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;
7
8use cairo_lang_filesystem::ids::SmolStrId;
9use cairo_lang_filesystem::span::TextWidth;
10use cairo_lang_utils::{Intern, extract_matches};
11use salsa::Database;
12
13use super::element_list::ElementList;
14use super::green::GreenNodeDetails;
15use super::kind::SyntaxKind;
16use super::{
17    GreenId, GreenNode, SyntaxNode, SyntaxStablePtrId, Terminal, Token, TypedStablePtr,
18    TypedSyntaxNode,
19};
20#[path = "ast_ext.rs"]
21mod ast_ext;
22#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23pub struct Trivia<'db>(ElementList<'db, Trivium<'db>, 1>);
24impl<'db> Deref for Trivia<'db> {
25    type Target = ElementList<'db, Trivium<'db>, 1>;
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}
30impl<'db> Trivia<'db> {
31    pub fn new_green(db: &'db dyn Database, children: &[TriviumGreen<'db>]) -> TriviaGreen<'db> {
32        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
33        TriviaGreen(
34            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, salsa::Update)]
46pub struct TriviaPtr<'db>(pub SyntaxStablePtrId<'db>);
47impl<'db> TypedStablePtr<'db> for TriviaPtr<'db> {
48    type SyntaxNode = Trivia<'db>;
49    fn untyped(self) -> SyntaxStablePtrId<'db> {
50        self.0
51    }
52    fn lookup(&self, db: &'db dyn Database) -> Trivia<'db> {
53        Trivia::from_syntax_node(db, self.0.lookup(db))
54    }
55}
56impl<'db> From<TriviaPtr<'db>> for SyntaxStablePtrId<'db> {
57    fn from(ptr: TriviaPtr<'db>) -> Self {
58        ptr.untyped()
59    }
60}
61#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
62pub struct TriviaGreen<'db>(pub GreenId<'db>);
63impl<'db> TypedSyntaxNode<'db> for Trivia<'db> {
64    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Trivia);
65    type StablePtr = TriviaPtr<'db>;
66    type Green = TriviaGreen<'db>;
67    fn missing(db: &'db dyn Database) -> Self::Green {
68        TriviaGreen(
69            GreenNode {
70                kind: SyntaxKind::Trivia,
71                details: GreenNodeDetails::Node {
72                    children: [].into(),
73                    width: TextWidth::default(),
74                },
75            }
76            .intern(db),
77        )
78    }
79    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
80        Self(ElementList::new(node))
81    }
82    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
83        if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
84    }
85    fn as_syntax_node(&self) -> SyntaxNode<'db> {
86        self.node
87    }
88    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
89        TriviaPtr(self.node.stable_ptr(db))
90    }
91}
92#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
93pub enum Trivium<'db> {
94    SingleLineComment(TokenSingleLineComment<'db>),
95    SingleLineDocComment(TokenSingleLineDocComment<'db>),
96    SingleLineInnerComment(TokenSingleLineInnerComment<'db>),
97    Whitespace(TokenWhitespace<'db>),
98    Newline(TokenNewline<'db>),
99    Skipped(TokenSkipped<'db>),
100    SkippedNode(TriviumSkippedNode<'db>),
101}
102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
103pub struct TriviumPtr<'db>(pub SyntaxStablePtrId<'db>);
104impl<'db> TypedStablePtr<'db> for TriviumPtr<'db> {
105    type SyntaxNode = Trivium<'db>;
106    fn untyped(self) -> SyntaxStablePtrId<'db> {
107        self.0
108    }
109    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
110        Trivium::from_syntax_node(db, self.0.lookup(db))
111    }
112}
113impl<'db> From<TriviumPtr<'db>> for SyntaxStablePtrId<'db> {
114    fn from(ptr: TriviumPtr<'db>) -> Self {
115        ptr.untyped()
116    }
117}
118impl<'db> From<TokenSingleLineCommentPtr<'db>> for TriviumPtr<'db> {
119    fn from(value: TokenSingleLineCommentPtr<'db>) -> Self {
120        Self(value.0)
121    }
122}
123impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for TriviumPtr<'db> {
124    fn from(value: TokenSingleLineDocCommentPtr<'db>) -> Self {
125        Self(value.0)
126    }
127}
128impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for TriviumPtr<'db> {
129    fn from(value: TokenSingleLineInnerCommentPtr<'db>) -> Self {
130        Self(value.0)
131    }
132}
133impl<'db> From<TokenWhitespacePtr<'db>> for TriviumPtr<'db> {
134    fn from(value: TokenWhitespacePtr<'db>) -> Self {
135        Self(value.0)
136    }
137}
138impl<'db> From<TokenNewlinePtr<'db>> for TriviumPtr<'db> {
139    fn from(value: TokenNewlinePtr<'db>) -> Self {
140        Self(value.0)
141    }
142}
143impl<'db> From<TokenSkippedPtr<'db>> for TriviumPtr<'db> {
144    fn from(value: TokenSkippedPtr<'db>) -> Self {
145        Self(value.0)
146    }
147}
148impl<'db> From<TriviumSkippedNodePtr<'db>> for TriviumPtr<'db> {
149    fn from(value: TriviumSkippedNodePtr<'db>) -> Self {
150        Self(value.0)
151    }
152}
153impl<'db> From<TokenSingleLineCommentGreen<'db>> for TriviumGreen<'db> {
154    fn from(value: TokenSingleLineCommentGreen<'db>) -> Self {
155        Self(value.0)
156    }
157}
158impl<'db> From<TokenSingleLineDocCommentGreen<'db>> for TriviumGreen<'db> {
159    fn from(value: TokenSingleLineDocCommentGreen<'db>) -> Self {
160        Self(value.0)
161    }
162}
163impl<'db> From<TokenSingleLineInnerCommentGreen<'db>> for TriviumGreen<'db> {
164    fn from(value: TokenSingleLineInnerCommentGreen<'db>) -> Self {
165        Self(value.0)
166    }
167}
168impl<'db> From<TokenWhitespaceGreen<'db>> for TriviumGreen<'db> {
169    fn from(value: TokenWhitespaceGreen<'db>) -> Self {
170        Self(value.0)
171    }
172}
173impl<'db> From<TokenNewlineGreen<'db>> for TriviumGreen<'db> {
174    fn from(value: TokenNewlineGreen<'db>) -> Self {
175        Self(value.0)
176    }
177}
178impl<'db> From<TokenSkippedGreen<'db>> for TriviumGreen<'db> {
179    fn from(value: TokenSkippedGreen<'db>) -> Self {
180        Self(value.0)
181    }
182}
183impl<'db> From<TriviumSkippedNodeGreen<'db>> for TriviumGreen<'db> {
184    fn from(value: TriviumSkippedNodeGreen<'db>) -> Self {
185        Self(value.0)
186    }
187}
188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
189pub struct TriviumGreen<'db>(pub GreenId<'db>);
190impl<'db> TypedSyntaxNode<'db> for Trivium<'db> {
191    const OPTIONAL_KIND: Option<SyntaxKind> = None;
192    type StablePtr = TriviumPtr<'db>;
193    type Green = TriviumGreen<'db>;
194    fn missing(db: &'db dyn Database) -> Self::Green {
195        panic!("No missing variant.");
196    }
197    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
198        let kind = node.kind(db);
199        match kind {
200            SyntaxKind::TokenSingleLineComment => {
201                Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
202            }
203            SyntaxKind::TokenSingleLineDocComment => {
204                Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
205            }
206            SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
207                TokenSingleLineInnerComment::from_syntax_node(db, node),
208            ),
209            SyntaxKind::TokenWhitespace => {
210                Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
211            }
212            SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
213            SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
214            SyntaxKind::TriviumSkippedNode => {
215                Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
216            }
217            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
218        }
219    }
220    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
221        let kind = node.kind(db);
222        match kind {
223            SyntaxKind::TokenSingleLineComment => {
224                Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
225            }
226            SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
227                TokenSingleLineDocComment::from_syntax_node(db, node),
228            )),
229            SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
230                TokenSingleLineInnerComment::from_syntax_node(db, node),
231            )),
232            SyntaxKind::TokenWhitespace => {
233                Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
234            }
235            SyntaxKind::TokenNewline => {
236                Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
237            }
238            SyntaxKind::TokenSkipped => {
239                Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
240            }
241            SyntaxKind::TriviumSkippedNode => {
242                Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
243            }
244            _ => None,
245        }
246    }
247    fn as_syntax_node(&self) -> SyntaxNode<'db> {
248        match self {
249            Trivium::SingleLineComment(x) => x.as_syntax_node(),
250            Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
251            Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
252            Trivium::Whitespace(x) => x.as_syntax_node(),
253            Trivium::Newline(x) => x.as_syntax_node(),
254            Trivium::Skipped(x) => x.as_syntax_node(),
255            Trivium::SkippedNode(x) => x.as_syntax_node(),
256        }
257    }
258    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
259        TriviumPtr(self.as_syntax_node().stable_ptr(db))
260    }
261}
262impl<'db> Trivium<'db> {
263    /// Checks if a kind of a variant of [Trivium].
264    pub fn is_variant(kind: SyntaxKind) -> bool {
265        matches!(
266            kind,
267            SyntaxKind::TokenSingleLineComment
268                | SyntaxKind::TokenSingleLineDocComment
269                | SyntaxKind::TokenSingleLineInnerComment
270                | SyntaxKind::TokenWhitespace
271                | SyntaxKind::TokenNewline
272                | SyntaxKind::TokenSkipped
273                | SyntaxKind::TriviumSkippedNode
274        )
275    }
276}
277#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
278pub enum Expr<'db> {
279    Path(ExprPath<'db>),
280    Literal(TerminalLiteralNumber<'db>),
281    ShortString(TerminalShortString<'db>),
282    String(TerminalString<'db>),
283    False(TerminalFalse<'db>),
284    True(TerminalTrue<'db>),
285    Parenthesized(ExprParenthesized<'db>),
286    Unary(ExprUnary<'db>),
287    Binary(ExprBinary<'db>),
288    Tuple(ExprListParenthesized<'db>),
289    FunctionCall(ExprFunctionCall<'db>),
290    StructCtorCall(ExprStructCtorCall<'db>),
291    Block(ExprBlock<'db>),
292    Match(ExprMatch<'db>),
293    If(ExprIf<'db>),
294    Loop(ExprLoop<'db>),
295    While(ExprWhile<'db>),
296    For(ExprFor<'db>),
297    Closure(ExprClosure<'db>),
298    ErrorPropagate(ExprErrorPropagate<'db>),
299    FieldInitShorthand(ExprFieldInitShorthand<'db>),
300    Indexed(ExprIndexed<'db>),
301    InlineMacro(ExprInlineMacro<'db>),
302    FixedSizeArray(ExprFixedSizeArray<'db>),
303    Missing(ExprMissing<'db>),
304}
305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
306pub struct ExprPtr<'db>(pub SyntaxStablePtrId<'db>);
307impl<'db> TypedStablePtr<'db> for ExprPtr<'db> {
308    type SyntaxNode = Expr<'db>;
309    fn untyped(self) -> SyntaxStablePtrId<'db> {
310        self.0
311    }
312    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
313        Expr::from_syntax_node(db, self.0.lookup(db))
314    }
315}
316impl<'db> From<ExprPtr<'db>> for SyntaxStablePtrId<'db> {
317    fn from(ptr: ExprPtr<'db>) -> Self {
318        ptr.untyped()
319    }
320}
321impl<'db> From<ExprPathPtr<'db>> for ExprPtr<'db> {
322    fn from(value: ExprPathPtr<'db>) -> Self {
323        Self(value.0)
324    }
325}
326impl<'db> From<TerminalLiteralNumberPtr<'db>> for ExprPtr<'db> {
327    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
328        Self(value.0)
329    }
330}
331impl<'db> From<TerminalShortStringPtr<'db>> for ExprPtr<'db> {
332    fn from(value: TerminalShortStringPtr<'db>) -> Self {
333        Self(value.0)
334    }
335}
336impl<'db> From<TerminalStringPtr<'db>> for ExprPtr<'db> {
337    fn from(value: TerminalStringPtr<'db>) -> Self {
338        Self(value.0)
339    }
340}
341impl<'db> From<TerminalFalsePtr<'db>> for ExprPtr<'db> {
342    fn from(value: TerminalFalsePtr<'db>) -> Self {
343        Self(value.0)
344    }
345}
346impl<'db> From<TerminalTruePtr<'db>> for ExprPtr<'db> {
347    fn from(value: TerminalTruePtr<'db>) -> Self {
348        Self(value.0)
349    }
350}
351impl<'db> From<ExprParenthesizedPtr<'db>> for ExprPtr<'db> {
352    fn from(value: ExprParenthesizedPtr<'db>) -> Self {
353        Self(value.0)
354    }
355}
356impl<'db> From<ExprUnaryPtr<'db>> for ExprPtr<'db> {
357    fn from(value: ExprUnaryPtr<'db>) -> Self {
358        Self(value.0)
359    }
360}
361impl<'db> From<ExprBinaryPtr<'db>> for ExprPtr<'db> {
362    fn from(value: ExprBinaryPtr<'db>) -> Self {
363        Self(value.0)
364    }
365}
366impl<'db> From<ExprListParenthesizedPtr<'db>> for ExprPtr<'db> {
367    fn from(value: ExprListParenthesizedPtr<'db>) -> Self {
368        Self(value.0)
369    }
370}
371impl<'db> From<ExprFunctionCallPtr<'db>> for ExprPtr<'db> {
372    fn from(value: ExprFunctionCallPtr<'db>) -> Self {
373        Self(value.0)
374    }
375}
376impl<'db> From<ExprStructCtorCallPtr<'db>> for ExprPtr<'db> {
377    fn from(value: ExprStructCtorCallPtr<'db>) -> Self {
378        Self(value.0)
379    }
380}
381impl<'db> From<ExprBlockPtr<'db>> for ExprPtr<'db> {
382    fn from(value: ExprBlockPtr<'db>) -> Self {
383        Self(value.0)
384    }
385}
386impl<'db> From<ExprMatchPtr<'db>> for ExprPtr<'db> {
387    fn from(value: ExprMatchPtr<'db>) -> Self {
388        Self(value.0)
389    }
390}
391impl<'db> From<ExprIfPtr<'db>> for ExprPtr<'db> {
392    fn from(value: ExprIfPtr<'db>) -> Self {
393        Self(value.0)
394    }
395}
396impl<'db> From<ExprLoopPtr<'db>> for ExprPtr<'db> {
397    fn from(value: ExprLoopPtr<'db>) -> Self {
398        Self(value.0)
399    }
400}
401impl<'db> From<ExprWhilePtr<'db>> for ExprPtr<'db> {
402    fn from(value: ExprWhilePtr<'db>) -> Self {
403        Self(value.0)
404    }
405}
406impl<'db> From<ExprForPtr<'db>> for ExprPtr<'db> {
407    fn from(value: ExprForPtr<'db>) -> Self {
408        Self(value.0)
409    }
410}
411impl<'db> From<ExprClosurePtr<'db>> for ExprPtr<'db> {
412    fn from(value: ExprClosurePtr<'db>) -> Self {
413        Self(value.0)
414    }
415}
416impl<'db> From<ExprErrorPropagatePtr<'db>> for ExprPtr<'db> {
417    fn from(value: ExprErrorPropagatePtr<'db>) -> Self {
418        Self(value.0)
419    }
420}
421impl<'db> From<ExprFieldInitShorthandPtr<'db>> for ExprPtr<'db> {
422    fn from(value: ExprFieldInitShorthandPtr<'db>) -> Self {
423        Self(value.0)
424    }
425}
426impl<'db> From<ExprIndexedPtr<'db>> for ExprPtr<'db> {
427    fn from(value: ExprIndexedPtr<'db>) -> Self {
428        Self(value.0)
429    }
430}
431impl<'db> From<ExprInlineMacroPtr<'db>> for ExprPtr<'db> {
432    fn from(value: ExprInlineMacroPtr<'db>) -> Self {
433        Self(value.0)
434    }
435}
436impl<'db> From<ExprFixedSizeArrayPtr<'db>> for ExprPtr<'db> {
437    fn from(value: ExprFixedSizeArrayPtr<'db>) -> Self {
438        Self(value.0)
439    }
440}
441impl<'db> From<ExprMissingPtr<'db>> for ExprPtr<'db> {
442    fn from(value: ExprMissingPtr<'db>) -> Self {
443        Self(value.0)
444    }
445}
446impl<'db> From<ExprPathGreen<'db>> for ExprGreen<'db> {
447    fn from(value: ExprPathGreen<'db>) -> Self {
448        Self(value.0)
449    }
450}
451impl<'db> From<TerminalLiteralNumberGreen<'db>> for ExprGreen<'db> {
452    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
453        Self(value.0)
454    }
455}
456impl<'db> From<TerminalShortStringGreen<'db>> for ExprGreen<'db> {
457    fn from(value: TerminalShortStringGreen<'db>) -> Self {
458        Self(value.0)
459    }
460}
461impl<'db> From<TerminalStringGreen<'db>> for ExprGreen<'db> {
462    fn from(value: TerminalStringGreen<'db>) -> Self {
463        Self(value.0)
464    }
465}
466impl<'db> From<TerminalFalseGreen<'db>> for ExprGreen<'db> {
467    fn from(value: TerminalFalseGreen<'db>) -> Self {
468        Self(value.0)
469    }
470}
471impl<'db> From<TerminalTrueGreen<'db>> for ExprGreen<'db> {
472    fn from(value: TerminalTrueGreen<'db>) -> Self {
473        Self(value.0)
474    }
475}
476impl<'db> From<ExprParenthesizedGreen<'db>> for ExprGreen<'db> {
477    fn from(value: ExprParenthesizedGreen<'db>) -> Self {
478        Self(value.0)
479    }
480}
481impl<'db> From<ExprUnaryGreen<'db>> for ExprGreen<'db> {
482    fn from(value: ExprUnaryGreen<'db>) -> Self {
483        Self(value.0)
484    }
485}
486impl<'db> From<ExprBinaryGreen<'db>> for ExprGreen<'db> {
487    fn from(value: ExprBinaryGreen<'db>) -> Self {
488        Self(value.0)
489    }
490}
491impl<'db> From<ExprListParenthesizedGreen<'db>> for ExprGreen<'db> {
492    fn from(value: ExprListParenthesizedGreen<'db>) -> Self {
493        Self(value.0)
494    }
495}
496impl<'db> From<ExprFunctionCallGreen<'db>> for ExprGreen<'db> {
497    fn from(value: ExprFunctionCallGreen<'db>) -> Self {
498        Self(value.0)
499    }
500}
501impl<'db> From<ExprStructCtorCallGreen<'db>> for ExprGreen<'db> {
502    fn from(value: ExprStructCtorCallGreen<'db>) -> Self {
503        Self(value.0)
504    }
505}
506impl<'db> From<ExprBlockGreen<'db>> for ExprGreen<'db> {
507    fn from(value: ExprBlockGreen<'db>) -> Self {
508        Self(value.0)
509    }
510}
511impl<'db> From<ExprMatchGreen<'db>> for ExprGreen<'db> {
512    fn from(value: ExprMatchGreen<'db>) -> Self {
513        Self(value.0)
514    }
515}
516impl<'db> From<ExprIfGreen<'db>> for ExprGreen<'db> {
517    fn from(value: ExprIfGreen<'db>) -> Self {
518        Self(value.0)
519    }
520}
521impl<'db> From<ExprLoopGreen<'db>> for ExprGreen<'db> {
522    fn from(value: ExprLoopGreen<'db>) -> Self {
523        Self(value.0)
524    }
525}
526impl<'db> From<ExprWhileGreen<'db>> for ExprGreen<'db> {
527    fn from(value: ExprWhileGreen<'db>) -> Self {
528        Self(value.0)
529    }
530}
531impl<'db> From<ExprForGreen<'db>> for ExprGreen<'db> {
532    fn from(value: ExprForGreen<'db>) -> Self {
533        Self(value.0)
534    }
535}
536impl<'db> From<ExprClosureGreen<'db>> for ExprGreen<'db> {
537    fn from(value: ExprClosureGreen<'db>) -> Self {
538        Self(value.0)
539    }
540}
541impl<'db> From<ExprErrorPropagateGreen<'db>> for ExprGreen<'db> {
542    fn from(value: ExprErrorPropagateGreen<'db>) -> Self {
543        Self(value.0)
544    }
545}
546impl<'db> From<ExprFieldInitShorthandGreen<'db>> for ExprGreen<'db> {
547    fn from(value: ExprFieldInitShorthandGreen<'db>) -> Self {
548        Self(value.0)
549    }
550}
551impl<'db> From<ExprIndexedGreen<'db>> for ExprGreen<'db> {
552    fn from(value: ExprIndexedGreen<'db>) -> Self {
553        Self(value.0)
554    }
555}
556impl<'db> From<ExprInlineMacroGreen<'db>> for ExprGreen<'db> {
557    fn from(value: ExprInlineMacroGreen<'db>) -> Self {
558        Self(value.0)
559    }
560}
561impl<'db> From<ExprFixedSizeArrayGreen<'db>> for ExprGreen<'db> {
562    fn from(value: ExprFixedSizeArrayGreen<'db>) -> Self {
563        Self(value.0)
564    }
565}
566impl<'db> From<ExprMissingGreen<'db>> for ExprGreen<'db> {
567    fn from(value: ExprMissingGreen<'db>) -> Self {
568        Self(value.0)
569    }
570}
571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
572pub struct ExprGreen<'db>(pub GreenId<'db>);
573impl<'db> TypedSyntaxNode<'db> for Expr<'db> {
574    const OPTIONAL_KIND: Option<SyntaxKind> = None;
575    type StablePtr = ExprPtr<'db>;
576    type Green = ExprGreen<'db>;
577    fn missing(db: &'db dyn Database) -> Self::Green {
578        ExprGreen(ExprMissing::missing(db).0)
579    }
580    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
581        let kind = node.kind(db);
582        match kind {
583            SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
584            SyntaxKind::TerminalLiteralNumber => {
585                Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
586            }
587            SyntaxKind::TerminalShortString => {
588                Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
589            }
590            SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
591            SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
592            SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
593            SyntaxKind::ExprParenthesized => {
594                Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
595            }
596            SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
597            SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
598            SyntaxKind::ExprListParenthesized => {
599                Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
600            }
601            SyntaxKind::ExprFunctionCall => {
602                Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
603            }
604            SyntaxKind::ExprStructCtorCall => {
605                Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
606            }
607            SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
608            SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
609            SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
610            SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
611            SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
612            SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
613            SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
614            SyntaxKind::ExprErrorPropagate => {
615                Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
616            }
617            SyntaxKind::ExprFieldInitShorthand => {
618                Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
619            }
620            SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
621            SyntaxKind::ExprInlineMacro => {
622                Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
623            }
624            SyntaxKind::ExprFixedSizeArray => {
625                Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
626            }
627            SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
628            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
629        }
630    }
631    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
632        let kind = node.kind(db);
633        match kind {
634            SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
635            SyntaxKind::TerminalLiteralNumber => {
636                Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
637            }
638            SyntaxKind::TerminalShortString => {
639                Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
640            }
641            SyntaxKind::TerminalString => {
642                Some(Expr::String(TerminalString::from_syntax_node(db, node)))
643            }
644            SyntaxKind::TerminalFalse => {
645                Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
646            }
647            SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
648            SyntaxKind::ExprParenthesized => {
649                Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
650            }
651            SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
652            SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
653            SyntaxKind::ExprListParenthesized => {
654                Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
655            }
656            SyntaxKind::ExprFunctionCall => {
657                Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
658            }
659            SyntaxKind::ExprStructCtorCall => {
660                Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
661            }
662            SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
663            SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
664            SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
665            SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
666            SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
667            SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
668            SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
669            SyntaxKind::ExprErrorPropagate => {
670                Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
671            }
672            SyntaxKind::ExprFieldInitShorthand => {
673                Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
674            }
675            SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
676            SyntaxKind::ExprInlineMacro => {
677                Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
678            }
679            SyntaxKind::ExprFixedSizeArray => {
680                Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
681            }
682            SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
683            _ => None,
684        }
685    }
686    fn as_syntax_node(&self) -> SyntaxNode<'db> {
687        match self {
688            Expr::Path(x) => x.as_syntax_node(),
689            Expr::Literal(x) => x.as_syntax_node(),
690            Expr::ShortString(x) => x.as_syntax_node(),
691            Expr::String(x) => x.as_syntax_node(),
692            Expr::False(x) => x.as_syntax_node(),
693            Expr::True(x) => x.as_syntax_node(),
694            Expr::Parenthesized(x) => x.as_syntax_node(),
695            Expr::Unary(x) => x.as_syntax_node(),
696            Expr::Binary(x) => x.as_syntax_node(),
697            Expr::Tuple(x) => x.as_syntax_node(),
698            Expr::FunctionCall(x) => x.as_syntax_node(),
699            Expr::StructCtorCall(x) => x.as_syntax_node(),
700            Expr::Block(x) => x.as_syntax_node(),
701            Expr::Match(x) => x.as_syntax_node(),
702            Expr::If(x) => x.as_syntax_node(),
703            Expr::Loop(x) => x.as_syntax_node(),
704            Expr::While(x) => x.as_syntax_node(),
705            Expr::For(x) => x.as_syntax_node(),
706            Expr::Closure(x) => x.as_syntax_node(),
707            Expr::ErrorPropagate(x) => x.as_syntax_node(),
708            Expr::FieldInitShorthand(x) => x.as_syntax_node(),
709            Expr::Indexed(x) => x.as_syntax_node(),
710            Expr::InlineMacro(x) => x.as_syntax_node(),
711            Expr::FixedSizeArray(x) => x.as_syntax_node(),
712            Expr::Missing(x) => x.as_syntax_node(),
713        }
714    }
715    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
716        ExprPtr(self.as_syntax_node().stable_ptr(db))
717    }
718}
719impl<'db> Expr<'db> {
720    /// Checks if a kind of a variant of [Expr].
721    pub fn is_variant(kind: SyntaxKind) -> bool {
722        matches!(
723            kind,
724            SyntaxKind::ExprPath
725                | SyntaxKind::TerminalLiteralNumber
726                | SyntaxKind::TerminalShortString
727                | SyntaxKind::TerminalString
728                | SyntaxKind::TerminalFalse
729                | SyntaxKind::TerminalTrue
730                | SyntaxKind::ExprParenthesized
731                | SyntaxKind::ExprUnary
732                | SyntaxKind::ExprBinary
733                | SyntaxKind::ExprListParenthesized
734                | SyntaxKind::ExprFunctionCall
735                | SyntaxKind::ExprStructCtorCall
736                | SyntaxKind::ExprBlock
737                | SyntaxKind::ExprMatch
738                | SyntaxKind::ExprIf
739                | SyntaxKind::ExprLoop
740                | SyntaxKind::ExprWhile
741                | SyntaxKind::ExprFor
742                | SyntaxKind::ExprClosure
743                | SyntaxKind::ExprErrorPropagate
744                | SyntaxKind::ExprFieldInitShorthand
745                | SyntaxKind::ExprIndexed
746                | SyntaxKind::ExprInlineMacro
747                | SyntaxKind::ExprFixedSizeArray
748                | SyntaxKind::ExprMissing
749        )
750    }
751}
752#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
753pub struct ExprList<'db>(ElementList<'db, Expr<'db>, 2>);
754impl<'db> Deref for ExprList<'db> {
755    type Target = ElementList<'db, Expr<'db>, 2>;
756    fn deref(&self) -> &Self::Target {
757        &self.0
758    }
759}
760impl<'db> ExprList<'db> {
761    pub fn new_green(
762        db: &'db dyn Database,
763        children: &[ExprListElementOrSeparatorGreen<'db>],
764    ) -> ExprListGreen<'db> {
765        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
766        ExprListGreen(
767            GreenNode {
768                kind: SyntaxKind::ExprList,
769                details: GreenNodeDetails::Node {
770                    children: children.iter().map(|x| x.id()).collect(),
771                    width,
772                },
773            }
774            .intern(db),
775        )
776    }
777}
778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
779pub struct ExprListPtr<'db>(pub SyntaxStablePtrId<'db>);
780impl<'db> TypedStablePtr<'db> for ExprListPtr<'db> {
781    type SyntaxNode = ExprList<'db>;
782    fn untyped(self) -> SyntaxStablePtrId<'db> {
783        self.0
784    }
785    fn lookup(&self, db: &'db dyn Database) -> ExprList<'db> {
786        ExprList::from_syntax_node(db, self.0.lookup(db))
787    }
788}
789impl<'db> From<ExprListPtr<'db>> for SyntaxStablePtrId<'db> {
790    fn from(ptr: ExprListPtr<'db>) -> Self {
791        ptr.untyped()
792    }
793}
794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
795pub enum ExprListElementOrSeparatorGreen<'db> {
796    Separator(TerminalCommaGreen<'db>),
797    Element(ExprGreen<'db>),
798}
799impl<'db> From<TerminalCommaGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
800    fn from(value: TerminalCommaGreen<'db>) -> Self {
801        ExprListElementOrSeparatorGreen::Separator(value)
802    }
803}
804impl<'db> From<ExprGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
805    fn from(value: ExprGreen<'db>) -> Self {
806        ExprListElementOrSeparatorGreen::Element(value)
807    }
808}
809impl<'db> ExprListElementOrSeparatorGreen<'db> {
810    fn id(&self) -> GreenId<'db> {
811        match self {
812            ExprListElementOrSeparatorGreen::Separator(green) => green.0,
813            ExprListElementOrSeparatorGreen::Element(green) => green.0,
814        }
815    }
816}
817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
818pub struct ExprListGreen<'db>(pub GreenId<'db>);
819impl<'db> TypedSyntaxNode<'db> for ExprList<'db> {
820    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
821    type StablePtr = ExprListPtr<'db>;
822    type Green = ExprListGreen<'db>;
823    fn missing(db: &'db dyn Database) -> Self::Green {
824        ExprListGreen(
825            GreenNode {
826                kind: SyntaxKind::ExprList,
827                details: GreenNodeDetails::Node {
828                    children: [].into(),
829                    width: TextWidth::default(),
830                },
831            }
832            .intern(db),
833        )
834    }
835    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
836        Self(ElementList::new(node))
837    }
838    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
839        if node.kind(db) == SyntaxKind::ExprList {
840            Some(Self(ElementList::new(node)))
841        } else {
842            None
843        }
844    }
845    fn as_syntax_node(&self) -> SyntaxNode<'db> {
846        self.node
847    }
848    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
849        ExprListPtr(self.node.stable_ptr(db))
850    }
851}
852#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
853pub struct Arg<'db> {
854    node: SyntaxNode<'db>,
855}
856impl<'db> Arg<'db> {
857    pub const INDEX_MODIFIERS: usize = 0;
858    pub const INDEX_ARG_CLAUSE: usize = 1;
859    pub fn new_green(
860        db: &'db dyn Database,
861        modifiers: ModifierListGreen<'db>,
862        arg_clause: ArgClauseGreen<'db>,
863    ) -> ArgGreen<'db> {
864        let children = [modifiers.0, arg_clause.0];
865        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
866        ArgGreen(
867            GreenNode {
868                kind: SyntaxKind::Arg,
869                details: GreenNodeDetails::Node { children: children.into(), width },
870            }
871            .intern(db),
872        )
873    }
874}
875impl<'db> Arg<'db> {
876    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
877        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
878    }
879    pub fn arg_clause(&self, db: &'db dyn Database) -> ArgClause<'db> {
880        ArgClause::from_syntax_node(db, self.node.get_children(db)[1])
881    }
882}
883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
884pub struct ArgPtr<'db>(pub SyntaxStablePtrId<'db>);
885impl<'db> ArgPtr<'db> {}
886impl<'db> TypedStablePtr<'db> for ArgPtr<'db> {
887    type SyntaxNode = Arg<'db>;
888    fn untyped(self) -> SyntaxStablePtrId<'db> {
889        self.0
890    }
891    fn lookup(&self, db: &'db dyn Database) -> Arg<'db> {
892        Arg::from_syntax_node(db, self.0.lookup(db))
893    }
894}
895impl<'db> From<ArgPtr<'db>> for SyntaxStablePtrId<'db> {
896    fn from(ptr: ArgPtr<'db>) -> Self {
897        ptr.untyped()
898    }
899}
900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
901pub struct ArgGreen<'db>(pub GreenId<'db>);
902impl<'db> TypedSyntaxNode<'db> for Arg<'db> {
903    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
904    type StablePtr = ArgPtr<'db>;
905    type Green = ArgGreen<'db>;
906    fn missing(db: &'db dyn Database) -> Self::Green {
907        ArgGreen(
908            GreenNode {
909                kind: SyntaxKind::Arg,
910                details: GreenNodeDetails::Node {
911                    children: [ModifierList::missing(db).0, ArgClause::missing(db).0].into(),
912                    width: TextWidth::default(),
913                },
914            }
915            .intern(db),
916        )
917    }
918    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
919        let kind = node.kind(db);
920        assert_eq!(
921            kind,
922            SyntaxKind::Arg,
923            "Unexpected SyntaxKind {:?}. Expected {:?}.",
924            kind,
925            SyntaxKind::Arg
926        );
927        Self { node }
928    }
929    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
930        let kind = node.kind(db);
931        if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
932    }
933    fn as_syntax_node(&self) -> SyntaxNode<'db> {
934        self.node
935    }
936    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
937        ArgPtr(self.node.stable_ptr(db))
938    }
939}
940#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
941pub enum ArgClause<'db> {
942    Unnamed(ArgClauseUnnamed<'db>),
943    Named(ArgClauseNamed<'db>),
944    FieldInitShorthand(ArgClauseFieldInitShorthand<'db>),
945}
946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
947pub struct ArgClausePtr<'db>(pub SyntaxStablePtrId<'db>);
948impl<'db> TypedStablePtr<'db> for ArgClausePtr<'db> {
949    type SyntaxNode = ArgClause<'db>;
950    fn untyped(self) -> SyntaxStablePtrId<'db> {
951        self.0
952    }
953    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
954        ArgClause::from_syntax_node(db, self.0.lookup(db))
955    }
956}
957impl<'db> From<ArgClausePtr<'db>> for SyntaxStablePtrId<'db> {
958    fn from(ptr: ArgClausePtr<'db>) -> Self {
959        ptr.untyped()
960    }
961}
962impl<'db> From<ArgClauseUnnamedPtr<'db>> for ArgClausePtr<'db> {
963    fn from(value: ArgClauseUnnamedPtr<'db>) -> Self {
964        Self(value.0)
965    }
966}
967impl<'db> From<ArgClauseNamedPtr<'db>> for ArgClausePtr<'db> {
968    fn from(value: ArgClauseNamedPtr<'db>) -> Self {
969        Self(value.0)
970    }
971}
972impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for ArgClausePtr<'db> {
973    fn from(value: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
974        Self(value.0)
975    }
976}
977impl<'db> From<ArgClauseUnnamedGreen<'db>> for ArgClauseGreen<'db> {
978    fn from(value: ArgClauseUnnamedGreen<'db>) -> Self {
979        Self(value.0)
980    }
981}
982impl<'db> From<ArgClauseNamedGreen<'db>> for ArgClauseGreen<'db> {
983    fn from(value: ArgClauseNamedGreen<'db>) -> Self {
984        Self(value.0)
985    }
986}
987impl<'db> From<ArgClauseFieldInitShorthandGreen<'db>> for ArgClauseGreen<'db> {
988    fn from(value: ArgClauseFieldInitShorthandGreen<'db>) -> Self {
989        Self(value.0)
990    }
991}
992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
993pub struct ArgClauseGreen<'db>(pub GreenId<'db>);
994impl<'db> TypedSyntaxNode<'db> for ArgClause<'db> {
995    const OPTIONAL_KIND: Option<SyntaxKind> = None;
996    type StablePtr = ArgClausePtr<'db>;
997    type Green = ArgClauseGreen<'db>;
998    fn missing(db: &'db dyn Database) -> Self::Green {
999        panic!("No missing variant.");
1000    }
1001    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1002        let kind = node.kind(db);
1003        match kind {
1004            SyntaxKind::ArgClauseUnnamed => {
1005                ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1006            }
1007            SyntaxKind::ArgClauseNamed => {
1008                ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1009            }
1010            SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1011                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1012            ),
1013            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1014        }
1015    }
1016    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1017        let kind = node.kind(db);
1018        match kind {
1019            SyntaxKind::ArgClauseUnnamed => {
1020                Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1021            }
1022            SyntaxKind::ArgClauseNamed => {
1023                Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1024            }
1025            SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1026                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1027            )),
1028            _ => None,
1029        }
1030    }
1031    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1032        match self {
1033            ArgClause::Unnamed(x) => x.as_syntax_node(),
1034            ArgClause::Named(x) => x.as_syntax_node(),
1035            ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1036        }
1037    }
1038    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1039        ArgClausePtr(self.as_syntax_node().stable_ptr(db))
1040    }
1041}
1042impl<'db> ArgClause<'db> {
1043    /// Checks if a kind of a variant of [ArgClause].
1044    pub fn is_variant(kind: SyntaxKind) -> bool {
1045        matches!(
1046            kind,
1047            SyntaxKind::ArgClauseUnnamed
1048                | SyntaxKind::ArgClauseNamed
1049                | SyntaxKind::ArgClauseFieldInitShorthand
1050        )
1051    }
1052}
1053#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1054pub struct ArgClauseNamed<'db> {
1055    node: SyntaxNode<'db>,
1056}
1057impl<'db> ArgClauseNamed<'db> {
1058    pub const INDEX_NAME: usize = 0;
1059    pub const INDEX_COLON: usize = 1;
1060    pub const INDEX_VALUE: usize = 2;
1061    pub fn new_green(
1062        db: &'db dyn Database,
1063        name: TerminalIdentifierGreen<'db>,
1064        colon: TerminalColonGreen<'db>,
1065        value: ExprGreen<'db>,
1066    ) -> ArgClauseNamedGreen<'db> {
1067        let children = [name.0, colon.0, value.0];
1068        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1069        ArgClauseNamedGreen(
1070            GreenNode {
1071                kind: SyntaxKind::ArgClauseNamed,
1072                details: GreenNodeDetails::Node { children: children.into(), width },
1073            }
1074            .intern(db),
1075        )
1076    }
1077}
1078impl<'db> ArgClauseNamed<'db> {
1079    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1080        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1081    }
1082    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1083        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
1084    }
1085    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1086        Expr::from_syntax_node(db, self.node.get_children(db)[2])
1087    }
1088}
1089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1090pub struct ArgClauseNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1091impl<'db> ArgClauseNamedPtr<'db> {}
1092impl<'db> TypedStablePtr<'db> for ArgClauseNamedPtr<'db> {
1093    type SyntaxNode = ArgClauseNamed<'db>;
1094    fn untyped(self) -> SyntaxStablePtrId<'db> {
1095        self.0
1096    }
1097    fn lookup(&self, db: &'db dyn Database) -> ArgClauseNamed<'db> {
1098        ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1099    }
1100}
1101impl<'db> From<ArgClauseNamedPtr<'db>> for SyntaxStablePtrId<'db> {
1102    fn from(ptr: ArgClauseNamedPtr<'db>) -> Self {
1103        ptr.untyped()
1104    }
1105}
1106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1107pub struct ArgClauseNamedGreen<'db>(pub GreenId<'db>);
1108impl<'db> TypedSyntaxNode<'db> for ArgClauseNamed<'db> {
1109    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1110    type StablePtr = ArgClauseNamedPtr<'db>;
1111    type Green = ArgClauseNamedGreen<'db>;
1112    fn missing(db: &'db dyn Database) -> Self::Green {
1113        ArgClauseNamedGreen(
1114            GreenNode {
1115                kind: SyntaxKind::ArgClauseNamed,
1116                details: GreenNodeDetails::Node {
1117                    children: [
1118                        TerminalIdentifier::missing(db).0,
1119                        TerminalColon::missing(db).0,
1120                        Expr::missing(db).0,
1121                    ]
1122                    .into(),
1123                    width: TextWidth::default(),
1124                },
1125            }
1126            .intern(db),
1127        )
1128    }
1129    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1130        let kind = node.kind(db);
1131        assert_eq!(
1132            kind,
1133            SyntaxKind::ArgClauseNamed,
1134            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1135            kind,
1136            SyntaxKind::ArgClauseNamed
1137        );
1138        Self { node }
1139    }
1140    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1141        let kind = node.kind(db);
1142        if kind == SyntaxKind::ArgClauseNamed {
1143            Some(Self::from_syntax_node(db, node))
1144        } else {
1145            None
1146        }
1147    }
1148    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1149        self.node
1150    }
1151    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1152        ArgClauseNamedPtr(self.node.stable_ptr(db))
1153    }
1154}
1155#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1156pub struct ArgClauseUnnamed<'db> {
1157    node: SyntaxNode<'db>,
1158}
1159impl<'db> ArgClauseUnnamed<'db> {
1160    pub const INDEX_VALUE: usize = 0;
1161    pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> ArgClauseUnnamedGreen<'db> {
1162        let children = [value.0];
1163        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1164        ArgClauseUnnamedGreen(
1165            GreenNode {
1166                kind: SyntaxKind::ArgClauseUnnamed,
1167                details: GreenNodeDetails::Node { children: children.into(), width },
1168            }
1169            .intern(db),
1170        )
1171    }
1172}
1173impl<'db> ArgClauseUnnamed<'db> {
1174    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1175        Expr::from_syntax_node(db, self.node.get_children(db)[0])
1176    }
1177}
1178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1179pub struct ArgClauseUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1180impl<'db> ArgClauseUnnamedPtr<'db> {}
1181impl<'db> TypedStablePtr<'db> for ArgClauseUnnamedPtr<'db> {
1182    type SyntaxNode = ArgClauseUnnamed<'db>;
1183    fn untyped(self) -> SyntaxStablePtrId<'db> {
1184        self.0
1185    }
1186    fn lookup(&self, db: &'db dyn Database) -> ArgClauseUnnamed<'db> {
1187        ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1188    }
1189}
1190impl<'db> From<ArgClauseUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
1191    fn from(ptr: ArgClauseUnnamedPtr<'db>) -> Self {
1192        ptr.untyped()
1193    }
1194}
1195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1196pub struct ArgClauseUnnamedGreen<'db>(pub GreenId<'db>);
1197impl<'db> TypedSyntaxNode<'db> for ArgClauseUnnamed<'db> {
1198    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1199    type StablePtr = ArgClauseUnnamedPtr<'db>;
1200    type Green = ArgClauseUnnamedGreen<'db>;
1201    fn missing(db: &'db dyn Database) -> Self::Green {
1202        ArgClauseUnnamedGreen(
1203            GreenNode {
1204                kind: SyntaxKind::ArgClauseUnnamed,
1205                details: GreenNodeDetails::Node {
1206                    children: [Expr::missing(db).0].into(),
1207                    width: TextWidth::default(),
1208                },
1209            }
1210            .intern(db),
1211        )
1212    }
1213    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1214        let kind = node.kind(db);
1215        assert_eq!(
1216            kind,
1217            SyntaxKind::ArgClauseUnnamed,
1218            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1219            kind,
1220            SyntaxKind::ArgClauseUnnamed
1221        );
1222        Self { node }
1223    }
1224    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1225        let kind = node.kind(db);
1226        if kind == SyntaxKind::ArgClauseUnnamed {
1227            Some(Self::from_syntax_node(db, node))
1228        } else {
1229            None
1230        }
1231    }
1232    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1233        self.node
1234    }
1235    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1236        ArgClauseUnnamedPtr(self.node.stable_ptr(db))
1237    }
1238}
1239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1240pub struct ArgClauseFieldInitShorthand<'db> {
1241    node: SyntaxNode<'db>,
1242}
1243impl<'db> ArgClauseFieldInitShorthand<'db> {
1244    pub const INDEX_COLON: usize = 0;
1245    pub const INDEX_NAME: usize = 1;
1246    pub fn new_green(
1247        db: &'db dyn Database,
1248        colon: TerminalColonGreen<'db>,
1249        name: ExprFieldInitShorthandGreen<'db>,
1250    ) -> ArgClauseFieldInitShorthandGreen<'db> {
1251        let children = [colon.0, name.0];
1252        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1253        ArgClauseFieldInitShorthandGreen(
1254            GreenNode {
1255                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1256                details: GreenNodeDetails::Node { children: children.into(), width },
1257            }
1258            .intern(db),
1259        )
1260    }
1261}
1262impl<'db> ArgClauseFieldInitShorthand<'db> {
1263    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1264        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
1265    }
1266    pub fn name(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1267        ExprFieldInitShorthand::from_syntax_node(db, self.node.get_children(db)[1])
1268    }
1269}
1270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1271pub struct ArgClauseFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1272impl<'db> ArgClauseFieldInitShorthandPtr<'db> {}
1273impl<'db> TypedStablePtr<'db> for ArgClauseFieldInitShorthandPtr<'db> {
1274    type SyntaxNode = ArgClauseFieldInitShorthand<'db>;
1275    fn untyped(self) -> SyntaxStablePtrId<'db> {
1276        self.0
1277    }
1278    fn lookup(&self, db: &'db dyn Database) -> ArgClauseFieldInitShorthand<'db> {
1279        ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1280    }
1281}
1282impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1283    fn from(ptr: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
1284        ptr.untyped()
1285    }
1286}
1287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1288pub struct ArgClauseFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1289impl<'db> TypedSyntaxNode<'db> for ArgClauseFieldInitShorthand<'db> {
1290    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1291    type StablePtr = ArgClauseFieldInitShorthandPtr<'db>;
1292    type Green = ArgClauseFieldInitShorthandGreen<'db>;
1293    fn missing(db: &'db dyn Database) -> Self::Green {
1294        ArgClauseFieldInitShorthandGreen(
1295            GreenNode {
1296                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1297                details: GreenNodeDetails::Node {
1298                    children: [TerminalColon::missing(db).0, ExprFieldInitShorthand::missing(db).0]
1299                        .into(),
1300                    width: TextWidth::default(),
1301                },
1302            }
1303            .intern(db),
1304        )
1305    }
1306    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1307        let kind = node.kind(db);
1308        assert_eq!(
1309            kind,
1310            SyntaxKind::ArgClauseFieldInitShorthand,
1311            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1312            kind,
1313            SyntaxKind::ArgClauseFieldInitShorthand
1314        );
1315        Self { node }
1316    }
1317    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1318        let kind = node.kind(db);
1319        if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1320            Some(Self::from_syntax_node(db, node))
1321        } else {
1322            None
1323        }
1324    }
1325    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1326        self.node
1327    }
1328    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1329        ArgClauseFieldInitShorthandPtr(self.node.stable_ptr(db))
1330    }
1331}
1332#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1333pub struct ExprFieldInitShorthand<'db> {
1334    node: SyntaxNode<'db>,
1335}
1336impl<'db> ExprFieldInitShorthand<'db> {
1337    pub const INDEX_NAME: usize = 0;
1338    pub fn new_green(
1339        db: &'db dyn Database,
1340        name: TerminalIdentifierGreen<'db>,
1341    ) -> ExprFieldInitShorthandGreen<'db> {
1342        let children = [name.0];
1343        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1344        ExprFieldInitShorthandGreen(
1345            GreenNode {
1346                kind: SyntaxKind::ExprFieldInitShorthand,
1347                details: GreenNodeDetails::Node { children: children.into(), width },
1348            }
1349            .intern(db),
1350        )
1351    }
1352}
1353impl<'db> ExprFieldInitShorthand<'db> {
1354    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1355        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1356    }
1357}
1358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1359pub struct ExprFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1360impl<'db> ExprFieldInitShorthandPtr<'db> {}
1361impl<'db> TypedStablePtr<'db> for ExprFieldInitShorthandPtr<'db> {
1362    type SyntaxNode = ExprFieldInitShorthand<'db>;
1363    fn untyped(self) -> SyntaxStablePtrId<'db> {
1364        self.0
1365    }
1366    fn lookup(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1367        ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1368    }
1369}
1370impl<'db> From<ExprFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1371    fn from(ptr: ExprFieldInitShorthandPtr<'db>) -> Self {
1372        ptr.untyped()
1373    }
1374}
1375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1376pub struct ExprFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1377impl<'db> TypedSyntaxNode<'db> for ExprFieldInitShorthand<'db> {
1378    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1379    type StablePtr = ExprFieldInitShorthandPtr<'db>;
1380    type Green = ExprFieldInitShorthandGreen<'db>;
1381    fn missing(db: &'db dyn Database) -> Self::Green {
1382        ExprFieldInitShorthandGreen(
1383            GreenNode {
1384                kind: SyntaxKind::ExprFieldInitShorthand,
1385                details: GreenNodeDetails::Node {
1386                    children: [TerminalIdentifier::missing(db).0].into(),
1387                    width: TextWidth::default(),
1388                },
1389            }
1390            .intern(db),
1391        )
1392    }
1393    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1394        let kind = node.kind(db);
1395        assert_eq!(
1396            kind,
1397            SyntaxKind::ExprFieldInitShorthand,
1398            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1399            kind,
1400            SyntaxKind::ExprFieldInitShorthand
1401        );
1402        Self { node }
1403    }
1404    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1405        let kind = node.kind(db);
1406        if kind == SyntaxKind::ExprFieldInitShorthand {
1407            Some(Self::from_syntax_node(db, node))
1408        } else {
1409            None
1410        }
1411    }
1412    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1413        self.node
1414    }
1415    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1416        ExprFieldInitShorthandPtr(self.node.stable_ptr(db))
1417    }
1418}
1419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1420pub struct ArgList<'db>(ElementList<'db, Arg<'db>, 2>);
1421impl<'db> Deref for ArgList<'db> {
1422    type Target = ElementList<'db, Arg<'db>, 2>;
1423    fn deref(&self) -> &Self::Target {
1424        &self.0
1425    }
1426}
1427impl<'db> ArgList<'db> {
1428    pub fn new_green(
1429        db: &'db dyn Database,
1430        children: &[ArgListElementOrSeparatorGreen<'db>],
1431    ) -> ArgListGreen<'db> {
1432        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
1433        ArgListGreen(
1434            GreenNode {
1435                kind: SyntaxKind::ArgList,
1436                details: GreenNodeDetails::Node {
1437                    children: children.iter().map(|x| x.id()).collect(),
1438                    width,
1439                },
1440            }
1441            .intern(db),
1442        )
1443    }
1444}
1445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1446pub struct ArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
1447impl<'db> TypedStablePtr<'db> for ArgListPtr<'db> {
1448    type SyntaxNode = ArgList<'db>;
1449    fn untyped(self) -> SyntaxStablePtrId<'db> {
1450        self.0
1451    }
1452    fn lookup(&self, db: &'db dyn Database) -> ArgList<'db> {
1453        ArgList::from_syntax_node(db, self.0.lookup(db))
1454    }
1455}
1456impl<'db> From<ArgListPtr<'db>> for SyntaxStablePtrId<'db> {
1457    fn from(ptr: ArgListPtr<'db>) -> Self {
1458        ptr.untyped()
1459    }
1460}
1461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1462pub enum ArgListElementOrSeparatorGreen<'db> {
1463    Separator(TerminalCommaGreen<'db>),
1464    Element(ArgGreen<'db>),
1465}
1466impl<'db> From<TerminalCommaGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1467    fn from(value: TerminalCommaGreen<'db>) -> Self {
1468        ArgListElementOrSeparatorGreen::Separator(value)
1469    }
1470}
1471impl<'db> From<ArgGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1472    fn from(value: ArgGreen<'db>) -> Self {
1473        ArgListElementOrSeparatorGreen::Element(value)
1474    }
1475}
1476impl<'db> ArgListElementOrSeparatorGreen<'db> {
1477    fn id(&self) -> GreenId<'db> {
1478        match self {
1479            ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1480            ArgListElementOrSeparatorGreen::Element(green) => green.0,
1481        }
1482    }
1483}
1484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1485pub struct ArgListGreen<'db>(pub GreenId<'db>);
1486impl<'db> TypedSyntaxNode<'db> for ArgList<'db> {
1487    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1488    type StablePtr = ArgListPtr<'db>;
1489    type Green = ArgListGreen<'db>;
1490    fn missing(db: &'db dyn Database) -> Self::Green {
1491        ArgListGreen(
1492            GreenNode {
1493                kind: SyntaxKind::ArgList,
1494                details: GreenNodeDetails::Node {
1495                    children: [].into(),
1496                    width: TextWidth::default(),
1497                },
1498            }
1499            .intern(db),
1500        )
1501    }
1502    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1503        Self(ElementList::new(node))
1504    }
1505    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1506        if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1507    }
1508    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1509        self.node
1510    }
1511    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1512        ArgListPtr(self.node.stable_ptr(db))
1513    }
1514}
1515#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1516pub struct ExprMissing<'db> {
1517    node: SyntaxNode<'db>,
1518}
1519impl<'db> ExprMissing<'db> {
1520    pub fn new_green(db: &'db dyn Database) -> ExprMissingGreen<'db> {
1521        let children = [];
1522        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1523        ExprMissingGreen(
1524            GreenNode {
1525                kind: SyntaxKind::ExprMissing,
1526                details: GreenNodeDetails::Node { children: children.into(), width },
1527            }
1528            .intern(db),
1529        )
1530    }
1531}
1532impl<'db> ExprMissing<'db> {}
1533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1534pub struct ExprMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
1535impl<'db> ExprMissingPtr<'db> {}
1536impl<'db> TypedStablePtr<'db> for ExprMissingPtr<'db> {
1537    type SyntaxNode = ExprMissing<'db>;
1538    fn untyped(self) -> SyntaxStablePtrId<'db> {
1539        self.0
1540    }
1541    fn lookup(&self, db: &'db dyn Database) -> ExprMissing<'db> {
1542        ExprMissing::from_syntax_node(db, self.0.lookup(db))
1543    }
1544}
1545impl<'db> From<ExprMissingPtr<'db>> for SyntaxStablePtrId<'db> {
1546    fn from(ptr: ExprMissingPtr<'db>) -> Self {
1547        ptr.untyped()
1548    }
1549}
1550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1551pub struct ExprMissingGreen<'db>(pub GreenId<'db>);
1552impl<'db> TypedSyntaxNode<'db> for ExprMissing<'db> {
1553    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1554    type StablePtr = ExprMissingPtr<'db>;
1555    type Green = ExprMissingGreen<'db>;
1556    fn missing(db: &'db dyn Database) -> Self::Green {
1557        ExprMissingGreen(
1558            GreenNode {
1559                kind: SyntaxKind::ExprMissing,
1560                details: GreenNodeDetails::Node {
1561                    children: [].into(),
1562                    width: TextWidth::default(),
1563                },
1564            }
1565            .intern(db),
1566        )
1567    }
1568    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1569        let kind = node.kind(db);
1570        assert_eq!(
1571            kind,
1572            SyntaxKind::ExprMissing,
1573            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1574            kind,
1575            SyntaxKind::ExprMissing
1576        );
1577        Self { node }
1578    }
1579    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1580        let kind = node.kind(db);
1581        if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1582    }
1583    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1584        self.node
1585    }
1586    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1587        ExprMissingPtr(self.node.stable_ptr(db))
1588    }
1589}
1590#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1591pub enum PathSegment<'db> {
1592    Simple(PathSegmentSimple<'db>),
1593    WithGenericArgs(PathSegmentWithGenericArgs<'db>),
1594    Missing(PathSegmentMissing<'db>),
1595}
1596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1597pub struct PathSegmentPtr<'db>(pub SyntaxStablePtrId<'db>);
1598impl<'db> TypedStablePtr<'db> for PathSegmentPtr<'db> {
1599    type SyntaxNode = PathSegment<'db>;
1600    fn untyped(self) -> SyntaxStablePtrId<'db> {
1601        self.0
1602    }
1603    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1604        PathSegment::from_syntax_node(db, self.0.lookup(db))
1605    }
1606}
1607impl<'db> From<PathSegmentPtr<'db>> for SyntaxStablePtrId<'db> {
1608    fn from(ptr: PathSegmentPtr<'db>) -> Self {
1609        ptr.untyped()
1610    }
1611}
1612impl<'db> From<PathSegmentSimplePtr<'db>> for PathSegmentPtr<'db> {
1613    fn from(value: PathSegmentSimplePtr<'db>) -> Self {
1614        Self(value.0)
1615    }
1616}
1617impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for PathSegmentPtr<'db> {
1618    fn from(value: PathSegmentWithGenericArgsPtr<'db>) -> Self {
1619        Self(value.0)
1620    }
1621}
1622impl<'db> From<PathSegmentMissingPtr<'db>> for PathSegmentPtr<'db> {
1623    fn from(value: PathSegmentMissingPtr<'db>) -> Self {
1624        Self(value.0)
1625    }
1626}
1627impl<'db> From<PathSegmentSimpleGreen<'db>> for PathSegmentGreen<'db> {
1628    fn from(value: PathSegmentSimpleGreen<'db>) -> Self {
1629        Self(value.0)
1630    }
1631}
1632impl<'db> From<PathSegmentWithGenericArgsGreen<'db>> for PathSegmentGreen<'db> {
1633    fn from(value: PathSegmentWithGenericArgsGreen<'db>) -> Self {
1634        Self(value.0)
1635    }
1636}
1637impl<'db> From<PathSegmentMissingGreen<'db>> for PathSegmentGreen<'db> {
1638    fn from(value: PathSegmentMissingGreen<'db>) -> Self {
1639        Self(value.0)
1640    }
1641}
1642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1643pub struct PathSegmentGreen<'db>(pub GreenId<'db>);
1644impl<'db> TypedSyntaxNode<'db> for PathSegment<'db> {
1645    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1646    type StablePtr = PathSegmentPtr<'db>;
1647    type Green = PathSegmentGreen<'db>;
1648    fn missing(db: &'db dyn Database) -> Self::Green {
1649        PathSegmentGreen(PathSegmentMissing::missing(db).0)
1650    }
1651    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1652        let kind = node.kind(db);
1653        match kind {
1654            SyntaxKind::PathSegmentSimple => {
1655                PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1656            }
1657            SyntaxKind::PathSegmentWithGenericArgs => {
1658                PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1659            }
1660            SyntaxKind::PathSegmentMissing => {
1661                PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1662            }
1663            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1664        }
1665    }
1666    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1667        let kind = node.kind(db);
1668        match kind {
1669            SyntaxKind::PathSegmentSimple => {
1670                Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1671            }
1672            SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1673                PathSegmentWithGenericArgs::from_syntax_node(db, node),
1674            )),
1675            SyntaxKind::PathSegmentMissing => {
1676                Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1677            }
1678            _ => None,
1679        }
1680    }
1681    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1682        match self {
1683            PathSegment::Simple(x) => x.as_syntax_node(),
1684            PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1685            PathSegment::Missing(x) => x.as_syntax_node(),
1686        }
1687    }
1688    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1689        PathSegmentPtr(self.as_syntax_node().stable_ptr(db))
1690    }
1691}
1692impl<'db> PathSegment<'db> {
1693    /// Checks if a kind of a variant of [PathSegment].
1694    pub fn is_variant(kind: SyntaxKind) -> bool {
1695        matches!(
1696            kind,
1697            SyntaxKind::PathSegmentSimple
1698                | SyntaxKind::PathSegmentWithGenericArgs
1699                | SyntaxKind::PathSegmentMissing
1700        )
1701    }
1702}
1703#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1704pub struct PathSegmentSimple<'db> {
1705    node: SyntaxNode<'db>,
1706}
1707impl<'db> PathSegmentSimple<'db> {
1708    pub const INDEX_IDENT: usize = 0;
1709    pub fn new_green(
1710        db: &'db dyn Database,
1711        ident: TerminalIdentifierGreen<'db>,
1712    ) -> PathSegmentSimpleGreen<'db> {
1713        let children = [ident.0];
1714        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1715        PathSegmentSimpleGreen(
1716            GreenNode {
1717                kind: SyntaxKind::PathSegmentSimple,
1718                details: GreenNodeDetails::Node { children: children.into(), width },
1719            }
1720            .intern(db),
1721        )
1722    }
1723}
1724impl<'db> PathSegmentSimple<'db> {
1725    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1726        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1727    }
1728}
1729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1730pub struct PathSegmentSimplePtr<'db>(pub SyntaxStablePtrId<'db>);
1731impl<'db> PathSegmentSimplePtr<'db> {}
1732impl<'db> TypedStablePtr<'db> for PathSegmentSimplePtr<'db> {
1733    type SyntaxNode = PathSegmentSimple<'db>;
1734    fn untyped(self) -> SyntaxStablePtrId<'db> {
1735        self.0
1736    }
1737    fn lookup(&self, db: &'db dyn Database) -> PathSegmentSimple<'db> {
1738        PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1739    }
1740}
1741impl<'db> From<PathSegmentSimplePtr<'db>> for SyntaxStablePtrId<'db> {
1742    fn from(ptr: PathSegmentSimplePtr<'db>) -> Self {
1743        ptr.untyped()
1744    }
1745}
1746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1747pub struct PathSegmentSimpleGreen<'db>(pub GreenId<'db>);
1748impl<'db> TypedSyntaxNode<'db> for PathSegmentSimple<'db> {
1749    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1750    type StablePtr = PathSegmentSimplePtr<'db>;
1751    type Green = PathSegmentSimpleGreen<'db>;
1752    fn missing(db: &'db dyn Database) -> Self::Green {
1753        PathSegmentSimpleGreen(
1754            GreenNode {
1755                kind: SyntaxKind::PathSegmentSimple,
1756                details: GreenNodeDetails::Node {
1757                    children: [TerminalIdentifier::missing(db).0].into(),
1758                    width: TextWidth::default(),
1759                },
1760            }
1761            .intern(db),
1762        )
1763    }
1764    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1765        let kind = node.kind(db);
1766        assert_eq!(
1767            kind,
1768            SyntaxKind::PathSegmentSimple,
1769            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1770            kind,
1771            SyntaxKind::PathSegmentSimple
1772        );
1773        Self { node }
1774    }
1775    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1776        let kind = node.kind(db);
1777        if kind == SyntaxKind::PathSegmentSimple {
1778            Some(Self::from_syntax_node(db, node))
1779        } else {
1780            None
1781        }
1782    }
1783    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1784        self.node
1785    }
1786    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1787        PathSegmentSimplePtr(self.node.stable_ptr(db))
1788    }
1789}
1790#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1791pub enum OptionTerminalColonColon<'db> {
1792    Empty(OptionTerminalColonColonEmpty<'db>),
1793    TerminalColonColon(TerminalColonColon<'db>),
1794}
1795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1796pub struct OptionTerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
1797impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonPtr<'db> {
1798    type SyntaxNode = OptionTerminalColonColon<'db>;
1799    fn untyped(self) -> SyntaxStablePtrId<'db> {
1800        self.0
1801    }
1802    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1803        OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1804    }
1805}
1806impl<'db> From<OptionTerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
1807    fn from(ptr: OptionTerminalColonColonPtr<'db>) -> Self {
1808        ptr.untyped()
1809    }
1810}
1811impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1812    fn from(value: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1813        Self(value.0)
1814    }
1815}
1816impl<'db> From<TerminalColonColonPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1817    fn from(value: TerminalColonColonPtr<'db>) -> Self {
1818        Self(value.0)
1819    }
1820}
1821impl<'db> From<OptionTerminalColonColonEmptyGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1822    fn from(value: OptionTerminalColonColonEmptyGreen<'db>) -> Self {
1823        Self(value.0)
1824    }
1825}
1826impl<'db> From<TerminalColonColonGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1827    fn from(value: TerminalColonColonGreen<'db>) -> Self {
1828        Self(value.0)
1829    }
1830}
1831#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1832pub struct OptionTerminalColonColonGreen<'db>(pub GreenId<'db>);
1833impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColon<'db> {
1834    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1835    type StablePtr = OptionTerminalColonColonPtr<'db>;
1836    type Green = OptionTerminalColonColonGreen<'db>;
1837    fn missing(db: &'db dyn Database) -> Self::Green {
1838        panic!("No missing variant.");
1839    }
1840    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1841        let kind = node.kind(db);
1842        match kind {
1843            SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1844                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1845            ),
1846            SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1847                TerminalColonColon::from_syntax_node(db, node),
1848            ),
1849            _ => panic!(
1850                "Unexpected syntax kind {:?} when constructing {}.",
1851                kind, "OptionTerminalColonColon"
1852            ),
1853        }
1854    }
1855    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1856        let kind = node.kind(db);
1857        match kind {
1858            SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1859                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1860            )),
1861            SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1862                TerminalColonColon::from_syntax_node(db, node),
1863            )),
1864            _ => None,
1865        }
1866    }
1867    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1868        match self {
1869            OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1870            OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1871        }
1872    }
1873    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1874        OptionTerminalColonColonPtr(self.as_syntax_node().stable_ptr(db))
1875    }
1876}
1877impl<'db> OptionTerminalColonColon<'db> {
1878    /// Checks if a kind of a variant of [OptionTerminalColonColon].
1879    pub fn is_variant(kind: SyntaxKind) -> bool {
1880        matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1881    }
1882}
1883#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1884pub struct OptionTerminalColonColonEmpty<'db> {
1885    node: SyntaxNode<'db>,
1886}
1887impl<'db> OptionTerminalColonColonEmpty<'db> {
1888    pub fn new_green(db: &'db dyn Database) -> OptionTerminalColonColonEmptyGreen<'db> {
1889        let children = [];
1890        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1891        OptionTerminalColonColonEmptyGreen(
1892            GreenNode {
1893                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1894                details: GreenNodeDetails::Node { children: children.into(), width },
1895            }
1896            .intern(db),
1897        )
1898    }
1899}
1900impl<'db> OptionTerminalColonColonEmpty<'db> {}
1901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1902pub struct OptionTerminalColonColonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
1903impl<'db> OptionTerminalColonColonEmptyPtr<'db> {}
1904impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonEmptyPtr<'db> {
1905    type SyntaxNode = OptionTerminalColonColonEmpty<'db>;
1906    fn untyped(self) -> SyntaxStablePtrId<'db> {
1907        self.0
1908    }
1909    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalColonColonEmpty<'db> {
1910        OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1911    }
1912}
1913impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
1914    fn from(ptr: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1915        ptr.untyped()
1916    }
1917}
1918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1919pub struct OptionTerminalColonColonEmptyGreen<'db>(pub GreenId<'db>);
1920impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColonEmpty<'db> {
1921    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1922    type StablePtr = OptionTerminalColonColonEmptyPtr<'db>;
1923    type Green = OptionTerminalColonColonEmptyGreen<'db>;
1924    fn missing(db: &'db dyn Database) -> Self::Green {
1925        OptionTerminalColonColonEmptyGreen(
1926            GreenNode {
1927                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1928                details: GreenNodeDetails::Node {
1929                    children: [].into(),
1930                    width: TextWidth::default(),
1931                },
1932            }
1933            .intern(db),
1934        )
1935    }
1936    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1937        let kind = node.kind(db);
1938        assert_eq!(
1939            kind,
1940            SyntaxKind::OptionTerminalColonColonEmpty,
1941            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1942            kind,
1943            SyntaxKind::OptionTerminalColonColonEmpty
1944        );
1945        Self { node }
1946    }
1947    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1948        let kind = node.kind(db);
1949        if kind == SyntaxKind::OptionTerminalColonColonEmpty {
1950            Some(Self::from_syntax_node(db, node))
1951        } else {
1952            None
1953        }
1954    }
1955    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1956        self.node
1957    }
1958    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1959        OptionTerminalColonColonEmptyPtr(self.node.stable_ptr(db))
1960    }
1961}
1962#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1963pub struct PathSegmentWithGenericArgs<'db> {
1964    node: SyntaxNode<'db>,
1965}
1966impl<'db> PathSegmentWithGenericArgs<'db> {
1967    pub const INDEX_IDENT: usize = 0;
1968    pub const INDEX_SEPARATOR: usize = 1;
1969    pub const INDEX_GENERIC_ARGS: usize = 2;
1970    pub fn new_green(
1971        db: &'db dyn Database,
1972        ident: TerminalIdentifierGreen<'db>,
1973        separator: OptionTerminalColonColonGreen<'db>,
1974        generic_args: GenericArgsGreen<'db>,
1975    ) -> PathSegmentWithGenericArgsGreen<'db> {
1976        let children = [ident.0, separator.0, generic_args.0];
1977        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1978        PathSegmentWithGenericArgsGreen(
1979            GreenNode {
1980                kind: SyntaxKind::PathSegmentWithGenericArgs,
1981                details: GreenNodeDetails::Node { children: children.into(), width },
1982            }
1983            .intern(db),
1984        )
1985    }
1986}
1987impl<'db> PathSegmentWithGenericArgs<'db> {
1988    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1989        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1990    }
1991    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalColonColon<'db> {
1992        OptionTerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
1993    }
1994    pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgs<'db> {
1995        GenericArgs::from_syntax_node(db, self.node.get_children(db)[2])
1996    }
1997}
1998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1999pub struct PathSegmentWithGenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
2000impl<'db> PathSegmentWithGenericArgsPtr<'db> {}
2001impl<'db> TypedStablePtr<'db> for PathSegmentWithGenericArgsPtr<'db> {
2002    type SyntaxNode = PathSegmentWithGenericArgs<'db>;
2003    fn untyped(self) -> SyntaxStablePtrId<'db> {
2004        self.0
2005    }
2006    fn lookup(&self, db: &'db dyn Database) -> PathSegmentWithGenericArgs<'db> {
2007        PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2008    }
2009}
2010impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
2011    fn from(ptr: PathSegmentWithGenericArgsPtr<'db>) -> Self {
2012        ptr.untyped()
2013    }
2014}
2015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2016pub struct PathSegmentWithGenericArgsGreen<'db>(pub GreenId<'db>);
2017impl<'db> TypedSyntaxNode<'db> for PathSegmentWithGenericArgs<'db> {
2018    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2019    type StablePtr = PathSegmentWithGenericArgsPtr<'db>;
2020    type Green = PathSegmentWithGenericArgsGreen<'db>;
2021    fn missing(db: &'db dyn Database) -> Self::Green {
2022        PathSegmentWithGenericArgsGreen(
2023            GreenNode {
2024                kind: SyntaxKind::PathSegmentWithGenericArgs,
2025                details: GreenNodeDetails::Node {
2026                    children: [
2027                        TerminalIdentifier::missing(db).0,
2028                        OptionTerminalColonColon::missing(db).0,
2029                        GenericArgs::missing(db).0,
2030                    ]
2031                    .into(),
2032                    width: TextWidth::default(),
2033                },
2034            }
2035            .intern(db),
2036        )
2037    }
2038    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2039        let kind = node.kind(db);
2040        assert_eq!(
2041            kind,
2042            SyntaxKind::PathSegmentWithGenericArgs,
2043            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2044            kind,
2045            SyntaxKind::PathSegmentWithGenericArgs
2046        );
2047        Self { node }
2048    }
2049    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2050        let kind = node.kind(db);
2051        if kind == SyntaxKind::PathSegmentWithGenericArgs {
2052            Some(Self::from_syntax_node(db, node))
2053        } else {
2054            None
2055        }
2056    }
2057    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2058        self.node
2059    }
2060    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2061        PathSegmentWithGenericArgsPtr(self.node.stable_ptr(db))
2062    }
2063}
2064#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2065pub struct ExprPath<'db> {
2066    node: SyntaxNode<'db>,
2067}
2068impl<'db> ExprPath<'db> {
2069    pub const INDEX_DOLLAR: usize = 0;
2070    pub const INDEX_SEGMENTS: usize = 1;
2071    pub fn new_green(
2072        db: &'db dyn Database,
2073        dollar: OptionTerminalDollarGreen<'db>,
2074        segments: ExprPathInnerGreen<'db>,
2075    ) -> ExprPathGreen<'db> {
2076        let children = [dollar.0, segments.0];
2077        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2078        ExprPathGreen(
2079            GreenNode {
2080                kind: SyntaxKind::ExprPath,
2081                details: GreenNodeDetails::Node { children: children.into(), width },
2082            }
2083            .intern(db),
2084        )
2085    }
2086}
2087impl<'db> ExprPath<'db> {
2088    pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
2089        OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
2090    }
2091    pub fn segments(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2092        ExprPathInner::from_syntax_node(db, self.node.get_children(db)[1])
2093    }
2094}
2095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2096pub struct ExprPathPtr<'db>(pub SyntaxStablePtrId<'db>);
2097impl<'db> ExprPathPtr<'db> {}
2098impl<'db> TypedStablePtr<'db> for ExprPathPtr<'db> {
2099    type SyntaxNode = ExprPath<'db>;
2100    fn untyped(self) -> SyntaxStablePtrId<'db> {
2101        self.0
2102    }
2103    fn lookup(&self, db: &'db dyn Database) -> ExprPath<'db> {
2104        ExprPath::from_syntax_node(db, self.0.lookup(db))
2105    }
2106}
2107impl<'db> From<ExprPathPtr<'db>> for SyntaxStablePtrId<'db> {
2108    fn from(ptr: ExprPathPtr<'db>) -> Self {
2109        ptr.untyped()
2110    }
2111}
2112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2113pub struct ExprPathGreen<'db>(pub GreenId<'db>);
2114impl<'db> TypedSyntaxNode<'db> for ExprPath<'db> {
2115    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2116    type StablePtr = ExprPathPtr<'db>;
2117    type Green = ExprPathGreen<'db>;
2118    fn missing(db: &'db dyn Database) -> Self::Green {
2119        ExprPathGreen(
2120            GreenNode {
2121                kind: SyntaxKind::ExprPath,
2122                details: GreenNodeDetails::Node {
2123                    children: [OptionTerminalDollar::missing(db).0, ExprPathInner::missing(db).0]
2124                        .into(),
2125                    width: TextWidth::default(),
2126                },
2127            }
2128            .intern(db),
2129        )
2130    }
2131    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2132        let kind = node.kind(db);
2133        assert_eq!(
2134            kind,
2135            SyntaxKind::ExprPath,
2136            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2137            kind,
2138            SyntaxKind::ExprPath
2139        );
2140        Self { node }
2141    }
2142    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2143        let kind = node.kind(db);
2144        if kind == SyntaxKind::ExprPath { Some(Self::from_syntax_node(db, node)) } else { None }
2145    }
2146    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2147        self.node
2148    }
2149    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2150        ExprPathPtr(self.node.stable_ptr(db))
2151    }
2152}
2153#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2154pub enum OptionTerminalDollar<'db> {
2155    Empty(OptionTerminalDollarEmpty<'db>),
2156    TerminalDollar(TerminalDollar<'db>),
2157}
2158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2159pub struct OptionTerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
2160impl<'db> TypedStablePtr<'db> for OptionTerminalDollarPtr<'db> {
2161    type SyntaxNode = OptionTerminalDollar<'db>;
2162    fn untyped(self) -> SyntaxStablePtrId<'db> {
2163        self.0
2164    }
2165    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2166        OptionTerminalDollar::from_syntax_node(db, self.0.lookup(db))
2167    }
2168}
2169impl<'db> From<OptionTerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
2170    fn from(ptr: OptionTerminalDollarPtr<'db>) -> Self {
2171        ptr.untyped()
2172    }
2173}
2174impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for OptionTerminalDollarPtr<'db> {
2175    fn from(value: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2176        Self(value.0)
2177    }
2178}
2179impl<'db> From<TerminalDollarPtr<'db>> for OptionTerminalDollarPtr<'db> {
2180    fn from(value: TerminalDollarPtr<'db>) -> Self {
2181        Self(value.0)
2182    }
2183}
2184impl<'db> From<OptionTerminalDollarEmptyGreen<'db>> for OptionTerminalDollarGreen<'db> {
2185    fn from(value: OptionTerminalDollarEmptyGreen<'db>) -> Self {
2186        Self(value.0)
2187    }
2188}
2189impl<'db> From<TerminalDollarGreen<'db>> for OptionTerminalDollarGreen<'db> {
2190    fn from(value: TerminalDollarGreen<'db>) -> Self {
2191        Self(value.0)
2192    }
2193}
2194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2195pub struct OptionTerminalDollarGreen<'db>(pub GreenId<'db>);
2196impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollar<'db> {
2197    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2198    type StablePtr = OptionTerminalDollarPtr<'db>;
2199    type Green = OptionTerminalDollarGreen<'db>;
2200    fn missing(db: &'db dyn Database) -> Self::Green {
2201        panic!("No missing variant.");
2202    }
2203    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2204        let kind = node.kind(db);
2205        match kind {
2206            SyntaxKind::OptionTerminalDollarEmpty => {
2207                OptionTerminalDollar::Empty(OptionTerminalDollarEmpty::from_syntax_node(db, node))
2208            }
2209            SyntaxKind::TerminalDollar => {
2210                OptionTerminalDollar::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
2211            }
2212            _ => panic!(
2213                "Unexpected syntax kind {:?} when constructing {}.",
2214                kind, "OptionTerminalDollar"
2215            ),
2216        }
2217    }
2218    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2219        let kind = node.kind(db);
2220        match kind {
2221            SyntaxKind::OptionTerminalDollarEmpty => Some(OptionTerminalDollar::Empty(
2222                OptionTerminalDollarEmpty::from_syntax_node(db, node),
2223            )),
2224            SyntaxKind::TerminalDollar => Some(OptionTerminalDollar::TerminalDollar(
2225                TerminalDollar::from_syntax_node(db, node),
2226            )),
2227            _ => None,
2228        }
2229    }
2230    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2231        match self {
2232            OptionTerminalDollar::Empty(x) => x.as_syntax_node(),
2233            OptionTerminalDollar::TerminalDollar(x) => x.as_syntax_node(),
2234        }
2235    }
2236    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2237        OptionTerminalDollarPtr(self.as_syntax_node().stable_ptr(db))
2238    }
2239}
2240impl<'db> OptionTerminalDollar<'db> {
2241    /// Checks if a kind of a variant of [OptionTerminalDollar].
2242    pub fn is_variant(kind: SyntaxKind) -> bool {
2243        matches!(kind, SyntaxKind::OptionTerminalDollarEmpty | SyntaxKind::TerminalDollar)
2244    }
2245}
2246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2247pub struct OptionTerminalDollarEmpty<'db> {
2248    node: SyntaxNode<'db>,
2249}
2250impl<'db> OptionTerminalDollarEmpty<'db> {
2251    pub fn new_green(db: &'db dyn Database) -> OptionTerminalDollarEmptyGreen<'db> {
2252        let children = [];
2253        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2254        OptionTerminalDollarEmptyGreen(
2255            GreenNode {
2256                kind: SyntaxKind::OptionTerminalDollarEmpty,
2257                details: GreenNodeDetails::Node { children: children.into(), width },
2258            }
2259            .intern(db),
2260        )
2261    }
2262}
2263impl<'db> OptionTerminalDollarEmpty<'db> {}
2264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2265pub struct OptionTerminalDollarEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
2266impl<'db> OptionTerminalDollarEmptyPtr<'db> {}
2267impl<'db> TypedStablePtr<'db> for OptionTerminalDollarEmptyPtr<'db> {
2268    type SyntaxNode = OptionTerminalDollarEmpty<'db>;
2269    fn untyped(self) -> SyntaxStablePtrId<'db> {
2270        self.0
2271    }
2272    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalDollarEmpty<'db> {
2273        OptionTerminalDollarEmpty::from_syntax_node(db, self.0.lookup(db))
2274    }
2275}
2276impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
2277    fn from(ptr: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2278        ptr.untyped()
2279    }
2280}
2281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2282pub struct OptionTerminalDollarEmptyGreen<'db>(pub GreenId<'db>);
2283impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollarEmpty<'db> {
2284    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalDollarEmpty);
2285    type StablePtr = OptionTerminalDollarEmptyPtr<'db>;
2286    type Green = OptionTerminalDollarEmptyGreen<'db>;
2287    fn missing(db: &'db dyn Database) -> Self::Green {
2288        OptionTerminalDollarEmptyGreen(
2289            GreenNode {
2290                kind: SyntaxKind::OptionTerminalDollarEmpty,
2291                details: GreenNodeDetails::Node {
2292                    children: [].into(),
2293                    width: TextWidth::default(),
2294                },
2295            }
2296            .intern(db),
2297        )
2298    }
2299    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2300        let kind = node.kind(db);
2301        assert_eq!(
2302            kind,
2303            SyntaxKind::OptionTerminalDollarEmpty,
2304            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2305            kind,
2306            SyntaxKind::OptionTerminalDollarEmpty
2307        );
2308        Self { node }
2309    }
2310    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2311        let kind = node.kind(db);
2312        if kind == SyntaxKind::OptionTerminalDollarEmpty {
2313            Some(Self::from_syntax_node(db, node))
2314        } else {
2315            None
2316        }
2317    }
2318    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2319        self.node
2320    }
2321    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2322        OptionTerminalDollarEmptyPtr(self.node.stable_ptr(db))
2323    }
2324}
2325#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2326pub struct PathSegmentMissing<'db> {
2327    node: SyntaxNode<'db>,
2328}
2329impl<'db> PathSegmentMissing<'db> {
2330    pub const INDEX_IDENT: usize = 0;
2331    pub fn new_green(
2332        db: &'db dyn Database,
2333        ident: TerminalIdentifierGreen<'db>,
2334    ) -> PathSegmentMissingGreen<'db> {
2335        let children = [ident.0];
2336        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2337        PathSegmentMissingGreen(
2338            GreenNode {
2339                kind: SyntaxKind::PathSegmentMissing,
2340                details: GreenNodeDetails::Node { children: children.into(), width },
2341            }
2342            .intern(db),
2343        )
2344    }
2345}
2346impl<'db> PathSegmentMissing<'db> {
2347    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2348        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2349    }
2350}
2351#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2352pub struct PathSegmentMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
2353impl<'db> PathSegmentMissingPtr<'db> {}
2354impl<'db> TypedStablePtr<'db> for PathSegmentMissingPtr<'db> {
2355    type SyntaxNode = PathSegmentMissing<'db>;
2356    fn untyped(self) -> SyntaxStablePtrId<'db> {
2357        self.0
2358    }
2359    fn lookup(&self, db: &'db dyn Database) -> PathSegmentMissing<'db> {
2360        PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2361    }
2362}
2363impl<'db> From<PathSegmentMissingPtr<'db>> for SyntaxStablePtrId<'db> {
2364    fn from(ptr: PathSegmentMissingPtr<'db>) -> Self {
2365        ptr.untyped()
2366    }
2367}
2368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2369pub struct PathSegmentMissingGreen<'db>(pub GreenId<'db>);
2370impl<'db> TypedSyntaxNode<'db> for PathSegmentMissing<'db> {
2371    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2372    type StablePtr = PathSegmentMissingPtr<'db>;
2373    type Green = PathSegmentMissingGreen<'db>;
2374    fn missing(db: &'db dyn Database) -> Self::Green {
2375        PathSegmentMissingGreen(
2376            GreenNode {
2377                kind: SyntaxKind::PathSegmentMissing,
2378                details: GreenNodeDetails::Node {
2379                    children: [TerminalIdentifier::missing(db).0].into(),
2380                    width: TextWidth::default(),
2381                },
2382            }
2383            .intern(db),
2384        )
2385    }
2386    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2387        let kind = node.kind(db);
2388        assert_eq!(
2389            kind,
2390            SyntaxKind::PathSegmentMissing,
2391            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2392            kind,
2393            SyntaxKind::PathSegmentMissing
2394        );
2395        Self { node }
2396    }
2397    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2398        let kind = node.kind(db);
2399        if kind == SyntaxKind::PathSegmentMissing {
2400            Some(Self::from_syntax_node(db, node))
2401        } else {
2402            None
2403        }
2404    }
2405    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2406        self.node
2407    }
2408    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2409        PathSegmentMissingPtr(self.node.stable_ptr(db))
2410    }
2411}
2412#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2413pub struct ExprPathInner<'db>(ElementList<'db, PathSegment<'db>, 2>);
2414impl<'db> Deref for ExprPathInner<'db> {
2415    type Target = ElementList<'db, PathSegment<'db>, 2>;
2416    fn deref(&self) -> &Self::Target {
2417        &self.0
2418    }
2419}
2420impl<'db> ExprPathInner<'db> {
2421    pub fn new_green(
2422        db: &'db dyn Database,
2423        children: &[ExprPathInnerElementOrSeparatorGreen<'db>],
2424    ) -> ExprPathInnerGreen<'db> {
2425        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
2426        ExprPathInnerGreen(
2427            GreenNode {
2428                kind: SyntaxKind::ExprPathInner,
2429                details: GreenNodeDetails::Node {
2430                    children: children.iter().map(|x| x.id()).collect(),
2431                    width,
2432                },
2433            }
2434            .intern(db),
2435        )
2436    }
2437}
2438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2439pub struct ExprPathInnerPtr<'db>(pub SyntaxStablePtrId<'db>);
2440impl<'db> TypedStablePtr<'db> for ExprPathInnerPtr<'db> {
2441    type SyntaxNode = ExprPathInner<'db>;
2442    fn untyped(self) -> SyntaxStablePtrId<'db> {
2443        self.0
2444    }
2445    fn lookup(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2446        ExprPathInner::from_syntax_node(db, self.0.lookup(db))
2447    }
2448}
2449impl<'db> From<ExprPathInnerPtr<'db>> for SyntaxStablePtrId<'db> {
2450    fn from(ptr: ExprPathInnerPtr<'db>) -> Self {
2451        ptr.untyped()
2452    }
2453}
2454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2455pub enum ExprPathInnerElementOrSeparatorGreen<'db> {
2456    Separator(TerminalColonColonGreen<'db>),
2457    Element(PathSegmentGreen<'db>),
2458}
2459impl<'db> From<TerminalColonColonGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2460    fn from(value: TerminalColonColonGreen<'db>) -> Self {
2461        ExprPathInnerElementOrSeparatorGreen::Separator(value)
2462    }
2463}
2464impl<'db> From<PathSegmentGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2465    fn from(value: PathSegmentGreen<'db>) -> Self {
2466        ExprPathInnerElementOrSeparatorGreen::Element(value)
2467    }
2468}
2469impl<'db> ExprPathInnerElementOrSeparatorGreen<'db> {
2470    fn id(&self) -> GreenId<'db> {
2471        match self {
2472            ExprPathInnerElementOrSeparatorGreen::Separator(green) => green.0,
2473            ExprPathInnerElementOrSeparatorGreen::Element(green) => green.0,
2474        }
2475    }
2476}
2477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2478pub struct ExprPathInnerGreen<'db>(pub GreenId<'db>);
2479impl<'db> TypedSyntaxNode<'db> for ExprPathInner<'db> {
2480    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPathInner);
2481    type StablePtr = ExprPathInnerPtr<'db>;
2482    type Green = ExprPathInnerGreen<'db>;
2483    fn missing(db: &'db dyn Database) -> Self::Green {
2484        ExprPathInnerGreen(
2485            GreenNode {
2486                kind: SyntaxKind::ExprPathInner,
2487                details: GreenNodeDetails::Node {
2488                    children: [].into(),
2489                    width: TextWidth::default(),
2490                },
2491            }
2492            .intern(db),
2493        )
2494    }
2495    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2496        Self(ElementList::new(node))
2497    }
2498    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2499        if node.kind(db) == SyntaxKind::ExprPathInner {
2500            Some(Self(ElementList::new(node)))
2501        } else {
2502            None
2503        }
2504    }
2505    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2506        self.node
2507    }
2508    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2509        ExprPathInnerPtr(self.node.stable_ptr(db))
2510    }
2511}
2512#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2513pub struct ExprParenthesized<'db> {
2514    node: SyntaxNode<'db>,
2515}
2516impl<'db> ExprParenthesized<'db> {
2517    pub const INDEX_LPAREN: usize = 0;
2518    pub const INDEX_EXPR: usize = 1;
2519    pub const INDEX_RPAREN: usize = 2;
2520    pub fn new_green(
2521        db: &'db dyn Database,
2522        lparen: TerminalLParenGreen<'db>,
2523        expr: ExprGreen<'db>,
2524        rparen: TerminalRParenGreen<'db>,
2525    ) -> ExprParenthesizedGreen<'db> {
2526        let children = [lparen.0, expr.0, rparen.0];
2527        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2528        ExprParenthesizedGreen(
2529            GreenNode {
2530                kind: SyntaxKind::ExprParenthesized,
2531                details: GreenNodeDetails::Node { children: children.into(), width },
2532            }
2533            .intern(db),
2534        )
2535    }
2536}
2537impl<'db> ExprParenthesized<'db> {
2538    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
2539        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
2540    }
2541    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2542        Expr::from_syntax_node(db, self.node.get_children(db)[1])
2543    }
2544    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
2545        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
2546    }
2547}
2548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2549pub struct ExprParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
2550impl<'db> ExprParenthesizedPtr<'db> {}
2551impl<'db> TypedStablePtr<'db> for ExprParenthesizedPtr<'db> {
2552    type SyntaxNode = ExprParenthesized<'db>;
2553    fn untyped(self) -> SyntaxStablePtrId<'db> {
2554        self.0
2555    }
2556    fn lookup(&self, db: &'db dyn Database) -> ExprParenthesized<'db> {
2557        ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2558    }
2559}
2560impl<'db> From<ExprParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
2561    fn from(ptr: ExprParenthesizedPtr<'db>) -> Self {
2562        ptr.untyped()
2563    }
2564}
2565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2566pub struct ExprParenthesizedGreen<'db>(pub GreenId<'db>);
2567impl<'db> TypedSyntaxNode<'db> for ExprParenthesized<'db> {
2568    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2569    type StablePtr = ExprParenthesizedPtr<'db>;
2570    type Green = ExprParenthesizedGreen<'db>;
2571    fn missing(db: &'db dyn Database) -> Self::Green {
2572        ExprParenthesizedGreen(
2573            GreenNode {
2574                kind: SyntaxKind::ExprParenthesized,
2575                details: GreenNodeDetails::Node {
2576                    children: [
2577                        TerminalLParen::missing(db).0,
2578                        Expr::missing(db).0,
2579                        TerminalRParen::missing(db).0,
2580                    ]
2581                    .into(),
2582                    width: TextWidth::default(),
2583                },
2584            }
2585            .intern(db),
2586        )
2587    }
2588    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2589        let kind = node.kind(db);
2590        assert_eq!(
2591            kind,
2592            SyntaxKind::ExprParenthesized,
2593            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2594            kind,
2595            SyntaxKind::ExprParenthesized
2596        );
2597        Self { node }
2598    }
2599    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2600        let kind = node.kind(db);
2601        if kind == SyntaxKind::ExprParenthesized {
2602            Some(Self::from_syntax_node(db, node))
2603        } else {
2604            None
2605        }
2606    }
2607    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2608        self.node
2609    }
2610    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2611        ExprParenthesizedPtr(self.node.stable_ptr(db))
2612    }
2613}
2614#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2615pub struct ExprUnary<'db> {
2616    node: SyntaxNode<'db>,
2617}
2618impl<'db> ExprUnary<'db> {
2619    pub const INDEX_OP: usize = 0;
2620    pub const INDEX_EXPR: usize = 1;
2621    pub fn new_green(
2622        db: &'db dyn Database,
2623        op: UnaryOperatorGreen<'db>,
2624        expr: ExprGreen<'db>,
2625    ) -> ExprUnaryGreen<'db> {
2626        let children = [op.0, expr.0];
2627        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2628        ExprUnaryGreen(
2629            GreenNode {
2630                kind: SyntaxKind::ExprUnary,
2631                details: GreenNodeDetails::Node { children: children.into(), width },
2632            }
2633            .intern(db),
2634        )
2635    }
2636}
2637impl<'db> ExprUnary<'db> {
2638    pub fn op(&self, db: &'db dyn Database) -> UnaryOperator<'db> {
2639        UnaryOperator::from_syntax_node(db, self.node.get_children(db)[0])
2640    }
2641    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2642        Expr::from_syntax_node(db, self.node.get_children(db)[1])
2643    }
2644}
2645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2646pub struct ExprUnaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2647impl<'db> ExprUnaryPtr<'db> {}
2648impl<'db> TypedStablePtr<'db> for ExprUnaryPtr<'db> {
2649    type SyntaxNode = ExprUnary<'db>;
2650    fn untyped(self) -> SyntaxStablePtrId<'db> {
2651        self.0
2652    }
2653    fn lookup(&self, db: &'db dyn Database) -> ExprUnary<'db> {
2654        ExprUnary::from_syntax_node(db, self.0.lookup(db))
2655    }
2656}
2657impl<'db> From<ExprUnaryPtr<'db>> for SyntaxStablePtrId<'db> {
2658    fn from(ptr: ExprUnaryPtr<'db>) -> Self {
2659        ptr.untyped()
2660    }
2661}
2662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2663pub struct ExprUnaryGreen<'db>(pub GreenId<'db>);
2664impl<'db> TypedSyntaxNode<'db> for ExprUnary<'db> {
2665    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2666    type StablePtr = ExprUnaryPtr<'db>;
2667    type Green = ExprUnaryGreen<'db>;
2668    fn missing(db: &'db dyn Database) -> Self::Green {
2669        ExprUnaryGreen(
2670            GreenNode {
2671                kind: SyntaxKind::ExprUnary,
2672                details: GreenNodeDetails::Node {
2673                    children: [UnaryOperator::missing(db).0, Expr::missing(db).0].into(),
2674                    width: TextWidth::default(),
2675                },
2676            }
2677            .intern(db),
2678        )
2679    }
2680    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2681        let kind = node.kind(db);
2682        assert_eq!(
2683            kind,
2684            SyntaxKind::ExprUnary,
2685            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2686            kind,
2687            SyntaxKind::ExprUnary
2688        );
2689        Self { node }
2690    }
2691    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2692        let kind = node.kind(db);
2693        if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2694    }
2695    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2696        self.node
2697    }
2698    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2699        ExprUnaryPtr(self.node.stable_ptr(db))
2700    }
2701}
2702#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2703pub enum UnaryOperator<'db> {
2704    Not(TerminalNot<'db>),
2705    BitNot(TerminalBitNot<'db>),
2706    Minus(TerminalMinus<'db>),
2707    At(TerminalAt<'db>),
2708    Desnap(TerminalMul<'db>),
2709    Reference(TerminalAnd<'db>),
2710}
2711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2712pub struct UnaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2713impl<'db> TypedStablePtr<'db> for UnaryOperatorPtr<'db> {
2714    type SyntaxNode = UnaryOperator<'db>;
2715    fn untyped(self) -> SyntaxStablePtrId<'db> {
2716        self.0
2717    }
2718    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2719        UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2720    }
2721}
2722impl<'db> From<UnaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2723    fn from(ptr: UnaryOperatorPtr<'db>) -> Self {
2724        ptr.untyped()
2725    }
2726}
2727impl<'db> From<TerminalNotPtr<'db>> for UnaryOperatorPtr<'db> {
2728    fn from(value: TerminalNotPtr<'db>) -> Self {
2729        Self(value.0)
2730    }
2731}
2732impl<'db> From<TerminalBitNotPtr<'db>> for UnaryOperatorPtr<'db> {
2733    fn from(value: TerminalBitNotPtr<'db>) -> Self {
2734        Self(value.0)
2735    }
2736}
2737impl<'db> From<TerminalMinusPtr<'db>> for UnaryOperatorPtr<'db> {
2738    fn from(value: TerminalMinusPtr<'db>) -> Self {
2739        Self(value.0)
2740    }
2741}
2742impl<'db> From<TerminalAtPtr<'db>> for UnaryOperatorPtr<'db> {
2743    fn from(value: TerminalAtPtr<'db>) -> Self {
2744        Self(value.0)
2745    }
2746}
2747impl<'db> From<TerminalMulPtr<'db>> for UnaryOperatorPtr<'db> {
2748    fn from(value: TerminalMulPtr<'db>) -> Self {
2749        Self(value.0)
2750    }
2751}
2752impl<'db> From<TerminalAndPtr<'db>> for UnaryOperatorPtr<'db> {
2753    fn from(value: TerminalAndPtr<'db>) -> Self {
2754        Self(value.0)
2755    }
2756}
2757impl<'db> From<TerminalNotGreen<'db>> for UnaryOperatorGreen<'db> {
2758    fn from(value: TerminalNotGreen<'db>) -> Self {
2759        Self(value.0)
2760    }
2761}
2762impl<'db> From<TerminalBitNotGreen<'db>> for UnaryOperatorGreen<'db> {
2763    fn from(value: TerminalBitNotGreen<'db>) -> Self {
2764        Self(value.0)
2765    }
2766}
2767impl<'db> From<TerminalMinusGreen<'db>> for UnaryOperatorGreen<'db> {
2768    fn from(value: TerminalMinusGreen<'db>) -> Self {
2769        Self(value.0)
2770    }
2771}
2772impl<'db> From<TerminalAtGreen<'db>> for UnaryOperatorGreen<'db> {
2773    fn from(value: TerminalAtGreen<'db>) -> Self {
2774        Self(value.0)
2775    }
2776}
2777impl<'db> From<TerminalMulGreen<'db>> for UnaryOperatorGreen<'db> {
2778    fn from(value: TerminalMulGreen<'db>) -> Self {
2779        Self(value.0)
2780    }
2781}
2782impl<'db> From<TerminalAndGreen<'db>> for UnaryOperatorGreen<'db> {
2783    fn from(value: TerminalAndGreen<'db>) -> Self {
2784        Self(value.0)
2785    }
2786}
2787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2788pub struct UnaryOperatorGreen<'db>(pub GreenId<'db>);
2789impl<'db> TypedSyntaxNode<'db> for UnaryOperator<'db> {
2790    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2791    type StablePtr = UnaryOperatorPtr<'db>;
2792    type Green = UnaryOperatorGreen<'db>;
2793    fn missing(db: &'db dyn Database) -> Self::Green {
2794        panic!("No missing variant.");
2795    }
2796    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2797        let kind = node.kind(db);
2798        match kind {
2799            SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2800            SyntaxKind::TerminalBitNot => {
2801                UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2802            }
2803            SyntaxKind::TerminalMinus => {
2804                UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2805            }
2806            SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2807            SyntaxKind::TerminalMul => {
2808                UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2809            }
2810            SyntaxKind::TerminalAnd => {
2811                UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node))
2812            }
2813            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2814        }
2815    }
2816    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2817        let kind = node.kind(db);
2818        match kind {
2819            SyntaxKind::TerminalNot => {
2820                Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2821            }
2822            SyntaxKind::TerminalBitNot => {
2823                Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2824            }
2825            SyntaxKind::TerminalMinus => {
2826                Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2827            }
2828            SyntaxKind::TerminalAt => {
2829                Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2830            }
2831            SyntaxKind::TerminalMul => {
2832                Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2833            }
2834            SyntaxKind::TerminalAnd => {
2835                Some(UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node)))
2836            }
2837            _ => None,
2838        }
2839    }
2840    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2841        match self {
2842            UnaryOperator::Not(x) => x.as_syntax_node(),
2843            UnaryOperator::BitNot(x) => x.as_syntax_node(),
2844            UnaryOperator::Minus(x) => x.as_syntax_node(),
2845            UnaryOperator::At(x) => x.as_syntax_node(),
2846            UnaryOperator::Desnap(x) => x.as_syntax_node(),
2847            UnaryOperator::Reference(x) => x.as_syntax_node(),
2848        }
2849    }
2850    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2851        UnaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
2852    }
2853}
2854impl<'db> UnaryOperator<'db> {
2855    /// Checks if a kind of a variant of [UnaryOperator].
2856    pub fn is_variant(kind: SyntaxKind) -> bool {
2857        matches!(
2858            kind,
2859            SyntaxKind::TerminalNot
2860                | SyntaxKind::TerminalBitNot
2861                | SyntaxKind::TerminalMinus
2862                | SyntaxKind::TerminalAt
2863                | SyntaxKind::TerminalMul
2864                | SyntaxKind::TerminalAnd
2865        )
2866    }
2867}
2868#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2869pub struct ExprBinary<'db> {
2870    node: SyntaxNode<'db>,
2871}
2872impl<'db> ExprBinary<'db> {
2873    pub const INDEX_LHS: usize = 0;
2874    pub const INDEX_OP: usize = 1;
2875    pub const INDEX_RHS: usize = 2;
2876    pub fn new_green(
2877        db: &'db dyn Database,
2878        lhs: ExprGreen<'db>,
2879        op: BinaryOperatorGreen<'db>,
2880        rhs: ExprGreen<'db>,
2881    ) -> ExprBinaryGreen<'db> {
2882        let children = [lhs.0, op.0, rhs.0];
2883        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2884        ExprBinaryGreen(
2885            GreenNode {
2886                kind: SyntaxKind::ExprBinary,
2887                details: GreenNodeDetails::Node { children: children.into(), width },
2888            }
2889            .intern(db),
2890        )
2891    }
2892}
2893impl<'db> ExprBinary<'db> {
2894    pub fn lhs(&self, db: &'db dyn Database) -> Expr<'db> {
2895        Expr::from_syntax_node(db, self.node.get_children(db)[0])
2896    }
2897    pub fn op(&self, db: &'db dyn Database) -> BinaryOperator<'db> {
2898        BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2899    }
2900    pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
2901        Expr::from_syntax_node(db, self.node.get_children(db)[2])
2902    }
2903}
2904#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2905pub struct ExprBinaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2906impl<'db> ExprBinaryPtr<'db> {}
2907impl<'db> TypedStablePtr<'db> for ExprBinaryPtr<'db> {
2908    type SyntaxNode = ExprBinary<'db>;
2909    fn untyped(self) -> SyntaxStablePtrId<'db> {
2910        self.0
2911    }
2912    fn lookup(&self, db: &'db dyn Database) -> ExprBinary<'db> {
2913        ExprBinary::from_syntax_node(db, self.0.lookup(db))
2914    }
2915}
2916impl<'db> From<ExprBinaryPtr<'db>> for SyntaxStablePtrId<'db> {
2917    fn from(ptr: ExprBinaryPtr<'db>) -> Self {
2918        ptr.untyped()
2919    }
2920}
2921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2922pub struct ExprBinaryGreen<'db>(pub GreenId<'db>);
2923impl<'db> TypedSyntaxNode<'db> for ExprBinary<'db> {
2924    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2925    type StablePtr = ExprBinaryPtr<'db>;
2926    type Green = ExprBinaryGreen<'db>;
2927    fn missing(db: &'db dyn Database) -> Self::Green {
2928        ExprBinaryGreen(
2929            GreenNode {
2930                kind: SyntaxKind::ExprBinary,
2931                details: GreenNodeDetails::Node {
2932                    children: [
2933                        Expr::missing(db).0,
2934                        BinaryOperator::missing(db).0,
2935                        Expr::missing(db).0,
2936                    ]
2937                    .into(),
2938                    width: TextWidth::default(),
2939                },
2940            }
2941            .intern(db),
2942        )
2943    }
2944    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2945        let kind = node.kind(db);
2946        assert_eq!(
2947            kind,
2948            SyntaxKind::ExprBinary,
2949            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2950            kind,
2951            SyntaxKind::ExprBinary
2952        );
2953        Self { node }
2954    }
2955    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2956        let kind = node.kind(db);
2957        if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2958    }
2959    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2960        self.node
2961    }
2962    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2963        ExprBinaryPtr(self.node.stable_ptr(db))
2964    }
2965}
2966#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2967pub enum BinaryOperator<'db> {
2968    Dot(TerminalDot<'db>),
2969    Not(TerminalNot<'db>),
2970    Mul(TerminalMul<'db>),
2971    MulEq(TerminalMulEq<'db>),
2972    Div(TerminalDiv<'db>),
2973    DivEq(TerminalDivEq<'db>),
2974    Mod(TerminalMod<'db>),
2975    ModEq(TerminalModEq<'db>),
2976    Plus(TerminalPlus<'db>),
2977    PlusEq(TerminalPlusEq<'db>),
2978    Minus(TerminalMinus<'db>),
2979    MinusEq(TerminalMinusEq<'db>),
2980    EqEq(TerminalEqEq<'db>),
2981    Neq(TerminalNeq<'db>),
2982    Eq(TerminalEq<'db>),
2983    And(TerminalAnd<'db>),
2984    AndAnd(TerminalAndAnd<'db>),
2985    Or(TerminalOr<'db>),
2986    OrOr(TerminalOrOr<'db>),
2987    Xor(TerminalXor<'db>),
2988    LE(TerminalLE<'db>),
2989    GE(TerminalGE<'db>),
2990    LT(TerminalLT<'db>),
2991    GT(TerminalGT<'db>),
2992    DotDot(TerminalDotDot<'db>),
2993    DotDotEq(TerminalDotDotEq<'db>),
2994}
2995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2996pub struct BinaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2997impl<'db> TypedStablePtr<'db> for BinaryOperatorPtr<'db> {
2998    type SyntaxNode = BinaryOperator<'db>;
2999    fn untyped(self) -> SyntaxStablePtrId<'db> {
3000        self.0
3001    }
3002    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3003        BinaryOperator::from_syntax_node(db, self.0.lookup(db))
3004    }
3005}
3006impl<'db> From<BinaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
3007    fn from(ptr: BinaryOperatorPtr<'db>) -> Self {
3008        ptr.untyped()
3009    }
3010}
3011impl<'db> From<TerminalDotPtr<'db>> for BinaryOperatorPtr<'db> {
3012    fn from(value: TerminalDotPtr<'db>) -> Self {
3013        Self(value.0)
3014    }
3015}
3016impl<'db> From<TerminalNotPtr<'db>> for BinaryOperatorPtr<'db> {
3017    fn from(value: TerminalNotPtr<'db>) -> Self {
3018        Self(value.0)
3019    }
3020}
3021impl<'db> From<TerminalMulPtr<'db>> for BinaryOperatorPtr<'db> {
3022    fn from(value: TerminalMulPtr<'db>) -> Self {
3023        Self(value.0)
3024    }
3025}
3026impl<'db> From<TerminalMulEqPtr<'db>> for BinaryOperatorPtr<'db> {
3027    fn from(value: TerminalMulEqPtr<'db>) -> Self {
3028        Self(value.0)
3029    }
3030}
3031impl<'db> From<TerminalDivPtr<'db>> for BinaryOperatorPtr<'db> {
3032    fn from(value: TerminalDivPtr<'db>) -> Self {
3033        Self(value.0)
3034    }
3035}
3036impl<'db> From<TerminalDivEqPtr<'db>> for BinaryOperatorPtr<'db> {
3037    fn from(value: TerminalDivEqPtr<'db>) -> Self {
3038        Self(value.0)
3039    }
3040}
3041impl<'db> From<TerminalModPtr<'db>> for BinaryOperatorPtr<'db> {
3042    fn from(value: TerminalModPtr<'db>) -> Self {
3043        Self(value.0)
3044    }
3045}
3046impl<'db> From<TerminalModEqPtr<'db>> for BinaryOperatorPtr<'db> {
3047    fn from(value: TerminalModEqPtr<'db>) -> Self {
3048        Self(value.0)
3049    }
3050}
3051impl<'db> From<TerminalPlusPtr<'db>> for BinaryOperatorPtr<'db> {
3052    fn from(value: TerminalPlusPtr<'db>) -> Self {
3053        Self(value.0)
3054    }
3055}
3056impl<'db> From<TerminalPlusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3057    fn from(value: TerminalPlusEqPtr<'db>) -> Self {
3058        Self(value.0)
3059    }
3060}
3061impl<'db> From<TerminalMinusPtr<'db>> for BinaryOperatorPtr<'db> {
3062    fn from(value: TerminalMinusPtr<'db>) -> Self {
3063        Self(value.0)
3064    }
3065}
3066impl<'db> From<TerminalMinusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3067    fn from(value: TerminalMinusEqPtr<'db>) -> Self {
3068        Self(value.0)
3069    }
3070}
3071impl<'db> From<TerminalEqEqPtr<'db>> for BinaryOperatorPtr<'db> {
3072    fn from(value: TerminalEqEqPtr<'db>) -> Self {
3073        Self(value.0)
3074    }
3075}
3076impl<'db> From<TerminalNeqPtr<'db>> for BinaryOperatorPtr<'db> {
3077    fn from(value: TerminalNeqPtr<'db>) -> Self {
3078        Self(value.0)
3079    }
3080}
3081impl<'db> From<TerminalEqPtr<'db>> for BinaryOperatorPtr<'db> {
3082    fn from(value: TerminalEqPtr<'db>) -> Self {
3083        Self(value.0)
3084    }
3085}
3086impl<'db> From<TerminalAndPtr<'db>> for BinaryOperatorPtr<'db> {
3087    fn from(value: TerminalAndPtr<'db>) -> Self {
3088        Self(value.0)
3089    }
3090}
3091impl<'db> From<TerminalAndAndPtr<'db>> for BinaryOperatorPtr<'db> {
3092    fn from(value: TerminalAndAndPtr<'db>) -> Self {
3093        Self(value.0)
3094    }
3095}
3096impl<'db> From<TerminalOrPtr<'db>> for BinaryOperatorPtr<'db> {
3097    fn from(value: TerminalOrPtr<'db>) -> Self {
3098        Self(value.0)
3099    }
3100}
3101impl<'db> From<TerminalOrOrPtr<'db>> for BinaryOperatorPtr<'db> {
3102    fn from(value: TerminalOrOrPtr<'db>) -> Self {
3103        Self(value.0)
3104    }
3105}
3106impl<'db> From<TerminalXorPtr<'db>> for BinaryOperatorPtr<'db> {
3107    fn from(value: TerminalXorPtr<'db>) -> Self {
3108        Self(value.0)
3109    }
3110}
3111impl<'db> From<TerminalLEPtr<'db>> for BinaryOperatorPtr<'db> {
3112    fn from(value: TerminalLEPtr<'db>) -> Self {
3113        Self(value.0)
3114    }
3115}
3116impl<'db> From<TerminalGEPtr<'db>> for BinaryOperatorPtr<'db> {
3117    fn from(value: TerminalGEPtr<'db>) -> Self {
3118        Self(value.0)
3119    }
3120}
3121impl<'db> From<TerminalLTPtr<'db>> for BinaryOperatorPtr<'db> {
3122    fn from(value: TerminalLTPtr<'db>) -> Self {
3123        Self(value.0)
3124    }
3125}
3126impl<'db> From<TerminalGTPtr<'db>> for BinaryOperatorPtr<'db> {
3127    fn from(value: TerminalGTPtr<'db>) -> Self {
3128        Self(value.0)
3129    }
3130}
3131impl<'db> From<TerminalDotDotPtr<'db>> for BinaryOperatorPtr<'db> {
3132    fn from(value: TerminalDotDotPtr<'db>) -> Self {
3133        Self(value.0)
3134    }
3135}
3136impl<'db> From<TerminalDotDotEqPtr<'db>> for BinaryOperatorPtr<'db> {
3137    fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
3138        Self(value.0)
3139    }
3140}
3141impl<'db> From<TerminalDotGreen<'db>> for BinaryOperatorGreen<'db> {
3142    fn from(value: TerminalDotGreen<'db>) -> Self {
3143        Self(value.0)
3144    }
3145}
3146impl<'db> From<TerminalNotGreen<'db>> for BinaryOperatorGreen<'db> {
3147    fn from(value: TerminalNotGreen<'db>) -> Self {
3148        Self(value.0)
3149    }
3150}
3151impl<'db> From<TerminalMulGreen<'db>> for BinaryOperatorGreen<'db> {
3152    fn from(value: TerminalMulGreen<'db>) -> Self {
3153        Self(value.0)
3154    }
3155}
3156impl<'db> From<TerminalMulEqGreen<'db>> for BinaryOperatorGreen<'db> {
3157    fn from(value: TerminalMulEqGreen<'db>) -> Self {
3158        Self(value.0)
3159    }
3160}
3161impl<'db> From<TerminalDivGreen<'db>> for BinaryOperatorGreen<'db> {
3162    fn from(value: TerminalDivGreen<'db>) -> Self {
3163        Self(value.0)
3164    }
3165}
3166impl<'db> From<TerminalDivEqGreen<'db>> for BinaryOperatorGreen<'db> {
3167    fn from(value: TerminalDivEqGreen<'db>) -> Self {
3168        Self(value.0)
3169    }
3170}
3171impl<'db> From<TerminalModGreen<'db>> for BinaryOperatorGreen<'db> {
3172    fn from(value: TerminalModGreen<'db>) -> Self {
3173        Self(value.0)
3174    }
3175}
3176impl<'db> From<TerminalModEqGreen<'db>> for BinaryOperatorGreen<'db> {
3177    fn from(value: TerminalModEqGreen<'db>) -> Self {
3178        Self(value.0)
3179    }
3180}
3181impl<'db> From<TerminalPlusGreen<'db>> for BinaryOperatorGreen<'db> {
3182    fn from(value: TerminalPlusGreen<'db>) -> Self {
3183        Self(value.0)
3184    }
3185}
3186impl<'db> From<TerminalPlusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3187    fn from(value: TerminalPlusEqGreen<'db>) -> Self {
3188        Self(value.0)
3189    }
3190}
3191impl<'db> From<TerminalMinusGreen<'db>> for BinaryOperatorGreen<'db> {
3192    fn from(value: TerminalMinusGreen<'db>) -> Self {
3193        Self(value.0)
3194    }
3195}
3196impl<'db> From<TerminalMinusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3197    fn from(value: TerminalMinusEqGreen<'db>) -> Self {
3198        Self(value.0)
3199    }
3200}
3201impl<'db> From<TerminalEqEqGreen<'db>> for BinaryOperatorGreen<'db> {
3202    fn from(value: TerminalEqEqGreen<'db>) -> Self {
3203        Self(value.0)
3204    }
3205}
3206impl<'db> From<TerminalNeqGreen<'db>> for BinaryOperatorGreen<'db> {
3207    fn from(value: TerminalNeqGreen<'db>) -> Self {
3208        Self(value.0)
3209    }
3210}
3211impl<'db> From<TerminalEqGreen<'db>> for BinaryOperatorGreen<'db> {
3212    fn from(value: TerminalEqGreen<'db>) -> Self {
3213        Self(value.0)
3214    }
3215}
3216impl<'db> From<TerminalAndGreen<'db>> for BinaryOperatorGreen<'db> {
3217    fn from(value: TerminalAndGreen<'db>) -> Self {
3218        Self(value.0)
3219    }
3220}
3221impl<'db> From<TerminalAndAndGreen<'db>> for BinaryOperatorGreen<'db> {
3222    fn from(value: TerminalAndAndGreen<'db>) -> Self {
3223        Self(value.0)
3224    }
3225}
3226impl<'db> From<TerminalOrGreen<'db>> for BinaryOperatorGreen<'db> {
3227    fn from(value: TerminalOrGreen<'db>) -> Self {
3228        Self(value.0)
3229    }
3230}
3231impl<'db> From<TerminalOrOrGreen<'db>> for BinaryOperatorGreen<'db> {
3232    fn from(value: TerminalOrOrGreen<'db>) -> Self {
3233        Self(value.0)
3234    }
3235}
3236impl<'db> From<TerminalXorGreen<'db>> for BinaryOperatorGreen<'db> {
3237    fn from(value: TerminalXorGreen<'db>) -> Self {
3238        Self(value.0)
3239    }
3240}
3241impl<'db> From<TerminalLEGreen<'db>> for BinaryOperatorGreen<'db> {
3242    fn from(value: TerminalLEGreen<'db>) -> Self {
3243        Self(value.0)
3244    }
3245}
3246impl<'db> From<TerminalGEGreen<'db>> for BinaryOperatorGreen<'db> {
3247    fn from(value: TerminalGEGreen<'db>) -> Self {
3248        Self(value.0)
3249    }
3250}
3251impl<'db> From<TerminalLTGreen<'db>> for BinaryOperatorGreen<'db> {
3252    fn from(value: TerminalLTGreen<'db>) -> Self {
3253        Self(value.0)
3254    }
3255}
3256impl<'db> From<TerminalGTGreen<'db>> for BinaryOperatorGreen<'db> {
3257    fn from(value: TerminalGTGreen<'db>) -> Self {
3258        Self(value.0)
3259    }
3260}
3261impl<'db> From<TerminalDotDotGreen<'db>> for BinaryOperatorGreen<'db> {
3262    fn from(value: TerminalDotDotGreen<'db>) -> Self {
3263        Self(value.0)
3264    }
3265}
3266impl<'db> From<TerminalDotDotEqGreen<'db>> for BinaryOperatorGreen<'db> {
3267    fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
3268        Self(value.0)
3269    }
3270}
3271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3272pub struct BinaryOperatorGreen<'db>(pub GreenId<'db>);
3273impl<'db> TypedSyntaxNode<'db> for BinaryOperator<'db> {
3274    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3275    type StablePtr = BinaryOperatorPtr<'db>;
3276    type Green = BinaryOperatorGreen<'db>;
3277    fn missing(db: &'db dyn Database) -> Self::Green {
3278        panic!("No missing variant.");
3279    }
3280    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3281        let kind = node.kind(db);
3282        match kind {
3283            SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3284            SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3285            SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3286            SyntaxKind::TerminalMulEq => {
3287                BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3288            }
3289            SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3290            SyntaxKind::TerminalDivEq => {
3291                BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3292            }
3293            SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3294            SyntaxKind::TerminalModEq => {
3295                BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3296            }
3297            SyntaxKind::TerminalPlus => {
3298                BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3299            }
3300            SyntaxKind::TerminalPlusEq => {
3301                BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3302            }
3303            SyntaxKind::TerminalMinus => {
3304                BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3305            }
3306            SyntaxKind::TerminalMinusEq => {
3307                BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3308            }
3309            SyntaxKind::TerminalEqEq => {
3310                BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3311            }
3312            SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3313            SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3314            SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3315            SyntaxKind::TerminalAndAnd => {
3316                BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3317            }
3318            SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3319            SyntaxKind::TerminalOrOr => {
3320                BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3321            }
3322            SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3323            SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3324            SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3325            SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3326            SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3327            SyntaxKind::TerminalDotDot => {
3328                BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3329            }
3330            SyntaxKind::TerminalDotDotEq => {
3331                BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3332            }
3333            _ => {
3334                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3335            }
3336        }
3337    }
3338    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3339        let kind = node.kind(db);
3340        match kind {
3341            SyntaxKind::TerminalDot => {
3342                Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3343            }
3344            SyntaxKind::TerminalNot => {
3345                Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3346            }
3347            SyntaxKind::TerminalMul => {
3348                Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3349            }
3350            SyntaxKind::TerminalMulEq => {
3351                Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3352            }
3353            SyntaxKind::TerminalDiv => {
3354                Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3355            }
3356            SyntaxKind::TerminalDivEq => {
3357                Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3358            }
3359            SyntaxKind::TerminalMod => {
3360                Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3361            }
3362            SyntaxKind::TerminalModEq => {
3363                Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3364            }
3365            SyntaxKind::TerminalPlus => {
3366                Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3367            }
3368            SyntaxKind::TerminalPlusEq => {
3369                Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3370            }
3371            SyntaxKind::TerminalMinus => {
3372                Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3373            }
3374            SyntaxKind::TerminalMinusEq => {
3375                Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3376            }
3377            SyntaxKind::TerminalEqEq => {
3378                Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3379            }
3380            SyntaxKind::TerminalNeq => {
3381                Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3382            }
3383            SyntaxKind::TerminalEq => {
3384                Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3385            }
3386            SyntaxKind::TerminalAnd => {
3387                Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3388            }
3389            SyntaxKind::TerminalAndAnd => {
3390                Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3391            }
3392            SyntaxKind::TerminalOr => {
3393                Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3394            }
3395            SyntaxKind::TerminalOrOr => {
3396                Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3397            }
3398            SyntaxKind::TerminalXor => {
3399                Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3400            }
3401            SyntaxKind::TerminalLE => {
3402                Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3403            }
3404            SyntaxKind::TerminalGE => {
3405                Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3406            }
3407            SyntaxKind::TerminalLT => {
3408                Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3409            }
3410            SyntaxKind::TerminalGT => {
3411                Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3412            }
3413            SyntaxKind::TerminalDotDot => {
3414                Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3415            }
3416            SyntaxKind::TerminalDotDotEq => {
3417                Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3418            }
3419            _ => None,
3420        }
3421    }
3422    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3423        match self {
3424            BinaryOperator::Dot(x) => x.as_syntax_node(),
3425            BinaryOperator::Not(x) => x.as_syntax_node(),
3426            BinaryOperator::Mul(x) => x.as_syntax_node(),
3427            BinaryOperator::MulEq(x) => x.as_syntax_node(),
3428            BinaryOperator::Div(x) => x.as_syntax_node(),
3429            BinaryOperator::DivEq(x) => x.as_syntax_node(),
3430            BinaryOperator::Mod(x) => x.as_syntax_node(),
3431            BinaryOperator::ModEq(x) => x.as_syntax_node(),
3432            BinaryOperator::Plus(x) => x.as_syntax_node(),
3433            BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3434            BinaryOperator::Minus(x) => x.as_syntax_node(),
3435            BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3436            BinaryOperator::EqEq(x) => x.as_syntax_node(),
3437            BinaryOperator::Neq(x) => x.as_syntax_node(),
3438            BinaryOperator::Eq(x) => x.as_syntax_node(),
3439            BinaryOperator::And(x) => x.as_syntax_node(),
3440            BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3441            BinaryOperator::Or(x) => x.as_syntax_node(),
3442            BinaryOperator::OrOr(x) => x.as_syntax_node(),
3443            BinaryOperator::Xor(x) => x.as_syntax_node(),
3444            BinaryOperator::LE(x) => x.as_syntax_node(),
3445            BinaryOperator::GE(x) => x.as_syntax_node(),
3446            BinaryOperator::LT(x) => x.as_syntax_node(),
3447            BinaryOperator::GT(x) => x.as_syntax_node(),
3448            BinaryOperator::DotDot(x) => x.as_syntax_node(),
3449            BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3450        }
3451    }
3452    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3453        BinaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
3454    }
3455}
3456impl<'db> BinaryOperator<'db> {
3457    /// Checks if a kind of a variant of [BinaryOperator].
3458    pub fn is_variant(kind: SyntaxKind) -> bool {
3459        matches!(
3460            kind,
3461            SyntaxKind::TerminalDot
3462                | SyntaxKind::TerminalNot
3463                | SyntaxKind::TerminalMul
3464                | SyntaxKind::TerminalMulEq
3465                | SyntaxKind::TerminalDiv
3466                | SyntaxKind::TerminalDivEq
3467                | SyntaxKind::TerminalMod
3468                | SyntaxKind::TerminalModEq
3469                | SyntaxKind::TerminalPlus
3470                | SyntaxKind::TerminalPlusEq
3471                | SyntaxKind::TerminalMinus
3472                | SyntaxKind::TerminalMinusEq
3473                | SyntaxKind::TerminalEqEq
3474                | SyntaxKind::TerminalNeq
3475                | SyntaxKind::TerminalEq
3476                | SyntaxKind::TerminalAnd
3477                | SyntaxKind::TerminalAndAnd
3478                | SyntaxKind::TerminalOr
3479                | SyntaxKind::TerminalOrOr
3480                | SyntaxKind::TerminalXor
3481                | SyntaxKind::TerminalLE
3482                | SyntaxKind::TerminalGE
3483                | SyntaxKind::TerminalLT
3484                | SyntaxKind::TerminalGT
3485                | SyntaxKind::TerminalDotDot
3486                | SyntaxKind::TerminalDotDotEq
3487        )
3488    }
3489}
3490#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3491pub struct ExprListParenthesized<'db> {
3492    node: SyntaxNode<'db>,
3493}
3494impl<'db> ExprListParenthesized<'db> {
3495    pub const INDEX_LPAREN: usize = 0;
3496    pub const INDEX_EXPRESSIONS: usize = 1;
3497    pub const INDEX_RPAREN: usize = 2;
3498    pub fn new_green(
3499        db: &'db dyn Database,
3500        lparen: TerminalLParenGreen<'db>,
3501        expressions: ExprListGreen<'db>,
3502        rparen: TerminalRParenGreen<'db>,
3503    ) -> ExprListParenthesizedGreen<'db> {
3504        let children = [lparen.0, expressions.0, rparen.0];
3505        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3506        ExprListParenthesizedGreen(
3507            GreenNode {
3508                kind: SyntaxKind::ExprListParenthesized,
3509                details: GreenNodeDetails::Node { children: children.into(), width },
3510            }
3511            .intern(db),
3512        )
3513    }
3514}
3515impl<'db> ExprListParenthesized<'db> {
3516    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3517        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3518    }
3519    pub fn expressions(&self, db: &'db dyn Database) -> ExprList<'db> {
3520        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3521    }
3522    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3523        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3524    }
3525}
3526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3527pub struct ExprListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3528impl<'db> ExprListParenthesizedPtr<'db> {}
3529impl<'db> TypedStablePtr<'db> for ExprListParenthesizedPtr<'db> {
3530    type SyntaxNode = ExprListParenthesized<'db>;
3531    fn untyped(self) -> SyntaxStablePtrId<'db> {
3532        self.0
3533    }
3534    fn lookup(&self, db: &'db dyn Database) -> ExprListParenthesized<'db> {
3535        ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3536    }
3537}
3538impl<'db> From<ExprListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3539    fn from(ptr: ExprListParenthesizedPtr<'db>) -> Self {
3540        ptr.untyped()
3541    }
3542}
3543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3544pub struct ExprListParenthesizedGreen<'db>(pub GreenId<'db>);
3545impl<'db> TypedSyntaxNode<'db> for ExprListParenthesized<'db> {
3546    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3547    type StablePtr = ExprListParenthesizedPtr<'db>;
3548    type Green = ExprListParenthesizedGreen<'db>;
3549    fn missing(db: &'db dyn Database) -> Self::Green {
3550        ExprListParenthesizedGreen(
3551            GreenNode {
3552                kind: SyntaxKind::ExprListParenthesized,
3553                details: GreenNodeDetails::Node {
3554                    children: [
3555                        TerminalLParen::missing(db).0,
3556                        ExprList::missing(db).0,
3557                        TerminalRParen::missing(db).0,
3558                    ]
3559                    .into(),
3560                    width: TextWidth::default(),
3561                },
3562            }
3563            .intern(db),
3564        )
3565    }
3566    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3567        let kind = node.kind(db);
3568        assert_eq!(
3569            kind,
3570            SyntaxKind::ExprListParenthesized,
3571            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3572            kind,
3573            SyntaxKind::ExprListParenthesized
3574        );
3575        Self { node }
3576    }
3577    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3578        let kind = node.kind(db);
3579        if kind == SyntaxKind::ExprListParenthesized {
3580            Some(Self::from_syntax_node(db, node))
3581        } else {
3582            None
3583        }
3584    }
3585    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3586        self.node
3587    }
3588    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3589        ExprListParenthesizedPtr(self.node.stable_ptr(db))
3590    }
3591}
3592#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3593pub struct ExprFunctionCall<'db> {
3594    node: SyntaxNode<'db>,
3595}
3596impl<'db> ExprFunctionCall<'db> {
3597    pub const INDEX_PATH: usize = 0;
3598    pub const INDEX_ARGUMENTS: usize = 1;
3599    pub fn new_green(
3600        db: &'db dyn Database,
3601        path: ExprPathGreen<'db>,
3602        arguments: ArgListParenthesizedGreen<'db>,
3603    ) -> ExprFunctionCallGreen<'db> {
3604        let children = [path.0, arguments.0];
3605        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3606        ExprFunctionCallGreen(
3607            GreenNode {
3608                kind: SyntaxKind::ExprFunctionCall,
3609                details: GreenNodeDetails::Node { children: children.into(), width },
3610            }
3611            .intern(db),
3612        )
3613    }
3614}
3615impl<'db> ExprFunctionCall<'db> {
3616    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3617        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3618    }
3619    pub fn arguments(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3620        ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3621    }
3622}
3623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3624pub struct ExprFunctionCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3625impl<'db> ExprFunctionCallPtr<'db> {}
3626impl<'db> TypedStablePtr<'db> for ExprFunctionCallPtr<'db> {
3627    type SyntaxNode = ExprFunctionCall<'db>;
3628    fn untyped(self) -> SyntaxStablePtrId<'db> {
3629        self.0
3630    }
3631    fn lookup(&self, db: &'db dyn Database) -> ExprFunctionCall<'db> {
3632        ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3633    }
3634}
3635impl<'db> From<ExprFunctionCallPtr<'db>> for SyntaxStablePtrId<'db> {
3636    fn from(ptr: ExprFunctionCallPtr<'db>) -> Self {
3637        ptr.untyped()
3638    }
3639}
3640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3641pub struct ExprFunctionCallGreen<'db>(pub GreenId<'db>);
3642impl<'db> TypedSyntaxNode<'db> for ExprFunctionCall<'db> {
3643    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3644    type StablePtr = ExprFunctionCallPtr<'db>;
3645    type Green = ExprFunctionCallGreen<'db>;
3646    fn missing(db: &'db dyn Database) -> Self::Green {
3647        ExprFunctionCallGreen(
3648            GreenNode {
3649                kind: SyntaxKind::ExprFunctionCall,
3650                details: GreenNodeDetails::Node {
3651                    children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3652                    width: TextWidth::default(),
3653                },
3654            }
3655            .intern(db),
3656        )
3657    }
3658    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3659        let kind = node.kind(db);
3660        assert_eq!(
3661            kind,
3662            SyntaxKind::ExprFunctionCall,
3663            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3664            kind,
3665            SyntaxKind::ExprFunctionCall
3666        );
3667        Self { node }
3668    }
3669    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3670        let kind = node.kind(db);
3671        if kind == SyntaxKind::ExprFunctionCall {
3672            Some(Self::from_syntax_node(db, node))
3673        } else {
3674            None
3675        }
3676    }
3677    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3678        self.node
3679    }
3680    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3681        ExprFunctionCallPtr(self.node.stable_ptr(db))
3682    }
3683}
3684#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3685pub struct ArgListParenthesized<'db> {
3686    node: SyntaxNode<'db>,
3687}
3688impl<'db> ArgListParenthesized<'db> {
3689    pub const INDEX_LPAREN: usize = 0;
3690    pub const INDEX_ARGUMENTS: usize = 1;
3691    pub const INDEX_RPAREN: usize = 2;
3692    pub fn new_green(
3693        db: &'db dyn Database,
3694        lparen: TerminalLParenGreen<'db>,
3695        arguments: ArgListGreen<'db>,
3696        rparen: TerminalRParenGreen<'db>,
3697    ) -> ArgListParenthesizedGreen<'db> {
3698        let children = [lparen.0, arguments.0, rparen.0];
3699        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3700        ArgListParenthesizedGreen(
3701            GreenNode {
3702                kind: SyntaxKind::ArgListParenthesized,
3703                details: GreenNodeDetails::Node { children: children.into(), width },
3704            }
3705            .intern(db),
3706        )
3707    }
3708}
3709impl<'db> ArgListParenthesized<'db> {
3710    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3711        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3712    }
3713    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
3714        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3715    }
3716    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3717        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3718    }
3719}
3720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3721pub struct ArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3722impl<'db> ArgListParenthesizedPtr<'db> {}
3723impl<'db> TypedStablePtr<'db> for ArgListParenthesizedPtr<'db> {
3724    type SyntaxNode = ArgListParenthesized<'db>;
3725    fn untyped(self) -> SyntaxStablePtrId<'db> {
3726        self.0
3727    }
3728    fn lookup(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3729        ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3730    }
3731}
3732impl<'db> From<ArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3733    fn from(ptr: ArgListParenthesizedPtr<'db>) -> Self {
3734        ptr.untyped()
3735    }
3736}
3737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3738pub struct ArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3739impl<'db> TypedSyntaxNode<'db> for ArgListParenthesized<'db> {
3740    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3741    type StablePtr = ArgListParenthesizedPtr<'db>;
3742    type Green = ArgListParenthesizedGreen<'db>;
3743    fn missing(db: &'db dyn Database) -> Self::Green {
3744        ArgListParenthesizedGreen(
3745            GreenNode {
3746                kind: SyntaxKind::ArgListParenthesized,
3747                details: GreenNodeDetails::Node {
3748                    children: [
3749                        TerminalLParen::missing(db).0,
3750                        ArgList::missing(db).0,
3751                        TerminalRParen::missing(db).0,
3752                    ]
3753                    .into(),
3754                    width: TextWidth::default(),
3755                },
3756            }
3757            .intern(db),
3758        )
3759    }
3760    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3761        let kind = node.kind(db);
3762        assert_eq!(
3763            kind,
3764            SyntaxKind::ArgListParenthesized,
3765            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3766            kind,
3767            SyntaxKind::ArgListParenthesized
3768        );
3769        Self { node }
3770    }
3771    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3772        let kind = node.kind(db);
3773        if kind == SyntaxKind::ArgListParenthesized {
3774            Some(Self::from_syntax_node(db, node))
3775        } else {
3776            None
3777        }
3778    }
3779    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3780        self.node
3781    }
3782    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3783        ArgListParenthesizedPtr(self.node.stable_ptr(db))
3784    }
3785}
3786#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3787pub enum OptionArgListParenthesized<'db> {
3788    Empty(OptionArgListParenthesizedEmpty<'db>),
3789    ArgListParenthesized(ArgListParenthesized<'db>),
3790}
3791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3792pub struct OptionArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3793impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedPtr<'db> {
3794    type SyntaxNode = OptionArgListParenthesized<'db>;
3795    fn untyped(self) -> SyntaxStablePtrId<'db> {
3796        self.0
3797    }
3798    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3799        OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3800    }
3801}
3802impl<'db> From<OptionArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3803    fn from(ptr: OptionArgListParenthesizedPtr<'db>) -> Self {
3804        ptr.untyped()
3805    }
3806}
3807impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3808    fn from(value: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3809        Self(value.0)
3810    }
3811}
3812impl<'db> From<ArgListParenthesizedPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3813    fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
3814        Self(value.0)
3815    }
3816}
3817impl<'db> From<OptionArgListParenthesizedEmptyGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3818    fn from(value: OptionArgListParenthesizedEmptyGreen<'db>) -> Self {
3819        Self(value.0)
3820    }
3821}
3822impl<'db> From<ArgListParenthesizedGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3823    fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
3824        Self(value.0)
3825    }
3826}
3827#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3828pub struct OptionArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3829impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesized<'db> {
3830    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3831    type StablePtr = OptionArgListParenthesizedPtr<'db>;
3832    type Green = OptionArgListParenthesizedGreen<'db>;
3833    fn missing(db: &'db dyn Database) -> Self::Green {
3834        panic!("No missing variant.");
3835    }
3836    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3837        let kind = node.kind(db);
3838        match kind {
3839            SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3840                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3841            ),
3842            SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3843                ArgListParenthesized::from_syntax_node(db, node),
3844            ),
3845            _ => panic!(
3846                "Unexpected syntax kind {:?} when constructing {}.",
3847                kind, "OptionArgListParenthesized"
3848            ),
3849        }
3850    }
3851    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3852        let kind = node.kind(db);
3853        match kind {
3854            SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3855                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3856            )),
3857            SyntaxKind::ArgListParenthesized => {
3858                Some(OptionArgListParenthesized::ArgListParenthesized(
3859                    ArgListParenthesized::from_syntax_node(db, node),
3860                ))
3861            }
3862            _ => None,
3863        }
3864    }
3865    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3866        match self {
3867            OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3868            OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3869        }
3870    }
3871    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3872        OptionArgListParenthesizedPtr(self.as_syntax_node().stable_ptr(db))
3873    }
3874}
3875impl<'db> OptionArgListParenthesized<'db> {
3876    /// Checks if a kind of a variant of [OptionArgListParenthesized].
3877    pub fn is_variant(kind: SyntaxKind) -> bool {
3878        matches!(
3879            kind,
3880            SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3881        )
3882    }
3883}
3884#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3885pub struct OptionArgListParenthesizedEmpty<'db> {
3886    node: SyntaxNode<'db>,
3887}
3888impl<'db> OptionArgListParenthesizedEmpty<'db> {
3889    pub fn new_green(db: &'db dyn Database) -> OptionArgListParenthesizedEmptyGreen<'db> {
3890        let children = [];
3891        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3892        OptionArgListParenthesizedEmptyGreen(
3893            GreenNode {
3894                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3895                details: GreenNodeDetails::Node { children: children.into(), width },
3896            }
3897            .intern(db),
3898        )
3899    }
3900}
3901impl<'db> OptionArgListParenthesizedEmpty<'db> {}
3902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3903pub struct OptionArgListParenthesizedEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
3904impl<'db> OptionArgListParenthesizedEmptyPtr<'db> {}
3905impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedEmptyPtr<'db> {
3906    type SyntaxNode = OptionArgListParenthesizedEmpty<'db>;
3907    fn untyped(self) -> SyntaxStablePtrId<'db> {
3908        self.0
3909    }
3910    fn lookup(&self, db: &'db dyn Database) -> OptionArgListParenthesizedEmpty<'db> {
3911        OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3912    }
3913}
3914impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
3915    fn from(ptr: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3916        ptr.untyped()
3917    }
3918}
3919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3920pub struct OptionArgListParenthesizedEmptyGreen<'db>(pub GreenId<'db>);
3921impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesizedEmpty<'db> {
3922    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3923    type StablePtr = OptionArgListParenthesizedEmptyPtr<'db>;
3924    type Green = OptionArgListParenthesizedEmptyGreen<'db>;
3925    fn missing(db: &'db dyn Database) -> Self::Green {
3926        OptionArgListParenthesizedEmptyGreen(
3927            GreenNode {
3928                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3929                details: GreenNodeDetails::Node {
3930                    children: [].into(),
3931                    width: TextWidth::default(),
3932                },
3933            }
3934            .intern(db),
3935        )
3936    }
3937    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3938        let kind = node.kind(db);
3939        assert_eq!(
3940            kind,
3941            SyntaxKind::OptionArgListParenthesizedEmpty,
3942            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3943            kind,
3944            SyntaxKind::OptionArgListParenthesizedEmpty
3945        );
3946        Self { node }
3947    }
3948    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3949        let kind = node.kind(db);
3950        if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3951            Some(Self::from_syntax_node(db, node))
3952        } else {
3953            None
3954        }
3955    }
3956    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3957        self.node
3958    }
3959    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3960        OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3961    }
3962}
3963#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3964pub struct ExprStructCtorCall<'db> {
3965    node: SyntaxNode<'db>,
3966}
3967impl<'db> ExprStructCtorCall<'db> {
3968    pub const INDEX_PATH: usize = 0;
3969    pub const INDEX_ARGUMENTS: usize = 1;
3970    pub fn new_green(
3971        db: &'db dyn Database,
3972        path: ExprPathGreen<'db>,
3973        arguments: StructArgListBracedGreen<'db>,
3974    ) -> ExprStructCtorCallGreen<'db> {
3975        let children = [path.0, arguments.0];
3976        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3977        ExprStructCtorCallGreen(
3978            GreenNode {
3979                kind: SyntaxKind::ExprStructCtorCall,
3980                details: GreenNodeDetails::Node { children: children.into(), width },
3981            }
3982            .intern(db),
3983        )
3984    }
3985}
3986impl<'db> ExprStructCtorCall<'db> {
3987    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3988        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3989    }
3990    pub fn arguments(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
3991        StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
3992    }
3993}
3994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3995pub struct ExprStructCtorCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3996impl<'db> ExprStructCtorCallPtr<'db> {}
3997impl<'db> TypedStablePtr<'db> for ExprStructCtorCallPtr<'db> {
3998    type SyntaxNode = ExprStructCtorCall<'db>;
3999    fn untyped(self) -> SyntaxStablePtrId<'db> {
4000        self.0
4001    }
4002    fn lookup(&self, db: &'db dyn Database) -> ExprStructCtorCall<'db> {
4003        ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
4004    }
4005}
4006impl<'db> From<ExprStructCtorCallPtr<'db>> for SyntaxStablePtrId<'db> {
4007    fn from(ptr: ExprStructCtorCallPtr<'db>) -> Self {
4008        ptr.untyped()
4009    }
4010}
4011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4012pub struct ExprStructCtorCallGreen<'db>(pub GreenId<'db>);
4013impl<'db> TypedSyntaxNode<'db> for ExprStructCtorCall<'db> {
4014    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
4015    type StablePtr = ExprStructCtorCallPtr<'db>;
4016    type Green = ExprStructCtorCallGreen<'db>;
4017    fn missing(db: &'db dyn Database) -> Self::Green {
4018        ExprStructCtorCallGreen(
4019            GreenNode {
4020                kind: SyntaxKind::ExprStructCtorCall,
4021                details: GreenNodeDetails::Node {
4022                    children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4023                    width: TextWidth::default(),
4024                },
4025            }
4026            .intern(db),
4027        )
4028    }
4029    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4030        let kind = node.kind(db);
4031        assert_eq!(
4032            kind,
4033            SyntaxKind::ExprStructCtorCall,
4034            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4035            kind,
4036            SyntaxKind::ExprStructCtorCall
4037        );
4038        Self { node }
4039    }
4040    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4041        let kind = node.kind(db);
4042        if kind == SyntaxKind::ExprStructCtorCall {
4043            Some(Self::from_syntax_node(db, node))
4044        } else {
4045            None
4046        }
4047    }
4048    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4049        self.node
4050    }
4051    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4052        ExprStructCtorCallPtr(self.node.stable_ptr(db))
4053    }
4054}
4055#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4056pub struct StructArgListBraced<'db> {
4057    node: SyntaxNode<'db>,
4058}
4059impl<'db> StructArgListBraced<'db> {
4060    pub const INDEX_LBRACE: usize = 0;
4061    pub const INDEX_ARGUMENTS: usize = 1;
4062    pub const INDEX_RBRACE: usize = 2;
4063    pub fn new_green(
4064        db: &'db dyn Database,
4065        lbrace: TerminalLBraceGreen<'db>,
4066        arguments: StructArgListGreen<'db>,
4067        rbrace: TerminalRBraceGreen<'db>,
4068    ) -> StructArgListBracedGreen<'db> {
4069        let children = [lbrace.0, arguments.0, rbrace.0];
4070        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4071        StructArgListBracedGreen(
4072            GreenNode {
4073                kind: SyntaxKind::StructArgListBraced,
4074                details: GreenNodeDetails::Node { children: children.into(), width },
4075            }
4076            .intern(db),
4077        )
4078    }
4079}
4080impl<'db> StructArgListBraced<'db> {
4081    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4082        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4083    }
4084    pub fn arguments(&self, db: &'db dyn Database) -> StructArgList<'db> {
4085        StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4086    }
4087    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4088        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4089    }
4090}
4091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4092pub struct StructArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
4093impl<'db> StructArgListBracedPtr<'db> {}
4094impl<'db> TypedStablePtr<'db> for StructArgListBracedPtr<'db> {
4095    type SyntaxNode = StructArgListBraced<'db>;
4096    fn untyped(self) -> SyntaxStablePtrId<'db> {
4097        self.0
4098    }
4099    fn lookup(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4100        StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4101    }
4102}
4103impl<'db> From<StructArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
4104    fn from(ptr: StructArgListBracedPtr<'db>) -> Self {
4105        ptr.untyped()
4106    }
4107}
4108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4109pub struct StructArgListBracedGreen<'db>(pub GreenId<'db>);
4110impl<'db> TypedSyntaxNode<'db> for StructArgListBraced<'db> {
4111    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4112    type StablePtr = StructArgListBracedPtr<'db>;
4113    type Green = StructArgListBracedGreen<'db>;
4114    fn missing(db: &'db dyn Database) -> Self::Green {
4115        StructArgListBracedGreen(
4116            GreenNode {
4117                kind: SyntaxKind::StructArgListBraced,
4118                details: GreenNodeDetails::Node {
4119                    children: [
4120                        TerminalLBrace::missing(db).0,
4121                        StructArgList::missing(db).0,
4122                        TerminalRBrace::missing(db).0,
4123                    ]
4124                    .into(),
4125                    width: TextWidth::default(),
4126                },
4127            }
4128            .intern(db),
4129        )
4130    }
4131    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4132        let kind = node.kind(db);
4133        assert_eq!(
4134            kind,
4135            SyntaxKind::StructArgListBraced,
4136            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4137            kind,
4138            SyntaxKind::StructArgListBraced
4139        );
4140        Self { node }
4141    }
4142    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4143        let kind = node.kind(db);
4144        if kind == SyntaxKind::StructArgListBraced {
4145            Some(Self::from_syntax_node(db, node))
4146        } else {
4147            None
4148        }
4149    }
4150    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4151        self.node
4152    }
4153    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4154        StructArgListBracedPtr(self.node.stable_ptr(db))
4155    }
4156}
4157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4158pub struct ExprBlock<'db> {
4159    node: SyntaxNode<'db>,
4160}
4161impl<'db> ExprBlock<'db> {
4162    pub const INDEX_LBRACE: usize = 0;
4163    pub const INDEX_STATEMENTS: usize = 1;
4164    pub const INDEX_RBRACE: usize = 2;
4165    pub fn new_green(
4166        db: &'db dyn Database,
4167        lbrace: TerminalLBraceGreen<'db>,
4168        statements: StatementListGreen<'db>,
4169        rbrace: TerminalRBraceGreen<'db>,
4170    ) -> ExprBlockGreen<'db> {
4171        let children = [lbrace.0, statements.0, rbrace.0];
4172        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4173        ExprBlockGreen(
4174            GreenNode {
4175                kind: SyntaxKind::ExprBlock,
4176                details: GreenNodeDetails::Node { children: children.into(), width },
4177            }
4178            .intern(db),
4179        )
4180    }
4181}
4182impl<'db> ExprBlock<'db> {
4183    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4184        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4185    }
4186    pub fn statements(&self, db: &'db dyn Database) -> StatementList<'db> {
4187        StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4188    }
4189    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4190        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4191    }
4192}
4193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4194pub struct ExprBlockPtr<'db>(pub SyntaxStablePtrId<'db>);
4195impl<'db> ExprBlockPtr<'db> {}
4196impl<'db> TypedStablePtr<'db> for ExprBlockPtr<'db> {
4197    type SyntaxNode = ExprBlock<'db>;
4198    fn untyped(self) -> SyntaxStablePtrId<'db> {
4199        self.0
4200    }
4201    fn lookup(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4202        ExprBlock::from_syntax_node(db, self.0.lookup(db))
4203    }
4204}
4205impl<'db> From<ExprBlockPtr<'db>> for SyntaxStablePtrId<'db> {
4206    fn from(ptr: ExprBlockPtr<'db>) -> Self {
4207        ptr.untyped()
4208    }
4209}
4210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4211pub struct ExprBlockGreen<'db>(pub GreenId<'db>);
4212impl<'db> TypedSyntaxNode<'db> for ExprBlock<'db> {
4213    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4214    type StablePtr = ExprBlockPtr<'db>;
4215    type Green = ExprBlockGreen<'db>;
4216    fn missing(db: &'db dyn Database) -> Self::Green {
4217        ExprBlockGreen(
4218            GreenNode {
4219                kind: SyntaxKind::ExprBlock,
4220                details: GreenNodeDetails::Node {
4221                    children: [
4222                        TerminalLBrace::missing(db).0,
4223                        StatementList::missing(db).0,
4224                        TerminalRBrace::missing(db).0,
4225                    ]
4226                    .into(),
4227                    width: TextWidth::default(),
4228                },
4229            }
4230            .intern(db),
4231        )
4232    }
4233    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4234        let kind = node.kind(db);
4235        assert_eq!(
4236            kind,
4237            SyntaxKind::ExprBlock,
4238            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4239            kind,
4240            SyntaxKind::ExprBlock
4241        );
4242        Self { node }
4243    }
4244    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4245        let kind = node.kind(db);
4246        if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4247    }
4248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4249        self.node
4250    }
4251    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4252        ExprBlockPtr(self.node.stable_ptr(db))
4253    }
4254}
4255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4256pub struct ExprMatch<'db> {
4257    node: SyntaxNode<'db>,
4258}
4259impl<'db> ExprMatch<'db> {
4260    pub const INDEX_MATCH_KW: usize = 0;
4261    pub const INDEX_EXPR: usize = 1;
4262    pub const INDEX_LBRACE: usize = 2;
4263    pub const INDEX_ARMS: usize = 3;
4264    pub const INDEX_RBRACE: usize = 4;
4265    pub fn new_green(
4266        db: &'db dyn Database,
4267        match_kw: TerminalMatchGreen<'db>,
4268        expr: ExprGreen<'db>,
4269        lbrace: TerminalLBraceGreen<'db>,
4270        arms: MatchArmsGreen<'db>,
4271        rbrace: TerminalRBraceGreen<'db>,
4272    ) -> ExprMatchGreen<'db> {
4273        let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4274        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4275        ExprMatchGreen(
4276            GreenNode {
4277                kind: SyntaxKind::ExprMatch,
4278                details: GreenNodeDetails::Node { children: children.into(), width },
4279            }
4280            .intern(db),
4281        )
4282    }
4283}
4284impl<'db> ExprMatch<'db> {
4285    pub fn match_kw(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
4286        TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4287    }
4288    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4289        Expr::from_syntax_node(db, self.node.get_children(db)[1])
4290    }
4291    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4292        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4293    }
4294    pub fn arms(&self, db: &'db dyn Database) -> MatchArms<'db> {
4295        MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4296    }
4297    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4298        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4299    }
4300}
4301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4302pub struct ExprMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
4303impl<'db> ExprMatchPtr<'db> {}
4304impl<'db> TypedStablePtr<'db> for ExprMatchPtr<'db> {
4305    type SyntaxNode = ExprMatch<'db>;
4306    fn untyped(self) -> SyntaxStablePtrId<'db> {
4307        self.0
4308    }
4309    fn lookup(&self, db: &'db dyn Database) -> ExprMatch<'db> {
4310        ExprMatch::from_syntax_node(db, self.0.lookup(db))
4311    }
4312}
4313impl<'db> From<ExprMatchPtr<'db>> for SyntaxStablePtrId<'db> {
4314    fn from(ptr: ExprMatchPtr<'db>) -> Self {
4315        ptr.untyped()
4316    }
4317}
4318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4319pub struct ExprMatchGreen<'db>(pub GreenId<'db>);
4320impl<'db> TypedSyntaxNode<'db> for ExprMatch<'db> {
4321    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4322    type StablePtr = ExprMatchPtr<'db>;
4323    type Green = ExprMatchGreen<'db>;
4324    fn missing(db: &'db dyn Database) -> Self::Green {
4325        ExprMatchGreen(
4326            GreenNode {
4327                kind: SyntaxKind::ExprMatch,
4328                details: GreenNodeDetails::Node {
4329                    children: [
4330                        TerminalMatch::missing(db).0,
4331                        Expr::missing(db).0,
4332                        TerminalLBrace::missing(db).0,
4333                        MatchArms::missing(db).0,
4334                        TerminalRBrace::missing(db).0,
4335                    ]
4336                    .into(),
4337                    width: TextWidth::default(),
4338                },
4339            }
4340            .intern(db),
4341        )
4342    }
4343    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4344        let kind = node.kind(db);
4345        assert_eq!(
4346            kind,
4347            SyntaxKind::ExprMatch,
4348            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4349            kind,
4350            SyntaxKind::ExprMatch
4351        );
4352        Self { node }
4353    }
4354    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4355        let kind = node.kind(db);
4356        if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4357    }
4358    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4359        self.node
4360    }
4361    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4362        ExprMatchPtr(self.node.stable_ptr(db))
4363    }
4364}
4365#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4366pub struct MatchArms<'db>(ElementList<'db, MatchArm<'db>, 2>);
4367impl<'db> Deref for MatchArms<'db> {
4368    type Target = ElementList<'db, MatchArm<'db>, 2>;
4369    fn deref(&self) -> &Self::Target {
4370        &self.0
4371    }
4372}
4373impl<'db> MatchArms<'db> {
4374    pub fn new_green(
4375        db: &'db dyn Database,
4376        children: &[MatchArmsElementOrSeparatorGreen<'db>],
4377    ) -> MatchArmsGreen<'db> {
4378        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4379        MatchArmsGreen(
4380            GreenNode {
4381                kind: SyntaxKind::MatchArms,
4382                details: GreenNodeDetails::Node {
4383                    children: children.iter().map(|x| x.id()).collect(),
4384                    width,
4385                },
4386            }
4387            .intern(db),
4388        )
4389    }
4390}
4391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4392pub struct MatchArmsPtr<'db>(pub SyntaxStablePtrId<'db>);
4393impl<'db> TypedStablePtr<'db> for MatchArmsPtr<'db> {
4394    type SyntaxNode = MatchArms<'db>;
4395    fn untyped(self) -> SyntaxStablePtrId<'db> {
4396        self.0
4397    }
4398    fn lookup(&self, db: &'db dyn Database) -> MatchArms<'db> {
4399        MatchArms::from_syntax_node(db, self.0.lookup(db))
4400    }
4401}
4402impl<'db> From<MatchArmsPtr<'db>> for SyntaxStablePtrId<'db> {
4403    fn from(ptr: MatchArmsPtr<'db>) -> Self {
4404        ptr.untyped()
4405    }
4406}
4407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4408pub enum MatchArmsElementOrSeparatorGreen<'db> {
4409    Separator(TerminalCommaGreen<'db>),
4410    Element(MatchArmGreen<'db>),
4411}
4412impl<'db> From<TerminalCommaGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4413    fn from(value: TerminalCommaGreen<'db>) -> Self {
4414        MatchArmsElementOrSeparatorGreen::Separator(value)
4415    }
4416}
4417impl<'db> From<MatchArmGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4418    fn from(value: MatchArmGreen<'db>) -> Self {
4419        MatchArmsElementOrSeparatorGreen::Element(value)
4420    }
4421}
4422impl<'db> MatchArmsElementOrSeparatorGreen<'db> {
4423    fn id(&self) -> GreenId<'db> {
4424        match self {
4425            MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4426            MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4427        }
4428    }
4429}
4430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4431pub struct MatchArmsGreen<'db>(pub GreenId<'db>);
4432impl<'db> TypedSyntaxNode<'db> for MatchArms<'db> {
4433    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4434    type StablePtr = MatchArmsPtr<'db>;
4435    type Green = MatchArmsGreen<'db>;
4436    fn missing(db: &'db dyn Database) -> Self::Green {
4437        MatchArmsGreen(
4438            GreenNode {
4439                kind: SyntaxKind::MatchArms,
4440                details: GreenNodeDetails::Node {
4441                    children: [].into(),
4442                    width: TextWidth::default(),
4443                },
4444            }
4445            .intern(db),
4446        )
4447    }
4448    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4449        Self(ElementList::new(node))
4450    }
4451    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4452        if node.kind(db) == SyntaxKind::MatchArms {
4453            Some(Self(ElementList::new(node)))
4454        } else {
4455            None
4456        }
4457    }
4458    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4459        self.node
4460    }
4461    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4462        MatchArmsPtr(self.node.stable_ptr(db))
4463    }
4464}
4465#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4466pub struct MatchArm<'db> {
4467    node: SyntaxNode<'db>,
4468}
4469impl<'db> MatchArm<'db> {
4470    pub const INDEX_PATTERNS: usize = 0;
4471    pub const INDEX_ARROW: usize = 1;
4472    pub const INDEX_EXPRESSION: usize = 2;
4473    pub fn new_green(
4474        db: &'db dyn Database,
4475        patterns: PatternListOrGreen<'db>,
4476        arrow: TerminalMatchArrowGreen<'db>,
4477        expression: ExprGreen<'db>,
4478    ) -> MatchArmGreen<'db> {
4479        let children = [patterns.0, arrow.0, expression.0];
4480        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4481        MatchArmGreen(
4482            GreenNode {
4483                kind: SyntaxKind::MatchArm,
4484                details: GreenNodeDetails::Node { children: children.into(), width },
4485            }
4486            .intern(db),
4487        )
4488    }
4489}
4490impl<'db> MatchArm<'db> {
4491    pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4492        PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4493    }
4494    pub fn arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
4495        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4496    }
4497    pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
4498        Expr::from_syntax_node(db, self.node.get_children(db)[2])
4499    }
4500}
4501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4502pub struct MatchArmPtr<'db>(pub SyntaxStablePtrId<'db>);
4503impl<'db> MatchArmPtr<'db> {}
4504impl<'db> TypedStablePtr<'db> for MatchArmPtr<'db> {
4505    type SyntaxNode = MatchArm<'db>;
4506    fn untyped(self) -> SyntaxStablePtrId<'db> {
4507        self.0
4508    }
4509    fn lookup(&self, db: &'db dyn Database) -> MatchArm<'db> {
4510        MatchArm::from_syntax_node(db, self.0.lookup(db))
4511    }
4512}
4513impl<'db> From<MatchArmPtr<'db>> for SyntaxStablePtrId<'db> {
4514    fn from(ptr: MatchArmPtr<'db>) -> Self {
4515        ptr.untyped()
4516    }
4517}
4518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4519pub struct MatchArmGreen<'db>(pub GreenId<'db>);
4520impl<'db> TypedSyntaxNode<'db> for MatchArm<'db> {
4521    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4522    type StablePtr = MatchArmPtr<'db>;
4523    type Green = MatchArmGreen<'db>;
4524    fn missing(db: &'db dyn Database) -> Self::Green {
4525        MatchArmGreen(
4526            GreenNode {
4527                kind: SyntaxKind::MatchArm,
4528                details: GreenNodeDetails::Node {
4529                    children: [
4530                        PatternListOr::missing(db).0,
4531                        TerminalMatchArrow::missing(db).0,
4532                        Expr::missing(db).0,
4533                    ]
4534                    .into(),
4535                    width: TextWidth::default(),
4536                },
4537            }
4538            .intern(db),
4539        )
4540    }
4541    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4542        let kind = node.kind(db);
4543        assert_eq!(
4544            kind,
4545            SyntaxKind::MatchArm,
4546            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4547            kind,
4548            SyntaxKind::MatchArm
4549        );
4550        Self { node }
4551    }
4552    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4553        let kind = node.kind(db);
4554        if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4555    }
4556    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4557        self.node
4558    }
4559    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4560        MatchArmPtr(self.node.stable_ptr(db))
4561    }
4562}
4563#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4564pub struct ExprIf<'db> {
4565    node: SyntaxNode<'db>,
4566}
4567impl<'db> ExprIf<'db> {
4568    pub const INDEX_IF_KW: usize = 0;
4569    pub const INDEX_CONDITIONS: usize = 1;
4570    pub const INDEX_IF_BLOCK: usize = 2;
4571    pub const INDEX_ELSE_CLAUSE: usize = 3;
4572    pub fn new_green(
4573        db: &'db dyn Database,
4574        if_kw: TerminalIfGreen<'db>,
4575        conditions: ConditionListAndGreen<'db>,
4576        if_block: ExprBlockGreen<'db>,
4577        else_clause: OptionElseClauseGreen<'db>,
4578    ) -> ExprIfGreen<'db> {
4579        let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4580        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4581        ExprIfGreen(
4582            GreenNode {
4583                kind: SyntaxKind::ExprIf,
4584                details: GreenNodeDetails::Node { children: children.into(), width },
4585            }
4586            .intern(db),
4587        )
4588    }
4589}
4590impl<'db> ExprIf<'db> {
4591    pub fn if_kw(&self, db: &'db dyn Database) -> TerminalIf<'db> {
4592        TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4593    }
4594    pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4595        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4596    }
4597    pub fn if_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4598        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4599    }
4600    pub fn else_clause(&self, db: &'db dyn Database) -> OptionElseClause<'db> {
4601        OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4602    }
4603}
4604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4605pub struct ExprIfPtr<'db>(pub SyntaxStablePtrId<'db>);
4606impl<'db> ExprIfPtr<'db> {}
4607impl<'db> TypedStablePtr<'db> for ExprIfPtr<'db> {
4608    type SyntaxNode = ExprIf<'db>;
4609    fn untyped(self) -> SyntaxStablePtrId<'db> {
4610        self.0
4611    }
4612    fn lookup(&self, db: &'db dyn Database) -> ExprIf<'db> {
4613        ExprIf::from_syntax_node(db, self.0.lookup(db))
4614    }
4615}
4616impl<'db> From<ExprIfPtr<'db>> for SyntaxStablePtrId<'db> {
4617    fn from(ptr: ExprIfPtr<'db>) -> Self {
4618        ptr.untyped()
4619    }
4620}
4621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4622pub struct ExprIfGreen<'db>(pub GreenId<'db>);
4623impl<'db> TypedSyntaxNode<'db> for ExprIf<'db> {
4624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4625    type StablePtr = ExprIfPtr<'db>;
4626    type Green = ExprIfGreen<'db>;
4627    fn missing(db: &'db dyn Database) -> Self::Green {
4628        ExprIfGreen(
4629            GreenNode {
4630                kind: SyntaxKind::ExprIf,
4631                details: GreenNodeDetails::Node {
4632                    children: [
4633                        TerminalIf::missing(db).0,
4634                        ConditionListAnd::missing(db).0,
4635                        ExprBlock::missing(db).0,
4636                        OptionElseClause::missing(db).0,
4637                    ]
4638                    .into(),
4639                    width: TextWidth::default(),
4640                },
4641            }
4642            .intern(db),
4643        )
4644    }
4645    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4646        let kind = node.kind(db);
4647        assert_eq!(
4648            kind,
4649            SyntaxKind::ExprIf,
4650            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4651            kind,
4652            SyntaxKind::ExprIf
4653        );
4654        Self { node }
4655    }
4656    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4657        let kind = node.kind(db);
4658        if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4659    }
4660    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4661        self.node
4662    }
4663    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4664        ExprIfPtr(self.node.stable_ptr(db))
4665    }
4666}
4667#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4668pub struct ConditionListAnd<'db>(ElementList<'db, Condition<'db>, 2>);
4669impl<'db> Deref for ConditionListAnd<'db> {
4670    type Target = ElementList<'db, Condition<'db>, 2>;
4671    fn deref(&self) -> &Self::Target {
4672        &self.0
4673    }
4674}
4675impl<'db> ConditionListAnd<'db> {
4676    pub fn new_green(
4677        db: &'db dyn Database,
4678        children: &[ConditionListAndElementOrSeparatorGreen<'db>],
4679    ) -> ConditionListAndGreen<'db> {
4680        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4681        ConditionListAndGreen(
4682            GreenNode {
4683                kind: SyntaxKind::ConditionListAnd,
4684                details: GreenNodeDetails::Node {
4685                    children: children.iter().map(|x| x.id()).collect(),
4686                    width,
4687                },
4688            }
4689            .intern(db),
4690        )
4691    }
4692}
4693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4694pub struct ConditionListAndPtr<'db>(pub SyntaxStablePtrId<'db>);
4695impl<'db> TypedStablePtr<'db> for ConditionListAndPtr<'db> {
4696    type SyntaxNode = ConditionListAnd<'db>;
4697    fn untyped(self) -> SyntaxStablePtrId<'db> {
4698        self.0
4699    }
4700    fn lookup(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4701        ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4702    }
4703}
4704impl<'db> From<ConditionListAndPtr<'db>> for SyntaxStablePtrId<'db> {
4705    fn from(ptr: ConditionListAndPtr<'db>) -> Self {
4706        ptr.untyped()
4707    }
4708}
4709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4710pub enum ConditionListAndElementOrSeparatorGreen<'db> {
4711    Separator(TerminalAndAndGreen<'db>),
4712    Element(ConditionGreen<'db>),
4713}
4714impl<'db> From<TerminalAndAndGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4715    fn from(value: TerminalAndAndGreen<'db>) -> Self {
4716        ConditionListAndElementOrSeparatorGreen::Separator(value)
4717    }
4718}
4719impl<'db> From<ConditionGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4720    fn from(value: ConditionGreen<'db>) -> Self {
4721        ConditionListAndElementOrSeparatorGreen::Element(value)
4722    }
4723}
4724impl<'db> ConditionListAndElementOrSeparatorGreen<'db> {
4725    fn id(&self) -> GreenId<'db> {
4726        match self {
4727            ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4728            ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4729        }
4730    }
4731}
4732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4733pub struct ConditionListAndGreen<'db>(pub GreenId<'db>);
4734impl<'db> TypedSyntaxNode<'db> for ConditionListAnd<'db> {
4735    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4736    type StablePtr = ConditionListAndPtr<'db>;
4737    type Green = ConditionListAndGreen<'db>;
4738    fn missing(db: &'db dyn Database) -> Self::Green {
4739        ConditionListAndGreen(
4740            GreenNode {
4741                kind: SyntaxKind::ConditionListAnd,
4742                details: GreenNodeDetails::Node {
4743                    children: [].into(),
4744                    width: TextWidth::default(),
4745                },
4746            }
4747            .intern(db),
4748        )
4749    }
4750    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4751        Self(ElementList::new(node))
4752    }
4753    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4754        if node.kind(db) == SyntaxKind::ConditionListAnd {
4755            Some(Self(ElementList::new(node)))
4756        } else {
4757            None
4758        }
4759    }
4760    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4761        self.node
4762    }
4763    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4764        ConditionListAndPtr(self.node.stable_ptr(db))
4765    }
4766}
4767#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4768pub enum Condition<'db> {
4769    Let(ConditionLet<'db>),
4770    Expr(ConditionExpr<'db>),
4771}
4772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4773pub struct ConditionPtr<'db>(pub SyntaxStablePtrId<'db>);
4774impl<'db> TypedStablePtr<'db> for ConditionPtr<'db> {
4775    type SyntaxNode = Condition<'db>;
4776    fn untyped(self) -> SyntaxStablePtrId<'db> {
4777        self.0
4778    }
4779    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
4780        Condition::from_syntax_node(db, self.0.lookup(db))
4781    }
4782}
4783impl<'db> From<ConditionPtr<'db>> for SyntaxStablePtrId<'db> {
4784    fn from(ptr: ConditionPtr<'db>) -> Self {
4785        ptr.untyped()
4786    }
4787}
4788impl<'db> From<ConditionLetPtr<'db>> for ConditionPtr<'db> {
4789    fn from(value: ConditionLetPtr<'db>) -> Self {
4790        Self(value.0)
4791    }
4792}
4793impl<'db> From<ConditionExprPtr<'db>> for ConditionPtr<'db> {
4794    fn from(value: ConditionExprPtr<'db>) -> Self {
4795        Self(value.0)
4796    }
4797}
4798impl<'db> From<ConditionLetGreen<'db>> for ConditionGreen<'db> {
4799    fn from(value: ConditionLetGreen<'db>) -> Self {
4800        Self(value.0)
4801    }
4802}
4803impl<'db> From<ConditionExprGreen<'db>> for ConditionGreen<'db> {
4804    fn from(value: ConditionExprGreen<'db>) -> Self {
4805        Self(value.0)
4806    }
4807}
4808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4809pub struct ConditionGreen<'db>(pub GreenId<'db>);
4810impl<'db> TypedSyntaxNode<'db> for Condition<'db> {
4811    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4812    type StablePtr = ConditionPtr<'db>;
4813    type Green = ConditionGreen<'db>;
4814    fn missing(db: &'db dyn Database) -> Self::Green {
4815        panic!("No missing variant.");
4816    }
4817    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4818        let kind = node.kind(db);
4819        match kind {
4820            SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4821            SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4822            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4823        }
4824    }
4825    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4826        let kind = node.kind(db);
4827        match kind {
4828            SyntaxKind::ConditionLet => {
4829                Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4830            }
4831            SyntaxKind::ConditionExpr => {
4832                Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4833            }
4834            _ => None,
4835        }
4836    }
4837    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4838        match self {
4839            Condition::Let(x) => x.as_syntax_node(),
4840            Condition::Expr(x) => x.as_syntax_node(),
4841        }
4842    }
4843    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4844        ConditionPtr(self.as_syntax_node().stable_ptr(db))
4845    }
4846}
4847impl<'db> Condition<'db> {
4848    /// Checks if a kind of a variant of [Condition].
4849    pub fn is_variant(kind: SyntaxKind) -> bool {
4850        matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4851    }
4852}
4853#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4854pub struct ConditionLet<'db> {
4855    node: SyntaxNode<'db>,
4856}
4857impl<'db> ConditionLet<'db> {
4858    pub const INDEX_LET_KW: usize = 0;
4859    pub const INDEX_PATTERNS: usize = 1;
4860    pub const INDEX_EQ: usize = 2;
4861    pub const INDEX_EXPR: usize = 3;
4862    pub fn new_green(
4863        db: &'db dyn Database,
4864        let_kw: TerminalLetGreen<'db>,
4865        patterns: PatternListOrGreen<'db>,
4866        eq: TerminalEqGreen<'db>,
4867        expr: ExprGreen<'db>,
4868    ) -> ConditionLetGreen<'db> {
4869        let children = [let_kw.0, patterns.0, eq.0, expr.0];
4870        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4871        ConditionLetGreen(
4872            GreenNode {
4873                kind: SyntaxKind::ConditionLet,
4874                details: GreenNodeDetails::Node { children: children.into(), width },
4875            }
4876            .intern(db),
4877        )
4878    }
4879}
4880impl<'db> ConditionLet<'db> {
4881    pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
4882        TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4883    }
4884    pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4885        PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4886    }
4887    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
4888        TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4889    }
4890    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4891        Expr::from_syntax_node(db, self.node.get_children(db)[3])
4892    }
4893}
4894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4895pub struct ConditionLetPtr<'db>(pub SyntaxStablePtrId<'db>);
4896impl<'db> ConditionLetPtr<'db> {}
4897impl<'db> TypedStablePtr<'db> for ConditionLetPtr<'db> {
4898    type SyntaxNode = ConditionLet<'db>;
4899    fn untyped(self) -> SyntaxStablePtrId<'db> {
4900        self.0
4901    }
4902    fn lookup(&self, db: &'db dyn Database) -> ConditionLet<'db> {
4903        ConditionLet::from_syntax_node(db, self.0.lookup(db))
4904    }
4905}
4906impl<'db> From<ConditionLetPtr<'db>> for SyntaxStablePtrId<'db> {
4907    fn from(ptr: ConditionLetPtr<'db>) -> Self {
4908        ptr.untyped()
4909    }
4910}
4911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4912pub struct ConditionLetGreen<'db>(pub GreenId<'db>);
4913impl<'db> TypedSyntaxNode<'db> for ConditionLet<'db> {
4914    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4915    type StablePtr = ConditionLetPtr<'db>;
4916    type Green = ConditionLetGreen<'db>;
4917    fn missing(db: &'db dyn Database) -> Self::Green {
4918        ConditionLetGreen(
4919            GreenNode {
4920                kind: SyntaxKind::ConditionLet,
4921                details: GreenNodeDetails::Node {
4922                    children: [
4923                        TerminalLet::missing(db).0,
4924                        PatternListOr::missing(db).0,
4925                        TerminalEq::missing(db).0,
4926                        Expr::missing(db).0,
4927                    ]
4928                    .into(),
4929                    width: TextWidth::default(),
4930                },
4931            }
4932            .intern(db),
4933        )
4934    }
4935    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4936        let kind = node.kind(db);
4937        assert_eq!(
4938            kind,
4939            SyntaxKind::ConditionLet,
4940            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4941            kind,
4942            SyntaxKind::ConditionLet
4943        );
4944        Self { node }
4945    }
4946    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4947        let kind = node.kind(db);
4948        if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4949    }
4950    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4951        self.node
4952    }
4953    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4954        ConditionLetPtr(self.node.stable_ptr(db))
4955    }
4956}
4957#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4958pub struct ConditionExpr<'db> {
4959    node: SyntaxNode<'db>,
4960}
4961impl<'db> ConditionExpr<'db> {
4962    pub const INDEX_EXPR: usize = 0;
4963    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ConditionExprGreen<'db> {
4964        let children = [expr.0];
4965        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4966        ConditionExprGreen(
4967            GreenNode {
4968                kind: SyntaxKind::ConditionExpr,
4969                details: GreenNodeDetails::Node { children: children.into(), width },
4970            }
4971            .intern(db),
4972        )
4973    }
4974}
4975impl<'db> ConditionExpr<'db> {
4976    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4977        Expr::from_syntax_node(db, self.node.get_children(db)[0])
4978    }
4979}
4980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4981pub struct ConditionExprPtr<'db>(pub SyntaxStablePtrId<'db>);
4982impl<'db> ConditionExprPtr<'db> {}
4983impl<'db> TypedStablePtr<'db> for ConditionExprPtr<'db> {
4984    type SyntaxNode = ConditionExpr<'db>;
4985    fn untyped(self) -> SyntaxStablePtrId<'db> {
4986        self.0
4987    }
4988    fn lookup(&self, db: &'db dyn Database) -> ConditionExpr<'db> {
4989        ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4990    }
4991}
4992impl<'db> From<ConditionExprPtr<'db>> for SyntaxStablePtrId<'db> {
4993    fn from(ptr: ConditionExprPtr<'db>) -> Self {
4994        ptr.untyped()
4995    }
4996}
4997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4998pub struct ConditionExprGreen<'db>(pub GreenId<'db>);
4999impl<'db> TypedSyntaxNode<'db> for ConditionExpr<'db> {
5000    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
5001    type StablePtr = ConditionExprPtr<'db>;
5002    type Green = ConditionExprGreen<'db>;
5003    fn missing(db: &'db dyn Database) -> Self::Green {
5004        ConditionExprGreen(
5005            GreenNode {
5006                kind: SyntaxKind::ConditionExpr,
5007                details: GreenNodeDetails::Node {
5008                    children: [Expr::missing(db).0].into(),
5009                    width: TextWidth::default(),
5010                },
5011            }
5012            .intern(db),
5013        )
5014    }
5015    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5016        let kind = node.kind(db);
5017        assert_eq!(
5018            kind,
5019            SyntaxKind::ConditionExpr,
5020            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5021            kind,
5022            SyntaxKind::ConditionExpr
5023        );
5024        Self { node }
5025    }
5026    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5027        let kind = node.kind(db);
5028        if kind == SyntaxKind::ConditionExpr {
5029            Some(Self::from_syntax_node(db, node))
5030        } else {
5031            None
5032        }
5033    }
5034    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5035        self.node
5036    }
5037    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5038        ConditionExprPtr(self.node.stable_ptr(db))
5039    }
5040}
5041#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5042pub enum BlockOrIf<'db> {
5043    Block(ExprBlock<'db>),
5044    If(ExprIf<'db>),
5045}
5046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5047pub struct BlockOrIfPtr<'db>(pub SyntaxStablePtrId<'db>);
5048impl<'db> TypedStablePtr<'db> for BlockOrIfPtr<'db> {
5049    type SyntaxNode = BlockOrIf<'db>;
5050    fn untyped(self) -> SyntaxStablePtrId<'db> {
5051        self.0
5052    }
5053    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5054        BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5055    }
5056}
5057impl<'db> From<BlockOrIfPtr<'db>> for SyntaxStablePtrId<'db> {
5058    fn from(ptr: BlockOrIfPtr<'db>) -> Self {
5059        ptr.untyped()
5060    }
5061}
5062impl<'db> From<ExprBlockPtr<'db>> for BlockOrIfPtr<'db> {
5063    fn from(value: ExprBlockPtr<'db>) -> Self {
5064        Self(value.0)
5065    }
5066}
5067impl<'db> From<ExprIfPtr<'db>> for BlockOrIfPtr<'db> {
5068    fn from(value: ExprIfPtr<'db>) -> Self {
5069        Self(value.0)
5070    }
5071}
5072impl<'db> From<ExprBlockGreen<'db>> for BlockOrIfGreen<'db> {
5073    fn from(value: ExprBlockGreen<'db>) -> Self {
5074        Self(value.0)
5075    }
5076}
5077impl<'db> From<ExprIfGreen<'db>> for BlockOrIfGreen<'db> {
5078    fn from(value: ExprIfGreen<'db>) -> Self {
5079        Self(value.0)
5080    }
5081}
5082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5083pub struct BlockOrIfGreen<'db>(pub GreenId<'db>);
5084impl<'db> TypedSyntaxNode<'db> for BlockOrIf<'db> {
5085    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5086    type StablePtr = BlockOrIfPtr<'db>;
5087    type Green = BlockOrIfGreen<'db>;
5088    fn missing(db: &'db dyn Database) -> Self::Green {
5089        panic!("No missing variant.");
5090    }
5091    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5092        let kind = node.kind(db);
5093        match kind {
5094            SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5095            SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5096            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5097        }
5098    }
5099    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5100        let kind = node.kind(db);
5101        match kind {
5102            SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5103            SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5104            _ => None,
5105        }
5106    }
5107    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5108        match self {
5109            BlockOrIf::Block(x) => x.as_syntax_node(),
5110            BlockOrIf::If(x) => x.as_syntax_node(),
5111        }
5112    }
5113    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5114        BlockOrIfPtr(self.as_syntax_node().stable_ptr(db))
5115    }
5116}
5117impl<'db> BlockOrIf<'db> {
5118    /// Checks if a kind of a variant of [BlockOrIf].
5119    pub fn is_variant(kind: SyntaxKind) -> bool {
5120        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5121    }
5122}
5123#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5124pub struct ExprLoop<'db> {
5125    node: SyntaxNode<'db>,
5126}
5127impl<'db> ExprLoop<'db> {
5128    pub const INDEX_LOOP_KW: usize = 0;
5129    pub const INDEX_BODY: usize = 1;
5130    pub fn new_green(
5131        db: &'db dyn Database,
5132        loop_kw: TerminalLoopGreen<'db>,
5133        body: ExprBlockGreen<'db>,
5134    ) -> ExprLoopGreen<'db> {
5135        let children = [loop_kw.0, body.0];
5136        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5137        ExprLoopGreen(
5138            GreenNode {
5139                kind: SyntaxKind::ExprLoop,
5140                details: GreenNodeDetails::Node { children: children.into(), width },
5141            }
5142            .intern(db),
5143        )
5144    }
5145}
5146impl<'db> ExprLoop<'db> {
5147    pub fn loop_kw(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
5148        TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5149    }
5150    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5151        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5152    }
5153}
5154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5155pub struct ExprLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
5156impl<'db> ExprLoopPtr<'db> {}
5157impl<'db> TypedStablePtr<'db> for ExprLoopPtr<'db> {
5158    type SyntaxNode = ExprLoop<'db>;
5159    fn untyped(self) -> SyntaxStablePtrId<'db> {
5160        self.0
5161    }
5162    fn lookup(&self, db: &'db dyn Database) -> ExprLoop<'db> {
5163        ExprLoop::from_syntax_node(db, self.0.lookup(db))
5164    }
5165}
5166impl<'db> From<ExprLoopPtr<'db>> for SyntaxStablePtrId<'db> {
5167    fn from(ptr: ExprLoopPtr<'db>) -> Self {
5168        ptr.untyped()
5169    }
5170}
5171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5172pub struct ExprLoopGreen<'db>(pub GreenId<'db>);
5173impl<'db> TypedSyntaxNode<'db> for ExprLoop<'db> {
5174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5175    type StablePtr = ExprLoopPtr<'db>;
5176    type Green = ExprLoopGreen<'db>;
5177    fn missing(db: &'db dyn Database) -> Self::Green {
5178        ExprLoopGreen(
5179            GreenNode {
5180                kind: SyntaxKind::ExprLoop,
5181                details: GreenNodeDetails::Node {
5182                    children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5183                    width: TextWidth::default(),
5184                },
5185            }
5186            .intern(db),
5187        )
5188    }
5189    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5190        let kind = node.kind(db);
5191        assert_eq!(
5192            kind,
5193            SyntaxKind::ExprLoop,
5194            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5195            kind,
5196            SyntaxKind::ExprLoop
5197        );
5198        Self { node }
5199    }
5200    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5201        let kind = node.kind(db);
5202        if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5203    }
5204    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5205        self.node
5206    }
5207    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5208        ExprLoopPtr(self.node.stable_ptr(db))
5209    }
5210}
5211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5212pub struct ExprWhile<'db> {
5213    node: SyntaxNode<'db>,
5214}
5215impl<'db> ExprWhile<'db> {
5216    pub const INDEX_WHILE_KW: usize = 0;
5217    pub const INDEX_CONDITIONS: usize = 1;
5218    pub const INDEX_BODY: usize = 2;
5219    pub fn new_green(
5220        db: &'db dyn Database,
5221        while_kw: TerminalWhileGreen<'db>,
5222        conditions: ConditionListAndGreen<'db>,
5223        body: ExprBlockGreen<'db>,
5224    ) -> ExprWhileGreen<'db> {
5225        let children = [while_kw.0, conditions.0, body.0];
5226        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5227        ExprWhileGreen(
5228            GreenNode {
5229                kind: SyntaxKind::ExprWhile,
5230                details: GreenNodeDetails::Node { children: children.into(), width },
5231            }
5232            .intern(db),
5233        )
5234    }
5235}
5236impl<'db> ExprWhile<'db> {
5237    pub fn while_kw(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
5238        TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5239    }
5240    pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
5241        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5242    }
5243    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5244        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5245    }
5246}
5247#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5248pub struct ExprWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
5249impl<'db> ExprWhilePtr<'db> {}
5250impl<'db> TypedStablePtr<'db> for ExprWhilePtr<'db> {
5251    type SyntaxNode = ExprWhile<'db>;
5252    fn untyped(self) -> SyntaxStablePtrId<'db> {
5253        self.0
5254    }
5255    fn lookup(&self, db: &'db dyn Database) -> ExprWhile<'db> {
5256        ExprWhile::from_syntax_node(db, self.0.lookup(db))
5257    }
5258}
5259impl<'db> From<ExprWhilePtr<'db>> for SyntaxStablePtrId<'db> {
5260    fn from(ptr: ExprWhilePtr<'db>) -> Self {
5261        ptr.untyped()
5262    }
5263}
5264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5265pub struct ExprWhileGreen<'db>(pub GreenId<'db>);
5266impl<'db> TypedSyntaxNode<'db> for ExprWhile<'db> {
5267    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5268    type StablePtr = ExprWhilePtr<'db>;
5269    type Green = ExprWhileGreen<'db>;
5270    fn missing(db: &'db dyn Database) -> Self::Green {
5271        ExprWhileGreen(
5272            GreenNode {
5273                kind: SyntaxKind::ExprWhile,
5274                details: GreenNodeDetails::Node {
5275                    children: [
5276                        TerminalWhile::missing(db).0,
5277                        ConditionListAnd::missing(db).0,
5278                        ExprBlock::missing(db).0,
5279                    ]
5280                    .into(),
5281                    width: TextWidth::default(),
5282                },
5283            }
5284            .intern(db),
5285        )
5286    }
5287    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5288        let kind = node.kind(db);
5289        assert_eq!(
5290            kind,
5291            SyntaxKind::ExprWhile,
5292            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5293            kind,
5294            SyntaxKind::ExprWhile
5295        );
5296        Self { node }
5297    }
5298    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5299        let kind = node.kind(db);
5300        if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5301    }
5302    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5303        self.node
5304    }
5305    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5306        ExprWhilePtr(self.node.stable_ptr(db))
5307    }
5308}
5309#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5310pub struct ExprFor<'db> {
5311    node: SyntaxNode<'db>,
5312}
5313impl<'db> ExprFor<'db> {
5314    pub const INDEX_FOR_KW: usize = 0;
5315    pub const INDEX_PATTERN: usize = 1;
5316    pub const INDEX_IDENTIFIER: usize = 2;
5317    pub const INDEX_EXPR: usize = 3;
5318    pub const INDEX_BODY: usize = 4;
5319    pub fn new_green(
5320        db: &'db dyn Database,
5321        for_kw: TerminalForGreen<'db>,
5322        pattern: PatternGreen<'db>,
5323        identifier: TerminalIdentifierGreen<'db>,
5324        expr: ExprGreen<'db>,
5325        body: ExprBlockGreen<'db>,
5326    ) -> ExprForGreen<'db> {
5327        let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5328        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5329        ExprForGreen(
5330            GreenNode {
5331                kind: SyntaxKind::ExprFor,
5332                details: GreenNodeDetails::Node { children: children.into(), width },
5333            }
5334            .intern(db),
5335        )
5336    }
5337}
5338impl<'db> ExprFor<'db> {
5339    pub fn for_kw(&self, db: &'db dyn Database) -> TerminalFor<'db> {
5340        TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5341    }
5342    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
5343        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5344    }
5345    pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
5346        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5347    }
5348    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5349        Expr::from_syntax_node(db, self.node.get_children(db)[3])
5350    }
5351    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5352        ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5353    }
5354}
5355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5356pub struct ExprForPtr<'db>(pub SyntaxStablePtrId<'db>);
5357impl<'db> ExprForPtr<'db> {
5358    pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
5359        PatternGreen(self.0.0.key_fields(db)[0])
5360    }
5361    pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
5362        TerminalIdentifierGreen(self.0.0.key_fields(db)[1])
5363    }
5364}
5365impl<'db> TypedStablePtr<'db> for ExprForPtr<'db> {
5366    type SyntaxNode = ExprFor<'db>;
5367    fn untyped(self) -> SyntaxStablePtrId<'db> {
5368        self.0
5369    }
5370    fn lookup(&self, db: &'db dyn Database) -> ExprFor<'db> {
5371        ExprFor::from_syntax_node(db, self.0.lookup(db))
5372    }
5373}
5374impl<'db> From<ExprForPtr<'db>> for SyntaxStablePtrId<'db> {
5375    fn from(ptr: ExprForPtr<'db>) -> Self {
5376        ptr.untyped()
5377    }
5378}
5379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5380pub struct ExprForGreen<'db>(pub GreenId<'db>);
5381impl<'db> TypedSyntaxNode<'db> for ExprFor<'db> {
5382    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5383    type StablePtr = ExprForPtr<'db>;
5384    type Green = ExprForGreen<'db>;
5385    fn missing(db: &'db dyn Database) -> Self::Green {
5386        ExprForGreen(
5387            GreenNode {
5388                kind: SyntaxKind::ExprFor,
5389                details: GreenNodeDetails::Node {
5390                    children: [
5391                        TerminalFor::missing(db).0,
5392                        Pattern::missing(db).0,
5393                        TerminalIdentifier::missing(db).0,
5394                        Expr::missing(db).0,
5395                        ExprBlock::missing(db).0,
5396                    ]
5397                    .into(),
5398                    width: TextWidth::default(),
5399                },
5400            }
5401            .intern(db),
5402        )
5403    }
5404    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5405        let kind = node.kind(db);
5406        assert_eq!(
5407            kind,
5408            SyntaxKind::ExprFor,
5409            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5410            kind,
5411            SyntaxKind::ExprFor
5412        );
5413        Self { node }
5414    }
5415    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5416        let kind = node.kind(db);
5417        if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5418    }
5419    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5420        self.node
5421    }
5422    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5423        ExprForPtr(self.node.stable_ptr(db))
5424    }
5425}
5426#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5427pub struct ElseClause<'db> {
5428    node: SyntaxNode<'db>,
5429}
5430impl<'db> ElseClause<'db> {
5431    pub const INDEX_ELSE_KW: usize = 0;
5432    pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5433    pub fn new_green(
5434        db: &'db dyn Database,
5435        else_kw: TerminalElseGreen<'db>,
5436        else_block_or_if: BlockOrIfGreen<'db>,
5437    ) -> ElseClauseGreen<'db> {
5438        let children = [else_kw.0, else_block_or_if.0];
5439        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5440        ElseClauseGreen(
5441            GreenNode {
5442                kind: SyntaxKind::ElseClause,
5443                details: GreenNodeDetails::Node { children: children.into(), width },
5444            }
5445            .intern(db),
5446        )
5447    }
5448}
5449impl<'db> ElseClause<'db> {
5450    pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
5451        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5452    }
5453    pub fn else_block_or_if(&self, db: &'db dyn Database) -> BlockOrIf<'db> {
5454        BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5455    }
5456}
5457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5458pub struct ElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5459impl<'db> ElseClausePtr<'db> {}
5460impl<'db> TypedStablePtr<'db> for ElseClausePtr<'db> {
5461    type SyntaxNode = ElseClause<'db>;
5462    fn untyped(self) -> SyntaxStablePtrId<'db> {
5463        self.0
5464    }
5465    fn lookup(&self, db: &'db dyn Database) -> ElseClause<'db> {
5466        ElseClause::from_syntax_node(db, self.0.lookup(db))
5467    }
5468}
5469impl<'db> From<ElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5470    fn from(ptr: ElseClausePtr<'db>) -> Self {
5471        ptr.untyped()
5472    }
5473}
5474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5475pub struct ElseClauseGreen<'db>(pub GreenId<'db>);
5476impl<'db> TypedSyntaxNode<'db> for ElseClause<'db> {
5477    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5478    type StablePtr = ElseClausePtr<'db>;
5479    type Green = ElseClauseGreen<'db>;
5480    fn missing(db: &'db dyn Database) -> Self::Green {
5481        ElseClauseGreen(
5482            GreenNode {
5483                kind: SyntaxKind::ElseClause,
5484                details: GreenNodeDetails::Node {
5485                    children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5486                    width: TextWidth::default(),
5487                },
5488            }
5489            .intern(db),
5490        )
5491    }
5492    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5493        let kind = node.kind(db);
5494        assert_eq!(
5495            kind,
5496            SyntaxKind::ElseClause,
5497            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5498            kind,
5499            SyntaxKind::ElseClause
5500        );
5501        Self { node }
5502    }
5503    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5504        let kind = node.kind(db);
5505        if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5506    }
5507    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5508        self.node
5509    }
5510    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5511        ElseClausePtr(self.node.stable_ptr(db))
5512    }
5513}
5514#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5515pub enum OptionElseClause<'db> {
5516    Empty(OptionElseClauseEmpty<'db>),
5517    ElseClause(ElseClause<'db>),
5518}
5519#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5520pub struct OptionElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5521impl<'db> TypedStablePtr<'db> for OptionElseClausePtr<'db> {
5522    type SyntaxNode = OptionElseClause<'db>;
5523    fn untyped(self) -> SyntaxStablePtrId<'db> {
5524        self.0
5525    }
5526    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5527        OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5528    }
5529}
5530impl<'db> From<OptionElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5531    fn from(ptr: OptionElseClausePtr<'db>) -> Self {
5532        ptr.untyped()
5533    }
5534}
5535impl<'db> From<OptionElseClauseEmptyPtr<'db>> for OptionElseClausePtr<'db> {
5536    fn from(value: OptionElseClauseEmptyPtr<'db>) -> Self {
5537        Self(value.0)
5538    }
5539}
5540impl<'db> From<ElseClausePtr<'db>> for OptionElseClausePtr<'db> {
5541    fn from(value: ElseClausePtr<'db>) -> Self {
5542        Self(value.0)
5543    }
5544}
5545impl<'db> From<OptionElseClauseEmptyGreen<'db>> for OptionElseClauseGreen<'db> {
5546    fn from(value: OptionElseClauseEmptyGreen<'db>) -> Self {
5547        Self(value.0)
5548    }
5549}
5550impl<'db> From<ElseClauseGreen<'db>> for OptionElseClauseGreen<'db> {
5551    fn from(value: ElseClauseGreen<'db>) -> Self {
5552        Self(value.0)
5553    }
5554}
5555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5556pub struct OptionElseClauseGreen<'db>(pub GreenId<'db>);
5557impl<'db> TypedSyntaxNode<'db> for OptionElseClause<'db> {
5558    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5559    type StablePtr = OptionElseClausePtr<'db>;
5560    type Green = OptionElseClauseGreen<'db>;
5561    fn missing(db: &'db dyn Database) -> Self::Green {
5562        panic!("No missing variant.");
5563    }
5564    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5565        let kind = node.kind(db);
5566        match kind {
5567            SyntaxKind::OptionElseClauseEmpty => {
5568                OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5569            }
5570            SyntaxKind::ElseClause => {
5571                OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5572            }
5573            _ => panic!(
5574                "Unexpected syntax kind {:?} when constructing {}.",
5575                kind, "OptionElseClause"
5576            ),
5577        }
5578    }
5579    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5580        let kind = node.kind(db);
5581        match kind {
5582            SyntaxKind::OptionElseClauseEmpty => {
5583                Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5584            }
5585            SyntaxKind::ElseClause => {
5586                Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5587            }
5588            _ => None,
5589        }
5590    }
5591    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5592        match self {
5593            OptionElseClause::Empty(x) => x.as_syntax_node(),
5594            OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5595        }
5596    }
5597    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5598        OptionElseClausePtr(self.as_syntax_node().stable_ptr(db))
5599    }
5600}
5601impl<'db> OptionElseClause<'db> {
5602    /// Checks if a kind of a variant of [OptionElseClause].
5603    pub fn is_variant(kind: SyntaxKind) -> bool {
5604        matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5605    }
5606}
5607#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5608pub struct OptionElseClauseEmpty<'db> {
5609    node: SyntaxNode<'db>,
5610}
5611impl<'db> OptionElseClauseEmpty<'db> {
5612    pub fn new_green(db: &'db dyn Database) -> OptionElseClauseEmptyGreen<'db> {
5613        let children = [];
5614        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5615        OptionElseClauseEmptyGreen(
5616            GreenNode {
5617                kind: SyntaxKind::OptionElseClauseEmpty,
5618                details: GreenNodeDetails::Node { children: children.into(), width },
5619            }
5620            .intern(db),
5621        )
5622    }
5623}
5624impl<'db> OptionElseClauseEmpty<'db> {}
5625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5626pub struct OptionElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
5627impl<'db> OptionElseClauseEmptyPtr<'db> {}
5628impl<'db> TypedStablePtr<'db> for OptionElseClauseEmptyPtr<'db> {
5629    type SyntaxNode = OptionElseClauseEmpty<'db>;
5630    fn untyped(self) -> SyntaxStablePtrId<'db> {
5631        self.0
5632    }
5633    fn lookup(&self, db: &'db dyn Database) -> OptionElseClauseEmpty<'db> {
5634        OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5635    }
5636}
5637impl<'db> From<OptionElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
5638    fn from(ptr: OptionElseClauseEmptyPtr<'db>) -> Self {
5639        ptr.untyped()
5640    }
5641}
5642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5643pub struct OptionElseClauseEmptyGreen<'db>(pub GreenId<'db>);
5644impl<'db> TypedSyntaxNode<'db> for OptionElseClauseEmpty<'db> {
5645    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5646    type StablePtr = OptionElseClauseEmptyPtr<'db>;
5647    type Green = OptionElseClauseEmptyGreen<'db>;
5648    fn missing(db: &'db dyn Database) -> Self::Green {
5649        OptionElseClauseEmptyGreen(
5650            GreenNode {
5651                kind: SyntaxKind::OptionElseClauseEmpty,
5652                details: GreenNodeDetails::Node {
5653                    children: [].into(),
5654                    width: TextWidth::default(),
5655                },
5656            }
5657            .intern(db),
5658        )
5659    }
5660    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5661        let kind = node.kind(db);
5662        assert_eq!(
5663            kind,
5664            SyntaxKind::OptionElseClauseEmpty,
5665            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5666            kind,
5667            SyntaxKind::OptionElseClauseEmpty
5668        );
5669        Self { node }
5670    }
5671    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5672        let kind = node.kind(db);
5673        if kind == SyntaxKind::OptionElseClauseEmpty {
5674            Some(Self::from_syntax_node(db, node))
5675        } else {
5676            None
5677        }
5678    }
5679    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5680        self.node
5681    }
5682    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5683        OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5684    }
5685}
5686#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5687pub struct ExprErrorPropagate<'db> {
5688    node: SyntaxNode<'db>,
5689}
5690impl<'db> ExprErrorPropagate<'db> {
5691    pub const INDEX_EXPR: usize = 0;
5692    pub const INDEX_OP: usize = 1;
5693    pub fn new_green(
5694        db: &'db dyn Database,
5695        expr: ExprGreen<'db>,
5696        op: TerminalQuestionMarkGreen<'db>,
5697    ) -> ExprErrorPropagateGreen<'db> {
5698        let children = [expr.0, op.0];
5699        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5700        ExprErrorPropagateGreen(
5701            GreenNode {
5702                kind: SyntaxKind::ExprErrorPropagate,
5703                details: GreenNodeDetails::Node { children: children.into(), width },
5704            }
5705            .intern(db),
5706        )
5707    }
5708}
5709impl<'db> ExprErrorPropagate<'db> {
5710    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5711        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5712    }
5713    pub fn op(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
5714        TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5715    }
5716}
5717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5718pub struct ExprErrorPropagatePtr<'db>(pub SyntaxStablePtrId<'db>);
5719impl<'db> ExprErrorPropagatePtr<'db> {}
5720impl<'db> TypedStablePtr<'db> for ExprErrorPropagatePtr<'db> {
5721    type SyntaxNode = ExprErrorPropagate<'db>;
5722    fn untyped(self) -> SyntaxStablePtrId<'db> {
5723        self.0
5724    }
5725    fn lookup(&self, db: &'db dyn Database) -> ExprErrorPropagate<'db> {
5726        ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5727    }
5728}
5729impl<'db> From<ExprErrorPropagatePtr<'db>> for SyntaxStablePtrId<'db> {
5730    fn from(ptr: ExprErrorPropagatePtr<'db>) -> Self {
5731        ptr.untyped()
5732    }
5733}
5734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5735pub struct ExprErrorPropagateGreen<'db>(pub GreenId<'db>);
5736impl<'db> TypedSyntaxNode<'db> for ExprErrorPropagate<'db> {
5737    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5738    type StablePtr = ExprErrorPropagatePtr<'db>;
5739    type Green = ExprErrorPropagateGreen<'db>;
5740    fn missing(db: &'db dyn Database) -> Self::Green {
5741        ExprErrorPropagateGreen(
5742            GreenNode {
5743                kind: SyntaxKind::ExprErrorPropagate,
5744                details: GreenNodeDetails::Node {
5745                    children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5746                    width: TextWidth::default(),
5747                },
5748            }
5749            .intern(db),
5750        )
5751    }
5752    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5753        let kind = node.kind(db);
5754        assert_eq!(
5755            kind,
5756            SyntaxKind::ExprErrorPropagate,
5757            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5758            kind,
5759            SyntaxKind::ExprErrorPropagate
5760        );
5761        Self { node }
5762    }
5763    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5764        let kind = node.kind(db);
5765        if kind == SyntaxKind::ExprErrorPropagate {
5766            Some(Self::from_syntax_node(db, node))
5767        } else {
5768            None
5769        }
5770    }
5771    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5772        self.node
5773    }
5774    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5775        ExprErrorPropagatePtr(self.node.stable_ptr(db))
5776    }
5777}
5778#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5779pub struct ExprIndexed<'db> {
5780    node: SyntaxNode<'db>,
5781}
5782impl<'db> ExprIndexed<'db> {
5783    pub const INDEX_EXPR: usize = 0;
5784    pub const INDEX_LBRACK: usize = 1;
5785    pub const INDEX_INDEX_EXPR: usize = 2;
5786    pub const INDEX_RBRACK: usize = 3;
5787    pub fn new_green(
5788        db: &'db dyn Database,
5789        expr: ExprGreen<'db>,
5790        lbrack: TerminalLBrackGreen<'db>,
5791        index_expr: ExprGreen<'db>,
5792        rbrack: TerminalRBrackGreen<'db>,
5793    ) -> ExprIndexedGreen<'db> {
5794        let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5795        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5796        ExprIndexedGreen(
5797            GreenNode {
5798                kind: SyntaxKind::ExprIndexed,
5799                details: GreenNodeDetails::Node { children: children.into(), width },
5800            }
5801            .intern(db),
5802        )
5803    }
5804}
5805impl<'db> ExprIndexed<'db> {
5806    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5807        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5808    }
5809    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5810        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5811    }
5812    pub fn index_expr(&self, db: &'db dyn Database) -> Expr<'db> {
5813        Expr::from_syntax_node(db, self.node.get_children(db)[2])
5814    }
5815    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5816        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5817    }
5818}
5819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5820pub struct ExprIndexedPtr<'db>(pub SyntaxStablePtrId<'db>);
5821impl<'db> ExprIndexedPtr<'db> {}
5822impl<'db> TypedStablePtr<'db> for ExprIndexedPtr<'db> {
5823    type SyntaxNode = ExprIndexed<'db>;
5824    fn untyped(self) -> SyntaxStablePtrId<'db> {
5825        self.0
5826    }
5827    fn lookup(&self, db: &'db dyn Database) -> ExprIndexed<'db> {
5828        ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5829    }
5830}
5831impl<'db> From<ExprIndexedPtr<'db>> for SyntaxStablePtrId<'db> {
5832    fn from(ptr: ExprIndexedPtr<'db>) -> Self {
5833        ptr.untyped()
5834    }
5835}
5836#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5837pub struct ExprIndexedGreen<'db>(pub GreenId<'db>);
5838impl<'db> TypedSyntaxNode<'db> for ExprIndexed<'db> {
5839    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5840    type StablePtr = ExprIndexedPtr<'db>;
5841    type Green = ExprIndexedGreen<'db>;
5842    fn missing(db: &'db dyn Database) -> Self::Green {
5843        ExprIndexedGreen(
5844            GreenNode {
5845                kind: SyntaxKind::ExprIndexed,
5846                details: GreenNodeDetails::Node {
5847                    children: [
5848                        Expr::missing(db).0,
5849                        TerminalLBrack::missing(db).0,
5850                        Expr::missing(db).0,
5851                        TerminalRBrack::missing(db).0,
5852                    ]
5853                    .into(),
5854                    width: TextWidth::default(),
5855                },
5856            }
5857            .intern(db),
5858        )
5859    }
5860    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5861        let kind = node.kind(db);
5862        assert_eq!(
5863            kind,
5864            SyntaxKind::ExprIndexed,
5865            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5866            kind,
5867            SyntaxKind::ExprIndexed
5868        );
5869        Self { node }
5870    }
5871    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5872        let kind = node.kind(db);
5873        if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5874    }
5875    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5876        self.node
5877    }
5878    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5879        ExprIndexedPtr(self.node.stable_ptr(db))
5880    }
5881}
5882#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5883pub struct ExprFixedSizeArray<'db> {
5884    node: SyntaxNode<'db>,
5885}
5886impl<'db> ExprFixedSizeArray<'db> {
5887    pub const INDEX_LBRACK: usize = 0;
5888    pub const INDEX_EXPRS: usize = 1;
5889    pub const INDEX_SIZE: usize = 2;
5890    pub const INDEX_RBRACK: usize = 3;
5891    pub fn new_green(
5892        db: &'db dyn Database,
5893        lbrack: TerminalLBrackGreen<'db>,
5894        exprs: ExprListGreen<'db>,
5895        size: OptionFixedSizeArraySizeGreen<'db>,
5896        rbrack: TerminalRBrackGreen<'db>,
5897    ) -> ExprFixedSizeArrayGreen<'db> {
5898        let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5899        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5900        ExprFixedSizeArrayGreen(
5901            GreenNode {
5902                kind: SyntaxKind::ExprFixedSizeArray,
5903                details: GreenNodeDetails::Node { children: children.into(), width },
5904            }
5905            .intern(db),
5906        )
5907    }
5908}
5909impl<'db> ExprFixedSizeArray<'db> {
5910    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5911        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5912    }
5913    pub fn exprs(&self, db: &'db dyn Database) -> ExprList<'db> {
5914        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5915    }
5916    pub fn size(&self, db: &'db dyn Database) -> OptionFixedSizeArraySize<'db> {
5917        OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5918    }
5919    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5920        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5921    }
5922}
5923#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5924pub struct ExprFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
5925impl<'db> ExprFixedSizeArrayPtr<'db> {}
5926impl<'db> TypedStablePtr<'db> for ExprFixedSizeArrayPtr<'db> {
5927    type SyntaxNode = ExprFixedSizeArray<'db>;
5928    fn untyped(self) -> SyntaxStablePtrId<'db> {
5929        self.0
5930    }
5931    fn lookup(&self, db: &'db dyn Database) -> ExprFixedSizeArray<'db> {
5932        ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5933    }
5934}
5935impl<'db> From<ExprFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
5936    fn from(ptr: ExprFixedSizeArrayPtr<'db>) -> Self {
5937        ptr.untyped()
5938    }
5939}
5940#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5941pub struct ExprFixedSizeArrayGreen<'db>(pub GreenId<'db>);
5942impl<'db> TypedSyntaxNode<'db> for ExprFixedSizeArray<'db> {
5943    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5944    type StablePtr = ExprFixedSizeArrayPtr<'db>;
5945    type Green = ExprFixedSizeArrayGreen<'db>;
5946    fn missing(db: &'db dyn Database) -> Self::Green {
5947        ExprFixedSizeArrayGreen(
5948            GreenNode {
5949                kind: SyntaxKind::ExprFixedSizeArray,
5950                details: GreenNodeDetails::Node {
5951                    children: [
5952                        TerminalLBrack::missing(db).0,
5953                        ExprList::missing(db).0,
5954                        OptionFixedSizeArraySize::missing(db).0,
5955                        TerminalRBrack::missing(db).0,
5956                    ]
5957                    .into(),
5958                    width: TextWidth::default(),
5959                },
5960            }
5961            .intern(db),
5962        )
5963    }
5964    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5965        let kind = node.kind(db);
5966        assert_eq!(
5967            kind,
5968            SyntaxKind::ExprFixedSizeArray,
5969            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5970            kind,
5971            SyntaxKind::ExprFixedSizeArray
5972        );
5973        Self { node }
5974    }
5975    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5976        let kind = node.kind(db);
5977        if kind == SyntaxKind::ExprFixedSizeArray {
5978            Some(Self::from_syntax_node(db, node))
5979        } else {
5980            None
5981        }
5982    }
5983    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5984        self.node
5985    }
5986    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5987        ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
5988    }
5989}
5990#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5991pub struct FixedSizeArraySize<'db> {
5992    node: SyntaxNode<'db>,
5993}
5994impl<'db> FixedSizeArraySize<'db> {
5995    pub const INDEX_SEMICOLON: usize = 0;
5996    pub const INDEX_SIZE: usize = 1;
5997    pub fn new_green(
5998        db: &'db dyn Database,
5999        semicolon: TerminalSemicolonGreen<'db>,
6000        size: ExprGreen<'db>,
6001    ) -> FixedSizeArraySizeGreen<'db> {
6002        let children = [semicolon.0, size.0];
6003        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6004        FixedSizeArraySizeGreen(
6005            GreenNode {
6006                kind: SyntaxKind::FixedSizeArraySize,
6007                details: GreenNodeDetails::Node { children: children.into(), width },
6008            }
6009            .intern(db),
6010        )
6011    }
6012}
6013impl<'db> FixedSizeArraySize<'db> {
6014    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
6015        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6016    }
6017    pub fn size(&self, db: &'db dyn Database) -> Expr<'db> {
6018        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6019    }
6020}
6021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6022pub struct FixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6023impl<'db> FixedSizeArraySizePtr<'db> {}
6024impl<'db> TypedStablePtr<'db> for FixedSizeArraySizePtr<'db> {
6025    type SyntaxNode = FixedSizeArraySize<'db>;
6026    fn untyped(self) -> SyntaxStablePtrId<'db> {
6027        self.0
6028    }
6029    fn lookup(&self, db: &'db dyn Database) -> FixedSizeArraySize<'db> {
6030        FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6031    }
6032}
6033impl<'db> From<FixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6034    fn from(ptr: FixedSizeArraySizePtr<'db>) -> Self {
6035        ptr.untyped()
6036    }
6037}
6038#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6039pub struct FixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6040impl<'db> TypedSyntaxNode<'db> for FixedSizeArraySize<'db> {
6041    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6042    type StablePtr = FixedSizeArraySizePtr<'db>;
6043    type Green = FixedSizeArraySizeGreen<'db>;
6044    fn missing(db: &'db dyn Database) -> Self::Green {
6045        FixedSizeArraySizeGreen(
6046            GreenNode {
6047                kind: SyntaxKind::FixedSizeArraySize,
6048                details: GreenNodeDetails::Node {
6049                    children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6050                    width: TextWidth::default(),
6051                },
6052            }
6053            .intern(db),
6054        )
6055    }
6056    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6057        let kind = node.kind(db);
6058        assert_eq!(
6059            kind,
6060            SyntaxKind::FixedSizeArraySize,
6061            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6062            kind,
6063            SyntaxKind::FixedSizeArraySize
6064        );
6065        Self { node }
6066    }
6067    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6068        let kind = node.kind(db);
6069        if kind == SyntaxKind::FixedSizeArraySize {
6070            Some(Self::from_syntax_node(db, node))
6071        } else {
6072            None
6073        }
6074    }
6075    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6076        self.node
6077    }
6078    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6079        FixedSizeArraySizePtr(self.node.stable_ptr(db))
6080    }
6081}
6082#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6083pub enum OptionFixedSizeArraySize<'db> {
6084    Empty(OptionFixedSizeArraySizeEmpty<'db>),
6085    FixedSizeArraySize(FixedSizeArraySize<'db>),
6086}
6087#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6088pub struct OptionFixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6089impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizePtr<'db> {
6090    type SyntaxNode = OptionFixedSizeArraySize<'db>;
6091    fn untyped(self) -> SyntaxStablePtrId<'db> {
6092        self.0
6093    }
6094    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6095        OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6096    }
6097}
6098impl<'db> From<OptionFixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6099    fn from(ptr: OptionFixedSizeArraySizePtr<'db>) -> Self {
6100        ptr.untyped()
6101    }
6102}
6103impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6104    fn from(value: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6105        Self(value.0)
6106    }
6107}
6108impl<'db> From<FixedSizeArraySizePtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6109    fn from(value: FixedSizeArraySizePtr<'db>) -> Self {
6110        Self(value.0)
6111    }
6112}
6113impl<'db> From<OptionFixedSizeArraySizeEmptyGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6114    fn from(value: OptionFixedSizeArraySizeEmptyGreen<'db>) -> Self {
6115        Self(value.0)
6116    }
6117}
6118impl<'db> From<FixedSizeArraySizeGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6119    fn from(value: FixedSizeArraySizeGreen<'db>) -> Self {
6120        Self(value.0)
6121    }
6122}
6123#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6124pub struct OptionFixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6125impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySize<'db> {
6126    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6127    type StablePtr = OptionFixedSizeArraySizePtr<'db>;
6128    type Green = OptionFixedSizeArraySizeGreen<'db>;
6129    fn missing(db: &'db dyn Database) -> Self::Green {
6130        panic!("No missing variant.");
6131    }
6132    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6133        let kind = node.kind(db);
6134        match kind {
6135            SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6136                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6137            ),
6138            SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6139                FixedSizeArraySize::from_syntax_node(db, node),
6140            ),
6141            _ => panic!(
6142                "Unexpected syntax kind {:?} when constructing {}.",
6143                kind, "OptionFixedSizeArraySize"
6144            ),
6145        }
6146    }
6147    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6148        let kind = node.kind(db);
6149        match kind {
6150            SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6151                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6152            )),
6153            SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6154                FixedSizeArraySize::from_syntax_node(db, node),
6155            )),
6156            _ => None,
6157        }
6158    }
6159    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6160        match self {
6161            OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6162            OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6163        }
6164    }
6165    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6166        OptionFixedSizeArraySizePtr(self.as_syntax_node().stable_ptr(db))
6167    }
6168}
6169impl<'db> OptionFixedSizeArraySize<'db> {
6170    /// Checks if a kind of a variant of [OptionFixedSizeArraySize].
6171    pub fn is_variant(kind: SyntaxKind) -> bool {
6172        matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6173    }
6174}
6175#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6176pub struct OptionFixedSizeArraySizeEmpty<'db> {
6177    node: SyntaxNode<'db>,
6178}
6179impl<'db> OptionFixedSizeArraySizeEmpty<'db> {
6180    pub fn new_green(db: &'db dyn Database) -> OptionFixedSizeArraySizeEmptyGreen<'db> {
6181        let children = [];
6182        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6183        OptionFixedSizeArraySizeEmptyGreen(
6184            GreenNode {
6185                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6186                details: GreenNodeDetails::Node { children: children.into(), width },
6187            }
6188            .intern(db),
6189        )
6190    }
6191}
6192impl<'db> OptionFixedSizeArraySizeEmpty<'db> {}
6193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6194pub struct OptionFixedSizeArraySizeEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6195impl<'db> OptionFixedSizeArraySizeEmptyPtr<'db> {}
6196impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizeEmptyPtr<'db> {
6197    type SyntaxNode = OptionFixedSizeArraySizeEmpty<'db>;
6198    fn untyped(self) -> SyntaxStablePtrId<'db> {
6199        self.0
6200    }
6201    fn lookup(&self, db: &'db dyn Database) -> OptionFixedSizeArraySizeEmpty<'db> {
6202        OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6203    }
6204}
6205impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6206    fn from(ptr: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6207        ptr.untyped()
6208    }
6209}
6210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6211pub struct OptionFixedSizeArraySizeEmptyGreen<'db>(pub GreenId<'db>);
6212impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySizeEmpty<'db> {
6213    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6214    type StablePtr = OptionFixedSizeArraySizeEmptyPtr<'db>;
6215    type Green = OptionFixedSizeArraySizeEmptyGreen<'db>;
6216    fn missing(db: &'db dyn Database) -> Self::Green {
6217        OptionFixedSizeArraySizeEmptyGreen(
6218            GreenNode {
6219                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6220                details: GreenNodeDetails::Node {
6221                    children: [].into(),
6222                    width: TextWidth::default(),
6223                },
6224            }
6225            .intern(db),
6226        )
6227    }
6228    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6229        let kind = node.kind(db);
6230        assert_eq!(
6231            kind,
6232            SyntaxKind::OptionFixedSizeArraySizeEmpty,
6233            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6234            kind,
6235            SyntaxKind::OptionFixedSizeArraySizeEmpty
6236        );
6237        Self { node }
6238    }
6239    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6240        let kind = node.kind(db);
6241        if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6242            Some(Self::from_syntax_node(db, node))
6243        } else {
6244            None
6245        }
6246    }
6247    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6248        self.node
6249    }
6250    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6251        OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6252    }
6253}
6254#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6255pub struct ExprClosure<'db> {
6256    node: SyntaxNode<'db>,
6257}
6258impl<'db> ExprClosure<'db> {
6259    pub const INDEX_WRAPPER: usize = 0;
6260    pub const INDEX_RET_TY: usize = 1;
6261    pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6262    pub const INDEX_EXPR: usize = 3;
6263    pub fn new_green(
6264        db: &'db dyn Database,
6265        wrapper: ClosureParamWrapperGreen<'db>,
6266        ret_ty: OptionReturnTypeClauseGreen<'db>,
6267        optional_no_panic: OptionTerminalNoPanicGreen<'db>,
6268        expr: ExprGreen<'db>,
6269    ) -> ExprClosureGreen<'db> {
6270        let children = [wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6271        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6272        ExprClosureGreen(
6273            GreenNode {
6274                kind: SyntaxKind::ExprClosure,
6275                details: GreenNodeDetails::Node { children: children.into(), width },
6276            }
6277            .intern(db),
6278        )
6279    }
6280}
6281impl<'db> ExprClosure<'db> {
6282    pub fn wrapper(&self, db: &'db dyn Database) -> ClosureParamWrapper<'db> {
6283        ClosureParamWrapper::from_syntax_node(db, self.node.get_children(db)[0])
6284    }
6285    pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
6286        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6287    }
6288    pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
6289        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6290    }
6291    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6292        Expr::from_syntax_node(db, self.node.get_children(db)[3])
6293    }
6294}
6295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6296pub struct ExprClosurePtr<'db>(pub SyntaxStablePtrId<'db>);
6297impl<'db> ExprClosurePtr<'db> {}
6298impl<'db> TypedStablePtr<'db> for ExprClosurePtr<'db> {
6299    type SyntaxNode = ExprClosure<'db>;
6300    fn untyped(self) -> SyntaxStablePtrId<'db> {
6301        self.0
6302    }
6303    fn lookup(&self, db: &'db dyn Database) -> ExprClosure<'db> {
6304        ExprClosure::from_syntax_node(db, self.0.lookup(db))
6305    }
6306}
6307impl<'db> From<ExprClosurePtr<'db>> for SyntaxStablePtrId<'db> {
6308    fn from(ptr: ExprClosurePtr<'db>) -> Self {
6309        ptr.untyped()
6310    }
6311}
6312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6313pub struct ExprClosureGreen<'db>(pub GreenId<'db>);
6314impl<'db> TypedSyntaxNode<'db> for ExprClosure<'db> {
6315    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6316    type StablePtr = ExprClosurePtr<'db>;
6317    type Green = ExprClosureGreen<'db>;
6318    fn missing(db: &'db dyn Database) -> Self::Green {
6319        ExprClosureGreen(
6320            GreenNode {
6321                kind: SyntaxKind::ExprClosure,
6322                details: GreenNodeDetails::Node {
6323                    children: [
6324                        ClosureParamWrapper::missing(db).0,
6325                        OptionReturnTypeClause::missing(db).0,
6326                        OptionTerminalNoPanic::missing(db).0,
6327                        Expr::missing(db).0,
6328                    ]
6329                    .into(),
6330                    width: TextWidth::default(),
6331                },
6332            }
6333            .intern(db),
6334        )
6335    }
6336    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6337        let kind = node.kind(db);
6338        assert_eq!(
6339            kind,
6340            SyntaxKind::ExprClosure,
6341            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6342            kind,
6343            SyntaxKind::ExprClosure
6344        );
6345        Self { node }
6346    }
6347    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6348        let kind = node.kind(db);
6349        if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6350    }
6351    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6352        self.node
6353    }
6354    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6355        ExprClosurePtr(self.node.stable_ptr(db))
6356    }
6357}
6358#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6359pub enum ClosureParamWrapper<'db> {
6360    Nullary(TerminalOrOr<'db>),
6361    NAry(ClosureParamWrapperNAry<'db>),
6362}
6363#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6364pub struct ClosureParamWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
6365impl<'db> TypedStablePtr<'db> for ClosureParamWrapperPtr<'db> {
6366    type SyntaxNode = ClosureParamWrapper<'db>;
6367    fn untyped(self) -> SyntaxStablePtrId<'db> {
6368        self.0
6369    }
6370    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6371        ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6372    }
6373}
6374impl<'db> From<ClosureParamWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
6375    fn from(ptr: ClosureParamWrapperPtr<'db>) -> Self {
6376        ptr.untyped()
6377    }
6378}
6379impl<'db> From<TerminalOrOrPtr<'db>> for ClosureParamWrapperPtr<'db> {
6380    fn from(value: TerminalOrOrPtr<'db>) -> Self {
6381        Self(value.0)
6382    }
6383}
6384impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for ClosureParamWrapperPtr<'db> {
6385    fn from(value: ClosureParamWrapperNAryPtr<'db>) -> Self {
6386        Self(value.0)
6387    }
6388}
6389impl<'db> From<TerminalOrOrGreen<'db>> for ClosureParamWrapperGreen<'db> {
6390    fn from(value: TerminalOrOrGreen<'db>) -> Self {
6391        Self(value.0)
6392    }
6393}
6394impl<'db> From<ClosureParamWrapperNAryGreen<'db>> for ClosureParamWrapperGreen<'db> {
6395    fn from(value: ClosureParamWrapperNAryGreen<'db>) -> Self {
6396        Self(value.0)
6397    }
6398}
6399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6400pub struct ClosureParamWrapperGreen<'db>(pub GreenId<'db>);
6401impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapper<'db> {
6402    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6403    type StablePtr = ClosureParamWrapperPtr<'db>;
6404    type Green = ClosureParamWrapperGreen<'db>;
6405    fn missing(db: &'db dyn Database) -> Self::Green {
6406        panic!("No missing variant.");
6407    }
6408    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6409        let kind = node.kind(db);
6410        match kind {
6411            SyntaxKind::TerminalOrOr => {
6412                ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6413            }
6414            SyntaxKind::ClosureParamWrapperNAry => {
6415                ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6416            }
6417            _ => panic!(
6418                "Unexpected syntax kind {:?} when constructing {}.",
6419                kind, "ClosureParamWrapper"
6420            ),
6421        }
6422    }
6423    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6424        let kind = node.kind(db);
6425        match kind {
6426            SyntaxKind::TerminalOrOr => {
6427                Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6428            }
6429            SyntaxKind::ClosureParamWrapperNAry => {
6430                Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6431            }
6432            _ => None,
6433        }
6434    }
6435    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6436        match self {
6437            ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6438            ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6439        }
6440    }
6441    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6442        ClosureParamWrapperPtr(self.as_syntax_node().stable_ptr(db))
6443    }
6444}
6445impl<'db> ClosureParamWrapper<'db> {
6446    /// Checks if a kind of a variant of [ClosureParamWrapper].
6447    pub fn is_variant(kind: SyntaxKind) -> bool {
6448        matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6449    }
6450}
6451#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6452pub struct ClosureParamWrapperNAry<'db> {
6453    node: SyntaxNode<'db>,
6454}
6455impl<'db> ClosureParamWrapperNAry<'db> {
6456    pub const INDEX_LEFTOR: usize = 0;
6457    pub const INDEX_PARAMS: usize = 1;
6458    pub const INDEX_RIGHTOR: usize = 2;
6459    pub fn new_green(
6460        db: &'db dyn Database,
6461        leftor: TerminalOrGreen<'db>,
6462        params: ParamListGreen<'db>,
6463        rightor: TerminalOrGreen<'db>,
6464    ) -> ClosureParamWrapperNAryGreen<'db> {
6465        let children = [leftor.0, params.0, rightor.0];
6466        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6467        ClosureParamWrapperNAryGreen(
6468            GreenNode {
6469                kind: SyntaxKind::ClosureParamWrapperNAry,
6470                details: GreenNodeDetails::Node { children: children.into(), width },
6471            }
6472            .intern(db),
6473        )
6474    }
6475}
6476impl<'db> ClosureParamWrapperNAry<'db> {
6477    pub fn leftor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6478        TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6479    }
6480    pub fn params(&self, db: &'db dyn Database) -> ParamList<'db> {
6481        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6482    }
6483    pub fn rightor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6484        TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6485    }
6486}
6487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6488pub struct ClosureParamWrapperNAryPtr<'db>(pub SyntaxStablePtrId<'db>);
6489impl<'db> ClosureParamWrapperNAryPtr<'db> {}
6490impl<'db> TypedStablePtr<'db> for ClosureParamWrapperNAryPtr<'db> {
6491    type SyntaxNode = ClosureParamWrapperNAry<'db>;
6492    fn untyped(self) -> SyntaxStablePtrId<'db> {
6493        self.0
6494    }
6495    fn lookup(&self, db: &'db dyn Database) -> ClosureParamWrapperNAry<'db> {
6496        ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6497    }
6498}
6499impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for SyntaxStablePtrId<'db> {
6500    fn from(ptr: ClosureParamWrapperNAryPtr<'db>) -> Self {
6501        ptr.untyped()
6502    }
6503}
6504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6505pub struct ClosureParamWrapperNAryGreen<'db>(pub GreenId<'db>);
6506impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapperNAry<'db> {
6507    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6508    type StablePtr = ClosureParamWrapperNAryPtr<'db>;
6509    type Green = ClosureParamWrapperNAryGreen<'db>;
6510    fn missing(db: &'db dyn Database) -> Self::Green {
6511        ClosureParamWrapperNAryGreen(
6512            GreenNode {
6513                kind: SyntaxKind::ClosureParamWrapperNAry,
6514                details: GreenNodeDetails::Node {
6515                    children: [
6516                        TerminalOr::missing(db).0,
6517                        ParamList::missing(db).0,
6518                        TerminalOr::missing(db).0,
6519                    ]
6520                    .into(),
6521                    width: TextWidth::default(),
6522                },
6523            }
6524            .intern(db),
6525        )
6526    }
6527    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6528        let kind = node.kind(db);
6529        assert_eq!(
6530            kind,
6531            SyntaxKind::ClosureParamWrapperNAry,
6532            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6533            kind,
6534            SyntaxKind::ClosureParamWrapperNAry
6535        );
6536        Self { node }
6537    }
6538    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6539        let kind = node.kind(db);
6540        if kind == SyntaxKind::ClosureParamWrapperNAry {
6541            Some(Self::from_syntax_node(db, node))
6542        } else {
6543            None
6544        }
6545    }
6546    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6547        self.node
6548    }
6549    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6550        ClosureParamWrapperNAryPtr(self.node.stable_ptr(db))
6551    }
6552}
6553#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6554pub struct StructArgExpr<'db> {
6555    node: SyntaxNode<'db>,
6556}
6557impl<'db> StructArgExpr<'db> {
6558    pub const INDEX_COLON: usize = 0;
6559    pub const INDEX_EXPR: usize = 1;
6560    pub fn new_green(
6561        db: &'db dyn Database,
6562        colon: TerminalColonGreen<'db>,
6563        expr: ExprGreen<'db>,
6564    ) -> StructArgExprGreen<'db> {
6565        let children = [colon.0, expr.0];
6566        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6567        StructArgExprGreen(
6568            GreenNode {
6569                kind: SyntaxKind::StructArgExpr,
6570                details: GreenNodeDetails::Node { children: children.into(), width },
6571            }
6572            .intern(db),
6573        )
6574    }
6575}
6576impl<'db> StructArgExpr<'db> {
6577    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
6578        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6579    }
6580    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6581        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6582    }
6583}
6584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6585pub struct StructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6586impl<'db> StructArgExprPtr<'db> {}
6587impl<'db> TypedStablePtr<'db> for StructArgExprPtr<'db> {
6588    type SyntaxNode = StructArgExpr<'db>;
6589    fn untyped(self) -> SyntaxStablePtrId<'db> {
6590        self.0
6591    }
6592    fn lookup(&self, db: &'db dyn Database) -> StructArgExpr<'db> {
6593        StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6594    }
6595}
6596impl<'db> From<StructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6597    fn from(ptr: StructArgExprPtr<'db>) -> Self {
6598        ptr.untyped()
6599    }
6600}
6601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6602pub struct StructArgExprGreen<'db>(pub GreenId<'db>);
6603impl<'db> TypedSyntaxNode<'db> for StructArgExpr<'db> {
6604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6605    type StablePtr = StructArgExprPtr<'db>;
6606    type Green = StructArgExprGreen<'db>;
6607    fn missing(db: &'db dyn Database) -> Self::Green {
6608        StructArgExprGreen(
6609            GreenNode {
6610                kind: SyntaxKind::StructArgExpr,
6611                details: GreenNodeDetails::Node {
6612                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6613                    width: TextWidth::default(),
6614                },
6615            }
6616            .intern(db),
6617        )
6618    }
6619    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6620        let kind = node.kind(db);
6621        assert_eq!(
6622            kind,
6623            SyntaxKind::StructArgExpr,
6624            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6625            kind,
6626            SyntaxKind::StructArgExpr
6627        );
6628        Self { node }
6629    }
6630    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6631        let kind = node.kind(db);
6632        if kind == SyntaxKind::StructArgExpr {
6633            Some(Self::from_syntax_node(db, node))
6634        } else {
6635            None
6636        }
6637    }
6638    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6639        self.node
6640    }
6641    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6642        StructArgExprPtr(self.node.stable_ptr(db))
6643    }
6644}
6645#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6646pub enum OptionStructArgExpr<'db> {
6647    Empty(OptionStructArgExprEmpty<'db>),
6648    StructArgExpr(StructArgExpr<'db>),
6649}
6650#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6651pub struct OptionStructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6652impl<'db> TypedStablePtr<'db> for OptionStructArgExprPtr<'db> {
6653    type SyntaxNode = OptionStructArgExpr<'db>;
6654    fn untyped(self) -> SyntaxStablePtrId<'db> {
6655        self.0
6656    }
6657    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6658        OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6659    }
6660}
6661impl<'db> From<OptionStructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6662    fn from(ptr: OptionStructArgExprPtr<'db>) -> Self {
6663        ptr.untyped()
6664    }
6665}
6666impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for OptionStructArgExprPtr<'db> {
6667    fn from(value: OptionStructArgExprEmptyPtr<'db>) -> Self {
6668        Self(value.0)
6669    }
6670}
6671impl<'db> From<StructArgExprPtr<'db>> for OptionStructArgExprPtr<'db> {
6672    fn from(value: StructArgExprPtr<'db>) -> Self {
6673        Self(value.0)
6674    }
6675}
6676impl<'db> From<OptionStructArgExprEmptyGreen<'db>> for OptionStructArgExprGreen<'db> {
6677    fn from(value: OptionStructArgExprEmptyGreen<'db>) -> Self {
6678        Self(value.0)
6679    }
6680}
6681impl<'db> From<StructArgExprGreen<'db>> for OptionStructArgExprGreen<'db> {
6682    fn from(value: StructArgExprGreen<'db>) -> Self {
6683        Self(value.0)
6684    }
6685}
6686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6687pub struct OptionStructArgExprGreen<'db>(pub GreenId<'db>);
6688impl<'db> TypedSyntaxNode<'db> for OptionStructArgExpr<'db> {
6689    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6690    type StablePtr = OptionStructArgExprPtr<'db>;
6691    type Green = OptionStructArgExprGreen<'db>;
6692    fn missing(db: &'db dyn Database) -> Self::Green {
6693        panic!("No missing variant.");
6694    }
6695    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6696        let kind = node.kind(db);
6697        match kind {
6698            SyntaxKind::OptionStructArgExprEmpty => {
6699                OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6700            }
6701            SyntaxKind::StructArgExpr => {
6702                OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6703            }
6704            _ => panic!(
6705                "Unexpected syntax kind {:?} when constructing {}.",
6706                kind, "OptionStructArgExpr"
6707            ),
6708        }
6709    }
6710    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6711        let kind = node.kind(db);
6712        match kind {
6713            SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6714                OptionStructArgExprEmpty::from_syntax_node(db, node),
6715            )),
6716            SyntaxKind::StructArgExpr => {
6717                Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6718            }
6719            _ => None,
6720        }
6721    }
6722    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6723        match self {
6724            OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6725            OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6726        }
6727    }
6728    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6729        OptionStructArgExprPtr(self.as_syntax_node().stable_ptr(db))
6730    }
6731}
6732impl<'db> OptionStructArgExpr<'db> {
6733    /// Checks if a kind of a variant of [OptionStructArgExpr].
6734    pub fn is_variant(kind: SyntaxKind) -> bool {
6735        matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6736    }
6737}
6738#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6739pub struct OptionStructArgExprEmpty<'db> {
6740    node: SyntaxNode<'db>,
6741}
6742impl<'db> OptionStructArgExprEmpty<'db> {
6743    pub fn new_green(db: &'db dyn Database) -> OptionStructArgExprEmptyGreen<'db> {
6744        let children = [];
6745        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6746        OptionStructArgExprEmptyGreen(
6747            GreenNode {
6748                kind: SyntaxKind::OptionStructArgExprEmpty,
6749                details: GreenNodeDetails::Node { children: children.into(), width },
6750            }
6751            .intern(db),
6752        )
6753    }
6754}
6755impl<'db> OptionStructArgExprEmpty<'db> {}
6756#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6757pub struct OptionStructArgExprEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6758impl<'db> OptionStructArgExprEmptyPtr<'db> {}
6759impl<'db> TypedStablePtr<'db> for OptionStructArgExprEmptyPtr<'db> {
6760    type SyntaxNode = OptionStructArgExprEmpty<'db>;
6761    fn untyped(self) -> SyntaxStablePtrId<'db> {
6762        self.0
6763    }
6764    fn lookup(&self, db: &'db dyn Database) -> OptionStructArgExprEmpty<'db> {
6765        OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6766    }
6767}
6768impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6769    fn from(ptr: OptionStructArgExprEmptyPtr<'db>) -> Self {
6770        ptr.untyped()
6771    }
6772}
6773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6774pub struct OptionStructArgExprEmptyGreen<'db>(pub GreenId<'db>);
6775impl<'db> TypedSyntaxNode<'db> for OptionStructArgExprEmpty<'db> {
6776    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6777    type StablePtr = OptionStructArgExprEmptyPtr<'db>;
6778    type Green = OptionStructArgExprEmptyGreen<'db>;
6779    fn missing(db: &'db dyn Database) -> Self::Green {
6780        OptionStructArgExprEmptyGreen(
6781            GreenNode {
6782                kind: SyntaxKind::OptionStructArgExprEmpty,
6783                details: GreenNodeDetails::Node {
6784                    children: [].into(),
6785                    width: TextWidth::default(),
6786                },
6787            }
6788            .intern(db),
6789        )
6790    }
6791    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6792        let kind = node.kind(db);
6793        assert_eq!(
6794            kind,
6795            SyntaxKind::OptionStructArgExprEmpty,
6796            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6797            kind,
6798            SyntaxKind::OptionStructArgExprEmpty
6799        );
6800        Self { node }
6801    }
6802    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6803        let kind = node.kind(db);
6804        if kind == SyntaxKind::OptionStructArgExprEmpty {
6805            Some(Self::from_syntax_node(db, node))
6806        } else {
6807            None
6808        }
6809    }
6810    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6811        self.node
6812    }
6813    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6814        OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6815    }
6816}
6817#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6818pub struct StructArgSingle<'db> {
6819    node: SyntaxNode<'db>,
6820}
6821impl<'db> StructArgSingle<'db> {
6822    pub const INDEX_IDENTIFIER: usize = 0;
6823    pub const INDEX_ARG_EXPR: usize = 1;
6824    pub fn new_green(
6825        db: &'db dyn Database,
6826        identifier: TerminalIdentifierGreen<'db>,
6827        arg_expr: OptionStructArgExprGreen<'db>,
6828    ) -> StructArgSingleGreen<'db> {
6829        let children = [identifier.0, arg_expr.0];
6830        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6831        StructArgSingleGreen(
6832            GreenNode {
6833                kind: SyntaxKind::StructArgSingle,
6834                details: GreenNodeDetails::Node { children: children.into(), width },
6835            }
6836            .intern(db),
6837        )
6838    }
6839}
6840impl<'db> StructArgSingle<'db> {
6841    pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
6842        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6843    }
6844    pub fn arg_expr(&self, db: &'db dyn Database) -> OptionStructArgExpr<'db> {
6845        OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6846    }
6847}
6848#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6849pub struct StructArgSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
6850impl<'db> StructArgSinglePtr<'db> {
6851    pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
6852        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
6853    }
6854}
6855impl<'db> TypedStablePtr<'db> for StructArgSinglePtr<'db> {
6856    type SyntaxNode = StructArgSingle<'db>;
6857    fn untyped(self) -> SyntaxStablePtrId<'db> {
6858        self.0
6859    }
6860    fn lookup(&self, db: &'db dyn Database) -> StructArgSingle<'db> {
6861        StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6862    }
6863}
6864impl<'db> From<StructArgSinglePtr<'db>> for SyntaxStablePtrId<'db> {
6865    fn from(ptr: StructArgSinglePtr<'db>) -> Self {
6866        ptr.untyped()
6867    }
6868}
6869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6870pub struct StructArgSingleGreen<'db>(pub GreenId<'db>);
6871impl<'db> TypedSyntaxNode<'db> for StructArgSingle<'db> {
6872    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6873    type StablePtr = StructArgSinglePtr<'db>;
6874    type Green = StructArgSingleGreen<'db>;
6875    fn missing(db: &'db dyn Database) -> Self::Green {
6876        StructArgSingleGreen(
6877            GreenNode {
6878                kind: SyntaxKind::StructArgSingle,
6879                details: GreenNodeDetails::Node {
6880                    children: [
6881                        TerminalIdentifier::missing(db).0,
6882                        OptionStructArgExpr::missing(db).0,
6883                    ]
6884                    .into(),
6885                    width: TextWidth::default(),
6886                },
6887            }
6888            .intern(db),
6889        )
6890    }
6891    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6892        let kind = node.kind(db);
6893        assert_eq!(
6894            kind,
6895            SyntaxKind::StructArgSingle,
6896            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6897            kind,
6898            SyntaxKind::StructArgSingle
6899        );
6900        Self { node }
6901    }
6902    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6903        let kind = node.kind(db);
6904        if kind == SyntaxKind::StructArgSingle {
6905            Some(Self::from_syntax_node(db, node))
6906        } else {
6907            None
6908        }
6909    }
6910    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6911        self.node
6912    }
6913    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6914        StructArgSinglePtr(self.node.stable_ptr(db))
6915    }
6916}
6917#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6918pub struct StructArgTail<'db> {
6919    node: SyntaxNode<'db>,
6920}
6921impl<'db> StructArgTail<'db> {
6922    pub const INDEX_DOTDOT: usize = 0;
6923    pub const INDEX_EXPRESSION: usize = 1;
6924    pub fn new_green(
6925        db: &'db dyn Database,
6926        dotdot: TerminalDotDotGreen<'db>,
6927        expression: ExprGreen<'db>,
6928    ) -> StructArgTailGreen<'db> {
6929        let children = [dotdot.0, expression.0];
6930        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6931        StructArgTailGreen(
6932            GreenNode {
6933                kind: SyntaxKind::StructArgTail,
6934                details: GreenNodeDetails::Node { children: children.into(), width },
6935            }
6936            .intern(db),
6937        )
6938    }
6939}
6940impl<'db> StructArgTail<'db> {
6941    pub fn dotdot(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
6942        TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
6943    }
6944    pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
6945        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6946    }
6947}
6948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6949pub struct StructArgTailPtr<'db>(pub SyntaxStablePtrId<'db>);
6950impl<'db> StructArgTailPtr<'db> {}
6951impl<'db> TypedStablePtr<'db> for StructArgTailPtr<'db> {
6952    type SyntaxNode = StructArgTail<'db>;
6953    fn untyped(self) -> SyntaxStablePtrId<'db> {
6954        self.0
6955    }
6956    fn lookup(&self, db: &'db dyn Database) -> StructArgTail<'db> {
6957        StructArgTail::from_syntax_node(db, self.0.lookup(db))
6958    }
6959}
6960impl<'db> From<StructArgTailPtr<'db>> for SyntaxStablePtrId<'db> {
6961    fn from(ptr: StructArgTailPtr<'db>) -> Self {
6962        ptr.untyped()
6963    }
6964}
6965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6966pub struct StructArgTailGreen<'db>(pub GreenId<'db>);
6967impl<'db> TypedSyntaxNode<'db> for StructArgTail<'db> {
6968    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6969    type StablePtr = StructArgTailPtr<'db>;
6970    type Green = StructArgTailGreen<'db>;
6971    fn missing(db: &'db dyn Database) -> Self::Green {
6972        StructArgTailGreen(
6973            GreenNode {
6974                kind: SyntaxKind::StructArgTail,
6975                details: GreenNodeDetails::Node {
6976                    children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
6977                    width: TextWidth::default(),
6978                },
6979            }
6980            .intern(db),
6981        )
6982    }
6983    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6984        let kind = node.kind(db);
6985        assert_eq!(
6986            kind,
6987            SyntaxKind::StructArgTail,
6988            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6989            kind,
6990            SyntaxKind::StructArgTail
6991        );
6992        Self { node }
6993    }
6994    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6995        let kind = node.kind(db);
6996        if kind == SyntaxKind::StructArgTail {
6997            Some(Self::from_syntax_node(db, node))
6998        } else {
6999            None
7000        }
7001    }
7002    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7003        self.node
7004    }
7005    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7006        StructArgTailPtr(self.node.stable_ptr(db))
7007    }
7008}
7009#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7010pub enum StructArg<'db> {
7011    StructArgSingle(StructArgSingle<'db>),
7012    StructArgTail(StructArgTail<'db>),
7013}
7014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7015pub struct StructArgPtr<'db>(pub SyntaxStablePtrId<'db>);
7016impl<'db> TypedStablePtr<'db> for StructArgPtr<'db> {
7017    type SyntaxNode = StructArg<'db>;
7018    fn untyped(self) -> SyntaxStablePtrId<'db> {
7019        self.0
7020    }
7021    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7022        StructArg::from_syntax_node(db, self.0.lookup(db))
7023    }
7024}
7025impl<'db> From<StructArgPtr<'db>> for SyntaxStablePtrId<'db> {
7026    fn from(ptr: StructArgPtr<'db>) -> Self {
7027        ptr.untyped()
7028    }
7029}
7030impl<'db> From<StructArgSinglePtr<'db>> for StructArgPtr<'db> {
7031    fn from(value: StructArgSinglePtr<'db>) -> Self {
7032        Self(value.0)
7033    }
7034}
7035impl<'db> From<StructArgTailPtr<'db>> for StructArgPtr<'db> {
7036    fn from(value: StructArgTailPtr<'db>) -> Self {
7037        Self(value.0)
7038    }
7039}
7040impl<'db> From<StructArgSingleGreen<'db>> for StructArgGreen<'db> {
7041    fn from(value: StructArgSingleGreen<'db>) -> Self {
7042        Self(value.0)
7043    }
7044}
7045impl<'db> From<StructArgTailGreen<'db>> for StructArgGreen<'db> {
7046    fn from(value: StructArgTailGreen<'db>) -> Self {
7047        Self(value.0)
7048    }
7049}
7050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7051pub struct StructArgGreen<'db>(pub GreenId<'db>);
7052impl<'db> TypedSyntaxNode<'db> for StructArg<'db> {
7053    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7054    type StablePtr = StructArgPtr<'db>;
7055    type Green = StructArgGreen<'db>;
7056    fn missing(db: &'db dyn Database) -> Self::Green {
7057        panic!("No missing variant.");
7058    }
7059    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7060        let kind = node.kind(db);
7061        match kind {
7062            SyntaxKind::StructArgSingle => {
7063                StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7064            }
7065            SyntaxKind::StructArgTail => {
7066                StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7067            }
7068            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7069        }
7070    }
7071    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7072        let kind = node.kind(db);
7073        match kind {
7074            SyntaxKind::StructArgSingle => {
7075                Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7076            }
7077            SyntaxKind::StructArgTail => {
7078                Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7079            }
7080            _ => None,
7081        }
7082    }
7083    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7084        match self {
7085            StructArg::StructArgSingle(x) => x.as_syntax_node(),
7086            StructArg::StructArgTail(x) => x.as_syntax_node(),
7087        }
7088    }
7089    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7090        StructArgPtr(self.as_syntax_node().stable_ptr(db))
7091    }
7092}
7093impl<'db> StructArg<'db> {
7094    /// Checks if a kind of a variant of [StructArg].
7095    pub fn is_variant(kind: SyntaxKind) -> bool {
7096        matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7097    }
7098}
7099#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7100pub struct StructArgList<'db>(ElementList<'db, StructArg<'db>, 2>);
7101impl<'db> Deref for StructArgList<'db> {
7102    type Target = ElementList<'db, StructArg<'db>, 2>;
7103    fn deref(&self) -> &Self::Target {
7104        &self.0
7105    }
7106}
7107impl<'db> StructArgList<'db> {
7108    pub fn new_green(
7109        db: &'db dyn Database,
7110        children: &[StructArgListElementOrSeparatorGreen<'db>],
7111    ) -> StructArgListGreen<'db> {
7112        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
7113        StructArgListGreen(
7114            GreenNode {
7115                kind: SyntaxKind::StructArgList,
7116                details: GreenNodeDetails::Node {
7117                    children: children.iter().map(|x| x.id()).collect(),
7118                    width,
7119                },
7120            }
7121            .intern(db),
7122        )
7123    }
7124}
7125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7126pub struct StructArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7127impl<'db> TypedStablePtr<'db> for StructArgListPtr<'db> {
7128    type SyntaxNode = StructArgList<'db>;
7129    fn untyped(self) -> SyntaxStablePtrId<'db> {
7130        self.0
7131    }
7132    fn lookup(&self, db: &'db dyn Database) -> StructArgList<'db> {
7133        StructArgList::from_syntax_node(db, self.0.lookup(db))
7134    }
7135}
7136impl<'db> From<StructArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7137    fn from(ptr: StructArgListPtr<'db>) -> Self {
7138        ptr.untyped()
7139    }
7140}
7141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7142pub enum StructArgListElementOrSeparatorGreen<'db> {
7143    Separator(TerminalCommaGreen<'db>),
7144    Element(StructArgGreen<'db>),
7145}
7146impl<'db> From<TerminalCommaGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7147    fn from(value: TerminalCommaGreen<'db>) -> Self {
7148        StructArgListElementOrSeparatorGreen::Separator(value)
7149    }
7150}
7151impl<'db> From<StructArgGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7152    fn from(value: StructArgGreen<'db>) -> Self {
7153        StructArgListElementOrSeparatorGreen::Element(value)
7154    }
7155}
7156impl<'db> StructArgListElementOrSeparatorGreen<'db> {
7157    fn id(&self) -> GreenId<'db> {
7158        match self {
7159            StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7160            StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7161        }
7162    }
7163}
7164#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7165pub struct StructArgListGreen<'db>(pub GreenId<'db>);
7166impl<'db> TypedSyntaxNode<'db> for StructArgList<'db> {
7167    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7168    type StablePtr = StructArgListPtr<'db>;
7169    type Green = StructArgListGreen<'db>;
7170    fn missing(db: &'db dyn Database) -> Self::Green {
7171        StructArgListGreen(
7172            GreenNode {
7173                kind: SyntaxKind::StructArgList,
7174                details: GreenNodeDetails::Node {
7175                    children: [].into(),
7176                    width: TextWidth::default(),
7177                },
7178            }
7179            .intern(db),
7180        )
7181    }
7182    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7183        Self(ElementList::new(node))
7184    }
7185    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7186        if node.kind(db) == SyntaxKind::StructArgList {
7187            Some(Self(ElementList::new(node)))
7188        } else {
7189            None
7190        }
7191    }
7192    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7193        self.node
7194    }
7195    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7196        StructArgListPtr(self.node.stable_ptr(db))
7197    }
7198}
7199#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7200pub struct ArgListBraced<'db> {
7201    node: SyntaxNode<'db>,
7202}
7203impl<'db> ArgListBraced<'db> {
7204    pub const INDEX_LBRACE: usize = 0;
7205    pub const INDEX_ARGUMENTS: usize = 1;
7206    pub const INDEX_RBRACE: usize = 2;
7207    pub fn new_green(
7208        db: &'db dyn Database,
7209        lbrace: TerminalLBraceGreen<'db>,
7210        arguments: ArgListGreen<'db>,
7211        rbrace: TerminalRBraceGreen<'db>,
7212    ) -> ArgListBracedGreen<'db> {
7213        let children = [lbrace.0, arguments.0, rbrace.0];
7214        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7215        ArgListBracedGreen(
7216            GreenNode {
7217                kind: SyntaxKind::ArgListBraced,
7218                details: GreenNodeDetails::Node { children: children.into(), width },
7219            }
7220            .intern(db),
7221        )
7222    }
7223}
7224impl<'db> ArgListBraced<'db> {
7225    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7226        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7227    }
7228    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7229        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7230    }
7231    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7232        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7233    }
7234}
7235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7236pub struct ArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
7237impl<'db> ArgListBracedPtr<'db> {}
7238impl<'db> TypedStablePtr<'db> for ArgListBracedPtr<'db> {
7239    type SyntaxNode = ArgListBraced<'db>;
7240    fn untyped(self) -> SyntaxStablePtrId<'db> {
7241        self.0
7242    }
7243    fn lookup(&self, db: &'db dyn Database) -> ArgListBraced<'db> {
7244        ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7245    }
7246}
7247impl<'db> From<ArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
7248    fn from(ptr: ArgListBracedPtr<'db>) -> Self {
7249        ptr.untyped()
7250    }
7251}
7252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7253pub struct ArgListBracedGreen<'db>(pub GreenId<'db>);
7254impl<'db> TypedSyntaxNode<'db> for ArgListBraced<'db> {
7255    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7256    type StablePtr = ArgListBracedPtr<'db>;
7257    type Green = ArgListBracedGreen<'db>;
7258    fn missing(db: &'db dyn Database) -> Self::Green {
7259        ArgListBracedGreen(
7260            GreenNode {
7261                kind: SyntaxKind::ArgListBraced,
7262                details: GreenNodeDetails::Node {
7263                    children: [
7264                        TerminalLBrace::missing(db).0,
7265                        ArgList::missing(db).0,
7266                        TerminalRBrace::missing(db).0,
7267                    ]
7268                    .into(),
7269                    width: TextWidth::default(),
7270                },
7271            }
7272            .intern(db),
7273        )
7274    }
7275    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7276        let kind = node.kind(db);
7277        assert_eq!(
7278            kind,
7279            SyntaxKind::ArgListBraced,
7280            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7281            kind,
7282            SyntaxKind::ArgListBraced
7283        );
7284        Self { node }
7285    }
7286    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7287        let kind = node.kind(db);
7288        if kind == SyntaxKind::ArgListBraced {
7289            Some(Self::from_syntax_node(db, node))
7290        } else {
7291            None
7292        }
7293    }
7294    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7295        self.node
7296    }
7297    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7298        ArgListBracedPtr(self.node.stable_ptr(db))
7299    }
7300}
7301#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7302pub struct ArgListBracketed<'db> {
7303    node: SyntaxNode<'db>,
7304}
7305impl<'db> ArgListBracketed<'db> {
7306    pub const INDEX_LBRACK: usize = 0;
7307    pub const INDEX_ARGUMENTS: usize = 1;
7308    pub const INDEX_RBRACK: usize = 2;
7309    pub fn new_green(
7310        db: &'db dyn Database,
7311        lbrack: TerminalLBrackGreen<'db>,
7312        arguments: ArgListGreen<'db>,
7313        rbrack: TerminalRBrackGreen<'db>,
7314    ) -> ArgListBracketedGreen<'db> {
7315        let children = [lbrack.0, arguments.0, rbrack.0];
7316        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7317        ArgListBracketedGreen(
7318            GreenNode {
7319                kind: SyntaxKind::ArgListBracketed,
7320                details: GreenNodeDetails::Node { children: children.into(), width },
7321            }
7322            .intern(db),
7323        )
7324    }
7325}
7326impl<'db> ArgListBracketed<'db> {
7327    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
7328        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7329    }
7330    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7331        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7332    }
7333    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
7334        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7335    }
7336}
7337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7338pub struct ArgListBracketedPtr<'db>(pub SyntaxStablePtrId<'db>);
7339impl<'db> ArgListBracketedPtr<'db> {}
7340impl<'db> TypedStablePtr<'db> for ArgListBracketedPtr<'db> {
7341    type SyntaxNode = ArgListBracketed<'db>;
7342    fn untyped(self) -> SyntaxStablePtrId<'db> {
7343        self.0
7344    }
7345    fn lookup(&self, db: &'db dyn Database) -> ArgListBracketed<'db> {
7346        ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7347    }
7348}
7349impl<'db> From<ArgListBracketedPtr<'db>> for SyntaxStablePtrId<'db> {
7350    fn from(ptr: ArgListBracketedPtr<'db>) -> Self {
7351        ptr.untyped()
7352    }
7353}
7354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7355pub struct ArgListBracketedGreen<'db>(pub GreenId<'db>);
7356impl<'db> TypedSyntaxNode<'db> for ArgListBracketed<'db> {
7357    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7358    type StablePtr = ArgListBracketedPtr<'db>;
7359    type Green = ArgListBracketedGreen<'db>;
7360    fn missing(db: &'db dyn Database) -> Self::Green {
7361        ArgListBracketedGreen(
7362            GreenNode {
7363                kind: SyntaxKind::ArgListBracketed,
7364                details: GreenNodeDetails::Node {
7365                    children: [
7366                        TerminalLBrack::missing(db).0,
7367                        ArgList::missing(db).0,
7368                        TerminalRBrack::missing(db).0,
7369                    ]
7370                    .into(),
7371                    width: TextWidth::default(),
7372                },
7373            }
7374            .intern(db),
7375        )
7376    }
7377    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7378        let kind = node.kind(db);
7379        assert_eq!(
7380            kind,
7381            SyntaxKind::ArgListBracketed,
7382            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7383            kind,
7384            SyntaxKind::ArgListBracketed
7385        );
7386        Self { node }
7387    }
7388    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7389        let kind = node.kind(db);
7390        if kind == SyntaxKind::ArgListBracketed {
7391            Some(Self::from_syntax_node(db, node))
7392        } else {
7393            None
7394        }
7395    }
7396    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7397        self.node
7398    }
7399    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7400        ArgListBracketedPtr(self.node.stable_ptr(db))
7401    }
7402}
7403#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7404pub enum WrappedArgList<'db> {
7405    BracketedArgList(ArgListBracketed<'db>),
7406    ParenthesizedArgList(ArgListParenthesized<'db>),
7407    BracedArgList(ArgListBraced<'db>),
7408    Missing(WrappedArgListMissing<'db>),
7409}
7410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7411pub struct WrappedArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7412impl<'db> TypedStablePtr<'db> for WrappedArgListPtr<'db> {
7413    type SyntaxNode = WrappedArgList<'db>;
7414    fn untyped(self) -> SyntaxStablePtrId<'db> {
7415        self.0
7416    }
7417    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7418        WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7419    }
7420}
7421impl<'db> From<WrappedArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7422    fn from(ptr: WrappedArgListPtr<'db>) -> Self {
7423        ptr.untyped()
7424    }
7425}
7426impl<'db> From<ArgListBracketedPtr<'db>> for WrappedArgListPtr<'db> {
7427    fn from(value: ArgListBracketedPtr<'db>) -> Self {
7428        Self(value.0)
7429    }
7430}
7431impl<'db> From<ArgListParenthesizedPtr<'db>> for WrappedArgListPtr<'db> {
7432    fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
7433        Self(value.0)
7434    }
7435}
7436impl<'db> From<ArgListBracedPtr<'db>> for WrappedArgListPtr<'db> {
7437    fn from(value: ArgListBracedPtr<'db>) -> Self {
7438        Self(value.0)
7439    }
7440}
7441impl<'db> From<WrappedArgListMissingPtr<'db>> for WrappedArgListPtr<'db> {
7442    fn from(value: WrappedArgListMissingPtr<'db>) -> Self {
7443        Self(value.0)
7444    }
7445}
7446impl<'db> From<ArgListBracketedGreen<'db>> for WrappedArgListGreen<'db> {
7447    fn from(value: ArgListBracketedGreen<'db>) -> Self {
7448        Self(value.0)
7449    }
7450}
7451impl<'db> From<ArgListParenthesizedGreen<'db>> for WrappedArgListGreen<'db> {
7452    fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
7453        Self(value.0)
7454    }
7455}
7456impl<'db> From<ArgListBracedGreen<'db>> for WrappedArgListGreen<'db> {
7457    fn from(value: ArgListBracedGreen<'db>) -> Self {
7458        Self(value.0)
7459    }
7460}
7461impl<'db> From<WrappedArgListMissingGreen<'db>> for WrappedArgListGreen<'db> {
7462    fn from(value: WrappedArgListMissingGreen<'db>) -> Self {
7463        Self(value.0)
7464    }
7465}
7466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7467pub struct WrappedArgListGreen<'db>(pub GreenId<'db>);
7468impl<'db> TypedSyntaxNode<'db> for WrappedArgList<'db> {
7469    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7470    type StablePtr = WrappedArgListPtr<'db>;
7471    type Green = WrappedArgListGreen<'db>;
7472    fn missing(db: &'db dyn Database) -> Self::Green {
7473        WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7474    }
7475    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7476        let kind = node.kind(db);
7477        match kind {
7478            SyntaxKind::ArgListBracketed => {
7479                WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7480            }
7481            SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7482                ArgListParenthesized::from_syntax_node(db, node),
7483            ),
7484            SyntaxKind::ArgListBraced => {
7485                WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7486            }
7487            SyntaxKind::WrappedArgListMissing => {
7488                WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7489            }
7490            _ => {
7491                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7492            }
7493        }
7494    }
7495    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7496        let kind = node.kind(db);
7497        match kind {
7498            SyntaxKind::ArgListBracketed => {
7499                Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7500            }
7501            SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7502                ArgListParenthesized::from_syntax_node(db, node),
7503            )),
7504            SyntaxKind::ArgListBraced => {
7505                Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7506            }
7507            SyntaxKind::WrappedArgListMissing => {
7508                Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7509            }
7510            _ => None,
7511        }
7512    }
7513    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7514        match self {
7515            WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7516            WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7517            WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7518            WrappedArgList::Missing(x) => x.as_syntax_node(),
7519        }
7520    }
7521    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7522        WrappedArgListPtr(self.as_syntax_node().stable_ptr(db))
7523    }
7524}
7525impl<'db> WrappedArgList<'db> {
7526    /// Checks if a kind of a variant of [WrappedArgList].
7527    pub fn is_variant(kind: SyntaxKind) -> bool {
7528        matches!(
7529            kind,
7530            SyntaxKind::ArgListBracketed
7531                | SyntaxKind::ArgListParenthesized
7532                | SyntaxKind::ArgListBraced
7533                | SyntaxKind::WrappedArgListMissing
7534        )
7535    }
7536}
7537#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7538pub struct WrappedArgListMissing<'db> {
7539    node: SyntaxNode<'db>,
7540}
7541impl<'db> WrappedArgListMissing<'db> {
7542    pub fn new_green(db: &'db dyn Database) -> WrappedArgListMissingGreen<'db> {
7543        let children = [];
7544        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7545        WrappedArgListMissingGreen(
7546            GreenNode {
7547                kind: SyntaxKind::WrappedArgListMissing,
7548                details: GreenNodeDetails::Node { children: children.into(), width },
7549            }
7550            .intern(db),
7551        )
7552    }
7553}
7554impl<'db> WrappedArgListMissing<'db> {}
7555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7556pub struct WrappedArgListMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
7557impl<'db> WrappedArgListMissingPtr<'db> {}
7558impl<'db> TypedStablePtr<'db> for WrappedArgListMissingPtr<'db> {
7559    type SyntaxNode = WrappedArgListMissing<'db>;
7560    fn untyped(self) -> SyntaxStablePtrId<'db> {
7561        self.0
7562    }
7563    fn lookup(&self, db: &'db dyn Database) -> WrappedArgListMissing<'db> {
7564        WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7565    }
7566}
7567impl<'db> From<WrappedArgListMissingPtr<'db>> for SyntaxStablePtrId<'db> {
7568    fn from(ptr: WrappedArgListMissingPtr<'db>) -> Self {
7569        ptr.untyped()
7570    }
7571}
7572#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7573pub struct WrappedArgListMissingGreen<'db>(pub GreenId<'db>);
7574impl<'db> TypedSyntaxNode<'db> for WrappedArgListMissing<'db> {
7575    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7576    type StablePtr = WrappedArgListMissingPtr<'db>;
7577    type Green = WrappedArgListMissingGreen<'db>;
7578    fn missing(db: &'db dyn Database) -> Self::Green {
7579        WrappedArgListMissingGreen(
7580            GreenNode {
7581                kind: SyntaxKind::WrappedArgListMissing,
7582                details: GreenNodeDetails::Node {
7583                    children: [].into(),
7584                    width: TextWidth::default(),
7585                },
7586            }
7587            .intern(db),
7588        )
7589    }
7590    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7591        let kind = node.kind(db);
7592        assert_eq!(
7593            kind,
7594            SyntaxKind::WrappedArgListMissing,
7595            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7596            kind,
7597            SyntaxKind::WrappedArgListMissing
7598        );
7599        Self { node }
7600    }
7601    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7602        let kind = node.kind(db);
7603        if kind == SyntaxKind::WrappedArgListMissing {
7604            Some(Self::from_syntax_node(db, node))
7605        } else {
7606            None
7607        }
7608    }
7609    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7610        self.node
7611    }
7612    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7613        WrappedArgListMissingPtr(self.node.stable_ptr(db))
7614    }
7615}
7616#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7617pub enum Pattern<'db> {
7618    Underscore(TerminalUnderscore<'db>),
7619    Literal(TerminalLiteralNumber<'db>),
7620    False(TerminalFalse<'db>),
7621    True(TerminalTrue<'db>),
7622    ShortString(TerminalShortString<'db>),
7623    String(TerminalString<'db>),
7624    Identifier(PatternIdentifier<'db>),
7625    Struct(PatternStruct<'db>),
7626    Tuple(PatternTuple<'db>),
7627    Enum(PatternEnum<'db>),
7628    FixedSizeArray(PatternFixedSizeArray<'db>),
7629    Path(ExprPath<'db>),
7630}
7631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7632pub struct PatternPtr<'db>(pub SyntaxStablePtrId<'db>);
7633impl<'db> TypedStablePtr<'db> for PatternPtr<'db> {
7634    type SyntaxNode = Pattern<'db>;
7635    fn untyped(self) -> SyntaxStablePtrId<'db> {
7636        self.0
7637    }
7638    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7639        Pattern::from_syntax_node(db, self.0.lookup(db))
7640    }
7641}
7642impl<'db> From<PatternPtr<'db>> for SyntaxStablePtrId<'db> {
7643    fn from(ptr: PatternPtr<'db>) -> Self {
7644        ptr.untyped()
7645    }
7646}
7647impl<'db> From<TerminalUnderscorePtr<'db>> for PatternPtr<'db> {
7648    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
7649        Self(value.0)
7650    }
7651}
7652impl<'db> From<TerminalLiteralNumberPtr<'db>> for PatternPtr<'db> {
7653    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
7654        Self(value.0)
7655    }
7656}
7657impl<'db> From<TerminalFalsePtr<'db>> for PatternPtr<'db> {
7658    fn from(value: TerminalFalsePtr<'db>) -> Self {
7659        Self(value.0)
7660    }
7661}
7662impl<'db> From<TerminalTruePtr<'db>> for PatternPtr<'db> {
7663    fn from(value: TerminalTruePtr<'db>) -> Self {
7664        Self(value.0)
7665    }
7666}
7667impl<'db> From<TerminalShortStringPtr<'db>> for PatternPtr<'db> {
7668    fn from(value: TerminalShortStringPtr<'db>) -> Self {
7669        Self(value.0)
7670    }
7671}
7672impl<'db> From<TerminalStringPtr<'db>> for PatternPtr<'db> {
7673    fn from(value: TerminalStringPtr<'db>) -> Self {
7674        Self(value.0)
7675    }
7676}
7677impl<'db> From<PatternIdentifierPtr<'db>> for PatternPtr<'db> {
7678    fn from(value: PatternIdentifierPtr<'db>) -> Self {
7679        Self(value.0)
7680    }
7681}
7682impl<'db> From<PatternStructPtr<'db>> for PatternPtr<'db> {
7683    fn from(value: PatternStructPtr<'db>) -> Self {
7684        Self(value.0)
7685    }
7686}
7687impl<'db> From<PatternTuplePtr<'db>> for PatternPtr<'db> {
7688    fn from(value: PatternTuplePtr<'db>) -> Self {
7689        Self(value.0)
7690    }
7691}
7692impl<'db> From<PatternEnumPtr<'db>> for PatternPtr<'db> {
7693    fn from(value: PatternEnumPtr<'db>) -> Self {
7694        Self(value.0)
7695    }
7696}
7697impl<'db> From<PatternFixedSizeArrayPtr<'db>> for PatternPtr<'db> {
7698    fn from(value: PatternFixedSizeArrayPtr<'db>) -> Self {
7699        Self(value.0)
7700    }
7701}
7702impl<'db> From<ExprPathPtr<'db>> for PatternPtr<'db> {
7703    fn from(value: ExprPathPtr<'db>) -> Self {
7704        Self(value.0)
7705    }
7706}
7707impl<'db> From<TerminalUnderscoreGreen<'db>> for PatternGreen<'db> {
7708    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
7709        Self(value.0)
7710    }
7711}
7712impl<'db> From<TerminalLiteralNumberGreen<'db>> for PatternGreen<'db> {
7713    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
7714        Self(value.0)
7715    }
7716}
7717impl<'db> From<TerminalFalseGreen<'db>> for PatternGreen<'db> {
7718    fn from(value: TerminalFalseGreen<'db>) -> Self {
7719        Self(value.0)
7720    }
7721}
7722impl<'db> From<TerminalTrueGreen<'db>> for PatternGreen<'db> {
7723    fn from(value: TerminalTrueGreen<'db>) -> Self {
7724        Self(value.0)
7725    }
7726}
7727impl<'db> From<TerminalShortStringGreen<'db>> for PatternGreen<'db> {
7728    fn from(value: TerminalShortStringGreen<'db>) -> Self {
7729        Self(value.0)
7730    }
7731}
7732impl<'db> From<TerminalStringGreen<'db>> for PatternGreen<'db> {
7733    fn from(value: TerminalStringGreen<'db>) -> Self {
7734        Self(value.0)
7735    }
7736}
7737impl<'db> From<PatternIdentifierGreen<'db>> for PatternGreen<'db> {
7738    fn from(value: PatternIdentifierGreen<'db>) -> Self {
7739        Self(value.0)
7740    }
7741}
7742impl<'db> From<PatternStructGreen<'db>> for PatternGreen<'db> {
7743    fn from(value: PatternStructGreen<'db>) -> Self {
7744        Self(value.0)
7745    }
7746}
7747impl<'db> From<PatternTupleGreen<'db>> for PatternGreen<'db> {
7748    fn from(value: PatternTupleGreen<'db>) -> Self {
7749        Self(value.0)
7750    }
7751}
7752impl<'db> From<PatternEnumGreen<'db>> for PatternGreen<'db> {
7753    fn from(value: PatternEnumGreen<'db>) -> Self {
7754        Self(value.0)
7755    }
7756}
7757impl<'db> From<PatternFixedSizeArrayGreen<'db>> for PatternGreen<'db> {
7758    fn from(value: PatternFixedSizeArrayGreen<'db>) -> Self {
7759        Self(value.0)
7760    }
7761}
7762impl<'db> From<ExprPathGreen<'db>> for PatternGreen<'db> {
7763    fn from(value: ExprPathGreen<'db>) -> Self {
7764        Self(value.0)
7765    }
7766}
7767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7768pub struct PatternGreen<'db>(pub GreenId<'db>);
7769impl<'db> TypedSyntaxNode<'db> for Pattern<'db> {
7770    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7771    type StablePtr = PatternPtr<'db>;
7772    type Green = PatternGreen<'db>;
7773    fn missing(db: &'db dyn Database) -> Self::Green {
7774        panic!("No missing variant.");
7775    }
7776    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7777        let kind = node.kind(db);
7778        match kind {
7779            SyntaxKind::TerminalUnderscore => {
7780                Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7781            }
7782            SyntaxKind::TerminalLiteralNumber => {
7783                Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7784            }
7785            SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7786            SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7787            SyntaxKind::TerminalShortString => {
7788                Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7789            }
7790            SyntaxKind::TerminalString => {
7791                Pattern::String(TerminalString::from_syntax_node(db, node))
7792            }
7793            SyntaxKind::PatternIdentifier => {
7794                Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7795            }
7796            SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7797            SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7798            SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7799            SyntaxKind::PatternFixedSizeArray => {
7800                Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7801            }
7802            SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7803            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7804        }
7805    }
7806    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7807        let kind = node.kind(db);
7808        match kind {
7809            SyntaxKind::TerminalUnderscore => {
7810                Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7811            }
7812            SyntaxKind::TerminalLiteralNumber => {
7813                Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7814            }
7815            SyntaxKind::TerminalFalse => {
7816                Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7817            }
7818            SyntaxKind::TerminalTrue => {
7819                Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7820            }
7821            SyntaxKind::TerminalShortString => {
7822                Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7823            }
7824            SyntaxKind::TerminalString => {
7825                Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7826            }
7827            SyntaxKind::PatternIdentifier => {
7828                Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7829            }
7830            SyntaxKind::PatternStruct => {
7831                Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7832            }
7833            SyntaxKind::PatternTuple => {
7834                Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7835            }
7836            SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7837            SyntaxKind::PatternFixedSizeArray => {
7838                Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7839            }
7840            SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7841            _ => None,
7842        }
7843    }
7844    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7845        match self {
7846            Pattern::Underscore(x) => x.as_syntax_node(),
7847            Pattern::Literal(x) => x.as_syntax_node(),
7848            Pattern::False(x) => x.as_syntax_node(),
7849            Pattern::True(x) => x.as_syntax_node(),
7850            Pattern::ShortString(x) => x.as_syntax_node(),
7851            Pattern::String(x) => x.as_syntax_node(),
7852            Pattern::Identifier(x) => x.as_syntax_node(),
7853            Pattern::Struct(x) => x.as_syntax_node(),
7854            Pattern::Tuple(x) => x.as_syntax_node(),
7855            Pattern::Enum(x) => x.as_syntax_node(),
7856            Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7857            Pattern::Path(x) => x.as_syntax_node(),
7858        }
7859    }
7860    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7861        PatternPtr(self.as_syntax_node().stable_ptr(db))
7862    }
7863}
7864impl<'db> Pattern<'db> {
7865    /// Checks if a kind of a variant of [Pattern].
7866    pub fn is_variant(kind: SyntaxKind) -> bool {
7867        matches!(
7868            kind,
7869            SyntaxKind::TerminalUnderscore
7870                | SyntaxKind::TerminalLiteralNumber
7871                | SyntaxKind::TerminalFalse
7872                | SyntaxKind::TerminalTrue
7873                | SyntaxKind::TerminalShortString
7874                | SyntaxKind::TerminalString
7875                | SyntaxKind::PatternIdentifier
7876                | SyntaxKind::PatternStruct
7877                | SyntaxKind::PatternTuple
7878                | SyntaxKind::PatternEnum
7879                | SyntaxKind::PatternFixedSizeArray
7880                | SyntaxKind::ExprPath
7881        )
7882    }
7883}
7884#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7885pub struct PatternIdentifier<'db> {
7886    node: SyntaxNode<'db>,
7887}
7888impl<'db> PatternIdentifier<'db> {
7889    pub const INDEX_MODIFIERS: usize = 0;
7890    pub const INDEX_NAME: usize = 1;
7891    pub fn new_green(
7892        db: &'db dyn Database,
7893        modifiers: ModifierListGreen<'db>,
7894        name: TerminalIdentifierGreen<'db>,
7895    ) -> PatternIdentifierGreen<'db> {
7896        let children = [modifiers.0, name.0];
7897        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7898        PatternIdentifierGreen(
7899            GreenNode {
7900                kind: SyntaxKind::PatternIdentifier,
7901                details: GreenNodeDetails::Node { children: children.into(), width },
7902            }
7903            .intern(db),
7904        )
7905    }
7906}
7907impl<'db> PatternIdentifier<'db> {
7908    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
7909        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
7910    }
7911    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
7912        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
7913    }
7914}
7915#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7916pub struct PatternIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
7917impl<'db> PatternIdentifierPtr<'db> {
7918    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
7919        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
7920    }
7921}
7922impl<'db> TypedStablePtr<'db> for PatternIdentifierPtr<'db> {
7923    type SyntaxNode = PatternIdentifier<'db>;
7924    fn untyped(self) -> SyntaxStablePtrId<'db> {
7925        self.0
7926    }
7927    fn lookup(&self, db: &'db dyn Database) -> PatternIdentifier<'db> {
7928        PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7929    }
7930}
7931impl<'db> From<PatternIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
7932    fn from(ptr: PatternIdentifierPtr<'db>) -> Self {
7933        ptr.untyped()
7934    }
7935}
7936#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7937pub struct PatternIdentifierGreen<'db>(pub GreenId<'db>);
7938impl<'db> TypedSyntaxNode<'db> for PatternIdentifier<'db> {
7939    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7940    type StablePtr = PatternIdentifierPtr<'db>;
7941    type Green = PatternIdentifierGreen<'db>;
7942    fn missing(db: &'db dyn Database) -> Self::Green {
7943        PatternIdentifierGreen(
7944            GreenNode {
7945                kind: SyntaxKind::PatternIdentifier,
7946                details: GreenNodeDetails::Node {
7947                    children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
7948                        .into(),
7949                    width: TextWidth::default(),
7950                },
7951            }
7952            .intern(db),
7953        )
7954    }
7955    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7956        let kind = node.kind(db);
7957        assert_eq!(
7958            kind,
7959            SyntaxKind::PatternIdentifier,
7960            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7961            kind,
7962            SyntaxKind::PatternIdentifier
7963        );
7964        Self { node }
7965    }
7966    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7967        let kind = node.kind(db);
7968        if kind == SyntaxKind::PatternIdentifier {
7969            Some(Self::from_syntax_node(db, node))
7970        } else {
7971            None
7972        }
7973    }
7974    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7975        self.node
7976    }
7977    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7978        PatternIdentifierPtr(self.node.stable_ptr(db))
7979    }
7980}
7981#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7982pub struct PatternStruct<'db> {
7983    node: SyntaxNode<'db>,
7984}
7985impl<'db> PatternStruct<'db> {
7986    pub const INDEX_PATH: usize = 0;
7987    pub const INDEX_LBRACE: usize = 1;
7988    pub const INDEX_PARAMS: usize = 2;
7989    pub const INDEX_RBRACE: usize = 3;
7990    pub fn new_green(
7991        db: &'db dyn Database,
7992        path: ExprPathGreen<'db>,
7993        lbrace: TerminalLBraceGreen<'db>,
7994        params: PatternStructParamListGreen<'db>,
7995        rbrace: TerminalRBraceGreen<'db>,
7996    ) -> PatternStructGreen<'db> {
7997        let children = [path.0, lbrace.0, params.0, rbrace.0];
7998        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7999        PatternStructGreen(
8000            GreenNode {
8001                kind: SyntaxKind::PatternStruct,
8002                details: GreenNodeDetails::Node { children: children.into(), width },
8003            }
8004            .intern(db),
8005        )
8006    }
8007}
8008impl<'db> PatternStruct<'db> {
8009    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8010        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8011    }
8012    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
8013        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
8014    }
8015    pub fn params(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8016        PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
8017    }
8018    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
8019        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
8020    }
8021}
8022#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8023pub struct PatternStructPtr<'db>(pub SyntaxStablePtrId<'db>);
8024impl<'db> PatternStructPtr<'db> {}
8025impl<'db> TypedStablePtr<'db> for PatternStructPtr<'db> {
8026    type SyntaxNode = PatternStruct<'db>;
8027    fn untyped(self) -> SyntaxStablePtrId<'db> {
8028        self.0
8029    }
8030    fn lookup(&self, db: &'db dyn Database) -> PatternStruct<'db> {
8031        PatternStruct::from_syntax_node(db, self.0.lookup(db))
8032    }
8033}
8034impl<'db> From<PatternStructPtr<'db>> for SyntaxStablePtrId<'db> {
8035    fn from(ptr: PatternStructPtr<'db>) -> Self {
8036        ptr.untyped()
8037    }
8038}
8039#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8040pub struct PatternStructGreen<'db>(pub GreenId<'db>);
8041impl<'db> TypedSyntaxNode<'db> for PatternStruct<'db> {
8042    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8043    type StablePtr = PatternStructPtr<'db>;
8044    type Green = PatternStructGreen<'db>;
8045    fn missing(db: &'db dyn Database) -> Self::Green {
8046        PatternStructGreen(
8047            GreenNode {
8048                kind: SyntaxKind::PatternStruct,
8049                details: GreenNodeDetails::Node {
8050                    children: [
8051                        ExprPath::missing(db).0,
8052                        TerminalLBrace::missing(db).0,
8053                        PatternStructParamList::missing(db).0,
8054                        TerminalRBrace::missing(db).0,
8055                    ]
8056                    .into(),
8057                    width: TextWidth::default(),
8058                },
8059            }
8060            .intern(db),
8061        )
8062    }
8063    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8064        let kind = node.kind(db);
8065        assert_eq!(
8066            kind,
8067            SyntaxKind::PatternStruct,
8068            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8069            kind,
8070            SyntaxKind::PatternStruct
8071        );
8072        Self { node }
8073    }
8074    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8075        let kind = node.kind(db);
8076        if kind == SyntaxKind::PatternStruct {
8077            Some(Self::from_syntax_node(db, node))
8078        } else {
8079            None
8080        }
8081    }
8082    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8083        self.node
8084    }
8085    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8086        PatternStructPtr(self.node.stable_ptr(db))
8087    }
8088}
8089#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8090pub struct PatternStructParamList<'db>(ElementList<'db, PatternStructParam<'db>, 2>);
8091impl<'db> Deref for PatternStructParamList<'db> {
8092    type Target = ElementList<'db, PatternStructParam<'db>, 2>;
8093    fn deref(&self) -> &Self::Target {
8094        &self.0
8095    }
8096}
8097impl<'db> PatternStructParamList<'db> {
8098    pub fn new_green(
8099        db: &'db dyn Database,
8100        children: &[PatternStructParamListElementOrSeparatorGreen<'db>],
8101    ) -> PatternStructParamListGreen<'db> {
8102        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8103        PatternStructParamListGreen(
8104            GreenNode {
8105                kind: SyntaxKind::PatternStructParamList,
8106                details: GreenNodeDetails::Node {
8107                    children: children.iter().map(|x| x.id()).collect(),
8108                    width,
8109                },
8110            }
8111            .intern(db),
8112        )
8113    }
8114}
8115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8116pub struct PatternStructParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
8117impl<'db> TypedStablePtr<'db> for PatternStructParamListPtr<'db> {
8118    type SyntaxNode = PatternStructParamList<'db>;
8119    fn untyped(self) -> SyntaxStablePtrId<'db> {
8120        self.0
8121    }
8122    fn lookup(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8123        PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8124    }
8125}
8126impl<'db> From<PatternStructParamListPtr<'db>> for SyntaxStablePtrId<'db> {
8127    fn from(ptr: PatternStructParamListPtr<'db>) -> Self {
8128        ptr.untyped()
8129    }
8130}
8131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8132pub enum PatternStructParamListElementOrSeparatorGreen<'db> {
8133    Separator(TerminalCommaGreen<'db>),
8134    Element(PatternStructParamGreen<'db>),
8135}
8136impl<'db> From<TerminalCommaGreen<'db>> for PatternStructParamListElementOrSeparatorGreen<'db> {
8137    fn from(value: TerminalCommaGreen<'db>) -> Self {
8138        PatternStructParamListElementOrSeparatorGreen::Separator(value)
8139    }
8140}
8141impl<'db> From<PatternStructParamGreen<'db>>
8142    for PatternStructParamListElementOrSeparatorGreen<'db>
8143{
8144    fn from(value: PatternStructParamGreen<'db>) -> Self {
8145        PatternStructParamListElementOrSeparatorGreen::Element(value)
8146    }
8147}
8148impl<'db> PatternStructParamListElementOrSeparatorGreen<'db> {
8149    fn id(&self) -> GreenId<'db> {
8150        match self {
8151            PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8152            PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8153        }
8154    }
8155}
8156#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8157pub struct PatternStructParamListGreen<'db>(pub GreenId<'db>);
8158impl<'db> TypedSyntaxNode<'db> for PatternStructParamList<'db> {
8159    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8160    type StablePtr = PatternStructParamListPtr<'db>;
8161    type Green = PatternStructParamListGreen<'db>;
8162    fn missing(db: &'db dyn Database) -> Self::Green {
8163        PatternStructParamListGreen(
8164            GreenNode {
8165                kind: SyntaxKind::PatternStructParamList,
8166                details: GreenNodeDetails::Node {
8167                    children: [].into(),
8168                    width: TextWidth::default(),
8169                },
8170            }
8171            .intern(db),
8172        )
8173    }
8174    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8175        Self(ElementList::new(node))
8176    }
8177    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8178        if node.kind(db) == SyntaxKind::PatternStructParamList {
8179            Some(Self(ElementList::new(node)))
8180        } else {
8181            None
8182        }
8183    }
8184    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8185        self.node
8186    }
8187    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8188        PatternStructParamListPtr(self.node.stable_ptr(db))
8189    }
8190}
8191#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8192pub struct PatternTuple<'db> {
8193    node: SyntaxNode<'db>,
8194}
8195impl<'db> PatternTuple<'db> {
8196    pub const INDEX_LPAREN: usize = 0;
8197    pub const INDEX_PATTERNS: usize = 1;
8198    pub const INDEX_RPAREN: usize = 2;
8199    pub fn new_green(
8200        db: &'db dyn Database,
8201        lparen: TerminalLParenGreen<'db>,
8202        patterns: PatternListGreen<'db>,
8203        rparen: TerminalRParenGreen<'db>,
8204    ) -> PatternTupleGreen<'db> {
8205        let children = [lparen.0, patterns.0, rparen.0];
8206        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8207        PatternTupleGreen(
8208            GreenNode {
8209                kind: SyntaxKind::PatternTuple,
8210                details: GreenNodeDetails::Node { children: children.into(), width },
8211            }
8212            .intern(db),
8213        )
8214    }
8215}
8216impl<'db> PatternTuple<'db> {
8217    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8218        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8219    }
8220    pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8221        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8222    }
8223    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8224        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8225    }
8226}
8227#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8228pub struct PatternTuplePtr<'db>(pub SyntaxStablePtrId<'db>);
8229impl<'db> PatternTuplePtr<'db> {}
8230impl<'db> TypedStablePtr<'db> for PatternTuplePtr<'db> {
8231    type SyntaxNode = PatternTuple<'db>;
8232    fn untyped(self) -> SyntaxStablePtrId<'db> {
8233        self.0
8234    }
8235    fn lookup(&self, db: &'db dyn Database) -> PatternTuple<'db> {
8236        PatternTuple::from_syntax_node(db, self.0.lookup(db))
8237    }
8238}
8239impl<'db> From<PatternTuplePtr<'db>> for SyntaxStablePtrId<'db> {
8240    fn from(ptr: PatternTuplePtr<'db>) -> Self {
8241        ptr.untyped()
8242    }
8243}
8244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8245pub struct PatternTupleGreen<'db>(pub GreenId<'db>);
8246impl<'db> TypedSyntaxNode<'db> for PatternTuple<'db> {
8247    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8248    type StablePtr = PatternTuplePtr<'db>;
8249    type Green = PatternTupleGreen<'db>;
8250    fn missing(db: &'db dyn Database) -> Self::Green {
8251        PatternTupleGreen(
8252            GreenNode {
8253                kind: SyntaxKind::PatternTuple,
8254                details: GreenNodeDetails::Node {
8255                    children: [
8256                        TerminalLParen::missing(db).0,
8257                        PatternList::missing(db).0,
8258                        TerminalRParen::missing(db).0,
8259                    ]
8260                    .into(),
8261                    width: TextWidth::default(),
8262                },
8263            }
8264            .intern(db),
8265        )
8266    }
8267    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8268        let kind = node.kind(db);
8269        assert_eq!(
8270            kind,
8271            SyntaxKind::PatternTuple,
8272            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8273            kind,
8274            SyntaxKind::PatternTuple
8275        );
8276        Self { node }
8277    }
8278    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8279        let kind = node.kind(db);
8280        if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8281    }
8282    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8283        self.node
8284    }
8285    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8286        PatternTuplePtr(self.node.stable_ptr(db))
8287    }
8288}
8289#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8290pub struct PatternFixedSizeArray<'db> {
8291    node: SyntaxNode<'db>,
8292}
8293impl<'db> PatternFixedSizeArray<'db> {
8294    pub const INDEX_LBRACK: usize = 0;
8295    pub const INDEX_PATTERNS: usize = 1;
8296    pub const INDEX_RBRACK: usize = 2;
8297    pub fn new_green(
8298        db: &'db dyn Database,
8299        lbrack: TerminalLBrackGreen<'db>,
8300        patterns: PatternListGreen<'db>,
8301        rbrack: TerminalRBrackGreen<'db>,
8302    ) -> PatternFixedSizeArrayGreen<'db> {
8303        let children = [lbrack.0, patterns.0, rbrack.0];
8304        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8305        PatternFixedSizeArrayGreen(
8306            GreenNode {
8307                kind: SyntaxKind::PatternFixedSizeArray,
8308                details: GreenNodeDetails::Node { children: children.into(), width },
8309            }
8310            .intern(db),
8311        )
8312    }
8313}
8314impl<'db> PatternFixedSizeArray<'db> {
8315    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
8316        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8317    }
8318    pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8319        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8320    }
8321    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
8322        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8323    }
8324}
8325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8326pub struct PatternFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
8327impl<'db> PatternFixedSizeArrayPtr<'db> {}
8328impl<'db> TypedStablePtr<'db> for PatternFixedSizeArrayPtr<'db> {
8329    type SyntaxNode = PatternFixedSizeArray<'db>;
8330    fn untyped(self) -> SyntaxStablePtrId<'db> {
8331        self.0
8332    }
8333    fn lookup(&self, db: &'db dyn Database) -> PatternFixedSizeArray<'db> {
8334        PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8335    }
8336}
8337impl<'db> From<PatternFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
8338    fn from(ptr: PatternFixedSizeArrayPtr<'db>) -> Self {
8339        ptr.untyped()
8340    }
8341}
8342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8343pub struct PatternFixedSizeArrayGreen<'db>(pub GreenId<'db>);
8344impl<'db> TypedSyntaxNode<'db> for PatternFixedSizeArray<'db> {
8345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8346    type StablePtr = PatternFixedSizeArrayPtr<'db>;
8347    type Green = PatternFixedSizeArrayGreen<'db>;
8348    fn missing(db: &'db dyn Database) -> Self::Green {
8349        PatternFixedSizeArrayGreen(
8350            GreenNode {
8351                kind: SyntaxKind::PatternFixedSizeArray,
8352                details: GreenNodeDetails::Node {
8353                    children: [
8354                        TerminalLBrack::missing(db).0,
8355                        PatternList::missing(db).0,
8356                        TerminalRBrack::missing(db).0,
8357                    ]
8358                    .into(),
8359                    width: TextWidth::default(),
8360                },
8361            }
8362            .intern(db),
8363        )
8364    }
8365    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8366        let kind = node.kind(db);
8367        assert_eq!(
8368            kind,
8369            SyntaxKind::PatternFixedSizeArray,
8370            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8371            kind,
8372            SyntaxKind::PatternFixedSizeArray
8373        );
8374        Self { node }
8375    }
8376    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8377        let kind = node.kind(db);
8378        if kind == SyntaxKind::PatternFixedSizeArray {
8379            Some(Self::from_syntax_node(db, node))
8380        } else {
8381            None
8382        }
8383    }
8384    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8385        self.node
8386    }
8387    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8388        PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8389    }
8390}
8391#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8392pub struct PatternList<'db>(ElementList<'db, Pattern<'db>, 2>);
8393impl<'db> Deref for PatternList<'db> {
8394    type Target = ElementList<'db, Pattern<'db>, 2>;
8395    fn deref(&self) -> &Self::Target {
8396        &self.0
8397    }
8398}
8399impl<'db> PatternList<'db> {
8400    pub fn new_green(
8401        db: &'db dyn Database,
8402        children: &[PatternListElementOrSeparatorGreen<'db>],
8403    ) -> PatternListGreen<'db> {
8404        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8405        PatternListGreen(
8406            GreenNode {
8407                kind: SyntaxKind::PatternList,
8408                details: GreenNodeDetails::Node {
8409                    children: children.iter().map(|x| x.id()).collect(),
8410                    width,
8411                },
8412            }
8413            .intern(db),
8414        )
8415    }
8416}
8417#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8418pub struct PatternListPtr<'db>(pub SyntaxStablePtrId<'db>);
8419impl<'db> TypedStablePtr<'db> for PatternListPtr<'db> {
8420    type SyntaxNode = PatternList<'db>;
8421    fn untyped(self) -> SyntaxStablePtrId<'db> {
8422        self.0
8423    }
8424    fn lookup(&self, db: &'db dyn Database) -> PatternList<'db> {
8425        PatternList::from_syntax_node(db, self.0.lookup(db))
8426    }
8427}
8428impl<'db> From<PatternListPtr<'db>> for SyntaxStablePtrId<'db> {
8429    fn from(ptr: PatternListPtr<'db>) -> Self {
8430        ptr.untyped()
8431    }
8432}
8433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8434pub enum PatternListElementOrSeparatorGreen<'db> {
8435    Separator(TerminalCommaGreen<'db>),
8436    Element(PatternGreen<'db>),
8437}
8438impl<'db> From<TerminalCommaGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8439    fn from(value: TerminalCommaGreen<'db>) -> Self {
8440        PatternListElementOrSeparatorGreen::Separator(value)
8441    }
8442}
8443impl<'db> From<PatternGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8444    fn from(value: PatternGreen<'db>) -> Self {
8445        PatternListElementOrSeparatorGreen::Element(value)
8446    }
8447}
8448impl<'db> PatternListElementOrSeparatorGreen<'db> {
8449    fn id(&self) -> GreenId<'db> {
8450        match self {
8451            PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8452            PatternListElementOrSeparatorGreen::Element(green) => green.0,
8453        }
8454    }
8455}
8456#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8457pub struct PatternListGreen<'db>(pub GreenId<'db>);
8458impl<'db> TypedSyntaxNode<'db> for PatternList<'db> {
8459    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8460    type StablePtr = PatternListPtr<'db>;
8461    type Green = PatternListGreen<'db>;
8462    fn missing(db: &'db dyn Database) -> Self::Green {
8463        PatternListGreen(
8464            GreenNode {
8465                kind: SyntaxKind::PatternList,
8466                details: GreenNodeDetails::Node {
8467                    children: [].into(),
8468                    width: TextWidth::default(),
8469                },
8470            }
8471            .intern(db),
8472        )
8473    }
8474    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8475        Self(ElementList::new(node))
8476    }
8477    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8478        if node.kind(db) == SyntaxKind::PatternList {
8479            Some(Self(ElementList::new(node)))
8480        } else {
8481            None
8482        }
8483    }
8484    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8485        self.node
8486    }
8487    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8488        PatternListPtr(self.node.stable_ptr(db))
8489    }
8490}
8491#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8492pub struct PatternListOr<'db>(ElementList<'db, Pattern<'db>, 2>);
8493impl<'db> Deref for PatternListOr<'db> {
8494    type Target = ElementList<'db, Pattern<'db>, 2>;
8495    fn deref(&self) -> &Self::Target {
8496        &self.0
8497    }
8498}
8499impl<'db> PatternListOr<'db> {
8500    pub fn new_green(
8501        db: &'db dyn Database,
8502        children: &[PatternListOrElementOrSeparatorGreen<'db>],
8503    ) -> PatternListOrGreen<'db> {
8504        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8505        PatternListOrGreen(
8506            GreenNode {
8507                kind: SyntaxKind::PatternListOr,
8508                details: GreenNodeDetails::Node {
8509                    children: children.iter().map(|x| x.id()).collect(),
8510                    width,
8511                },
8512            }
8513            .intern(db),
8514        )
8515    }
8516}
8517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8518pub struct PatternListOrPtr<'db>(pub SyntaxStablePtrId<'db>);
8519impl<'db> TypedStablePtr<'db> for PatternListOrPtr<'db> {
8520    type SyntaxNode = PatternListOr<'db>;
8521    fn untyped(self) -> SyntaxStablePtrId<'db> {
8522        self.0
8523    }
8524    fn lookup(&self, db: &'db dyn Database) -> PatternListOr<'db> {
8525        PatternListOr::from_syntax_node(db, self.0.lookup(db))
8526    }
8527}
8528impl<'db> From<PatternListOrPtr<'db>> for SyntaxStablePtrId<'db> {
8529    fn from(ptr: PatternListOrPtr<'db>) -> Self {
8530        ptr.untyped()
8531    }
8532}
8533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8534pub enum PatternListOrElementOrSeparatorGreen<'db> {
8535    Separator(TerminalOrGreen<'db>),
8536    Element(PatternGreen<'db>),
8537}
8538impl<'db> From<TerminalOrGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8539    fn from(value: TerminalOrGreen<'db>) -> Self {
8540        PatternListOrElementOrSeparatorGreen::Separator(value)
8541    }
8542}
8543impl<'db> From<PatternGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8544    fn from(value: PatternGreen<'db>) -> Self {
8545        PatternListOrElementOrSeparatorGreen::Element(value)
8546    }
8547}
8548impl<'db> PatternListOrElementOrSeparatorGreen<'db> {
8549    fn id(&self) -> GreenId<'db> {
8550        match self {
8551            PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8552            PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8553        }
8554    }
8555}
8556#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8557pub struct PatternListOrGreen<'db>(pub GreenId<'db>);
8558impl<'db> TypedSyntaxNode<'db> for PatternListOr<'db> {
8559    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8560    type StablePtr = PatternListOrPtr<'db>;
8561    type Green = PatternListOrGreen<'db>;
8562    fn missing(db: &'db dyn Database) -> Self::Green {
8563        PatternListOrGreen(
8564            GreenNode {
8565                kind: SyntaxKind::PatternListOr,
8566                details: GreenNodeDetails::Node {
8567                    children: [].into(),
8568                    width: TextWidth::default(),
8569                },
8570            }
8571            .intern(db),
8572        )
8573    }
8574    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8575        Self(ElementList::new(node))
8576    }
8577    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8578        if node.kind(db) == SyntaxKind::PatternListOr {
8579            Some(Self(ElementList::new(node)))
8580        } else {
8581            None
8582        }
8583    }
8584    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8585        self.node
8586    }
8587    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8588        PatternListOrPtr(self.node.stable_ptr(db))
8589    }
8590}
8591#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8592pub enum PatternStructParam<'db> {
8593    Single(PatternIdentifier<'db>),
8594    WithExpr(PatternStructParamWithExpr<'db>),
8595    Tail(TerminalDotDot<'db>),
8596}
8597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8598pub struct PatternStructParamPtr<'db>(pub SyntaxStablePtrId<'db>);
8599impl<'db> TypedStablePtr<'db> for PatternStructParamPtr<'db> {
8600    type SyntaxNode = PatternStructParam<'db>;
8601    fn untyped(self) -> SyntaxStablePtrId<'db> {
8602        self.0
8603    }
8604    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8605        PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8606    }
8607}
8608impl<'db> From<PatternStructParamPtr<'db>> for SyntaxStablePtrId<'db> {
8609    fn from(ptr: PatternStructParamPtr<'db>) -> Self {
8610        ptr.untyped()
8611    }
8612}
8613impl<'db> From<PatternIdentifierPtr<'db>> for PatternStructParamPtr<'db> {
8614    fn from(value: PatternIdentifierPtr<'db>) -> Self {
8615        Self(value.0)
8616    }
8617}
8618impl<'db> From<PatternStructParamWithExprPtr<'db>> for PatternStructParamPtr<'db> {
8619    fn from(value: PatternStructParamWithExprPtr<'db>) -> Self {
8620        Self(value.0)
8621    }
8622}
8623impl<'db> From<TerminalDotDotPtr<'db>> for PatternStructParamPtr<'db> {
8624    fn from(value: TerminalDotDotPtr<'db>) -> Self {
8625        Self(value.0)
8626    }
8627}
8628impl<'db> From<PatternIdentifierGreen<'db>> for PatternStructParamGreen<'db> {
8629    fn from(value: PatternIdentifierGreen<'db>) -> Self {
8630        Self(value.0)
8631    }
8632}
8633impl<'db> From<PatternStructParamWithExprGreen<'db>> for PatternStructParamGreen<'db> {
8634    fn from(value: PatternStructParamWithExprGreen<'db>) -> Self {
8635        Self(value.0)
8636    }
8637}
8638impl<'db> From<TerminalDotDotGreen<'db>> for PatternStructParamGreen<'db> {
8639    fn from(value: TerminalDotDotGreen<'db>) -> Self {
8640        Self(value.0)
8641    }
8642}
8643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8644pub struct PatternStructParamGreen<'db>(pub GreenId<'db>);
8645impl<'db> TypedSyntaxNode<'db> for PatternStructParam<'db> {
8646    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8647    type StablePtr = PatternStructParamPtr<'db>;
8648    type Green = PatternStructParamGreen<'db>;
8649    fn missing(db: &'db dyn Database) -> Self::Green {
8650        panic!("No missing variant.");
8651    }
8652    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8653        let kind = node.kind(db);
8654        match kind {
8655            SyntaxKind::PatternIdentifier => {
8656                PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8657            }
8658            SyntaxKind::PatternStructParamWithExpr => {
8659                PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8660            }
8661            SyntaxKind::TerminalDotDot => {
8662                PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8663            }
8664            _ => panic!(
8665                "Unexpected syntax kind {:?} when constructing {}.",
8666                kind, "PatternStructParam"
8667            ),
8668        }
8669    }
8670    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8671        let kind = node.kind(db);
8672        match kind {
8673            SyntaxKind::PatternIdentifier => {
8674                Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8675            }
8676            SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8677                PatternStructParamWithExpr::from_syntax_node(db, node),
8678            )),
8679            SyntaxKind::TerminalDotDot => {
8680                Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8681            }
8682            _ => None,
8683        }
8684    }
8685    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8686        match self {
8687            PatternStructParam::Single(x) => x.as_syntax_node(),
8688            PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8689            PatternStructParam::Tail(x) => x.as_syntax_node(),
8690        }
8691    }
8692    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8693        PatternStructParamPtr(self.as_syntax_node().stable_ptr(db))
8694    }
8695}
8696impl<'db> PatternStructParam<'db> {
8697    /// Checks if a kind of a variant of [PatternStructParam].
8698    pub fn is_variant(kind: SyntaxKind) -> bool {
8699        matches!(
8700            kind,
8701            SyntaxKind::PatternIdentifier
8702                | SyntaxKind::PatternStructParamWithExpr
8703                | SyntaxKind::TerminalDotDot
8704        )
8705    }
8706}
8707#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8708pub struct PatternStructParamWithExpr<'db> {
8709    node: SyntaxNode<'db>,
8710}
8711impl<'db> PatternStructParamWithExpr<'db> {
8712    pub const INDEX_MODIFIERS: usize = 0;
8713    pub const INDEX_NAME: usize = 1;
8714    pub const INDEX_COLON: usize = 2;
8715    pub const INDEX_PATTERN: usize = 3;
8716    pub fn new_green(
8717        db: &'db dyn Database,
8718        modifiers: ModifierListGreen<'db>,
8719        name: TerminalIdentifierGreen<'db>,
8720        colon: TerminalColonGreen<'db>,
8721        pattern: PatternGreen<'db>,
8722    ) -> PatternStructParamWithExprGreen<'db> {
8723        let children = [modifiers.0, name.0, colon.0, pattern.0];
8724        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8725        PatternStructParamWithExprGreen(
8726            GreenNode {
8727                kind: SyntaxKind::PatternStructParamWithExpr,
8728                details: GreenNodeDetails::Node { children: children.into(), width },
8729            }
8730            .intern(db),
8731        )
8732    }
8733}
8734impl<'db> PatternStructParamWithExpr<'db> {
8735    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
8736        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8737    }
8738    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
8739        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8740    }
8741    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
8742        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8743    }
8744    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8745        Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8746    }
8747}
8748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8749pub struct PatternStructParamWithExprPtr<'db>(pub SyntaxStablePtrId<'db>);
8750impl<'db> PatternStructParamWithExprPtr<'db> {}
8751impl<'db> TypedStablePtr<'db> for PatternStructParamWithExprPtr<'db> {
8752    type SyntaxNode = PatternStructParamWithExpr<'db>;
8753    fn untyped(self) -> SyntaxStablePtrId<'db> {
8754        self.0
8755    }
8756    fn lookup(&self, db: &'db dyn Database) -> PatternStructParamWithExpr<'db> {
8757        PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8758    }
8759}
8760impl<'db> From<PatternStructParamWithExprPtr<'db>> for SyntaxStablePtrId<'db> {
8761    fn from(ptr: PatternStructParamWithExprPtr<'db>) -> Self {
8762        ptr.untyped()
8763    }
8764}
8765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8766pub struct PatternStructParamWithExprGreen<'db>(pub GreenId<'db>);
8767impl<'db> TypedSyntaxNode<'db> for PatternStructParamWithExpr<'db> {
8768    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8769    type StablePtr = PatternStructParamWithExprPtr<'db>;
8770    type Green = PatternStructParamWithExprGreen<'db>;
8771    fn missing(db: &'db dyn Database) -> Self::Green {
8772        PatternStructParamWithExprGreen(
8773            GreenNode {
8774                kind: SyntaxKind::PatternStructParamWithExpr,
8775                details: GreenNodeDetails::Node {
8776                    children: [
8777                        ModifierList::missing(db).0,
8778                        TerminalIdentifier::missing(db).0,
8779                        TerminalColon::missing(db).0,
8780                        Pattern::missing(db).0,
8781                    ]
8782                    .into(),
8783                    width: TextWidth::default(),
8784                },
8785            }
8786            .intern(db),
8787        )
8788    }
8789    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8790        let kind = node.kind(db);
8791        assert_eq!(
8792            kind,
8793            SyntaxKind::PatternStructParamWithExpr,
8794            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8795            kind,
8796            SyntaxKind::PatternStructParamWithExpr
8797        );
8798        Self { node }
8799    }
8800    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8801        let kind = node.kind(db);
8802        if kind == SyntaxKind::PatternStructParamWithExpr {
8803            Some(Self::from_syntax_node(db, node))
8804        } else {
8805            None
8806        }
8807    }
8808    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8809        self.node
8810    }
8811    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8812        PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8813    }
8814}
8815#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8816pub struct PatternEnum<'db> {
8817    node: SyntaxNode<'db>,
8818}
8819impl<'db> PatternEnum<'db> {
8820    pub const INDEX_PATH: usize = 0;
8821    pub const INDEX_PATTERN: usize = 1;
8822    pub fn new_green(
8823        db: &'db dyn Database,
8824        path: ExprPathGreen<'db>,
8825        pattern: OptionPatternEnumInnerPatternGreen<'db>,
8826    ) -> PatternEnumGreen<'db> {
8827        let children = [path.0, pattern.0];
8828        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8829        PatternEnumGreen(
8830            GreenNode {
8831                kind: SyntaxKind::PatternEnum,
8832                details: GreenNodeDetails::Node { children: children.into(), width },
8833            }
8834            .intern(db),
8835        )
8836    }
8837}
8838impl<'db> PatternEnum<'db> {
8839    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8840        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8841    }
8842    pub fn pattern(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPattern<'db> {
8843        OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8844    }
8845}
8846#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8847pub struct PatternEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
8848impl<'db> PatternEnumPtr<'db> {}
8849impl<'db> TypedStablePtr<'db> for PatternEnumPtr<'db> {
8850    type SyntaxNode = PatternEnum<'db>;
8851    fn untyped(self) -> SyntaxStablePtrId<'db> {
8852        self.0
8853    }
8854    fn lookup(&self, db: &'db dyn Database) -> PatternEnum<'db> {
8855        PatternEnum::from_syntax_node(db, self.0.lookup(db))
8856    }
8857}
8858impl<'db> From<PatternEnumPtr<'db>> for SyntaxStablePtrId<'db> {
8859    fn from(ptr: PatternEnumPtr<'db>) -> Self {
8860        ptr.untyped()
8861    }
8862}
8863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8864pub struct PatternEnumGreen<'db>(pub GreenId<'db>);
8865impl<'db> TypedSyntaxNode<'db> for PatternEnum<'db> {
8866    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8867    type StablePtr = PatternEnumPtr<'db>;
8868    type Green = PatternEnumGreen<'db>;
8869    fn missing(db: &'db dyn Database) -> Self::Green {
8870        PatternEnumGreen(
8871            GreenNode {
8872                kind: SyntaxKind::PatternEnum,
8873                details: GreenNodeDetails::Node {
8874                    children: [
8875                        ExprPath::missing(db).0,
8876                        OptionPatternEnumInnerPattern::missing(db).0,
8877                    ]
8878                    .into(),
8879                    width: TextWidth::default(),
8880                },
8881            }
8882            .intern(db),
8883        )
8884    }
8885    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8886        let kind = node.kind(db);
8887        assert_eq!(
8888            kind,
8889            SyntaxKind::PatternEnum,
8890            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8891            kind,
8892            SyntaxKind::PatternEnum
8893        );
8894        Self { node }
8895    }
8896    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8897        let kind = node.kind(db);
8898        if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8899    }
8900    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8901        self.node
8902    }
8903    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8904        PatternEnumPtr(self.node.stable_ptr(db))
8905    }
8906}
8907#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8908pub struct PatternEnumInnerPattern<'db> {
8909    node: SyntaxNode<'db>,
8910}
8911impl<'db> PatternEnumInnerPattern<'db> {
8912    pub const INDEX_LPAREN: usize = 0;
8913    pub const INDEX_PATTERN: usize = 1;
8914    pub const INDEX_RPAREN: usize = 2;
8915    pub fn new_green(
8916        db: &'db dyn Database,
8917        lparen: TerminalLParenGreen<'db>,
8918        pattern: PatternGreen<'db>,
8919        rparen: TerminalRParenGreen<'db>,
8920    ) -> PatternEnumInnerPatternGreen<'db> {
8921        let children = [lparen.0, pattern.0, rparen.0];
8922        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8923        PatternEnumInnerPatternGreen(
8924            GreenNode {
8925                kind: SyntaxKind::PatternEnumInnerPattern,
8926                details: GreenNodeDetails::Node { children: children.into(), width },
8927            }
8928            .intern(db),
8929        )
8930    }
8931}
8932impl<'db> PatternEnumInnerPattern<'db> {
8933    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8934        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8935    }
8936    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8937        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
8938    }
8939    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8940        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8941    }
8942}
8943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8944pub struct PatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8945impl<'db> PatternEnumInnerPatternPtr<'db> {}
8946impl<'db> TypedStablePtr<'db> for PatternEnumInnerPatternPtr<'db> {
8947    type SyntaxNode = PatternEnumInnerPattern<'db>;
8948    fn untyped(self) -> SyntaxStablePtrId<'db> {
8949        self.0
8950    }
8951    fn lookup(&self, db: &'db dyn Database) -> PatternEnumInnerPattern<'db> {
8952        PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8953    }
8954}
8955impl<'db> From<PatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8956    fn from(ptr: PatternEnumInnerPatternPtr<'db>) -> Self {
8957        ptr.untyped()
8958    }
8959}
8960#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8961pub struct PatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8962impl<'db> TypedSyntaxNode<'db> for PatternEnumInnerPattern<'db> {
8963    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
8964    type StablePtr = PatternEnumInnerPatternPtr<'db>;
8965    type Green = PatternEnumInnerPatternGreen<'db>;
8966    fn missing(db: &'db dyn Database) -> Self::Green {
8967        PatternEnumInnerPatternGreen(
8968            GreenNode {
8969                kind: SyntaxKind::PatternEnumInnerPattern,
8970                details: GreenNodeDetails::Node {
8971                    children: [
8972                        TerminalLParen::missing(db).0,
8973                        Pattern::missing(db).0,
8974                        TerminalRParen::missing(db).0,
8975                    ]
8976                    .into(),
8977                    width: TextWidth::default(),
8978                },
8979            }
8980            .intern(db),
8981        )
8982    }
8983    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8984        let kind = node.kind(db);
8985        assert_eq!(
8986            kind,
8987            SyntaxKind::PatternEnumInnerPattern,
8988            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8989            kind,
8990            SyntaxKind::PatternEnumInnerPattern
8991        );
8992        Self { node }
8993    }
8994    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8995        let kind = node.kind(db);
8996        if kind == SyntaxKind::PatternEnumInnerPattern {
8997            Some(Self::from_syntax_node(db, node))
8998        } else {
8999            None
9000        }
9001    }
9002    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9003        self.node
9004    }
9005    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9006        PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
9007    }
9008}
9009#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9010pub enum OptionPatternEnumInnerPattern<'db> {
9011    Empty(OptionPatternEnumInnerPatternEmpty<'db>),
9012    PatternEnumInnerPattern(PatternEnumInnerPattern<'db>),
9013}
9014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9015pub struct OptionPatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
9016impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternPtr<'db> {
9017    type SyntaxNode = OptionPatternEnumInnerPattern<'db>;
9018    fn untyped(self) -> SyntaxStablePtrId<'db> {
9019        self.0
9020    }
9021    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9022        OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9023    }
9024}
9025impl<'db> From<OptionPatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
9026    fn from(ptr: OptionPatternEnumInnerPatternPtr<'db>) -> Self {
9027        ptr.untyped()
9028    }
9029}
9030impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>>
9031    for OptionPatternEnumInnerPatternPtr<'db>
9032{
9033    fn from(value: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9034        Self(value.0)
9035    }
9036}
9037impl<'db> From<PatternEnumInnerPatternPtr<'db>> for OptionPatternEnumInnerPatternPtr<'db> {
9038    fn from(value: PatternEnumInnerPatternPtr<'db>) -> Self {
9039        Self(value.0)
9040    }
9041}
9042impl<'db> From<OptionPatternEnumInnerPatternEmptyGreen<'db>>
9043    for OptionPatternEnumInnerPatternGreen<'db>
9044{
9045    fn from(value: OptionPatternEnumInnerPatternEmptyGreen<'db>) -> Self {
9046        Self(value.0)
9047    }
9048}
9049impl<'db> From<PatternEnumInnerPatternGreen<'db>> for OptionPatternEnumInnerPatternGreen<'db> {
9050    fn from(value: PatternEnumInnerPatternGreen<'db>) -> Self {
9051        Self(value.0)
9052    }
9053}
9054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9055pub struct OptionPatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
9056impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPattern<'db> {
9057    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9058    type StablePtr = OptionPatternEnumInnerPatternPtr<'db>;
9059    type Green = OptionPatternEnumInnerPatternGreen<'db>;
9060    fn missing(db: &'db dyn Database) -> Self::Green {
9061        panic!("No missing variant.");
9062    }
9063    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9064        let kind = node.kind(db);
9065        match kind {
9066            SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9067                OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9068            ),
9069            SyntaxKind::PatternEnumInnerPattern => {
9070                OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9071                    PatternEnumInnerPattern::from_syntax_node(db, node),
9072                )
9073            }
9074            _ => panic!(
9075                "Unexpected syntax kind {:?} when constructing {}.",
9076                kind, "OptionPatternEnumInnerPattern"
9077            ),
9078        }
9079    }
9080    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9081        let kind = node.kind(db);
9082        match kind {
9083            SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9084                Some(OptionPatternEnumInnerPattern::Empty(
9085                    OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9086                ))
9087            }
9088            SyntaxKind::PatternEnumInnerPattern => {
9089                Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9090                    PatternEnumInnerPattern::from_syntax_node(db, node),
9091                ))
9092            }
9093            _ => None,
9094        }
9095    }
9096    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9097        match self {
9098            OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9099            OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9100        }
9101    }
9102    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9103        OptionPatternEnumInnerPatternPtr(self.as_syntax_node().stable_ptr(db))
9104    }
9105}
9106impl<'db> OptionPatternEnumInnerPattern<'db> {
9107    /// Checks if a kind of a variant of [OptionPatternEnumInnerPattern].
9108    pub fn is_variant(kind: SyntaxKind) -> bool {
9109        matches!(
9110            kind,
9111            SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9112        )
9113    }
9114}
9115#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9116pub struct OptionPatternEnumInnerPatternEmpty<'db> {
9117    node: SyntaxNode<'db>,
9118}
9119impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {
9120    pub fn new_green(db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmptyGreen<'db> {
9121        let children = [];
9122        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9123        OptionPatternEnumInnerPatternEmptyGreen(
9124            GreenNode {
9125                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9126                details: GreenNodeDetails::Node { children: children.into(), width },
9127            }
9128            .intern(db),
9129        )
9130    }
9131}
9132impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {}
9133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9134pub struct OptionPatternEnumInnerPatternEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9135impl<'db> OptionPatternEnumInnerPatternEmptyPtr<'db> {}
9136impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternEmptyPtr<'db> {
9137    type SyntaxNode = OptionPatternEnumInnerPatternEmpty<'db>;
9138    fn untyped(self) -> SyntaxStablePtrId<'db> {
9139        self.0
9140    }
9141    fn lookup(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmpty<'db> {
9142        OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9143    }
9144}
9145impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9146    fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9147        ptr.untyped()
9148    }
9149}
9150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9151pub struct OptionPatternEnumInnerPatternEmptyGreen<'db>(pub GreenId<'db>);
9152impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPatternEmpty<'db> {
9153    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9154    type StablePtr = OptionPatternEnumInnerPatternEmptyPtr<'db>;
9155    type Green = OptionPatternEnumInnerPatternEmptyGreen<'db>;
9156    fn missing(db: &'db dyn Database) -> Self::Green {
9157        OptionPatternEnumInnerPatternEmptyGreen(
9158            GreenNode {
9159                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9160                details: GreenNodeDetails::Node {
9161                    children: [].into(),
9162                    width: TextWidth::default(),
9163                },
9164            }
9165            .intern(db),
9166        )
9167    }
9168    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9169        let kind = node.kind(db);
9170        assert_eq!(
9171            kind,
9172            SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9173            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9174            kind,
9175            SyntaxKind::OptionPatternEnumInnerPatternEmpty
9176        );
9177        Self { node }
9178    }
9179    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9180        let kind = node.kind(db);
9181        if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9182            Some(Self::from_syntax_node(db, node))
9183        } else {
9184            None
9185        }
9186    }
9187    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9188        self.node
9189    }
9190    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9191        OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9192    }
9193}
9194#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9195pub struct TypeClause<'db> {
9196    node: SyntaxNode<'db>,
9197}
9198impl<'db> TypeClause<'db> {
9199    pub const INDEX_COLON: usize = 0;
9200    pub const INDEX_TY: usize = 1;
9201    pub fn new_green(
9202        db: &'db dyn Database,
9203        colon: TerminalColonGreen<'db>,
9204        ty: ExprGreen<'db>,
9205    ) -> TypeClauseGreen<'db> {
9206        let children = [colon.0, ty.0];
9207        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9208        TypeClauseGreen(
9209            GreenNode {
9210                kind: SyntaxKind::TypeClause,
9211                details: GreenNodeDetails::Node { children: children.into(), width },
9212            }
9213            .intern(db),
9214        )
9215    }
9216}
9217impl<'db> TypeClause<'db> {
9218    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
9219        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9220    }
9221    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9222        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9223    }
9224}
9225#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9226pub struct TypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9227impl<'db> TypeClausePtr<'db> {}
9228impl<'db> TypedStablePtr<'db> for TypeClausePtr<'db> {
9229    type SyntaxNode = TypeClause<'db>;
9230    fn untyped(self) -> SyntaxStablePtrId<'db> {
9231        self.0
9232    }
9233    fn lookup(&self, db: &'db dyn Database) -> TypeClause<'db> {
9234        TypeClause::from_syntax_node(db, self.0.lookup(db))
9235    }
9236}
9237impl<'db> From<TypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9238    fn from(ptr: TypeClausePtr<'db>) -> Self {
9239        ptr.untyped()
9240    }
9241}
9242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9243pub struct TypeClauseGreen<'db>(pub GreenId<'db>);
9244impl<'db> TypedSyntaxNode<'db> for TypeClause<'db> {
9245    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9246    type StablePtr = TypeClausePtr<'db>;
9247    type Green = TypeClauseGreen<'db>;
9248    fn missing(db: &'db dyn Database) -> Self::Green {
9249        TypeClauseGreen(
9250            GreenNode {
9251                kind: SyntaxKind::TypeClause,
9252                details: GreenNodeDetails::Node {
9253                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9254                    width: TextWidth::default(),
9255                },
9256            }
9257            .intern(db),
9258        )
9259    }
9260    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9261        let kind = node.kind(db);
9262        assert_eq!(
9263            kind,
9264            SyntaxKind::TypeClause,
9265            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9266            kind,
9267            SyntaxKind::TypeClause
9268        );
9269        Self { node }
9270    }
9271    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9272        let kind = node.kind(db);
9273        if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9274    }
9275    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9276        self.node
9277    }
9278    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9279        TypeClausePtr(self.node.stable_ptr(db))
9280    }
9281}
9282#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9283pub enum OptionTypeClause<'db> {
9284    Empty(OptionTypeClauseEmpty<'db>),
9285    TypeClause(TypeClause<'db>),
9286}
9287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9288pub struct OptionTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9289impl<'db> TypedStablePtr<'db> for OptionTypeClausePtr<'db> {
9290    type SyntaxNode = OptionTypeClause<'db>;
9291    fn untyped(self) -> SyntaxStablePtrId<'db> {
9292        self.0
9293    }
9294    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9295        OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9296    }
9297}
9298impl<'db> From<OptionTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9299    fn from(ptr: OptionTypeClausePtr<'db>) -> Self {
9300        ptr.untyped()
9301    }
9302}
9303impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for OptionTypeClausePtr<'db> {
9304    fn from(value: OptionTypeClauseEmptyPtr<'db>) -> Self {
9305        Self(value.0)
9306    }
9307}
9308impl<'db> From<TypeClausePtr<'db>> for OptionTypeClausePtr<'db> {
9309    fn from(value: TypeClausePtr<'db>) -> Self {
9310        Self(value.0)
9311    }
9312}
9313impl<'db> From<OptionTypeClauseEmptyGreen<'db>> for OptionTypeClauseGreen<'db> {
9314    fn from(value: OptionTypeClauseEmptyGreen<'db>) -> Self {
9315        Self(value.0)
9316    }
9317}
9318impl<'db> From<TypeClauseGreen<'db>> for OptionTypeClauseGreen<'db> {
9319    fn from(value: TypeClauseGreen<'db>) -> Self {
9320        Self(value.0)
9321    }
9322}
9323#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9324pub struct OptionTypeClauseGreen<'db>(pub GreenId<'db>);
9325impl<'db> TypedSyntaxNode<'db> for OptionTypeClause<'db> {
9326    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9327    type StablePtr = OptionTypeClausePtr<'db>;
9328    type Green = OptionTypeClauseGreen<'db>;
9329    fn missing(db: &'db dyn Database) -> Self::Green {
9330        panic!("No missing variant.");
9331    }
9332    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9333        let kind = node.kind(db);
9334        match kind {
9335            SyntaxKind::OptionTypeClauseEmpty => {
9336                OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9337            }
9338            SyntaxKind::TypeClause => {
9339                OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9340            }
9341            _ => panic!(
9342                "Unexpected syntax kind {:?} when constructing {}.",
9343                kind, "OptionTypeClause"
9344            ),
9345        }
9346    }
9347    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9348        let kind = node.kind(db);
9349        match kind {
9350            SyntaxKind::OptionTypeClauseEmpty => {
9351                Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9352            }
9353            SyntaxKind::TypeClause => {
9354                Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9355            }
9356            _ => None,
9357        }
9358    }
9359    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9360        match self {
9361            OptionTypeClause::Empty(x) => x.as_syntax_node(),
9362            OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9363        }
9364    }
9365    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9366        OptionTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9367    }
9368}
9369impl<'db> OptionTypeClause<'db> {
9370    /// Checks if a kind of a variant of [OptionTypeClause].
9371    pub fn is_variant(kind: SyntaxKind) -> bool {
9372        matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9373    }
9374}
9375#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9376pub struct OptionTypeClauseEmpty<'db> {
9377    node: SyntaxNode<'db>,
9378}
9379impl<'db> OptionTypeClauseEmpty<'db> {
9380    pub fn new_green(db: &'db dyn Database) -> OptionTypeClauseEmptyGreen<'db> {
9381        let children = [];
9382        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9383        OptionTypeClauseEmptyGreen(
9384            GreenNode {
9385                kind: SyntaxKind::OptionTypeClauseEmpty,
9386                details: GreenNodeDetails::Node { children: children.into(), width },
9387            }
9388            .intern(db),
9389        )
9390    }
9391}
9392impl<'db> OptionTypeClauseEmpty<'db> {}
9393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9394pub struct OptionTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9395impl<'db> OptionTypeClauseEmptyPtr<'db> {}
9396impl<'db> TypedStablePtr<'db> for OptionTypeClauseEmptyPtr<'db> {
9397    type SyntaxNode = OptionTypeClauseEmpty<'db>;
9398    fn untyped(self) -> SyntaxStablePtrId<'db> {
9399        self.0
9400    }
9401    fn lookup(&self, db: &'db dyn Database) -> OptionTypeClauseEmpty<'db> {
9402        OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9403    }
9404}
9405impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9406    fn from(ptr: OptionTypeClauseEmptyPtr<'db>) -> Self {
9407        ptr.untyped()
9408    }
9409}
9410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9411pub struct OptionTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9412impl<'db> TypedSyntaxNode<'db> for OptionTypeClauseEmpty<'db> {
9413    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9414    type StablePtr = OptionTypeClauseEmptyPtr<'db>;
9415    type Green = OptionTypeClauseEmptyGreen<'db>;
9416    fn missing(db: &'db dyn Database) -> Self::Green {
9417        OptionTypeClauseEmptyGreen(
9418            GreenNode {
9419                kind: SyntaxKind::OptionTypeClauseEmpty,
9420                details: GreenNodeDetails::Node {
9421                    children: [].into(),
9422                    width: TextWidth::default(),
9423                },
9424            }
9425            .intern(db),
9426        )
9427    }
9428    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9429        let kind = node.kind(db);
9430        assert_eq!(
9431            kind,
9432            SyntaxKind::OptionTypeClauseEmpty,
9433            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9434            kind,
9435            SyntaxKind::OptionTypeClauseEmpty
9436        );
9437        Self { node }
9438    }
9439    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9440        let kind = node.kind(db);
9441        if kind == SyntaxKind::OptionTypeClauseEmpty {
9442            Some(Self::from_syntax_node(db, node))
9443        } else {
9444            None
9445        }
9446    }
9447    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9448        self.node
9449    }
9450    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9451        OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9452    }
9453}
9454#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9455pub struct ReturnTypeClause<'db> {
9456    node: SyntaxNode<'db>,
9457}
9458impl<'db> ReturnTypeClause<'db> {
9459    pub const INDEX_ARROW: usize = 0;
9460    pub const INDEX_TY: usize = 1;
9461    pub fn new_green(
9462        db: &'db dyn Database,
9463        arrow: TerminalArrowGreen<'db>,
9464        ty: ExprGreen<'db>,
9465    ) -> ReturnTypeClauseGreen<'db> {
9466        let children = [arrow.0, ty.0];
9467        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9468        ReturnTypeClauseGreen(
9469            GreenNode {
9470                kind: SyntaxKind::ReturnTypeClause,
9471                details: GreenNodeDetails::Node { children: children.into(), width },
9472            }
9473            .intern(db),
9474        )
9475    }
9476}
9477impl<'db> ReturnTypeClause<'db> {
9478    pub fn arrow(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
9479        TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9480    }
9481    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9482        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9483    }
9484}
9485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9486pub struct ReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9487impl<'db> ReturnTypeClausePtr<'db> {}
9488impl<'db> TypedStablePtr<'db> for ReturnTypeClausePtr<'db> {
9489    type SyntaxNode = ReturnTypeClause<'db>;
9490    fn untyped(self) -> SyntaxStablePtrId<'db> {
9491        self.0
9492    }
9493    fn lookup(&self, db: &'db dyn Database) -> ReturnTypeClause<'db> {
9494        ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9495    }
9496}
9497impl<'db> From<ReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9498    fn from(ptr: ReturnTypeClausePtr<'db>) -> Self {
9499        ptr.untyped()
9500    }
9501}
9502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9503pub struct ReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9504impl<'db> TypedSyntaxNode<'db> for ReturnTypeClause<'db> {
9505    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9506    type StablePtr = ReturnTypeClausePtr<'db>;
9507    type Green = ReturnTypeClauseGreen<'db>;
9508    fn missing(db: &'db dyn Database) -> Self::Green {
9509        ReturnTypeClauseGreen(
9510            GreenNode {
9511                kind: SyntaxKind::ReturnTypeClause,
9512                details: GreenNodeDetails::Node {
9513                    children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9514                    width: TextWidth::default(),
9515                },
9516            }
9517            .intern(db),
9518        )
9519    }
9520    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9521        let kind = node.kind(db);
9522        assert_eq!(
9523            kind,
9524            SyntaxKind::ReturnTypeClause,
9525            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9526            kind,
9527            SyntaxKind::ReturnTypeClause
9528        );
9529        Self { node }
9530    }
9531    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9532        let kind = node.kind(db);
9533        if kind == SyntaxKind::ReturnTypeClause {
9534            Some(Self::from_syntax_node(db, node))
9535        } else {
9536            None
9537        }
9538    }
9539    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9540        self.node
9541    }
9542    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9543        ReturnTypeClausePtr(self.node.stable_ptr(db))
9544    }
9545}
9546#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9547pub enum OptionReturnTypeClause<'db> {
9548    Empty(OptionReturnTypeClauseEmpty<'db>),
9549    ReturnTypeClause(ReturnTypeClause<'db>),
9550}
9551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9552pub struct OptionReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9553impl<'db> TypedStablePtr<'db> for OptionReturnTypeClausePtr<'db> {
9554    type SyntaxNode = OptionReturnTypeClause<'db>;
9555    fn untyped(self) -> SyntaxStablePtrId<'db> {
9556        self.0
9557    }
9558    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9559        OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9560    }
9561}
9562impl<'db> From<OptionReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9563    fn from(ptr: OptionReturnTypeClausePtr<'db>) -> Self {
9564        ptr.untyped()
9565    }
9566}
9567impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for OptionReturnTypeClausePtr<'db> {
9568    fn from(value: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9569        Self(value.0)
9570    }
9571}
9572impl<'db> From<ReturnTypeClausePtr<'db>> for OptionReturnTypeClausePtr<'db> {
9573    fn from(value: ReturnTypeClausePtr<'db>) -> Self {
9574        Self(value.0)
9575    }
9576}
9577impl<'db> From<OptionReturnTypeClauseEmptyGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9578    fn from(value: OptionReturnTypeClauseEmptyGreen<'db>) -> Self {
9579        Self(value.0)
9580    }
9581}
9582impl<'db> From<ReturnTypeClauseGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9583    fn from(value: ReturnTypeClauseGreen<'db>) -> Self {
9584        Self(value.0)
9585    }
9586}
9587#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9588pub struct OptionReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9589impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClause<'db> {
9590    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9591    type StablePtr = OptionReturnTypeClausePtr<'db>;
9592    type Green = OptionReturnTypeClauseGreen<'db>;
9593    fn missing(db: &'db dyn Database) -> Self::Green {
9594        panic!("No missing variant.");
9595    }
9596    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9597        let kind = node.kind(db);
9598        match kind {
9599            SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9600                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9601            ),
9602            SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9603                ReturnTypeClause::from_syntax_node(db, node),
9604            ),
9605            _ => panic!(
9606                "Unexpected syntax kind {:?} when constructing {}.",
9607                kind, "OptionReturnTypeClause"
9608            ),
9609        }
9610    }
9611    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9612        let kind = node.kind(db);
9613        match kind {
9614            SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9615                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9616            )),
9617            SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9618                ReturnTypeClause::from_syntax_node(db, node),
9619            )),
9620            _ => None,
9621        }
9622    }
9623    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9624        match self {
9625            OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9626            OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9627        }
9628    }
9629    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9630        OptionReturnTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9631    }
9632}
9633impl<'db> OptionReturnTypeClause<'db> {
9634    /// Checks if a kind of a variant of [OptionReturnTypeClause].
9635    pub fn is_variant(kind: SyntaxKind) -> bool {
9636        matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9637    }
9638}
9639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9640pub struct OptionReturnTypeClauseEmpty<'db> {
9641    node: SyntaxNode<'db>,
9642}
9643impl<'db> OptionReturnTypeClauseEmpty<'db> {
9644    pub fn new_green(db: &'db dyn Database) -> OptionReturnTypeClauseEmptyGreen<'db> {
9645        let children = [];
9646        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9647        OptionReturnTypeClauseEmptyGreen(
9648            GreenNode {
9649                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9650                details: GreenNodeDetails::Node { children: children.into(), width },
9651            }
9652            .intern(db),
9653        )
9654    }
9655}
9656impl<'db> OptionReturnTypeClauseEmpty<'db> {}
9657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9658pub struct OptionReturnTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9659impl<'db> OptionReturnTypeClauseEmptyPtr<'db> {}
9660impl<'db> TypedStablePtr<'db> for OptionReturnTypeClauseEmptyPtr<'db> {
9661    type SyntaxNode = OptionReturnTypeClauseEmpty<'db>;
9662    fn untyped(self) -> SyntaxStablePtrId<'db> {
9663        self.0
9664    }
9665    fn lookup(&self, db: &'db dyn Database) -> OptionReturnTypeClauseEmpty<'db> {
9666        OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9667    }
9668}
9669impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9670    fn from(ptr: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9671        ptr.untyped()
9672    }
9673}
9674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9675pub struct OptionReturnTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9676impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClauseEmpty<'db> {
9677    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9678    type StablePtr = OptionReturnTypeClauseEmptyPtr<'db>;
9679    type Green = OptionReturnTypeClauseEmptyGreen<'db>;
9680    fn missing(db: &'db dyn Database) -> Self::Green {
9681        OptionReturnTypeClauseEmptyGreen(
9682            GreenNode {
9683                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9684                details: GreenNodeDetails::Node {
9685                    children: [].into(),
9686                    width: TextWidth::default(),
9687                },
9688            }
9689            .intern(db),
9690        )
9691    }
9692    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9693        let kind = node.kind(db);
9694        assert_eq!(
9695            kind,
9696            SyntaxKind::OptionReturnTypeClauseEmpty,
9697            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9698            kind,
9699            SyntaxKind::OptionReturnTypeClauseEmpty
9700        );
9701        Self { node }
9702    }
9703    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9704        let kind = node.kind(db);
9705        if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9706            Some(Self::from_syntax_node(db, node))
9707        } else {
9708            None
9709        }
9710    }
9711    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9712        self.node
9713    }
9714    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9715        OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9716    }
9717}
9718#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9719pub enum Statement<'db> {
9720    Let(StatementLet<'db>),
9721    Expr(StatementExpr<'db>),
9722    Continue(StatementContinue<'db>),
9723    Return(StatementReturn<'db>),
9724    Break(StatementBreak<'db>),
9725    Item(StatementItem<'db>),
9726    Missing(StatementMissing<'db>),
9727}
9728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9729pub struct StatementPtr<'db>(pub SyntaxStablePtrId<'db>);
9730impl<'db> TypedStablePtr<'db> for StatementPtr<'db> {
9731    type SyntaxNode = Statement<'db>;
9732    fn untyped(self) -> SyntaxStablePtrId<'db> {
9733        self.0
9734    }
9735    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9736        Statement::from_syntax_node(db, self.0.lookup(db))
9737    }
9738}
9739impl<'db> From<StatementPtr<'db>> for SyntaxStablePtrId<'db> {
9740    fn from(ptr: StatementPtr<'db>) -> Self {
9741        ptr.untyped()
9742    }
9743}
9744impl<'db> From<StatementLetPtr<'db>> for StatementPtr<'db> {
9745    fn from(value: StatementLetPtr<'db>) -> Self {
9746        Self(value.0)
9747    }
9748}
9749impl<'db> From<StatementExprPtr<'db>> for StatementPtr<'db> {
9750    fn from(value: StatementExprPtr<'db>) -> Self {
9751        Self(value.0)
9752    }
9753}
9754impl<'db> From<StatementContinuePtr<'db>> for StatementPtr<'db> {
9755    fn from(value: StatementContinuePtr<'db>) -> Self {
9756        Self(value.0)
9757    }
9758}
9759impl<'db> From<StatementReturnPtr<'db>> for StatementPtr<'db> {
9760    fn from(value: StatementReturnPtr<'db>) -> Self {
9761        Self(value.0)
9762    }
9763}
9764impl<'db> From<StatementBreakPtr<'db>> for StatementPtr<'db> {
9765    fn from(value: StatementBreakPtr<'db>) -> Self {
9766        Self(value.0)
9767    }
9768}
9769impl<'db> From<StatementItemPtr<'db>> for StatementPtr<'db> {
9770    fn from(value: StatementItemPtr<'db>) -> Self {
9771        Self(value.0)
9772    }
9773}
9774impl<'db> From<StatementMissingPtr<'db>> for StatementPtr<'db> {
9775    fn from(value: StatementMissingPtr<'db>) -> Self {
9776        Self(value.0)
9777    }
9778}
9779impl<'db> From<StatementLetGreen<'db>> for StatementGreen<'db> {
9780    fn from(value: StatementLetGreen<'db>) -> Self {
9781        Self(value.0)
9782    }
9783}
9784impl<'db> From<StatementExprGreen<'db>> for StatementGreen<'db> {
9785    fn from(value: StatementExprGreen<'db>) -> Self {
9786        Self(value.0)
9787    }
9788}
9789impl<'db> From<StatementContinueGreen<'db>> for StatementGreen<'db> {
9790    fn from(value: StatementContinueGreen<'db>) -> Self {
9791        Self(value.0)
9792    }
9793}
9794impl<'db> From<StatementReturnGreen<'db>> for StatementGreen<'db> {
9795    fn from(value: StatementReturnGreen<'db>) -> Self {
9796        Self(value.0)
9797    }
9798}
9799impl<'db> From<StatementBreakGreen<'db>> for StatementGreen<'db> {
9800    fn from(value: StatementBreakGreen<'db>) -> Self {
9801        Self(value.0)
9802    }
9803}
9804impl<'db> From<StatementItemGreen<'db>> for StatementGreen<'db> {
9805    fn from(value: StatementItemGreen<'db>) -> Self {
9806        Self(value.0)
9807    }
9808}
9809impl<'db> From<StatementMissingGreen<'db>> for StatementGreen<'db> {
9810    fn from(value: StatementMissingGreen<'db>) -> Self {
9811        Self(value.0)
9812    }
9813}
9814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9815pub struct StatementGreen<'db>(pub GreenId<'db>);
9816impl<'db> TypedSyntaxNode<'db> for Statement<'db> {
9817    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9818    type StablePtr = StatementPtr<'db>;
9819    type Green = StatementGreen<'db>;
9820    fn missing(db: &'db dyn Database) -> Self::Green {
9821        StatementGreen(StatementMissing::missing(db).0)
9822    }
9823    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9824        let kind = node.kind(db);
9825        match kind {
9826            SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9827            SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9828            SyntaxKind::StatementContinue => {
9829                Statement::Continue(StatementContinue::from_syntax_node(db, node))
9830            }
9831            SyntaxKind::StatementReturn => {
9832                Statement::Return(StatementReturn::from_syntax_node(db, node))
9833            }
9834            SyntaxKind::StatementBreak => {
9835                Statement::Break(StatementBreak::from_syntax_node(db, node))
9836            }
9837            SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9838            SyntaxKind::StatementMissing => {
9839                Statement::Missing(StatementMissing::from_syntax_node(db, node))
9840            }
9841            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9842        }
9843    }
9844    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9845        let kind = node.kind(db);
9846        match kind {
9847            SyntaxKind::StatementLet => {
9848                Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9849            }
9850            SyntaxKind::StatementExpr => {
9851                Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9852            }
9853            SyntaxKind::StatementContinue => {
9854                Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9855            }
9856            SyntaxKind::StatementReturn => {
9857                Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9858            }
9859            SyntaxKind::StatementBreak => {
9860                Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9861            }
9862            SyntaxKind::StatementItem => {
9863                Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9864            }
9865            SyntaxKind::StatementMissing => {
9866                Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9867            }
9868            _ => None,
9869        }
9870    }
9871    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9872        match self {
9873            Statement::Let(x) => x.as_syntax_node(),
9874            Statement::Expr(x) => x.as_syntax_node(),
9875            Statement::Continue(x) => x.as_syntax_node(),
9876            Statement::Return(x) => x.as_syntax_node(),
9877            Statement::Break(x) => x.as_syntax_node(),
9878            Statement::Item(x) => x.as_syntax_node(),
9879            Statement::Missing(x) => x.as_syntax_node(),
9880        }
9881    }
9882    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9883        StatementPtr(self.as_syntax_node().stable_ptr(db))
9884    }
9885}
9886impl<'db> Statement<'db> {
9887    /// Checks if a kind of a variant of [Statement].
9888    pub fn is_variant(kind: SyntaxKind) -> bool {
9889        matches!(
9890            kind,
9891            SyntaxKind::StatementLet
9892                | SyntaxKind::StatementExpr
9893                | SyntaxKind::StatementContinue
9894                | SyntaxKind::StatementReturn
9895                | SyntaxKind::StatementBreak
9896                | SyntaxKind::StatementItem
9897                | SyntaxKind::StatementMissing
9898        )
9899    }
9900}
9901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9902pub struct StatementList<'db>(ElementList<'db, Statement<'db>, 1>);
9903impl<'db> Deref for StatementList<'db> {
9904    type Target = ElementList<'db, Statement<'db>, 1>;
9905    fn deref(&self) -> &Self::Target {
9906        &self.0
9907    }
9908}
9909impl<'db> StatementList<'db> {
9910    pub fn new_green(
9911        db: &'db dyn Database,
9912        children: &[StatementGreen<'db>],
9913    ) -> StatementListGreen<'db> {
9914        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
9915        StatementListGreen(
9916            GreenNode {
9917                kind: SyntaxKind::StatementList,
9918                details: GreenNodeDetails::Node {
9919                    children: children.iter().map(|x| x.0).collect(),
9920                    width,
9921                },
9922            }
9923            .intern(db),
9924        )
9925    }
9926}
9927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9928pub struct StatementListPtr<'db>(pub SyntaxStablePtrId<'db>);
9929impl<'db> TypedStablePtr<'db> for StatementListPtr<'db> {
9930    type SyntaxNode = StatementList<'db>;
9931    fn untyped(self) -> SyntaxStablePtrId<'db> {
9932        self.0
9933    }
9934    fn lookup(&self, db: &'db dyn Database) -> StatementList<'db> {
9935        StatementList::from_syntax_node(db, self.0.lookup(db))
9936    }
9937}
9938impl<'db> From<StatementListPtr<'db>> for SyntaxStablePtrId<'db> {
9939    fn from(ptr: StatementListPtr<'db>) -> Self {
9940        ptr.untyped()
9941    }
9942}
9943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9944pub struct StatementListGreen<'db>(pub GreenId<'db>);
9945impl<'db> TypedSyntaxNode<'db> for StatementList<'db> {
9946    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
9947    type StablePtr = StatementListPtr<'db>;
9948    type Green = StatementListGreen<'db>;
9949    fn missing(db: &'db dyn Database) -> Self::Green {
9950        StatementListGreen(
9951            GreenNode {
9952                kind: SyntaxKind::StatementList,
9953                details: GreenNodeDetails::Node {
9954                    children: [].into(),
9955                    width: TextWidth::default(),
9956                },
9957            }
9958            .intern(db),
9959        )
9960    }
9961    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9962        Self(ElementList::new(node))
9963    }
9964    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9965        if node.kind(db) == SyntaxKind::StatementList {
9966            Some(Self(ElementList::new(node)))
9967        } else {
9968            None
9969        }
9970    }
9971    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9972        self.node
9973    }
9974    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9975        StatementListPtr(self.node.stable_ptr(db))
9976    }
9977}
9978#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9979pub struct StatementMissing<'db> {
9980    node: SyntaxNode<'db>,
9981}
9982impl<'db> StatementMissing<'db> {
9983    pub fn new_green(db: &'db dyn Database) -> StatementMissingGreen<'db> {
9984        let children = [];
9985        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9986        StatementMissingGreen(
9987            GreenNode {
9988                kind: SyntaxKind::StatementMissing,
9989                details: GreenNodeDetails::Node { children: children.into(), width },
9990            }
9991            .intern(db),
9992        )
9993    }
9994}
9995impl<'db> StatementMissing<'db> {}
9996#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9997pub struct StatementMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
9998impl<'db> StatementMissingPtr<'db> {}
9999impl<'db> TypedStablePtr<'db> for StatementMissingPtr<'db> {
10000    type SyntaxNode = StatementMissing<'db>;
10001    fn untyped(self) -> SyntaxStablePtrId<'db> {
10002        self.0
10003    }
10004    fn lookup(&self, db: &'db dyn Database) -> StatementMissing<'db> {
10005        StatementMissing::from_syntax_node(db, self.0.lookup(db))
10006    }
10007}
10008impl<'db> From<StatementMissingPtr<'db>> for SyntaxStablePtrId<'db> {
10009    fn from(ptr: StatementMissingPtr<'db>) -> Self {
10010        ptr.untyped()
10011    }
10012}
10013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10014pub struct StatementMissingGreen<'db>(pub GreenId<'db>);
10015impl<'db> TypedSyntaxNode<'db> for StatementMissing<'db> {
10016    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10017    type StablePtr = StatementMissingPtr<'db>;
10018    type Green = StatementMissingGreen<'db>;
10019    fn missing(db: &'db dyn Database) -> Self::Green {
10020        StatementMissingGreen(
10021            GreenNode {
10022                kind: SyntaxKind::StatementMissing,
10023                details: GreenNodeDetails::Node {
10024                    children: [].into(),
10025                    width: TextWidth::default(),
10026                },
10027            }
10028            .intern(db),
10029        )
10030    }
10031    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10032        let kind = node.kind(db);
10033        assert_eq!(
10034            kind,
10035            SyntaxKind::StatementMissing,
10036            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10037            kind,
10038            SyntaxKind::StatementMissing
10039        );
10040        Self { node }
10041    }
10042    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10043        let kind = node.kind(db);
10044        if kind == SyntaxKind::StatementMissing {
10045            Some(Self::from_syntax_node(db, node))
10046        } else {
10047            None
10048        }
10049    }
10050    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10051        self.node
10052    }
10053    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10054        StatementMissingPtr(self.node.stable_ptr(db))
10055    }
10056}
10057#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10058pub struct StatementLet<'db> {
10059    node: SyntaxNode<'db>,
10060}
10061impl<'db> StatementLet<'db> {
10062    pub const INDEX_ATTRIBUTES: usize = 0;
10063    pub const INDEX_LET_KW: usize = 1;
10064    pub const INDEX_PATTERN: usize = 2;
10065    pub const INDEX_TYPE_CLAUSE: usize = 3;
10066    pub const INDEX_EQ: usize = 4;
10067    pub const INDEX_RHS: usize = 5;
10068    pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
10069    pub const INDEX_SEMICOLON: usize = 7;
10070    pub fn new_green(
10071        db: &'db dyn Database,
10072        attributes: AttributeListGreen<'db>,
10073        let_kw: TerminalLetGreen<'db>,
10074        pattern: PatternGreen<'db>,
10075        type_clause: OptionTypeClauseGreen<'db>,
10076        eq: TerminalEqGreen<'db>,
10077        rhs: ExprGreen<'db>,
10078        let_else_clause: OptionLetElseClauseGreen<'db>,
10079        semicolon: TerminalSemicolonGreen<'db>,
10080    ) -> StatementLetGreen<'db> {
10081        let children = [
10082            attributes.0,
10083            let_kw.0,
10084            pattern.0,
10085            type_clause.0,
10086            eq.0,
10087            rhs.0,
10088            let_else_clause.0,
10089            semicolon.0,
10090        ];
10091        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10092        StatementLetGreen(
10093            GreenNode {
10094                kind: SyntaxKind::StatementLet,
10095                details: GreenNodeDetails::Node { children: children.into(), width },
10096            }
10097            .intern(db),
10098        )
10099    }
10100}
10101impl<'db> StatementLet<'db> {
10102    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10103        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10104    }
10105    pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
10106        TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10107    }
10108    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
10109        Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10110    }
10111    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
10112        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10113    }
10114    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
10115        TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10116    }
10117    pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
10118        Expr::from_syntax_node(db, self.node.get_children(db)[5])
10119    }
10120    pub fn let_else_clause(&self, db: &'db dyn Database) -> OptionLetElseClause<'db> {
10121        OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10122    }
10123    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10124        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10125    }
10126}
10127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10128pub struct StatementLetPtr<'db>(pub SyntaxStablePtrId<'db>);
10129impl<'db> StatementLetPtr<'db> {
10130    pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
10131        PatternGreen(self.0.0.key_fields(db)[0])
10132    }
10133}
10134impl<'db> TypedStablePtr<'db> for StatementLetPtr<'db> {
10135    type SyntaxNode = StatementLet<'db>;
10136    fn untyped(self) -> SyntaxStablePtrId<'db> {
10137        self.0
10138    }
10139    fn lookup(&self, db: &'db dyn Database) -> StatementLet<'db> {
10140        StatementLet::from_syntax_node(db, self.0.lookup(db))
10141    }
10142}
10143impl<'db> From<StatementLetPtr<'db>> for SyntaxStablePtrId<'db> {
10144    fn from(ptr: StatementLetPtr<'db>) -> Self {
10145        ptr.untyped()
10146    }
10147}
10148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10149pub struct StatementLetGreen<'db>(pub GreenId<'db>);
10150impl<'db> TypedSyntaxNode<'db> for StatementLet<'db> {
10151    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10152    type StablePtr = StatementLetPtr<'db>;
10153    type Green = StatementLetGreen<'db>;
10154    fn missing(db: &'db dyn Database) -> Self::Green {
10155        StatementLetGreen(
10156            GreenNode {
10157                kind: SyntaxKind::StatementLet,
10158                details: GreenNodeDetails::Node {
10159                    children: [
10160                        AttributeList::missing(db).0,
10161                        TerminalLet::missing(db).0,
10162                        Pattern::missing(db).0,
10163                        OptionTypeClause::missing(db).0,
10164                        TerminalEq::missing(db).0,
10165                        Expr::missing(db).0,
10166                        OptionLetElseClause::missing(db).0,
10167                        TerminalSemicolon::missing(db).0,
10168                    ]
10169                    .into(),
10170                    width: TextWidth::default(),
10171                },
10172            }
10173            .intern(db),
10174        )
10175    }
10176    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10177        let kind = node.kind(db);
10178        assert_eq!(
10179            kind,
10180            SyntaxKind::StatementLet,
10181            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10182            kind,
10183            SyntaxKind::StatementLet
10184        );
10185        Self { node }
10186    }
10187    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10188        let kind = node.kind(db);
10189        if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10190    }
10191    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10192        self.node
10193    }
10194    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10195        StatementLetPtr(self.node.stable_ptr(db))
10196    }
10197}
10198#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10199pub struct LetElseClause<'db> {
10200    node: SyntaxNode<'db>,
10201}
10202impl<'db> LetElseClause<'db> {
10203    pub const INDEX_ELSE_KW: usize = 0;
10204    pub const INDEX_ELSE_BLOCK: usize = 1;
10205    pub fn new_green(
10206        db: &'db dyn Database,
10207        else_kw: TerminalElseGreen<'db>,
10208        else_block: ExprBlockGreen<'db>,
10209    ) -> LetElseClauseGreen<'db> {
10210        let children = [else_kw.0, else_block.0];
10211        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10212        LetElseClauseGreen(
10213            GreenNode {
10214                kind: SyntaxKind::LetElseClause,
10215                details: GreenNodeDetails::Node { children: children.into(), width },
10216            }
10217            .intern(db),
10218        )
10219    }
10220}
10221impl<'db> LetElseClause<'db> {
10222    pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
10223        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10224    }
10225    pub fn else_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
10226        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10227    }
10228}
10229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10230pub struct LetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10231impl<'db> LetElseClausePtr<'db> {}
10232impl<'db> TypedStablePtr<'db> for LetElseClausePtr<'db> {
10233    type SyntaxNode = LetElseClause<'db>;
10234    fn untyped(self) -> SyntaxStablePtrId<'db> {
10235        self.0
10236    }
10237    fn lookup(&self, db: &'db dyn Database) -> LetElseClause<'db> {
10238        LetElseClause::from_syntax_node(db, self.0.lookup(db))
10239    }
10240}
10241impl<'db> From<LetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10242    fn from(ptr: LetElseClausePtr<'db>) -> Self {
10243        ptr.untyped()
10244    }
10245}
10246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10247pub struct LetElseClauseGreen<'db>(pub GreenId<'db>);
10248impl<'db> TypedSyntaxNode<'db> for LetElseClause<'db> {
10249    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10250    type StablePtr = LetElseClausePtr<'db>;
10251    type Green = LetElseClauseGreen<'db>;
10252    fn missing(db: &'db dyn Database) -> Self::Green {
10253        LetElseClauseGreen(
10254            GreenNode {
10255                kind: SyntaxKind::LetElseClause,
10256                details: GreenNodeDetails::Node {
10257                    children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10258                    width: TextWidth::default(),
10259                },
10260            }
10261            .intern(db),
10262        )
10263    }
10264    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10265        let kind = node.kind(db);
10266        assert_eq!(
10267            kind,
10268            SyntaxKind::LetElseClause,
10269            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10270            kind,
10271            SyntaxKind::LetElseClause
10272        );
10273        Self { node }
10274    }
10275    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10276        let kind = node.kind(db);
10277        if kind == SyntaxKind::LetElseClause {
10278            Some(Self::from_syntax_node(db, node))
10279        } else {
10280            None
10281        }
10282    }
10283    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10284        self.node
10285    }
10286    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10287        LetElseClausePtr(self.node.stable_ptr(db))
10288    }
10289}
10290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10291pub enum OptionLetElseClause<'db> {
10292    Empty(OptionLetElseClauseEmpty<'db>),
10293    LetElseClause(LetElseClause<'db>),
10294}
10295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10296pub struct OptionLetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10297impl<'db> TypedStablePtr<'db> for OptionLetElseClausePtr<'db> {
10298    type SyntaxNode = OptionLetElseClause<'db>;
10299    fn untyped(self) -> SyntaxStablePtrId<'db> {
10300        self.0
10301    }
10302    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10303        OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10304    }
10305}
10306impl<'db> From<OptionLetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10307    fn from(ptr: OptionLetElseClausePtr<'db>) -> Self {
10308        ptr.untyped()
10309    }
10310}
10311impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for OptionLetElseClausePtr<'db> {
10312    fn from(value: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10313        Self(value.0)
10314    }
10315}
10316impl<'db> From<LetElseClausePtr<'db>> for OptionLetElseClausePtr<'db> {
10317    fn from(value: LetElseClausePtr<'db>) -> Self {
10318        Self(value.0)
10319    }
10320}
10321impl<'db> From<OptionLetElseClauseEmptyGreen<'db>> for OptionLetElseClauseGreen<'db> {
10322    fn from(value: OptionLetElseClauseEmptyGreen<'db>) -> Self {
10323        Self(value.0)
10324    }
10325}
10326impl<'db> From<LetElseClauseGreen<'db>> for OptionLetElseClauseGreen<'db> {
10327    fn from(value: LetElseClauseGreen<'db>) -> Self {
10328        Self(value.0)
10329    }
10330}
10331#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10332pub struct OptionLetElseClauseGreen<'db>(pub GreenId<'db>);
10333impl<'db> TypedSyntaxNode<'db> for OptionLetElseClause<'db> {
10334    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10335    type StablePtr = OptionLetElseClausePtr<'db>;
10336    type Green = OptionLetElseClauseGreen<'db>;
10337    fn missing(db: &'db dyn Database) -> Self::Green {
10338        panic!("No missing variant.");
10339    }
10340    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10341        let kind = node.kind(db);
10342        match kind {
10343            SyntaxKind::OptionLetElseClauseEmpty => {
10344                OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10345            }
10346            SyntaxKind::LetElseClause => {
10347                OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10348            }
10349            _ => panic!(
10350                "Unexpected syntax kind {:?} when constructing {}.",
10351                kind, "OptionLetElseClause"
10352            ),
10353        }
10354    }
10355    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10356        let kind = node.kind(db);
10357        match kind {
10358            SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10359                OptionLetElseClauseEmpty::from_syntax_node(db, node),
10360            )),
10361            SyntaxKind::LetElseClause => {
10362                Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10363            }
10364            _ => None,
10365        }
10366    }
10367    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10368        match self {
10369            OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10370            OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10371        }
10372    }
10373    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10374        OptionLetElseClausePtr(self.as_syntax_node().stable_ptr(db))
10375    }
10376}
10377impl<'db> OptionLetElseClause<'db> {
10378    /// Checks if a kind of a variant of [OptionLetElseClause].
10379    pub fn is_variant(kind: SyntaxKind) -> bool {
10380        matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10381    }
10382}
10383#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10384pub struct OptionLetElseClauseEmpty<'db> {
10385    node: SyntaxNode<'db>,
10386}
10387impl<'db> OptionLetElseClauseEmpty<'db> {
10388    pub fn new_green(db: &'db dyn Database) -> OptionLetElseClauseEmptyGreen<'db> {
10389        let children = [];
10390        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10391        OptionLetElseClauseEmptyGreen(
10392            GreenNode {
10393                kind: SyntaxKind::OptionLetElseClauseEmpty,
10394                details: GreenNodeDetails::Node { children: children.into(), width },
10395            }
10396            .intern(db),
10397        )
10398    }
10399}
10400impl<'db> OptionLetElseClauseEmpty<'db> {}
10401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10402pub struct OptionLetElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10403impl<'db> OptionLetElseClauseEmptyPtr<'db> {}
10404impl<'db> TypedStablePtr<'db> for OptionLetElseClauseEmptyPtr<'db> {
10405    type SyntaxNode = OptionLetElseClauseEmpty<'db>;
10406    fn untyped(self) -> SyntaxStablePtrId<'db> {
10407        self.0
10408    }
10409    fn lookup(&self, db: &'db dyn Database) -> OptionLetElseClauseEmpty<'db> {
10410        OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10411    }
10412}
10413impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10414    fn from(ptr: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10415        ptr.untyped()
10416    }
10417}
10418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10419pub struct OptionLetElseClauseEmptyGreen<'db>(pub GreenId<'db>);
10420impl<'db> TypedSyntaxNode<'db> for OptionLetElseClauseEmpty<'db> {
10421    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10422    type StablePtr = OptionLetElseClauseEmptyPtr<'db>;
10423    type Green = OptionLetElseClauseEmptyGreen<'db>;
10424    fn missing(db: &'db dyn Database) -> Self::Green {
10425        OptionLetElseClauseEmptyGreen(
10426            GreenNode {
10427                kind: SyntaxKind::OptionLetElseClauseEmpty,
10428                details: GreenNodeDetails::Node {
10429                    children: [].into(),
10430                    width: TextWidth::default(),
10431                },
10432            }
10433            .intern(db),
10434        )
10435    }
10436    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10437        let kind = node.kind(db);
10438        assert_eq!(
10439            kind,
10440            SyntaxKind::OptionLetElseClauseEmpty,
10441            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10442            kind,
10443            SyntaxKind::OptionLetElseClauseEmpty
10444        );
10445        Self { node }
10446    }
10447    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10448        let kind = node.kind(db);
10449        if kind == SyntaxKind::OptionLetElseClauseEmpty {
10450            Some(Self::from_syntax_node(db, node))
10451        } else {
10452            None
10453        }
10454    }
10455    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10456        self.node
10457    }
10458    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10459        OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10460    }
10461}
10462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10463pub enum OptionTerminalSemicolon<'db> {
10464    Empty(OptionTerminalSemicolonEmpty<'db>),
10465    TerminalSemicolon(TerminalSemicolon<'db>),
10466}
10467#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10468pub struct OptionTerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
10469impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonPtr<'db> {
10470    type SyntaxNode = OptionTerminalSemicolon<'db>;
10471    fn untyped(self) -> SyntaxStablePtrId<'db> {
10472        self.0
10473    }
10474    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10475        OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10476    }
10477}
10478impl<'db> From<OptionTerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
10479    fn from(ptr: OptionTerminalSemicolonPtr<'db>) -> Self {
10480        ptr.untyped()
10481    }
10482}
10483impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10484    fn from(value: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10485        Self(value.0)
10486    }
10487}
10488impl<'db> From<TerminalSemicolonPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10489    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
10490        Self(value.0)
10491    }
10492}
10493impl<'db> From<OptionTerminalSemicolonEmptyGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10494    fn from(value: OptionTerminalSemicolonEmptyGreen<'db>) -> Self {
10495        Self(value.0)
10496    }
10497}
10498impl<'db> From<TerminalSemicolonGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10499    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
10500        Self(value.0)
10501    }
10502}
10503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10504pub struct OptionTerminalSemicolonGreen<'db>(pub GreenId<'db>);
10505impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolon<'db> {
10506    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10507    type StablePtr = OptionTerminalSemicolonPtr<'db>;
10508    type Green = OptionTerminalSemicolonGreen<'db>;
10509    fn missing(db: &'db dyn Database) -> Self::Green {
10510        panic!("No missing variant.");
10511    }
10512    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10513        let kind = node.kind(db);
10514        match kind {
10515            SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10516                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10517            ),
10518            SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10519                TerminalSemicolon::from_syntax_node(db, node),
10520            ),
10521            _ => panic!(
10522                "Unexpected syntax kind {:?} when constructing {}.",
10523                kind, "OptionTerminalSemicolon"
10524            ),
10525        }
10526    }
10527    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10528        let kind = node.kind(db);
10529        match kind {
10530            SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10531                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10532            )),
10533            SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10534                TerminalSemicolon::from_syntax_node(db, node),
10535            )),
10536            _ => None,
10537        }
10538    }
10539    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10540        match self {
10541            OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10542            OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10543        }
10544    }
10545    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10546        OptionTerminalSemicolonPtr(self.as_syntax_node().stable_ptr(db))
10547    }
10548}
10549impl<'db> OptionTerminalSemicolon<'db> {
10550    /// Checks if a kind of a variant of [OptionTerminalSemicolon].
10551    pub fn is_variant(kind: SyntaxKind) -> bool {
10552        matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10553    }
10554}
10555#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10556pub struct OptionTerminalSemicolonEmpty<'db> {
10557    node: SyntaxNode<'db>,
10558}
10559impl<'db> OptionTerminalSemicolonEmpty<'db> {
10560    pub fn new_green(db: &'db dyn Database) -> OptionTerminalSemicolonEmptyGreen<'db> {
10561        let children = [];
10562        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10563        OptionTerminalSemicolonEmptyGreen(
10564            GreenNode {
10565                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10566                details: GreenNodeDetails::Node { children: children.into(), width },
10567            }
10568            .intern(db),
10569        )
10570    }
10571}
10572impl<'db> OptionTerminalSemicolonEmpty<'db> {}
10573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10574pub struct OptionTerminalSemicolonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10575impl<'db> OptionTerminalSemicolonEmptyPtr<'db> {}
10576impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonEmptyPtr<'db> {
10577    type SyntaxNode = OptionTerminalSemicolonEmpty<'db>;
10578    fn untyped(self) -> SyntaxStablePtrId<'db> {
10579        self.0
10580    }
10581    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalSemicolonEmpty<'db> {
10582        OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10583    }
10584}
10585impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10586    fn from(ptr: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10587        ptr.untyped()
10588    }
10589}
10590#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10591pub struct OptionTerminalSemicolonEmptyGreen<'db>(pub GreenId<'db>);
10592impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolonEmpty<'db> {
10593    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10594    type StablePtr = OptionTerminalSemicolonEmptyPtr<'db>;
10595    type Green = OptionTerminalSemicolonEmptyGreen<'db>;
10596    fn missing(db: &'db dyn Database) -> Self::Green {
10597        OptionTerminalSemicolonEmptyGreen(
10598            GreenNode {
10599                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10600                details: GreenNodeDetails::Node {
10601                    children: [].into(),
10602                    width: TextWidth::default(),
10603                },
10604            }
10605            .intern(db),
10606        )
10607    }
10608    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10609        let kind = node.kind(db);
10610        assert_eq!(
10611            kind,
10612            SyntaxKind::OptionTerminalSemicolonEmpty,
10613            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10614            kind,
10615            SyntaxKind::OptionTerminalSemicolonEmpty
10616        );
10617        Self { node }
10618    }
10619    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10620        let kind = node.kind(db);
10621        if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10622            Some(Self::from_syntax_node(db, node))
10623        } else {
10624            None
10625        }
10626    }
10627    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10628        self.node
10629    }
10630    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10631        OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10632    }
10633}
10634#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10635pub struct StatementExpr<'db> {
10636    node: SyntaxNode<'db>,
10637}
10638impl<'db> StatementExpr<'db> {
10639    pub const INDEX_ATTRIBUTES: usize = 0;
10640    pub const INDEX_EXPR: usize = 1;
10641    pub const INDEX_SEMICOLON: usize = 2;
10642    pub fn new_green(
10643        db: &'db dyn Database,
10644        attributes: AttributeListGreen<'db>,
10645        expr: ExprGreen<'db>,
10646        semicolon: OptionTerminalSemicolonGreen<'db>,
10647    ) -> StatementExprGreen<'db> {
10648        let children = [attributes.0, expr.0, semicolon.0];
10649        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10650        StatementExprGreen(
10651            GreenNode {
10652                kind: SyntaxKind::StatementExpr,
10653                details: GreenNodeDetails::Node { children: children.into(), width },
10654            }
10655            .intern(db),
10656        )
10657    }
10658}
10659impl<'db> StatementExpr<'db> {
10660    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10661        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10662    }
10663    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10664        Expr::from_syntax_node(db, self.node.get_children(db)[1])
10665    }
10666    pub fn semicolon(&self, db: &'db dyn Database) -> OptionTerminalSemicolon<'db> {
10667        OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10668    }
10669}
10670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10671pub struct StatementExprPtr<'db>(pub SyntaxStablePtrId<'db>);
10672impl<'db> StatementExprPtr<'db> {}
10673impl<'db> TypedStablePtr<'db> for StatementExprPtr<'db> {
10674    type SyntaxNode = StatementExpr<'db>;
10675    fn untyped(self) -> SyntaxStablePtrId<'db> {
10676        self.0
10677    }
10678    fn lookup(&self, db: &'db dyn Database) -> StatementExpr<'db> {
10679        StatementExpr::from_syntax_node(db, self.0.lookup(db))
10680    }
10681}
10682impl<'db> From<StatementExprPtr<'db>> for SyntaxStablePtrId<'db> {
10683    fn from(ptr: StatementExprPtr<'db>) -> Self {
10684        ptr.untyped()
10685    }
10686}
10687#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10688pub struct StatementExprGreen<'db>(pub GreenId<'db>);
10689impl<'db> TypedSyntaxNode<'db> for StatementExpr<'db> {
10690    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10691    type StablePtr = StatementExprPtr<'db>;
10692    type Green = StatementExprGreen<'db>;
10693    fn missing(db: &'db dyn Database) -> Self::Green {
10694        StatementExprGreen(
10695            GreenNode {
10696                kind: SyntaxKind::StatementExpr,
10697                details: GreenNodeDetails::Node {
10698                    children: [
10699                        AttributeList::missing(db).0,
10700                        Expr::missing(db).0,
10701                        OptionTerminalSemicolon::missing(db).0,
10702                    ]
10703                    .into(),
10704                    width: TextWidth::default(),
10705                },
10706            }
10707            .intern(db),
10708        )
10709    }
10710    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10711        let kind = node.kind(db);
10712        assert_eq!(
10713            kind,
10714            SyntaxKind::StatementExpr,
10715            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10716            kind,
10717            SyntaxKind::StatementExpr
10718        );
10719        Self { node }
10720    }
10721    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10722        let kind = node.kind(db);
10723        if kind == SyntaxKind::StatementExpr {
10724            Some(Self::from_syntax_node(db, node))
10725        } else {
10726            None
10727        }
10728    }
10729    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10730        self.node
10731    }
10732    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10733        StatementExprPtr(self.node.stable_ptr(db))
10734    }
10735}
10736#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10737pub struct StatementContinue<'db> {
10738    node: SyntaxNode<'db>,
10739}
10740impl<'db> StatementContinue<'db> {
10741    pub const INDEX_ATTRIBUTES: usize = 0;
10742    pub const INDEX_CONTINUE_KW: usize = 1;
10743    pub const INDEX_SEMICOLON: usize = 2;
10744    pub fn new_green(
10745        db: &'db dyn Database,
10746        attributes: AttributeListGreen<'db>,
10747        continue_kw: TerminalContinueGreen<'db>,
10748        semicolon: TerminalSemicolonGreen<'db>,
10749    ) -> StatementContinueGreen<'db> {
10750        let children = [attributes.0, continue_kw.0, semicolon.0];
10751        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10752        StatementContinueGreen(
10753            GreenNode {
10754                kind: SyntaxKind::StatementContinue,
10755                details: GreenNodeDetails::Node { children: children.into(), width },
10756            }
10757            .intern(db),
10758        )
10759    }
10760}
10761impl<'db> StatementContinue<'db> {
10762    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10763        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10764    }
10765    pub fn continue_kw(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
10766        TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10767    }
10768    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10769        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10770    }
10771}
10772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10773pub struct StatementContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
10774impl<'db> StatementContinuePtr<'db> {}
10775impl<'db> TypedStablePtr<'db> for StatementContinuePtr<'db> {
10776    type SyntaxNode = StatementContinue<'db>;
10777    fn untyped(self) -> SyntaxStablePtrId<'db> {
10778        self.0
10779    }
10780    fn lookup(&self, db: &'db dyn Database) -> StatementContinue<'db> {
10781        StatementContinue::from_syntax_node(db, self.0.lookup(db))
10782    }
10783}
10784impl<'db> From<StatementContinuePtr<'db>> for SyntaxStablePtrId<'db> {
10785    fn from(ptr: StatementContinuePtr<'db>) -> Self {
10786        ptr.untyped()
10787    }
10788}
10789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10790pub struct StatementContinueGreen<'db>(pub GreenId<'db>);
10791impl<'db> TypedSyntaxNode<'db> for StatementContinue<'db> {
10792    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10793    type StablePtr = StatementContinuePtr<'db>;
10794    type Green = StatementContinueGreen<'db>;
10795    fn missing(db: &'db dyn Database) -> Self::Green {
10796        StatementContinueGreen(
10797            GreenNode {
10798                kind: SyntaxKind::StatementContinue,
10799                details: GreenNodeDetails::Node {
10800                    children: [
10801                        AttributeList::missing(db).0,
10802                        TerminalContinue::missing(db).0,
10803                        TerminalSemicolon::missing(db).0,
10804                    ]
10805                    .into(),
10806                    width: TextWidth::default(),
10807                },
10808            }
10809            .intern(db),
10810        )
10811    }
10812    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10813        let kind = node.kind(db);
10814        assert_eq!(
10815            kind,
10816            SyntaxKind::StatementContinue,
10817            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10818            kind,
10819            SyntaxKind::StatementContinue
10820        );
10821        Self { node }
10822    }
10823    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10824        let kind = node.kind(db);
10825        if kind == SyntaxKind::StatementContinue {
10826            Some(Self::from_syntax_node(db, node))
10827        } else {
10828            None
10829        }
10830    }
10831    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10832        self.node
10833    }
10834    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10835        StatementContinuePtr(self.node.stable_ptr(db))
10836    }
10837}
10838#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10839pub struct ExprClause<'db> {
10840    node: SyntaxNode<'db>,
10841}
10842impl<'db> ExprClause<'db> {
10843    pub const INDEX_EXPR: usize = 0;
10844    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ExprClauseGreen<'db> {
10845        let children = [expr.0];
10846        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10847        ExprClauseGreen(
10848            GreenNode {
10849                kind: SyntaxKind::ExprClause,
10850                details: GreenNodeDetails::Node { children: children.into(), width },
10851            }
10852            .intern(db),
10853        )
10854    }
10855}
10856impl<'db> ExprClause<'db> {
10857    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10858        Expr::from_syntax_node(db, self.node.get_children(db)[0])
10859    }
10860}
10861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10862pub struct ExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10863impl<'db> ExprClausePtr<'db> {}
10864impl<'db> TypedStablePtr<'db> for ExprClausePtr<'db> {
10865    type SyntaxNode = ExprClause<'db>;
10866    fn untyped(self) -> SyntaxStablePtrId<'db> {
10867        self.0
10868    }
10869    fn lookup(&self, db: &'db dyn Database) -> ExprClause<'db> {
10870        ExprClause::from_syntax_node(db, self.0.lookup(db))
10871    }
10872}
10873impl<'db> From<ExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10874    fn from(ptr: ExprClausePtr<'db>) -> Self {
10875        ptr.untyped()
10876    }
10877}
10878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10879pub struct ExprClauseGreen<'db>(pub GreenId<'db>);
10880impl<'db> TypedSyntaxNode<'db> for ExprClause<'db> {
10881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10882    type StablePtr = ExprClausePtr<'db>;
10883    type Green = ExprClauseGreen<'db>;
10884    fn missing(db: &'db dyn Database) -> Self::Green {
10885        ExprClauseGreen(
10886            GreenNode {
10887                kind: SyntaxKind::ExprClause,
10888                details: GreenNodeDetails::Node {
10889                    children: [Expr::missing(db).0].into(),
10890                    width: TextWidth::default(),
10891                },
10892            }
10893            .intern(db),
10894        )
10895    }
10896    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10897        let kind = node.kind(db);
10898        assert_eq!(
10899            kind,
10900            SyntaxKind::ExprClause,
10901            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10902            kind,
10903            SyntaxKind::ExprClause
10904        );
10905        Self { node }
10906    }
10907    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10908        let kind = node.kind(db);
10909        if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10910    }
10911    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10912        self.node
10913    }
10914    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10915        ExprClausePtr(self.node.stable_ptr(db))
10916    }
10917}
10918#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10919pub enum OptionExprClause<'db> {
10920    Empty(OptionExprClauseEmpty<'db>),
10921    ExprClause(ExprClause<'db>),
10922}
10923#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10924pub struct OptionExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10925impl<'db> TypedStablePtr<'db> for OptionExprClausePtr<'db> {
10926    type SyntaxNode = OptionExprClause<'db>;
10927    fn untyped(self) -> SyntaxStablePtrId<'db> {
10928        self.0
10929    }
10930    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10931        OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10932    }
10933}
10934impl<'db> From<OptionExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10935    fn from(ptr: OptionExprClausePtr<'db>) -> Self {
10936        ptr.untyped()
10937    }
10938}
10939impl<'db> From<OptionExprClauseEmptyPtr<'db>> for OptionExprClausePtr<'db> {
10940    fn from(value: OptionExprClauseEmptyPtr<'db>) -> Self {
10941        Self(value.0)
10942    }
10943}
10944impl<'db> From<ExprClausePtr<'db>> for OptionExprClausePtr<'db> {
10945    fn from(value: ExprClausePtr<'db>) -> Self {
10946        Self(value.0)
10947    }
10948}
10949impl<'db> From<OptionExprClauseEmptyGreen<'db>> for OptionExprClauseGreen<'db> {
10950    fn from(value: OptionExprClauseEmptyGreen<'db>) -> Self {
10951        Self(value.0)
10952    }
10953}
10954impl<'db> From<ExprClauseGreen<'db>> for OptionExprClauseGreen<'db> {
10955    fn from(value: ExprClauseGreen<'db>) -> Self {
10956        Self(value.0)
10957    }
10958}
10959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10960pub struct OptionExprClauseGreen<'db>(pub GreenId<'db>);
10961impl<'db> TypedSyntaxNode<'db> for OptionExprClause<'db> {
10962    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10963    type StablePtr = OptionExprClausePtr<'db>;
10964    type Green = OptionExprClauseGreen<'db>;
10965    fn missing(db: &'db dyn Database) -> Self::Green {
10966        panic!("No missing variant.");
10967    }
10968    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10969        let kind = node.kind(db);
10970        match kind {
10971            SyntaxKind::OptionExprClauseEmpty => {
10972                OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10973            }
10974            SyntaxKind::ExprClause => {
10975                OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10976            }
10977            _ => panic!(
10978                "Unexpected syntax kind {:?} when constructing {}.",
10979                kind, "OptionExprClause"
10980            ),
10981        }
10982    }
10983    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10984        let kind = node.kind(db);
10985        match kind {
10986            SyntaxKind::OptionExprClauseEmpty => {
10987                Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10988            }
10989            SyntaxKind::ExprClause => {
10990                Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10991            }
10992            _ => None,
10993        }
10994    }
10995    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10996        match self {
10997            OptionExprClause::Empty(x) => x.as_syntax_node(),
10998            OptionExprClause::ExprClause(x) => x.as_syntax_node(),
10999        }
11000    }
11001    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11002        OptionExprClausePtr(self.as_syntax_node().stable_ptr(db))
11003    }
11004}
11005impl<'db> OptionExprClause<'db> {
11006    /// Checks if a kind of a variant of [OptionExprClause].
11007    pub fn is_variant(kind: SyntaxKind) -> bool {
11008        matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
11009    }
11010}
11011#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11012pub struct OptionExprClauseEmpty<'db> {
11013    node: SyntaxNode<'db>,
11014}
11015impl<'db> OptionExprClauseEmpty<'db> {
11016    pub fn new_green(db: &'db dyn Database) -> OptionExprClauseEmptyGreen<'db> {
11017        let children = [];
11018        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11019        OptionExprClauseEmptyGreen(
11020            GreenNode {
11021                kind: SyntaxKind::OptionExprClauseEmpty,
11022                details: GreenNodeDetails::Node { children: children.into(), width },
11023            }
11024            .intern(db),
11025        )
11026    }
11027}
11028impl<'db> OptionExprClauseEmpty<'db> {}
11029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11030pub struct OptionExprClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
11031impl<'db> OptionExprClauseEmptyPtr<'db> {}
11032impl<'db> TypedStablePtr<'db> for OptionExprClauseEmptyPtr<'db> {
11033    type SyntaxNode = OptionExprClauseEmpty<'db>;
11034    fn untyped(self) -> SyntaxStablePtrId<'db> {
11035        self.0
11036    }
11037    fn lookup(&self, db: &'db dyn Database) -> OptionExprClauseEmpty<'db> {
11038        OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11039    }
11040}
11041impl<'db> From<OptionExprClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
11042    fn from(ptr: OptionExprClauseEmptyPtr<'db>) -> Self {
11043        ptr.untyped()
11044    }
11045}
11046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11047pub struct OptionExprClauseEmptyGreen<'db>(pub GreenId<'db>);
11048impl<'db> TypedSyntaxNode<'db> for OptionExprClauseEmpty<'db> {
11049    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
11050    type StablePtr = OptionExprClauseEmptyPtr<'db>;
11051    type Green = OptionExprClauseEmptyGreen<'db>;
11052    fn missing(db: &'db dyn Database) -> Self::Green {
11053        OptionExprClauseEmptyGreen(
11054            GreenNode {
11055                kind: SyntaxKind::OptionExprClauseEmpty,
11056                details: GreenNodeDetails::Node {
11057                    children: [].into(),
11058                    width: TextWidth::default(),
11059                },
11060            }
11061            .intern(db),
11062        )
11063    }
11064    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11065        let kind = node.kind(db);
11066        assert_eq!(
11067            kind,
11068            SyntaxKind::OptionExprClauseEmpty,
11069            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11070            kind,
11071            SyntaxKind::OptionExprClauseEmpty
11072        );
11073        Self { node }
11074    }
11075    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11076        let kind = node.kind(db);
11077        if kind == SyntaxKind::OptionExprClauseEmpty {
11078            Some(Self::from_syntax_node(db, node))
11079        } else {
11080            None
11081        }
11082    }
11083    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11084        self.node
11085    }
11086    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11087        OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11088    }
11089}
11090#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11091pub struct StatementReturn<'db> {
11092    node: SyntaxNode<'db>,
11093}
11094impl<'db> StatementReturn<'db> {
11095    pub const INDEX_ATTRIBUTES: usize = 0;
11096    pub const INDEX_RETURN_KW: usize = 1;
11097    pub const INDEX_EXPR_CLAUSE: usize = 2;
11098    pub const INDEX_SEMICOLON: usize = 3;
11099    pub fn new_green(
11100        db: &'db dyn Database,
11101        attributes: AttributeListGreen<'db>,
11102        return_kw: TerminalReturnGreen<'db>,
11103        expr_clause: OptionExprClauseGreen<'db>,
11104        semicolon: TerminalSemicolonGreen<'db>,
11105    ) -> StatementReturnGreen<'db> {
11106        let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11107        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11108        StatementReturnGreen(
11109            GreenNode {
11110                kind: SyntaxKind::StatementReturn,
11111                details: GreenNodeDetails::Node { children: children.into(), width },
11112            }
11113            .intern(db),
11114        )
11115    }
11116}
11117impl<'db> StatementReturn<'db> {
11118    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11119        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11120    }
11121    pub fn return_kw(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
11122        TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11123    }
11124    pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11125        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11126    }
11127    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11128        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11129    }
11130}
11131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11132pub struct StatementReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
11133impl<'db> StatementReturnPtr<'db> {}
11134impl<'db> TypedStablePtr<'db> for StatementReturnPtr<'db> {
11135    type SyntaxNode = StatementReturn<'db>;
11136    fn untyped(self) -> SyntaxStablePtrId<'db> {
11137        self.0
11138    }
11139    fn lookup(&self, db: &'db dyn Database) -> StatementReturn<'db> {
11140        StatementReturn::from_syntax_node(db, self.0.lookup(db))
11141    }
11142}
11143impl<'db> From<StatementReturnPtr<'db>> for SyntaxStablePtrId<'db> {
11144    fn from(ptr: StatementReturnPtr<'db>) -> Self {
11145        ptr.untyped()
11146    }
11147}
11148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11149pub struct StatementReturnGreen<'db>(pub GreenId<'db>);
11150impl<'db> TypedSyntaxNode<'db> for StatementReturn<'db> {
11151    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11152    type StablePtr = StatementReturnPtr<'db>;
11153    type Green = StatementReturnGreen<'db>;
11154    fn missing(db: &'db dyn Database) -> Self::Green {
11155        StatementReturnGreen(
11156            GreenNode {
11157                kind: SyntaxKind::StatementReturn,
11158                details: GreenNodeDetails::Node {
11159                    children: [
11160                        AttributeList::missing(db).0,
11161                        TerminalReturn::missing(db).0,
11162                        OptionExprClause::missing(db).0,
11163                        TerminalSemicolon::missing(db).0,
11164                    ]
11165                    .into(),
11166                    width: TextWidth::default(),
11167                },
11168            }
11169            .intern(db),
11170        )
11171    }
11172    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11173        let kind = node.kind(db);
11174        assert_eq!(
11175            kind,
11176            SyntaxKind::StatementReturn,
11177            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11178            kind,
11179            SyntaxKind::StatementReturn
11180        );
11181        Self { node }
11182    }
11183    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11184        let kind = node.kind(db);
11185        if kind == SyntaxKind::StatementReturn {
11186            Some(Self::from_syntax_node(db, node))
11187        } else {
11188            None
11189        }
11190    }
11191    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11192        self.node
11193    }
11194    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11195        StatementReturnPtr(self.node.stable_ptr(db))
11196    }
11197}
11198#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11199pub struct StatementBreak<'db> {
11200    node: SyntaxNode<'db>,
11201}
11202impl<'db> StatementBreak<'db> {
11203    pub const INDEX_ATTRIBUTES: usize = 0;
11204    pub const INDEX_BREAK_KW: usize = 1;
11205    pub const INDEX_EXPR_CLAUSE: usize = 2;
11206    pub const INDEX_SEMICOLON: usize = 3;
11207    pub fn new_green(
11208        db: &'db dyn Database,
11209        attributes: AttributeListGreen<'db>,
11210        break_kw: TerminalBreakGreen<'db>,
11211        expr_clause: OptionExprClauseGreen<'db>,
11212        semicolon: TerminalSemicolonGreen<'db>,
11213    ) -> StatementBreakGreen<'db> {
11214        let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11215        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11216        StatementBreakGreen(
11217            GreenNode {
11218                kind: SyntaxKind::StatementBreak,
11219                details: GreenNodeDetails::Node { children: children.into(), width },
11220            }
11221            .intern(db),
11222        )
11223    }
11224}
11225impl<'db> StatementBreak<'db> {
11226    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11227        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11228    }
11229    pub fn break_kw(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
11230        TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11231    }
11232    pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11233        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11234    }
11235    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11236        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11237    }
11238}
11239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11240pub struct StatementBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
11241impl<'db> StatementBreakPtr<'db> {}
11242impl<'db> TypedStablePtr<'db> for StatementBreakPtr<'db> {
11243    type SyntaxNode = StatementBreak<'db>;
11244    fn untyped(self) -> SyntaxStablePtrId<'db> {
11245        self.0
11246    }
11247    fn lookup(&self, db: &'db dyn Database) -> StatementBreak<'db> {
11248        StatementBreak::from_syntax_node(db, self.0.lookup(db))
11249    }
11250}
11251impl<'db> From<StatementBreakPtr<'db>> for SyntaxStablePtrId<'db> {
11252    fn from(ptr: StatementBreakPtr<'db>) -> Self {
11253        ptr.untyped()
11254    }
11255}
11256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11257pub struct StatementBreakGreen<'db>(pub GreenId<'db>);
11258impl<'db> TypedSyntaxNode<'db> for StatementBreak<'db> {
11259    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11260    type StablePtr = StatementBreakPtr<'db>;
11261    type Green = StatementBreakGreen<'db>;
11262    fn missing(db: &'db dyn Database) -> Self::Green {
11263        StatementBreakGreen(
11264            GreenNode {
11265                kind: SyntaxKind::StatementBreak,
11266                details: GreenNodeDetails::Node {
11267                    children: [
11268                        AttributeList::missing(db).0,
11269                        TerminalBreak::missing(db).0,
11270                        OptionExprClause::missing(db).0,
11271                        TerminalSemicolon::missing(db).0,
11272                    ]
11273                    .into(),
11274                    width: TextWidth::default(),
11275                },
11276            }
11277            .intern(db),
11278        )
11279    }
11280    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11281        let kind = node.kind(db);
11282        assert_eq!(
11283            kind,
11284            SyntaxKind::StatementBreak,
11285            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11286            kind,
11287            SyntaxKind::StatementBreak
11288        );
11289        Self { node }
11290    }
11291    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11292        let kind = node.kind(db);
11293        if kind == SyntaxKind::StatementBreak {
11294            Some(Self::from_syntax_node(db, node))
11295        } else {
11296            None
11297        }
11298    }
11299    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11300        self.node
11301    }
11302    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11303        StatementBreakPtr(self.node.stable_ptr(db))
11304    }
11305}
11306#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11307pub struct StatementItem<'db> {
11308    node: SyntaxNode<'db>,
11309}
11310impl<'db> StatementItem<'db> {
11311    pub const INDEX_ITEM: usize = 0;
11312    pub fn new_green(db: &'db dyn Database, item: ModuleItemGreen<'db>) -> StatementItemGreen<'db> {
11313        let children = [item.0];
11314        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11315        StatementItemGreen(
11316            GreenNode {
11317                kind: SyntaxKind::StatementItem,
11318                details: GreenNodeDetails::Node { children: children.into(), width },
11319            }
11320            .intern(db),
11321        )
11322    }
11323}
11324impl<'db> StatementItem<'db> {
11325    pub fn item(&self, db: &'db dyn Database) -> ModuleItem<'db> {
11326        ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11327    }
11328}
11329#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11330pub struct StatementItemPtr<'db>(pub SyntaxStablePtrId<'db>);
11331impl<'db> StatementItemPtr<'db> {}
11332impl<'db> TypedStablePtr<'db> for StatementItemPtr<'db> {
11333    type SyntaxNode = StatementItem<'db>;
11334    fn untyped(self) -> SyntaxStablePtrId<'db> {
11335        self.0
11336    }
11337    fn lookup(&self, db: &'db dyn Database) -> StatementItem<'db> {
11338        StatementItem::from_syntax_node(db, self.0.lookup(db))
11339    }
11340}
11341impl<'db> From<StatementItemPtr<'db>> for SyntaxStablePtrId<'db> {
11342    fn from(ptr: StatementItemPtr<'db>) -> Self {
11343        ptr.untyped()
11344    }
11345}
11346#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11347pub struct StatementItemGreen<'db>(pub GreenId<'db>);
11348impl<'db> TypedSyntaxNode<'db> for StatementItem<'db> {
11349    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11350    type StablePtr = StatementItemPtr<'db>;
11351    type Green = StatementItemGreen<'db>;
11352    fn missing(db: &'db dyn Database) -> Self::Green {
11353        StatementItemGreen(
11354            GreenNode {
11355                kind: SyntaxKind::StatementItem,
11356                details: GreenNodeDetails::Node {
11357                    children: [ModuleItem::missing(db).0].into(),
11358                    width: TextWidth::default(),
11359                },
11360            }
11361            .intern(db),
11362        )
11363    }
11364    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11365        let kind = node.kind(db);
11366        assert_eq!(
11367            kind,
11368            SyntaxKind::StatementItem,
11369            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11370            kind,
11371            SyntaxKind::StatementItem
11372        );
11373        Self { node }
11374    }
11375    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11376        let kind = node.kind(db);
11377        if kind == SyntaxKind::StatementItem {
11378            Some(Self::from_syntax_node(db, node))
11379        } else {
11380            None
11381        }
11382    }
11383    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11384        self.node
11385    }
11386    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11387        StatementItemPtr(self.node.stable_ptr(db))
11388    }
11389}
11390#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11391pub struct Param<'db> {
11392    node: SyntaxNode<'db>,
11393}
11394impl<'db> Param<'db> {
11395    pub const INDEX_MODIFIERS: usize = 0;
11396    pub const INDEX_NAME: usize = 1;
11397    pub const INDEX_TYPE_CLAUSE: usize = 2;
11398    pub fn new_green(
11399        db: &'db dyn Database,
11400        modifiers: ModifierListGreen<'db>,
11401        name: TerminalIdentifierGreen<'db>,
11402        type_clause: OptionTypeClauseGreen<'db>,
11403    ) -> ParamGreen<'db> {
11404        let children = [modifiers.0, name.0, type_clause.0];
11405        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11406        ParamGreen(
11407            GreenNode {
11408                kind: SyntaxKind::Param,
11409                details: GreenNodeDetails::Node { children: children.into(), width },
11410            }
11411            .intern(db),
11412        )
11413    }
11414}
11415impl<'db> Param<'db> {
11416    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
11417        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11418    }
11419    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
11420        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11421    }
11422    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
11423        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11424    }
11425}
11426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11427pub struct ParamPtr<'db>(pub SyntaxStablePtrId<'db>);
11428impl<'db> ParamPtr<'db> {
11429    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
11430        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
11431    }
11432}
11433impl<'db> TypedStablePtr<'db> for ParamPtr<'db> {
11434    type SyntaxNode = Param<'db>;
11435    fn untyped(self) -> SyntaxStablePtrId<'db> {
11436        self.0
11437    }
11438    fn lookup(&self, db: &'db dyn Database) -> Param<'db> {
11439        Param::from_syntax_node(db, self.0.lookup(db))
11440    }
11441}
11442impl<'db> From<ParamPtr<'db>> for SyntaxStablePtrId<'db> {
11443    fn from(ptr: ParamPtr<'db>) -> Self {
11444        ptr.untyped()
11445    }
11446}
11447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11448pub struct ParamGreen<'db>(pub GreenId<'db>);
11449impl<'db> TypedSyntaxNode<'db> for Param<'db> {
11450    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11451    type StablePtr = ParamPtr<'db>;
11452    type Green = ParamGreen<'db>;
11453    fn missing(db: &'db dyn Database) -> Self::Green {
11454        ParamGreen(
11455            GreenNode {
11456                kind: SyntaxKind::Param,
11457                details: GreenNodeDetails::Node {
11458                    children: [
11459                        ModifierList::missing(db).0,
11460                        TerminalIdentifier::missing(db).0,
11461                        OptionTypeClause::missing(db).0,
11462                    ]
11463                    .into(),
11464                    width: TextWidth::default(),
11465                },
11466            }
11467            .intern(db),
11468        )
11469    }
11470    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11471        let kind = node.kind(db);
11472        assert_eq!(
11473            kind,
11474            SyntaxKind::Param,
11475            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11476            kind,
11477            SyntaxKind::Param
11478        );
11479        Self { node }
11480    }
11481    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11482        let kind = node.kind(db);
11483        if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11484    }
11485    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11486        self.node
11487    }
11488    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11489        ParamPtr(self.node.stable_ptr(db))
11490    }
11491}
11492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11493pub struct ModifierList<'db>(ElementList<'db, Modifier<'db>, 1>);
11494impl<'db> Deref for ModifierList<'db> {
11495    type Target = ElementList<'db, Modifier<'db>, 1>;
11496    fn deref(&self) -> &Self::Target {
11497        &self.0
11498    }
11499}
11500impl<'db> ModifierList<'db> {
11501    pub fn new_green(
11502        db: &'db dyn Database,
11503        children: &[ModifierGreen<'db>],
11504    ) -> ModifierListGreen<'db> {
11505        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
11506        ModifierListGreen(
11507            GreenNode {
11508                kind: SyntaxKind::ModifierList,
11509                details: GreenNodeDetails::Node {
11510                    children: children.iter().map(|x| x.0).collect(),
11511                    width,
11512                },
11513            }
11514            .intern(db),
11515        )
11516    }
11517}
11518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11519pub struct ModifierListPtr<'db>(pub SyntaxStablePtrId<'db>);
11520impl<'db> TypedStablePtr<'db> for ModifierListPtr<'db> {
11521    type SyntaxNode = ModifierList<'db>;
11522    fn untyped(self) -> SyntaxStablePtrId<'db> {
11523        self.0
11524    }
11525    fn lookup(&self, db: &'db dyn Database) -> ModifierList<'db> {
11526        ModifierList::from_syntax_node(db, self.0.lookup(db))
11527    }
11528}
11529impl<'db> From<ModifierListPtr<'db>> for SyntaxStablePtrId<'db> {
11530    fn from(ptr: ModifierListPtr<'db>) -> Self {
11531        ptr.untyped()
11532    }
11533}
11534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11535pub struct ModifierListGreen<'db>(pub GreenId<'db>);
11536impl<'db> TypedSyntaxNode<'db> for ModifierList<'db> {
11537    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11538    type StablePtr = ModifierListPtr<'db>;
11539    type Green = ModifierListGreen<'db>;
11540    fn missing(db: &'db dyn Database) -> Self::Green {
11541        ModifierListGreen(
11542            GreenNode {
11543                kind: SyntaxKind::ModifierList,
11544                details: GreenNodeDetails::Node {
11545                    children: [].into(),
11546                    width: TextWidth::default(),
11547                },
11548            }
11549            .intern(db),
11550        )
11551    }
11552    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11553        Self(ElementList::new(node))
11554    }
11555    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11556        if node.kind(db) == SyntaxKind::ModifierList {
11557            Some(Self(ElementList::new(node)))
11558        } else {
11559            None
11560        }
11561    }
11562    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11563        self.node
11564    }
11565    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11566        ModifierListPtr(self.node.stable_ptr(db))
11567    }
11568}
11569#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11570pub enum Modifier<'db> {
11571    Ref(TerminalRef<'db>),
11572    Mut(TerminalMut<'db>),
11573}
11574#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11575pub struct ModifierPtr<'db>(pub SyntaxStablePtrId<'db>);
11576impl<'db> TypedStablePtr<'db> for ModifierPtr<'db> {
11577    type SyntaxNode = Modifier<'db>;
11578    fn untyped(self) -> SyntaxStablePtrId<'db> {
11579        self.0
11580    }
11581    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11582        Modifier::from_syntax_node(db, self.0.lookup(db))
11583    }
11584}
11585impl<'db> From<ModifierPtr<'db>> for SyntaxStablePtrId<'db> {
11586    fn from(ptr: ModifierPtr<'db>) -> Self {
11587        ptr.untyped()
11588    }
11589}
11590impl<'db> From<TerminalRefPtr<'db>> for ModifierPtr<'db> {
11591    fn from(value: TerminalRefPtr<'db>) -> Self {
11592        Self(value.0)
11593    }
11594}
11595impl<'db> From<TerminalMutPtr<'db>> for ModifierPtr<'db> {
11596    fn from(value: TerminalMutPtr<'db>) -> Self {
11597        Self(value.0)
11598    }
11599}
11600impl<'db> From<TerminalRefGreen<'db>> for ModifierGreen<'db> {
11601    fn from(value: TerminalRefGreen<'db>) -> Self {
11602        Self(value.0)
11603    }
11604}
11605impl<'db> From<TerminalMutGreen<'db>> for ModifierGreen<'db> {
11606    fn from(value: TerminalMutGreen<'db>) -> Self {
11607        Self(value.0)
11608    }
11609}
11610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11611pub struct ModifierGreen<'db>(pub GreenId<'db>);
11612impl<'db> TypedSyntaxNode<'db> for Modifier<'db> {
11613    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11614    type StablePtr = ModifierPtr<'db>;
11615    type Green = ModifierGreen<'db>;
11616    fn missing(db: &'db dyn Database) -> Self::Green {
11617        panic!("No missing variant.");
11618    }
11619    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11620        let kind = node.kind(db);
11621        match kind {
11622            SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11623            SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11624            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11625        }
11626    }
11627    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11628        let kind = node.kind(db);
11629        match kind {
11630            SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11631            SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11632            _ => None,
11633        }
11634    }
11635    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11636        match self {
11637            Modifier::Ref(x) => x.as_syntax_node(),
11638            Modifier::Mut(x) => x.as_syntax_node(),
11639        }
11640    }
11641    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11642        ModifierPtr(self.as_syntax_node().stable_ptr(db))
11643    }
11644}
11645impl<'db> Modifier<'db> {
11646    /// Checks if a kind of a variant of [Modifier].
11647    pub fn is_variant(kind: SyntaxKind) -> bool {
11648        matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11649    }
11650}
11651#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11652pub struct ParamList<'db>(ElementList<'db, Param<'db>, 2>);
11653impl<'db> Deref for ParamList<'db> {
11654    type Target = ElementList<'db, Param<'db>, 2>;
11655    fn deref(&self) -> &Self::Target {
11656        &self.0
11657    }
11658}
11659impl<'db> ParamList<'db> {
11660    pub fn new_green(
11661        db: &'db dyn Database,
11662        children: &[ParamListElementOrSeparatorGreen<'db>],
11663    ) -> ParamListGreen<'db> {
11664        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11665        ParamListGreen(
11666            GreenNode {
11667                kind: SyntaxKind::ParamList,
11668                details: GreenNodeDetails::Node {
11669                    children: children.iter().map(|x| x.id()).collect(),
11670                    width,
11671                },
11672            }
11673            .intern(db),
11674        )
11675    }
11676}
11677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11678pub struct ParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
11679impl<'db> TypedStablePtr<'db> for ParamListPtr<'db> {
11680    type SyntaxNode = ParamList<'db>;
11681    fn untyped(self) -> SyntaxStablePtrId<'db> {
11682        self.0
11683    }
11684    fn lookup(&self, db: &'db dyn Database) -> ParamList<'db> {
11685        ParamList::from_syntax_node(db, self.0.lookup(db))
11686    }
11687}
11688impl<'db> From<ParamListPtr<'db>> for SyntaxStablePtrId<'db> {
11689    fn from(ptr: ParamListPtr<'db>) -> Self {
11690        ptr.untyped()
11691    }
11692}
11693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11694pub enum ParamListElementOrSeparatorGreen<'db> {
11695    Separator(TerminalCommaGreen<'db>),
11696    Element(ParamGreen<'db>),
11697}
11698impl<'db> From<TerminalCommaGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11699    fn from(value: TerminalCommaGreen<'db>) -> Self {
11700        ParamListElementOrSeparatorGreen::Separator(value)
11701    }
11702}
11703impl<'db> From<ParamGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11704    fn from(value: ParamGreen<'db>) -> Self {
11705        ParamListElementOrSeparatorGreen::Element(value)
11706    }
11707}
11708impl<'db> ParamListElementOrSeparatorGreen<'db> {
11709    fn id(&self) -> GreenId<'db> {
11710        match self {
11711            ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11712            ParamListElementOrSeparatorGreen::Element(green) => green.0,
11713        }
11714    }
11715}
11716#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11717pub struct ParamListGreen<'db>(pub GreenId<'db>);
11718impl<'db> TypedSyntaxNode<'db> for ParamList<'db> {
11719    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11720    type StablePtr = ParamListPtr<'db>;
11721    type Green = ParamListGreen<'db>;
11722    fn missing(db: &'db dyn Database) -> Self::Green {
11723        ParamListGreen(
11724            GreenNode {
11725                kind: SyntaxKind::ParamList,
11726                details: GreenNodeDetails::Node {
11727                    children: [].into(),
11728                    width: TextWidth::default(),
11729                },
11730            }
11731            .intern(db),
11732        )
11733    }
11734    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11735        Self(ElementList::new(node))
11736    }
11737    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11738        if node.kind(db) == SyntaxKind::ParamList {
11739            Some(Self(ElementList::new(node)))
11740        } else {
11741            None
11742        }
11743    }
11744    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11745        self.node
11746    }
11747    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11748        ParamListPtr(self.node.stable_ptr(db))
11749    }
11750}
11751#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11752pub struct ImplicitsClause<'db> {
11753    node: SyntaxNode<'db>,
11754}
11755impl<'db> ImplicitsClause<'db> {
11756    pub const INDEX_IMPLICITS_KW: usize = 0;
11757    pub const INDEX_LPAREN: usize = 1;
11758    pub const INDEX_IMPLICITS: usize = 2;
11759    pub const INDEX_RPAREN: usize = 3;
11760    pub fn new_green(
11761        db: &'db dyn Database,
11762        implicits_kw: TerminalImplicitsGreen<'db>,
11763        lparen: TerminalLParenGreen<'db>,
11764        implicits: ImplicitsListGreen<'db>,
11765        rparen: TerminalRParenGreen<'db>,
11766    ) -> ImplicitsClauseGreen<'db> {
11767        let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11768        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11769        ImplicitsClauseGreen(
11770            GreenNode {
11771                kind: SyntaxKind::ImplicitsClause,
11772                details: GreenNodeDetails::Node { children: children.into(), width },
11773            }
11774            .intern(db),
11775        )
11776    }
11777}
11778impl<'db> ImplicitsClause<'db> {
11779    pub fn implicits_kw(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
11780        TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11781    }
11782    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
11783        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11784    }
11785    pub fn implicits(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11786        ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11787    }
11788    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
11789        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11790    }
11791}
11792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11793pub struct ImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11794impl<'db> ImplicitsClausePtr<'db> {}
11795impl<'db> TypedStablePtr<'db> for ImplicitsClausePtr<'db> {
11796    type SyntaxNode = ImplicitsClause<'db>;
11797    fn untyped(self) -> SyntaxStablePtrId<'db> {
11798        self.0
11799    }
11800    fn lookup(&self, db: &'db dyn Database) -> ImplicitsClause<'db> {
11801        ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11802    }
11803}
11804impl<'db> From<ImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11805    fn from(ptr: ImplicitsClausePtr<'db>) -> Self {
11806        ptr.untyped()
11807    }
11808}
11809#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11810pub struct ImplicitsClauseGreen<'db>(pub GreenId<'db>);
11811impl<'db> TypedSyntaxNode<'db> for ImplicitsClause<'db> {
11812    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11813    type StablePtr = ImplicitsClausePtr<'db>;
11814    type Green = ImplicitsClauseGreen<'db>;
11815    fn missing(db: &'db dyn Database) -> Self::Green {
11816        ImplicitsClauseGreen(
11817            GreenNode {
11818                kind: SyntaxKind::ImplicitsClause,
11819                details: GreenNodeDetails::Node {
11820                    children: [
11821                        TerminalImplicits::missing(db).0,
11822                        TerminalLParen::missing(db).0,
11823                        ImplicitsList::missing(db).0,
11824                        TerminalRParen::missing(db).0,
11825                    ]
11826                    .into(),
11827                    width: TextWidth::default(),
11828                },
11829            }
11830            .intern(db),
11831        )
11832    }
11833    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11834        let kind = node.kind(db);
11835        assert_eq!(
11836            kind,
11837            SyntaxKind::ImplicitsClause,
11838            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11839            kind,
11840            SyntaxKind::ImplicitsClause
11841        );
11842        Self { node }
11843    }
11844    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11845        let kind = node.kind(db);
11846        if kind == SyntaxKind::ImplicitsClause {
11847            Some(Self::from_syntax_node(db, node))
11848        } else {
11849            None
11850        }
11851    }
11852    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11853        self.node
11854    }
11855    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11856        ImplicitsClausePtr(self.node.stable_ptr(db))
11857    }
11858}
11859#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11860pub struct ImplicitsList<'db>(ElementList<'db, ExprPath<'db>, 2>);
11861impl<'db> Deref for ImplicitsList<'db> {
11862    type Target = ElementList<'db, ExprPath<'db>, 2>;
11863    fn deref(&self) -> &Self::Target {
11864        &self.0
11865    }
11866}
11867impl<'db> ImplicitsList<'db> {
11868    pub fn new_green(
11869        db: &'db dyn Database,
11870        children: &[ImplicitsListElementOrSeparatorGreen<'db>],
11871    ) -> ImplicitsListGreen<'db> {
11872        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11873        ImplicitsListGreen(
11874            GreenNode {
11875                kind: SyntaxKind::ImplicitsList,
11876                details: GreenNodeDetails::Node {
11877                    children: children.iter().map(|x| x.id()).collect(),
11878                    width,
11879                },
11880            }
11881            .intern(db),
11882        )
11883    }
11884}
11885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11886pub struct ImplicitsListPtr<'db>(pub SyntaxStablePtrId<'db>);
11887impl<'db> TypedStablePtr<'db> for ImplicitsListPtr<'db> {
11888    type SyntaxNode = ImplicitsList<'db>;
11889    fn untyped(self) -> SyntaxStablePtrId<'db> {
11890        self.0
11891    }
11892    fn lookup(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11893        ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11894    }
11895}
11896impl<'db> From<ImplicitsListPtr<'db>> for SyntaxStablePtrId<'db> {
11897    fn from(ptr: ImplicitsListPtr<'db>) -> Self {
11898        ptr.untyped()
11899    }
11900}
11901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11902pub enum ImplicitsListElementOrSeparatorGreen<'db> {
11903    Separator(TerminalCommaGreen<'db>),
11904    Element(ExprPathGreen<'db>),
11905}
11906impl<'db> From<TerminalCommaGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11907    fn from(value: TerminalCommaGreen<'db>) -> Self {
11908        ImplicitsListElementOrSeparatorGreen::Separator(value)
11909    }
11910}
11911impl<'db> From<ExprPathGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11912    fn from(value: ExprPathGreen<'db>) -> Self {
11913        ImplicitsListElementOrSeparatorGreen::Element(value)
11914    }
11915}
11916impl<'db> ImplicitsListElementOrSeparatorGreen<'db> {
11917    fn id(&self) -> GreenId<'db> {
11918        match self {
11919            ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11920            ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11921        }
11922    }
11923}
11924#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11925pub struct ImplicitsListGreen<'db>(pub GreenId<'db>);
11926impl<'db> TypedSyntaxNode<'db> for ImplicitsList<'db> {
11927    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11928    type StablePtr = ImplicitsListPtr<'db>;
11929    type Green = ImplicitsListGreen<'db>;
11930    fn missing(db: &'db dyn Database) -> Self::Green {
11931        ImplicitsListGreen(
11932            GreenNode {
11933                kind: SyntaxKind::ImplicitsList,
11934                details: GreenNodeDetails::Node {
11935                    children: [].into(),
11936                    width: TextWidth::default(),
11937                },
11938            }
11939            .intern(db),
11940        )
11941    }
11942    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11943        Self(ElementList::new(node))
11944    }
11945    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11946        if node.kind(db) == SyntaxKind::ImplicitsList {
11947            Some(Self(ElementList::new(node)))
11948        } else {
11949            None
11950        }
11951    }
11952    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11953        self.node
11954    }
11955    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11956        ImplicitsListPtr(self.node.stable_ptr(db))
11957    }
11958}
11959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11960pub enum OptionImplicitsClause<'db> {
11961    Empty(OptionImplicitsClauseEmpty<'db>),
11962    ImplicitsClause(ImplicitsClause<'db>),
11963}
11964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11965pub struct OptionImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11966impl<'db> TypedStablePtr<'db> for OptionImplicitsClausePtr<'db> {
11967    type SyntaxNode = OptionImplicitsClause<'db>;
11968    fn untyped(self) -> SyntaxStablePtrId<'db> {
11969        self.0
11970    }
11971    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11972        OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11973    }
11974}
11975impl<'db> From<OptionImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11976    fn from(ptr: OptionImplicitsClausePtr<'db>) -> Self {
11977        ptr.untyped()
11978    }
11979}
11980impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for OptionImplicitsClausePtr<'db> {
11981    fn from(value: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
11982        Self(value.0)
11983    }
11984}
11985impl<'db> From<ImplicitsClausePtr<'db>> for OptionImplicitsClausePtr<'db> {
11986    fn from(value: ImplicitsClausePtr<'db>) -> Self {
11987        Self(value.0)
11988    }
11989}
11990impl<'db> From<OptionImplicitsClauseEmptyGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11991    fn from(value: OptionImplicitsClauseEmptyGreen<'db>) -> Self {
11992        Self(value.0)
11993    }
11994}
11995impl<'db> From<ImplicitsClauseGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11996    fn from(value: ImplicitsClauseGreen<'db>) -> Self {
11997        Self(value.0)
11998    }
11999}
12000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12001pub struct OptionImplicitsClauseGreen<'db>(pub GreenId<'db>);
12002impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClause<'db> {
12003    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12004    type StablePtr = OptionImplicitsClausePtr<'db>;
12005    type Green = OptionImplicitsClauseGreen<'db>;
12006    fn missing(db: &'db dyn Database) -> Self::Green {
12007        panic!("No missing variant.");
12008    }
12009    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12010        let kind = node.kind(db);
12011        match kind {
12012            SyntaxKind::OptionImplicitsClauseEmpty => {
12013                OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
12014            }
12015            SyntaxKind::ImplicitsClause => {
12016                OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
12017            }
12018            _ => panic!(
12019                "Unexpected syntax kind {:?} when constructing {}.",
12020                kind, "OptionImplicitsClause"
12021            ),
12022        }
12023    }
12024    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12025        let kind = node.kind(db);
12026        match kind {
12027            SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
12028                OptionImplicitsClauseEmpty::from_syntax_node(db, node),
12029            )),
12030            SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
12031                ImplicitsClause::from_syntax_node(db, node),
12032            )),
12033            _ => None,
12034        }
12035    }
12036    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12037        match self {
12038            OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
12039            OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
12040        }
12041    }
12042    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12043        OptionImplicitsClausePtr(self.as_syntax_node().stable_ptr(db))
12044    }
12045}
12046impl<'db> OptionImplicitsClause<'db> {
12047    /// Checks if a kind of a variant of [OptionImplicitsClause].
12048    pub fn is_variant(kind: SyntaxKind) -> bool {
12049        matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
12050    }
12051}
12052#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12053pub struct OptionImplicitsClauseEmpty<'db> {
12054    node: SyntaxNode<'db>,
12055}
12056impl<'db> OptionImplicitsClauseEmpty<'db> {
12057    pub fn new_green(db: &'db dyn Database) -> OptionImplicitsClauseEmptyGreen<'db> {
12058        let children = [];
12059        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12060        OptionImplicitsClauseEmptyGreen(
12061            GreenNode {
12062                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12063                details: GreenNodeDetails::Node { children: children.into(), width },
12064            }
12065            .intern(db),
12066        )
12067    }
12068}
12069impl<'db> OptionImplicitsClauseEmpty<'db> {}
12070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12071pub struct OptionImplicitsClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12072impl<'db> OptionImplicitsClauseEmptyPtr<'db> {}
12073impl<'db> TypedStablePtr<'db> for OptionImplicitsClauseEmptyPtr<'db> {
12074    type SyntaxNode = OptionImplicitsClauseEmpty<'db>;
12075    fn untyped(self) -> SyntaxStablePtrId<'db> {
12076        self.0
12077    }
12078    fn lookup(&self, db: &'db dyn Database) -> OptionImplicitsClauseEmpty<'db> {
12079        OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12080    }
12081}
12082impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12083    fn from(ptr: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
12084        ptr.untyped()
12085    }
12086}
12087#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12088pub struct OptionImplicitsClauseEmptyGreen<'db>(pub GreenId<'db>);
12089impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClauseEmpty<'db> {
12090    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12091    type StablePtr = OptionImplicitsClauseEmptyPtr<'db>;
12092    type Green = OptionImplicitsClauseEmptyGreen<'db>;
12093    fn missing(db: &'db dyn Database) -> Self::Green {
12094        OptionImplicitsClauseEmptyGreen(
12095            GreenNode {
12096                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12097                details: GreenNodeDetails::Node {
12098                    children: [].into(),
12099                    width: TextWidth::default(),
12100                },
12101            }
12102            .intern(db),
12103        )
12104    }
12105    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12106        let kind = node.kind(db);
12107        assert_eq!(
12108            kind,
12109            SyntaxKind::OptionImplicitsClauseEmpty,
12110            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12111            kind,
12112            SyntaxKind::OptionImplicitsClauseEmpty
12113        );
12114        Self { node }
12115    }
12116    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12117        let kind = node.kind(db);
12118        if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12119            Some(Self::from_syntax_node(db, node))
12120        } else {
12121            None
12122        }
12123    }
12124    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12125        self.node
12126    }
12127    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12128        OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12129    }
12130}
12131#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12132pub enum OptionTerminalNoPanic<'db> {
12133    Empty(OptionTerminalNoPanicEmpty<'db>),
12134    TerminalNoPanic(TerminalNoPanic<'db>),
12135}
12136#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12137pub struct OptionTerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
12138impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicPtr<'db> {
12139    type SyntaxNode = OptionTerminalNoPanic<'db>;
12140    fn untyped(self) -> SyntaxStablePtrId<'db> {
12141        self.0
12142    }
12143    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12144        OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12145    }
12146}
12147impl<'db> From<OptionTerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
12148    fn from(ptr: OptionTerminalNoPanicPtr<'db>) -> Self {
12149        ptr.untyped()
12150    }
12151}
12152impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12153    fn from(value: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12154        Self(value.0)
12155    }
12156}
12157impl<'db> From<TerminalNoPanicPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12158    fn from(value: TerminalNoPanicPtr<'db>) -> Self {
12159        Self(value.0)
12160    }
12161}
12162impl<'db> From<OptionTerminalNoPanicEmptyGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12163    fn from(value: OptionTerminalNoPanicEmptyGreen<'db>) -> Self {
12164        Self(value.0)
12165    }
12166}
12167impl<'db> From<TerminalNoPanicGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12168    fn from(value: TerminalNoPanicGreen<'db>) -> Self {
12169        Self(value.0)
12170    }
12171}
12172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12173pub struct OptionTerminalNoPanicGreen<'db>(pub GreenId<'db>);
12174impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanic<'db> {
12175    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12176    type StablePtr = OptionTerminalNoPanicPtr<'db>;
12177    type Green = OptionTerminalNoPanicGreen<'db>;
12178    fn missing(db: &'db dyn Database) -> Self::Green {
12179        panic!("No missing variant.");
12180    }
12181    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12182        let kind = node.kind(db);
12183        match kind {
12184            SyntaxKind::OptionTerminalNoPanicEmpty => {
12185                OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12186            }
12187            SyntaxKind::TerminalNoPanic => {
12188                OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12189            }
12190            _ => panic!(
12191                "Unexpected syntax kind {:?} when constructing {}.",
12192                kind, "OptionTerminalNoPanic"
12193            ),
12194        }
12195    }
12196    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12197        let kind = node.kind(db);
12198        match kind {
12199            SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12200                OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12201            )),
12202            SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12203                TerminalNoPanic::from_syntax_node(db, node),
12204            )),
12205            _ => None,
12206        }
12207    }
12208    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12209        match self {
12210            OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12211            OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12212        }
12213    }
12214    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12215        OptionTerminalNoPanicPtr(self.as_syntax_node().stable_ptr(db))
12216    }
12217}
12218impl<'db> OptionTerminalNoPanic<'db> {
12219    /// Checks if a kind of a variant of [OptionTerminalNoPanic].
12220    pub fn is_variant(kind: SyntaxKind) -> bool {
12221        matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12222    }
12223}
12224#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12225pub struct OptionTerminalNoPanicEmpty<'db> {
12226    node: SyntaxNode<'db>,
12227}
12228impl<'db> OptionTerminalNoPanicEmpty<'db> {
12229    pub fn new_green(db: &'db dyn Database) -> OptionTerminalNoPanicEmptyGreen<'db> {
12230        let children = [];
12231        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12232        OptionTerminalNoPanicEmptyGreen(
12233            GreenNode {
12234                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12235                details: GreenNodeDetails::Node { children: children.into(), width },
12236            }
12237            .intern(db),
12238        )
12239    }
12240}
12241impl<'db> OptionTerminalNoPanicEmpty<'db> {}
12242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12243pub struct OptionTerminalNoPanicEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12244impl<'db> OptionTerminalNoPanicEmptyPtr<'db> {}
12245impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicEmptyPtr<'db> {
12246    type SyntaxNode = OptionTerminalNoPanicEmpty<'db>;
12247    fn untyped(self) -> SyntaxStablePtrId<'db> {
12248        self.0
12249    }
12250    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalNoPanicEmpty<'db> {
12251        OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12252    }
12253}
12254impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12255    fn from(ptr: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12256        ptr.untyped()
12257    }
12258}
12259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12260pub struct OptionTerminalNoPanicEmptyGreen<'db>(pub GreenId<'db>);
12261impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanicEmpty<'db> {
12262    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12263    type StablePtr = OptionTerminalNoPanicEmptyPtr<'db>;
12264    type Green = OptionTerminalNoPanicEmptyGreen<'db>;
12265    fn missing(db: &'db dyn Database) -> Self::Green {
12266        OptionTerminalNoPanicEmptyGreen(
12267            GreenNode {
12268                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12269                details: GreenNodeDetails::Node {
12270                    children: [].into(),
12271                    width: TextWidth::default(),
12272                },
12273            }
12274            .intern(db),
12275        )
12276    }
12277    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12278        let kind = node.kind(db);
12279        assert_eq!(
12280            kind,
12281            SyntaxKind::OptionTerminalNoPanicEmpty,
12282            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12283            kind,
12284            SyntaxKind::OptionTerminalNoPanicEmpty
12285        );
12286        Self { node }
12287    }
12288    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12289        let kind = node.kind(db);
12290        if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12291            Some(Self::from_syntax_node(db, node))
12292        } else {
12293            None
12294        }
12295    }
12296    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12297        self.node
12298    }
12299    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12300        OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12301    }
12302}
12303#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12304pub enum OptionTerminalConst<'db> {
12305    Empty(OptionTerminalConstEmpty<'db>),
12306    TerminalConst(TerminalConst<'db>),
12307}
12308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12309pub struct OptionTerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
12310impl<'db> TypedStablePtr<'db> for OptionTerminalConstPtr<'db> {
12311    type SyntaxNode = OptionTerminalConst<'db>;
12312    fn untyped(self) -> SyntaxStablePtrId<'db> {
12313        self.0
12314    }
12315    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12316        OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12317    }
12318}
12319impl<'db> From<OptionTerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
12320    fn from(ptr: OptionTerminalConstPtr<'db>) -> Self {
12321        ptr.untyped()
12322    }
12323}
12324impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for OptionTerminalConstPtr<'db> {
12325    fn from(value: OptionTerminalConstEmptyPtr<'db>) -> Self {
12326        Self(value.0)
12327    }
12328}
12329impl<'db> From<TerminalConstPtr<'db>> for OptionTerminalConstPtr<'db> {
12330    fn from(value: TerminalConstPtr<'db>) -> Self {
12331        Self(value.0)
12332    }
12333}
12334impl<'db> From<OptionTerminalConstEmptyGreen<'db>> for OptionTerminalConstGreen<'db> {
12335    fn from(value: OptionTerminalConstEmptyGreen<'db>) -> Self {
12336        Self(value.0)
12337    }
12338}
12339impl<'db> From<TerminalConstGreen<'db>> for OptionTerminalConstGreen<'db> {
12340    fn from(value: TerminalConstGreen<'db>) -> Self {
12341        Self(value.0)
12342    }
12343}
12344#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12345pub struct OptionTerminalConstGreen<'db>(pub GreenId<'db>);
12346impl<'db> TypedSyntaxNode<'db> for OptionTerminalConst<'db> {
12347    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12348    type StablePtr = OptionTerminalConstPtr<'db>;
12349    type Green = OptionTerminalConstGreen<'db>;
12350    fn missing(db: &'db dyn Database) -> Self::Green {
12351        panic!("No missing variant.");
12352    }
12353    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12354        let kind = node.kind(db);
12355        match kind {
12356            SyntaxKind::OptionTerminalConstEmpty => {
12357                OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12358            }
12359            SyntaxKind::TerminalConst => {
12360                OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12361            }
12362            _ => panic!(
12363                "Unexpected syntax kind {:?} when constructing {}.",
12364                kind, "OptionTerminalConst"
12365            ),
12366        }
12367    }
12368    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12369        let kind = node.kind(db);
12370        match kind {
12371            SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12372                OptionTerminalConstEmpty::from_syntax_node(db, node),
12373            )),
12374            SyntaxKind::TerminalConst => {
12375                Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12376            }
12377            _ => None,
12378        }
12379    }
12380    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12381        match self {
12382            OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12383            OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12384        }
12385    }
12386    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12387        OptionTerminalConstPtr(self.as_syntax_node().stable_ptr(db))
12388    }
12389}
12390impl<'db> OptionTerminalConst<'db> {
12391    /// Checks if a kind of a variant of [OptionTerminalConst].
12392    pub fn is_variant(kind: SyntaxKind) -> bool {
12393        matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12394    }
12395}
12396#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12397pub struct OptionTerminalConstEmpty<'db> {
12398    node: SyntaxNode<'db>,
12399}
12400impl<'db> OptionTerminalConstEmpty<'db> {
12401    pub fn new_green(db: &'db dyn Database) -> OptionTerminalConstEmptyGreen<'db> {
12402        let children = [];
12403        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12404        OptionTerminalConstEmptyGreen(
12405            GreenNode {
12406                kind: SyntaxKind::OptionTerminalConstEmpty,
12407                details: GreenNodeDetails::Node { children: children.into(), width },
12408            }
12409            .intern(db),
12410        )
12411    }
12412}
12413impl<'db> OptionTerminalConstEmpty<'db> {}
12414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12415pub struct OptionTerminalConstEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12416impl<'db> OptionTerminalConstEmptyPtr<'db> {}
12417impl<'db> TypedStablePtr<'db> for OptionTerminalConstEmptyPtr<'db> {
12418    type SyntaxNode = OptionTerminalConstEmpty<'db>;
12419    fn untyped(self) -> SyntaxStablePtrId<'db> {
12420        self.0
12421    }
12422    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalConstEmpty<'db> {
12423        OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12424    }
12425}
12426impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12427    fn from(ptr: OptionTerminalConstEmptyPtr<'db>) -> Self {
12428        ptr.untyped()
12429    }
12430}
12431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12432pub struct OptionTerminalConstEmptyGreen<'db>(pub GreenId<'db>);
12433impl<'db> TypedSyntaxNode<'db> for OptionTerminalConstEmpty<'db> {
12434    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12435    type StablePtr = OptionTerminalConstEmptyPtr<'db>;
12436    type Green = OptionTerminalConstEmptyGreen<'db>;
12437    fn missing(db: &'db dyn Database) -> Self::Green {
12438        OptionTerminalConstEmptyGreen(
12439            GreenNode {
12440                kind: SyntaxKind::OptionTerminalConstEmpty,
12441                details: GreenNodeDetails::Node {
12442                    children: [].into(),
12443                    width: TextWidth::default(),
12444                },
12445            }
12446            .intern(db),
12447        )
12448    }
12449    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12450        let kind = node.kind(db);
12451        assert_eq!(
12452            kind,
12453            SyntaxKind::OptionTerminalConstEmpty,
12454            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12455            kind,
12456            SyntaxKind::OptionTerminalConstEmpty
12457        );
12458        Self { node }
12459    }
12460    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12461        let kind = node.kind(db);
12462        if kind == SyntaxKind::OptionTerminalConstEmpty {
12463            Some(Self::from_syntax_node(db, node))
12464        } else {
12465            None
12466        }
12467    }
12468    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12469        self.node
12470    }
12471    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12472        OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12473    }
12474}
12475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12476pub struct FunctionSignature<'db> {
12477    node: SyntaxNode<'db>,
12478}
12479impl<'db> FunctionSignature<'db> {
12480    pub const INDEX_LPAREN: usize = 0;
12481    pub const INDEX_PARAMETERS: usize = 1;
12482    pub const INDEX_RPAREN: usize = 2;
12483    pub const INDEX_RET_TY: usize = 3;
12484    pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12485    pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12486    pub fn new_green(
12487        db: &'db dyn Database,
12488        lparen: TerminalLParenGreen<'db>,
12489        parameters: ParamListGreen<'db>,
12490        rparen: TerminalRParenGreen<'db>,
12491        ret_ty: OptionReturnTypeClauseGreen<'db>,
12492        implicits_clause: OptionImplicitsClauseGreen<'db>,
12493        optional_no_panic: OptionTerminalNoPanicGreen<'db>,
12494    ) -> FunctionSignatureGreen<'db> {
12495        let children =
12496            [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12497        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12498        FunctionSignatureGreen(
12499            GreenNode {
12500                kind: SyntaxKind::FunctionSignature,
12501                details: GreenNodeDetails::Node { children: children.into(), width },
12502            }
12503            .intern(db),
12504        )
12505    }
12506}
12507impl<'db> FunctionSignature<'db> {
12508    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
12509        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12510    }
12511    pub fn parameters(&self, db: &'db dyn Database) -> ParamList<'db> {
12512        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12513    }
12514    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
12515        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12516    }
12517    pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
12518        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12519    }
12520    pub fn implicits_clause(&self, db: &'db dyn Database) -> OptionImplicitsClause<'db> {
12521        OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12522    }
12523    pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
12524        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12525    }
12526}
12527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12528pub struct FunctionSignaturePtr<'db>(pub SyntaxStablePtrId<'db>);
12529impl<'db> FunctionSignaturePtr<'db> {}
12530impl<'db> TypedStablePtr<'db> for FunctionSignaturePtr<'db> {
12531    type SyntaxNode = FunctionSignature<'db>;
12532    fn untyped(self) -> SyntaxStablePtrId<'db> {
12533        self.0
12534    }
12535    fn lookup(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
12536        FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12537    }
12538}
12539impl<'db> From<FunctionSignaturePtr<'db>> for SyntaxStablePtrId<'db> {
12540    fn from(ptr: FunctionSignaturePtr<'db>) -> Self {
12541        ptr.untyped()
12542    }
12543}
12544#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12545pub struct FunctionSignatureGreen<'db>(pub GreenId<'db>);
12546impl<'db> TypedSyntaxNode<'db> for FunctionSignature<'db> {
12547    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12548    type StablePtr = FunctionSignaturePtr<'db>;
12549    type Green = FunctionSignatureGreen<'db>;
12550    fn missing(db: &'db dyn Database) -> Self::Green {
12551        FunctionSignatureGreen(
12552            GreenNode {
12553                kind: SyntaxKind::FunctionSignature,
12554                details: GreenNodeDetails::Node {
12555                    children: [
12556                        TerminalLParen::missing(db).0,
12557                        ParamList::missing(db).0,
12558                        TerminalRParen::missing(db).0,
12559                        OptionReturnTypeClause::missing(db).0,
12560                        OptionImplicitsClause::missing(db).0,
12561                        OptionTerminalNoPanic::missing(db).0,
12562                    ]
12563                    .into(),
12564                    width: TextWidth::default(),
12565                },
12566            }
12567            .intern(db),
12568        )
12569    }
12570    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12571        let kind = node.kind(db);
12572        assert_eq!(
12573            kind,
12574            SyntaxKind::FunctionSignature,
12575            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12576            kind,
12577            SyntaxKind::FunctionSignature
12578        );
12579        Self { node }
12580    }
12581    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12582        let kind = node.kind(db);
12583        if kind == SyntaxKind::FunctionSignature {
12584            Some(Self::from_syntax_node(db, node))
12585        } else {
12586            None
12587        }
12588    }
12589    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12590        self.node
12591    }
12592    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12593        FunctionSignaturePtr(self.node.stable_ptr(db))
12594    }
12595}
12596#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12597pub struct Member<'db> {
12598    node: SyntaxNode<'db>,
12599}
12600impl<'db> Member<'db> {
12601    pub const INDEX_ATTRIBUTES: usize = 0;
12602    pub const INDEX_VISIBILITY: usize = 1;
12603    pub const INDEX_NAME: usize = 2;
12604    pub const INDEX_TYPE_CLAUSE: usize = 3;
12605    pub fn new_green(
12606        db: &'db dyn Database,
12607        attributes: AttributeListGreen<'db>,
12608        visibility: VisibilityGreen<'db>,
12609        name: TerminalIdentifierGreen<'db>,
12610        type_clause: TypeClauseGreen<'db>,
12611    ) -> MemberGreen<'db> {
12612        let children = [attributes.0, visibility.0, name.0, type_clause.0];
12613        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12614        MemberGreen(
12615            GreenNode {
12616                kind: SyntaxKind::Member,
12617                details: GreenNodeDetails::Node { children: children.into(), width },
12618            }
12619            .intern(db),
12620        )
12621    }
12622}
12623impl<'db> Member<'db> {
12624    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12625        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12626    }
12627    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
12628        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12629    }
12630    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12631        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12632    }
12633    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
12634        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12635    }
12636}
12637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12638pub struct MemberPtr<'db>(pub SyntaxStablePtrId<'db>);
12639impl<'db> MemberPtr<'db> {
12640    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12641        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12642    }
12643}
12644impl<'db> TypedStablePtr<'db> for MemberPtr<'db> {
12645    type SyntaxNode = Member<'db>;
12646    fn untyped(self) -> SyntaxStablePtrId<'db> {
12647        self.0
12648    }
12649    fn lookup(&self, db: &'db dyn Database) -> Member<'db> {
12650        Member::from_syntax_node(db, self.0.lookup(db))
12651    }
12652}
12653impl<'db> From<MemberPtr<'db>> for SyntaxStablePtrId<'db> {
12654    fn from(ptr: MemberPtr<'db>) -> Self {
12655        ptr.untyped()
12656    }
12657}
12658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12659pub struct MemberGreen<'db>(pub GreenId<'db>);
12660impl<'db> TypedSyntaxNode<'db> for Member<'db> {
12661    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12662    type StablePtr = MemberPtr<'db>;
12663    type Green = MemberGreen<'db>;
12664    fn missing(db: &'db dyn Database) -> Self::Green {
12665        MemberGreen(
12666            GreenNode {
12667                kind: SyntaxKind::Member,
12668                details: GreenNodeDetails::Node {
12669                    children: [
12670                        AttributeList::missing(db).0,
12671                        Visibility::missing(db).0,
12672                        TerminalIdentifier::missing(db).0,
12673                        TypeClause::missing(db).0,
12674                    ]
12675                    .into(),
12676                    width: TextWidth::default(),
12677                },
12678            }
12679            .intern(db),
12680        )
12681    }
12682    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12683        let kind = node.kind(db);
12684        assert_eq!(
12685            kind,
12686            SyntaxKind::Member,
12687            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12688            kind,
12689            SyntaxKind::Member
12690        );
12691        Self { node }
12692    }
12693    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12694        let kind = node.kind(db);
12695        if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12696    }
12697    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12698        self.node
12699    }
12700    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12701        MemberPtr(self.node.stable_ptr(db))
12702    }
12703}
12704#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12705pub struct MemberList<'db>(ElementList<'db, Member<'db>, 2>);
12706impl<'db> Deref for MemberList<'db> {
12707    type Target = ElementList<'db, Member<'db>, 2>;
12708    fn deref(&self) -> &Self::Target {
12709        &self.0
12710    }
12711}
12712impl<'db> MemberList<'db> {
12713    pub fn new_green(
12714        db: &'db dyn Database,
12715        children: &[MemberListElementOrSeparatorGreen<'db>],
12716    ) -> MemberListGreen<'db> {
12717        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12718        MemberListGreen(
12719            GreenNode {
12720                kind: SyntaxKind::MemberList,
12721                details: GreenNodeDetails::Node {
12722                    children: children.iter().map(|x| x.id()).collect(),
12723                    width,
12724                },
12725            }
12726            .intern(db),
12727        )
12728    }
12729}
12730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12731pub struct MemberListPtr<'db>(pub SyntaxStablePtrId<'db>);
12732impl<'db> TypedStablePtr<'db> for MemberListPtr<'db> {
12733    type SyntaxNode = MemberList<'db>;
12734    fn untyped(self) -> SyntaxStablePtrId<'db> {
12735        self.0
12736    }
12737    fn lookup(&self, db: &'db dyn Database) -> MemberList<'db> {
12738        MemberList::from_syntax_node(db, self.0.lookup(db))
12739    }
12740}
12741impl<'db> From<MemberListPtr<'db>> for SyntaxStablePtrId<'db> {
12742    fn from(ptr: MemberListPtr<'db>) -> Self {
12743        ptr.untyped()
12744    }
12745}
12746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12747pub enum MemberListElementOrSeparatorGreen<'db> {
12748    Separator(TerminalCommaGreen<'db>),
12749    Element(MemberGreen<'db>),
12750}
12751impl<'db> From<TerminalCommaGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12752    fn from(value: TerminalCommaGreen<'db>) -> Self {
12753        MemberListElementOrSeparatorGreen::Separator(value)
12754    }
12755}
12756impl<'db> From<MemberGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12757    fn from(value: MemberGreen<'db>) -> Self {
12758        MemberListElementOrSeparatorGreen::Element(value)
12759    }
12760}
12761impl<'db> MemberListElementOrSeparatorGreen<'db> {
12762    fn id(&self) -> GreenId<'db> {
12763        match self {
12764            MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12765            MemberListElementOrSeparatorGreen::Element(green) => green.0,
12766        }
12767    }
12768}
12769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12770pub struct MemberListGreen<'db>(pub GreenId<'db>);
12771impl<'db> TypedSyntaxNode<'db> for MemberList<'db> {
12772    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12773    type StablePtr = MemberListPtr<'db>;
12774    type Green = MemberListGreen<'db>;
12775    fn missing(db: &'db dyn Database) -> Self::Green {
12776        MemberListGreen(
12777            GreenNode {
12778                kind: SyntaxKind::MemberList,
12779                details: GreenNodeDetails::Node {
12780                    children: [].into(),
12781                    width: TextWidth::default(),
12782                },
12783            }
12784            .intern(db),
12785        )
12786    }
12787    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12788        Self(ElementList::new(node))
12789    }
12790    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12791        if node.kind(db) == SyntaxKind::MemberList {
12792            Some(Self(ElementList::new(node)))
12793        } else {
12794            None
12795        }
12796    }
12797    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12798        self.node
12799    }
12800    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12801        MemberListPtr(self.node.stable_ptr(db))
12802    }
12803}
12804#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12805pub struct Variant<'db> {
12806    node: SyntaxNode<'db>,
12807}
12808impl<'db> Variant<'db> {
12809    pub const INDEX_ATTRIBUTES: usize = 0;
12810    pub const INDEX_NAME: usize = 1;
12811    pub const INDEX_TYPE_CLAUSE: usize = 2;
12812    pub fn new_green(
12813        db: &'db dyn Database,
12814        attributes: AttributeListGreen<'db>,
12815        name: TerminalIdentifierGreen<'db>,
12816        type_clause: OptionTypeClauseGreen<'db>,
12817    ) -> VariantGreen<'db> {
12818        let children = [attributes.0, name.0, type_clause.0];
12819        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12820        VariantGreen(
12821            GreenNode {
12822                kind: SyntaxKind::Variant,
12823                details: GreenNodeDetails::Node { children: children.into(), width },
12824            }
12825            .intern(db),
12826        )
12827    }
12828}
12829impl<'db> Variant<'db> {
12830    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12831        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12832    }
12833    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12834        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12835    }
12836    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
12837        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12838    }
12839}
12840#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12841pub struct VariantPtr<'db>(pub SyntaxStablePtrId<'db>);
12842impl<'db> VariantPtr<'db> {
12843    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12844        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12845    }
12846}
12847impl<'db> TypedStablePtr<'db> for VariantPtr<'db> {
12848    type SyntaxNode = Variant<'db>;
12849    fn untyped(self) -> SyntaxStablePtrId<'db> {
12850        self.0
12851    }
12852    fn lookup(&self, db: &'db dyn Database) -> Variant<'db> {
12853        Variant::from_syntax_node(db, self.0.lookup(db))
12854    }
12855}
12856impl<'db> From<VariantPtr<'db>> for SyntaxStablePtrId<'db> {
12857    fn from(ptr: VariantPtr<'db>) -> Self {
12858        ptr.untyped()
12859    }
12860}
12861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12862pub struct VariantGreen<'db>(pub GreenId<'db>);
12863impl<'db> TypedSyntaxNode<'db> for Variant<'db> {
12864    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12865    type StablePtr = VariantPtr<'db>;
12866    type Green = VariantGreen<'db>;
12867    fn missing(db: &'db dyn Database) -> Self::Green {
12868        VariantGreen(
12869            GreenNode {
12870                kind: SyntaxKind::Variant,
12871                details: GreenNodeDetails::Node {
12872                    children: [
12873                        AttributeList::missing(db).0,
12874                        TerminalIdentifier::missing(db).0,
12875                        OptionTypeClause::missing(db).0,
12876                    ]
12877                    .into(),
12878                    width: TextWidth::default(),
12879                },
12880            }
12881            .intern(db),
12882        )
12883    }
12884    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12885        let kind = node.kind(db);
12886        assert_eq!(
12887            kind,
12888            SyntaxKind::Variant,
12889            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12890            kind,
12891            SyntaxKind::Variant
12892        );
12893        Self { node }
12894    }
12895    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12896        let kind = node.kind(db);
12897        if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12898    }
12899    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12900        self.node
12901    }
12902    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12903        VariantPtr(self.node.stable_ptr(db))
12904    }
12905}
12906#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12907pub struct VariantList<'db>(ElementList<'db, Variant<'db>, 2>);
12908impl<'db> Deref for VariantList<'db> {
12909    type Target = ElementList<'db, Variant<'db>, 2>;
12910    fn deref(&self) -> &Self::Target {
12911        &self.0
12912    }
12913}
12914impl<'db> VariantList<'db> {
12915    pub fn new_green(
12916        db: &'db dyn Database,
12917        children: &[VariantListElementOrSeparatorGreen<'db>],
12918    ) -> VariantListGreen<'db> {
12919        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12920        VariantListGreen(
12921            GreenNode {
12922                kind: SyntaxKind::VariantList,
12923                details: GreenNodeDetails::Node {
12924                    children: children.iter().map(|x| x.id()).collect(),
12925                    width,
12926                },
12927            }
12928            .intern(db),
12929        )
12930    }
12931}
12932#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12933pub struct VariantListPtr<'db>(pub SyntaxStablePtrId<'db>);
12934impl<'db> TypedStablePtr<'db> for VariantListPtr<'db> {
12935    type SyntaxNode = VariantList<'db>;
12936    fn untyped(self) -> SyntaxStablePtrId<'db> {
12937        self.0
12938    }
12939    fn lookup(&self, db: &'db dyn Database) -> VariantList<'db> {
12940        VariantList::from_syntax_node(db, self.0.lookup(db))
12941    }
12942}
12943impl<'db> From<VariantListPtr<'db>> for SyntaxStablePtrId<'db> {
12944    fn from(ptr: VariantListPtr<'db>) -> Self {
12945        ptr.untyped()
12946    }
12947}
12948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12949pub enum VariantListElementOrSeparatorGreen<'db> {
12950    Separator(TerminalCommaGreen<'db>),
12951    Element(VariantGreen<'db>),
12952}
12953impl<'db> From<TerminalCommaGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12954    fn from(value: TerminalCommaGreen<'db>) -> Self {
12955        VariantListElementOrSeparatorGreen::Separator(value)
12956    }
12957}
12958impl<'db> From<VariantGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12959    fn from(value: VariantGreen<'db>) -> Self {
12960        VariantListElementOrSeparatorGreen::Element(value)
12961    }
12962}
12963impl<'db> VariantListElementOrSeparatorGreen<'db> {
12964    fn id(&self) -> GreenId<'db> {
12965        match self {
12966            VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12967            VariantListElementOrSeparatorGreen::Element(green) => green.0,
12968        }
12969    }
12970}
12971#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12972pub struct VariantListGreen<'db>(pub GreenId<'db>);
12973impl<'db> TypedSyntaxNode<'db> for VariantList<'db> {
12974    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12975    type StablePtr = VariantListPtr<'db>;
12976    type Green = VariantListGreen<'db>;
12977    fn missing(db: &'db dyn Database) -> Self::Green {
12978        VariantListGreen(
12979            GreenNode {
12980                kind: SyntaxKind::VariantList,
12981                details: GreenNodeDetails::Node {
12982                    children: [].into(),
12983                    width: TextWidth::default(),
12984                },
12985            }
12986            .intern(db),
12987        )
12988    }
12989    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12990        Self(ElementList::new(node))
12991    }
12992    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12993        if node.kind(db) == SyntaxKind::VariantList {
12994            Some(Self(ElementList::new(node)))
12995        } else {
12996            None
12997        }
12998    }
12999    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13000        self.node
13001    }
13002    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13003        VariantListPtr(self.node.stable_ptr(db))
13004    }
13005}
13006#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13007pub enum ModuleItem<'db> {
13008    Constant(ItemConstant<'db>),
13009    Module(ItemModule<'db>),
13010    Use(ItemUse<'db>),
13011    FreeFunction(FunctionWithBody<'db>),
13012    ExternFunction(ItemExternFunction<'db>),
13013    ExternType(ItemExternType<'db>),
13014    Trait(ItemTrait<'db>),
13015    Impl(ItemImpl<'db>),
13016    ImplAlias(ItemImplAlias<'db>),
13017    Struct(ItemStruct<'db>),
13018    Enum(ItemEnum<'db>),
13019    TypeAlias(ItemTypeAlias<'db>),
13020    InlineMacro(ItemInlineMacro<'db>),
13021    MacroDeclaration(ItemMacroDeclaration<'db>),
13022    HeaderDoc(ItemHeaderDoc<'db>),
13023    Missing(ModuleItemMissing<'db>),
13024}
13025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13026pub struct ModuleItemPtr<'db>(pub SyntaxStablePtrId<'db>);
13027impl<'db> TypedStablePtr<'db> for ModuleItemPtr<'db> {
13028    type SyntaxNode = ModuleItem<'db>;
13029    fn untyped(self) -> SyntaxStablePtrId<'db> {
13030        self.0
13031    }
13032    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13033        ModuleItem::from_syntax_node(db, self.0.lookup(db))
13034    }
13035}
13036impl<'db> From<ModuleItemPtr<'db>> for SyntaxStablePtrId<'db> {
13037    fn from(ptr: ModuleItemPtr<'db>) -> Self {
13038        ptr.untyped()
13039    }
13040}
13041impl<'db> From<ItemConstantPtr<'db>> for ModuleItemPtr<'db> {
13042    fn from(value: ItemConstantPtr<'db>) -> Self {
13043        Self(value.0)
13044    }
13045}
13046impl<'db> From<ItemModulePtr<'db>> for ModuleItemPtr<'db> {
13047    fn from(value: ItemModulePtr<'db>) -> Self {
13048        Self(value.0)
13049    }
13050}
13051impl<'db> From<ItemUsePtr<'db>> for ModuleItemPtr<'db> {
13052    fn from(value: ItemUsePtr<'db>) -> Self {
13053        Self(value.0)
13054    }
13055}
13056impl<'db> From<FunctionWithBodyPtr<'db>> for ModuleItemPtr<'db> {
13057    fn from(value: FunctionWithBodyPtr<'db>) -> Self {
13058        Self(value.0)
13059    }
13060}
13061impl<'db> From<ItemExternFunctionPtr<'db>> for ModuleItemPtr<'db> {
13062    fn from(value: ItemExternFunctionPtr<'db>) -> Self {
13063        Self(value.0)
13064    }
13065}
13066impl<'db> From<ItemExternTypePtr<'db>> for ModuleItemPtr<'db> {
13067    fn from(value: ItemExternTypePtr<'db>) -> Self {
13068        Self(value.0)
13069    }
13070}
13071impl<'db> From<ItemTraitPtr<'db>> for ModuleItemPtr<'db> {
13072    fn from(value: ItemTraitPtr<'db>) -> Self {
13073        Self(value.0)
13074    }
13075}
13076impl<'db> From<ItemImplPtr<'db>> for ModuleItemPtr<'db> {
13077    fn from(value: ItemImplPtr<'db>) -> Self {
13078        Self(value.0)
13079    }
13080}
13081impl<'db> From<ItemImplAliasPtr<'db>> for ModuleItemPtr<'db> {
13082    fn from(value: ItemImplAliasPtr<'db>) -> Self {
13083        Self(value.0)
13084    }
13085}
13086impl<'db> From<ItemStructPtr<'db>> for ModuleItemPtr<'db> {
13087    fn from(value: ItemStructPtr<'db>) -> Self {
13088        Self(value.0)
13089    }
13090}
13091impl<'db> From<ItemEnumPtr<'db>> for ModuleItemPtr<'db> {
13092    fn from(value: ItemEnumPtr<'db>) -> Self {
13093        Self(value.0)
13094    }
13095}
13096impl<'db> From<ItemTypeAliasPtr<'db>> for ModuleItemPtr<'db> {
13097    fn from(value: ItemTypeAliasPtr<'db>) -> Self {
13098        Self(value.0)
13099    }
13100}
13101impl<'db> From<ItemInlineMacroPtr<'db>> for ModuleItemPtr<'db> {
13102    fn from(value: ItemInlineMacroPtr<'db>) -> Self {
13103        Self(value.0)
13104    }
13105}
13106impl<'db> From<ItemMacroDeclarationPtr<'db>> for ModuleItemPtr<'db> {
13107    fn from(value: ItemMacroDeclarationPtr<'db>) -> Self {
13108        Self(value.0)
13109    }
13110}
13111impl<'db> From<ItemHeaderDocPtr<'db>> for ModuleItemPtr<'db> {
13112    fn from(value: ItemHeaderDocPtr<'db>) -> Self {
13113        Self(value.0)
13114    }
13115}
13116impl<'db> From<ModuleItemMissingPtr<'db>> for ModuleItemPtr<'db> {
13117    fn from(value: ModuleItemMissingPtr<'db>) -> Self {
13118        Self(value.0)
13119    }
13120}
13121impl<'db> From<ItemConstantGreen<'db>> for ModuleItemGreen<'db> {
13122    fn from(value: ItemConstantGreen<'db>) -> Self {
13123        Self(value.0)
13124    }
13125}
13126impl<'db> From<ItemModuleGreen<'db>> for ModuleItemGreen<'db> {
13127    fn from(value: ItemModuleGreen<'db>) -> Self {
13128        Self(value.0)
13129    }
13130}
13131impl<'db> From<ItemUseGreen<'db>> for ModuleItemGreen<'db> {
13132    fn from(value: ItemUseGreen<'db>) -> Self {
13133        Self(value.0)
13134    }
13135}
13136impl<'db> From<FunctionWithBodyGreen<'db>> for ModuleItemGreen<'db> {
13137    fn from(value: FunctionWithBodyGreen<'db>) -> Self {
13138        Self(value.0)
13139    }
13140}
13141impl<'db> From<ItemExternFunctionGreen<'db>> for ModuleItemGreen<'db> {
13142    fn from(value: ItemExternFunctionGreen<'db>) -> Self {
13143        Self(value.0)
13144    }
13145}
13146impl<'db> From<ItemExternTypeGreen<'db>> for ModuleItemGreen<'db> {
13147    fn from(value: ItemExternTypeGreen<'db>) -> Self {
13148        Self(value.0)
13149    }
13150}
13151impl<'db> From<ItemTraitGreen<'db>> for ModuleItemGreen<'db> {
13152    fn from(value: ItemTraitGreen<'db>) -> Self {
13153        Self(value.0)
13154    }
13155}
13156impl<'db> From<ItemImplGreen<'db>> for ModuleItemGreen<'db> {
13157    fn from(value: ItemImplGreen<'db>) -> Self {
13158        Self(value.0)
13159    }
13160}
13161impl<'db> From<ItemImplAliasGreen<'db>> for ModuleItemGreen<'db> {
13162    fn from(value: ItemImplAliasGreen<'db>) -> Self {
13163        Self(value.0)
13164    }
13165}
13166impl<'db> From<ItemStructGreen<'db>> for ModuleItemGreen<'db> {
13167    fn from(value: ItemStructGreen<'db>) -> Self {
13168        Self(value.0)
13169    }
13170}
13171impl<'db> From<ItemEnumGreen<'db>> for ModuleItemGreen<'db> {
13172    fn from(value: ItemEnumGreen<'db>) -> Self {
13173        Self(value.0)
13174    }
13175}
13176impl<'db> From<ItemTypeAliasGreen<'db>> for ModuleItemGreen<'db> {
13177    fn from(value: ItemTypeAliasGreen<'db>) -> Self {
13178        Self(value.0)
13179    }
13180}
13181impl<'db> From<ItemInlineMacroGreen<'db>> for ModuleItemGreen<'db> {
13182    fn from(value: ItemInlineMacroGreen<'db>) -> Self {
13183        Self(value.0)
13184    }
13185}
13186impl<'db> From<ItemMacroDeclarationGreen<'db>> for ModuleItemGreen<'db> {
13187    fn from(value: ItemMacroDeclarationGreen<'db>) -> Self {
13188        Self(value.0)
13189    }
13190}
13191impl<'db> From<ItemHeaderDocGreen<'db>> for ModuleItemGreen<'db> {
13192    fn from(value: ItemHeaderDocGreen<'db>) -> Self {
13193        Self(value.0)
13194    }
13195}
13196impl<'db> From<ModuleItemMissingGreen<'db>> for ModuleItemGreen<'db> {
13197    fn from(value: ModuleItemMissingGreen<'db>) -> Self {
13198        Self(value.0)
13199    }
13200}
13201#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13202pub struct ModuleItemGreen<'db>(pub GreenId<'db>);
13203impl<'db> TypedSyntaxNode<'db> for ModuleItem<'db> {
13204    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13205    type StablePtr = ModuleItemPtr<'db>;
13206    type Green = ModuleItemGreen<'db>;
13207    fn missing(db: &'db dyn Database) -> Self::Green {
13208        ModuleItemGreen(ModuleItemMissing::missing(db).0)
13209    }
13210    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13211        let kind = node.kind(db);
13212        match kind {
13213            SyntaxKind::ItemConstant => {
13214                ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13215            }
13216            SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13217            SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13218            SyntaxKind::FunctionWithBody => {
13219                ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13220            }
13221            SyntaxKind::ItemExternFunction => {
13222                ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13223            }
13224            SyntaxKind::ItemExternType => {
13225                ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13226            }
13227            SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13228            SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13229            SyntaxKind::ItemImplAlias => {
13230                ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13231            }
13232            SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13233            SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13234            SyntaxKind::ItemTypeAlias => {
13235                ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13236            }
13237            SyntaxKind::ItemInlineMacro => {
13238                ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13239            }
13240            SyntaxKind::ItemMacroDeclaration => {
13241                ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13242            }
13243            SyntaxKind::ItemHeaderDoc => {
13244                ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13245            }
13246            SyntaxKind::ModuleItemMissing => {
13247                ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13248            }
13249            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13250        }
13251    }
13252    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13253        let kind = node.kind(db);
13254        match kind {
13255            SyntaxKind::ItemConstant => {
13256                Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13257            }
13258            SyntaxKind::ItemModule => {
13259                Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13260            }
13261            SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13262            SyntaxKind::FunctionWithBody => {
13263                Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13264            }
13265            SyntaxKind::ItemExternFunction => {
13266                Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13267            }
13268            SyntaxKind::ItemExternType => {
13269                Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13270            }
13271            SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13272            SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13273            SyntaxKind::ItemImplAlias => {
13274                Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13275            }
13276            SyntaxKind::ItemStruct => {
13277                Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13278            }
13279            SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13280            SyntaxKind::ItemTypeAlias => {
13281                Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13282            }
13283            SyntaxKind::ItemInlineMacro => {
13284                Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13285            }
13286            SyntaxKind::ItemMacroDeclaration => {
13287                Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13288            }
13289            SyntaxKind::ItemHeaderDoc => {
13290                Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13291            }
13292            SyntaxKind::ModuleItemMissing => {
13293                Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13294            }
13295            _ => None,
13296        }
13297    }
13298    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13299        match self {
13300            ModuleItem::Constant(x) => x.as_syntax_node(),
13301            ModuleItem::Module(x) => x.as_syntax_node(),
13302            ModuleItem::Use(x) => x.as_syntax_node(),
13303            ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13304            ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13305            ModuleItem::ExternType(x) => x.as_syntax_node(),
13306            ModuleItem::Trait(x) => x.as_syntax_node(),
13307            ModuleItem::Impl(x) => x.as_syntax_node(),
13308            ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13309            ModuleItem::Struct(x) => x.as_syntax_node(),
13310            ModuleItem::Enum(x) => x.as_syntax_node(),
13311            ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13312            ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13313            ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13314            ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13315            ModuleItem::Missing(x) => x.as_syntax_node(),
13316        }
13317    }
13318    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13319        ModuleItemPtr(self.as_syntax_node().stable_ptr(db))
13320    }
13321}
13322impl<'db> ModuleItem<'db> {
13323    /// Checks if a kind of a variant of [ModuleItem].
13324    pub fn is_variant(kind: SyntaxKind) -> bool {
13325        matches!(
13326            kind,
13327            SyntaxKind::ItemConstant
13328                | SyntaxKind::ItemModule
13329                | SyntaxKind::ItemUse
13330                | SyntaxKind::FunctionWithBody
13331                | SyntaxKind::ItemExternFunction
13332                | SyntaxKind::ItemExternType
13333                | SyntaxKind::ItemTrait
13334                | SyntaxKind::ItemImpl
13335                | SyntaxKind::ItemImplAlias
13336                | SyntaxKind::ItemStruct
13337                | SyntaxKind::ItemEnum
13338                | SyntaxKind::ItemTypeAlias
13339                | SyntaxKind::ItemInlineMacro
13340                | SyntaxKind::ItemMacroDeclaration
13341                | SyntaxKind::ItemHeaderDoc
13342                | SyntaxKind::ModuleItemMissing
13343        )
13344    }
13345}
13346#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13347pub struct ModuleItemList<'db>(ElementList<'db, ModuleItem<'db>, 1>);
13348impl<'db> Deref for ModuleItemList<'db> {
13349    type Target = ElementList<'db, ModuleItem<'db>, 1>;
13350    fn deref(&self) -> &Self::Target {
13351        &self.0
13352    }
13353}
13354impl<'db> ModuleItemList<'db> {
13355    pub fn new_green(
13356        db: &'db dyn Database,
13357        children: &[ModuleItemGreen<'db>],
13358    ) -> ModuleItemListGreen<'db> {
13359        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13360        ModuleItemListGreen(
13361            GreenNode {
13362                kind: SyntaxKind::ModuleItemList,
13363                details: GreenNodeDetails::Node {
13364                    children: children.iter().map(|x| x.0).collect(),
13365                    width,
13366                },
13367            }
13368            .intern(db),
13369        )
13370    }
13371}
13372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13373pub struct ModuleItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
13374impl<'db> TypedStablePtr<'db> for ModuleItemListPtr<'db> {
13375    type SyntaxNode = ModuleItemList<'db>;
13376    fn untyped(self) -> SyntaxStablePtrId<'db> {
13377        self.0
13378    }
13379    fn lookup(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
13380        ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13381    }
13382}
13383impl<'db> From<ModuleItemListPtr<'db>> for SyntaxStablePtrId<'db> {
13384    fn from(ptr: ModuleItemListPtr<'db>) -> Self {
13385        ptr.untyped()
13386    }
13387}
13388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13389pub struct ModuleItemListGreen<'db>(pub GreenId<'db>);
13390impl<'db> TypedSyntaxNode<'db> for ModuleItemList<'db> {
13391    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13392    type StablePtr = ModuleItemListPtr<'db>;
13393    type Green = ModuleItemListGreen<'db>;
13394    fn missing(db: &'db dyn Database) -> Self::Green {
13395        ModuleItemListGreen(
13396            GreenNode {
13397                kind: SyntaxKind::ModuleItemList,
13398                details: GreenNodeDetails::Node {
13399                    children: [].into(),
13400                    width: TextWidth::default(),
13401                },
13402            }
13403            .intern(db),
13404        )
13405    }
13406    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13407        Self(ElementList::new(node))
13408    }
13409    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13410        if node.kind(db) == SyntaxKind::ModuleItemList {
13411            Some(Self(ElementList::new(node)))
13412        } else {
13413            None
13414        }
13415    }
13416    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13417        self.node
13418    }
13419    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13420        ModuleItemListPtr(self.node.stable_ptr(db))
13421    }
13422}
13423#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13424pub struct ModuleItemMissing<'db> {
13425    node: SyntaxNode<'db>,
13426}
13427impl<'db> ModuleItemMissing<'db> {
13428    pub fn new_green(db: &'db dyn Database) -> ModuleItemMissingGreen<'db> {
13429        let children = [];
13430        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13431        ModuleItemMissingGreen(
13432            GreenNode {
13433                kind: SyntaxKind::ModuleItemMissing,
13434                details: GreenNodeDetails::Node { children: children.into(), width },
13435            }
13436            .intern(db),
13437        )
13438    }
13439}
13440impl<'db> ModuleItemMissing<'db> {}
13441#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13442pub struct ModuleItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
13443impl<'db> ModuleItemMissingPtr<'db> {}
13444impl<'db> TypedStablePtr<'db> for ModuleItemMissingPtr<'db> {
13445    type SyntaxNode = ModuleItemMissing<'db>;
13446    fn untyped(self) -> SyntaxStablePtrId<'db> {
13447        self.0
13448    }
13449    fn lookup(&self, db: &'db dyn Database) -> ModuleItemMissing<'db> {
13450        ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13451    }
13452}
13453impl<'db> From<ModuleItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
13454    fn from(ptr: ModuleItemMissingPtr<'db>) -> Self {
13455        ptr.untyped()
13456    }
13457}
13458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13459pub struct ModuleItemMissingGreen<'db>(pub GreenId<'db>);
13460impl<'db> TypedSyntaxNode<'db> for ModuleItemMissing<'db> {
13461    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13462    type StablePtr = ModuleItemMissingPtr<'db>;
13463    type Green = ModuleItemMissingGreen<'db>;
13464    fn missing(db: &'db dyn Database) -> Self::Green {
13465        ModuleItemMissingGreen(
13466            GreenNode {
13467                kind: SyntaxKind::ModuleItemMissing,
13468                details: GreenNodeDetails::Node {
13469                    children: [].into(),
13470                    width: TextWidth::default(),
13471                },
13472            }
13473            .intern(db),
13474        )
13475    }
13476    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13477        let kind = node.kind(db);
13478        assert_eq!(
13479            kind,
13480            SyntaxKind::ModuleItemMissing,
13481            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13482            kind,
13483            SyntaxKind::ModuleItemMissing
13484        );
13485        Self { node }
13486    }
13487    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13488        let kind = node.kind(db);
13489        if kind == SyntaxKind::ModuleItemMissing {
13490            Some(Self::from_syntax_node(db, node))
13491        } else {
13492            None
13493        }
13494    }
13495    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13496        self.node
13497    }
13498    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13499        ModuleItemMissingPtr(self.node.stable_ptr(db))
13500    }
13501}
13502#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13503pub struct Attribute<'db> {
13504    node: SyntaxNode<'db>,
13505}
13506impl<'db> Attribute<'db> {
13507    pub const INDEX_HASH: usize = 0;
13508    pub const INDEX_LBRACK: usize = 1;
13509    pub const INDEX_ATTR: usize = 2;
13510    pub const INDEX_ARGUMENTS: usize = 3;
13511    pub const INDEX_RBRACK: usize = 4;
13512    pub fn new_green(
13513        db: &'db dyn Database,
13514        hash: TerminalHashGreen<'db>,
13515        lbrack: TerminalLBrackGreen<'db>,
13516        attr: ExprPathGreen<'db>,
13517        arguments: OptionArgListParenthesizedGreen<'db>,
13518        rbrack: TerminalRBrackGreen<'db>,
13519    ) -> AttributeGreen<'db> {
13520        let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13521        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13522        AttributeGreen(
13523            GreenNode {
13524                kind: SyntaxKind::Attribute,
13525                details: GreenNodeDetails::Node { children: children.into(), width },
13526            }
13527            .intern(db),
13528        )
13529    }
13530}
13531impl<'db> Attribute<'db> {
13532    pub fn hash(&self, db: &'db dyn Database) -> TerminalHash<'db> {
13533        TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13534    }
13535    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
13536        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13537    }
13538    pub fn attr(&self, db: &'db dyn Database) -> ExprPath<'db> {
13539        ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13540    }
13541    pub fn arguments(&self, db: &'db dyn Database) -> OptionArgListParenthesized<'db> {
13542        OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13543    }
13544    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
13545        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13546    }
13547}
13548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13549pub struct AttributePtr<'db>(pub SyntaxStablePtrId<'db>);
13550impl<'db> AttributePtr<'db> {}
13551impl<'db> TypedStablePtr<'db> for AttributePtr<'db> {
13552    type SyntaxNode = Attribute<'db>;
13553    fn untyped(self) -> SyntaxStablePtrId<'db> {
13554        self.0
13555    }
13556    fn lookup(&self, db: &'db dyn Database) -> Attribute<'db> {
13557        Attribute::from_syntax_node(db, self.0.lookup(db))
13558    }
13559}
13560impl<'db> From<AttributePtr<'db>> for SyntaxStablePtrId<'db> {
13561    fn from(ptr: AttributePtr<'db>) -> Self {
13562        ptr.untyped()
13563    }
13564}
13565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13566pub struct AttributeGreen<'db>(pub GreenId<'db>);
13567impl<'db> TypedSyntaxNode<'db> for Attribute<'db> {
13568    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13569    type StablePtr = AttributePtr<'db>;
13570    type Green = AttributeGreen<'db>;
13571    fn missing(db: &'db dyn Database) -> Self::Green {
13572        AttributeGreen(
13573            GreenNode {
13574                kind: SyntaxKind::Attribute,
13575                details: GreenNodeDetails::Node {
13576                    children: [
13577                        TerminalHash::missing(db).0,
13578                        TerminalLBrack::missing(db).0,
13579                        ExprPath::missing(db).0,
13580                        OptionArgListParenthesized::missing(db).0,
13581                        TerminalRBrack::missing(db).0,
13582                    ]
13583                    .into(),
13584                    width: TextWidth::default(),
13585                },
13586            }
13587            .intern(db),
13588        )
13589    }
13590    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13591        let kind = node.kind(db);
13592        assert_eq!(
13593            kind,
13594            SyntaxKind::Attribute,
13595            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13596            kind,
13597            SyntaxKind::Attribute
13598        );
13599        Self { node }
13600    }
13601    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13602        let kind = node.kind(db);
13603        if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13604    }
13605    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13606        self.node
13607    }
13608    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13609        AttributePtr(self.node.stable_ptr(db))
13610    }
13611}
13612#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13613pub struct AttributeList<'db>(ElementList<'db, Attribute<'db>, 1>);
13614impl<'db> Deref for AttributeList<'db> {
13615    type Target = ElementList<'db, Attribute<'db>, 1>;
13616    fn deref(&self) -> &Self::Target {
13617        &self.0
13618    }
13619}
13620impl<'db> AttributeList<'db> {
13621    pub fn new_green(
13622        db: &'db dyn Database,
13623        children: &[AttributeGreen<'db>],
13624    ) -> AttributeListGreen<'db> {
13625        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13626        AttributeListGreen(
13627            GreenNode {
13628                kind: SyntaxKind::AttributeList,
13629                details: GreenNodeDetails::Node {
13630                    children: children.iter().map(|x| x.0).collect(),
13631                    width,
13632                },
13633            }
13634            .intern(db),
13635        )
13636    }
13637}
13638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13639pub struct AttributeListPtr<'db>(pub SyntaxStablePtrId<'db>);
13640impl<'db> TypedStablePtr<'db> for AttributeListPtr<'db> {
13641    type SyntaxNode = AttributeList<'db>;
13642    fn untyped(self) -> SyntaxStablePtrId<'db> {
13643        self.0
13644    }
13645    fn lookup(&self, db: &'db dyn Database) -> AttributeList<'db> {
13646        AttributeList::from_syntax_node(db, self.0.lookup(db))
13647    }
13648}
13649impl<'db> From<AttributeListPtr<'db>> for SyntaxStablePtrId<'db> {
13650    fn from(ptr: AttributeListPtr<'db>) -> Self {
13651        ptr.untyped()
13652    }
13653}
13654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13655pub struct AttributeListGreen<'db>(pub GreenId<'db>);
13656impl<'db> TypedSyntaxNode<'db> for AttributeList<'db> {
13657    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13658    type StablePtr = AttributeListPtr<'db>;
13659    type Green = AttributeListGreen<'db>;
13660    fn missing(db: &'db dyn Database) -> Self::Green {
13661        AttributeListGreen(
13662            GreenNode {
13663                kind: SyntaxKind::AttributeList,
13664                details: GreenNodeDetails::Node {
13665                    children: [].into(),
13666                    width: TextWidth::default(),
13667                },
13668            }
13669            .intern(db),
13670        )
13671    }
13672    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13673        Self(ElementList::new(node))
13674    }
13675    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13676        if node.kind(db) == SyntaxKind::AttributeList {
13677            Some(Self(ElementList::new(node)))
13678        } else {
13679            None
13680        }
13681    }
13682    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13683        self.node
13684    }
13685    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13686        AttributeListPtr(self.node.stable_ptr(db))
13687    }
13688}
13689#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13690pub struct VisibilityDefault<'db> {
13691    node: SyntaxNode<'db>,
13692}
13693impl<'db> VisibilityDefault<'db> {
13694    pub fn new_green(db: &'db dyn Database) -> VisibilityDefaultGreen<'db> {
13695        let children = [];
13696        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13697        VisibilityDefaultGreen(
13698            GreenNode {
13699                kind: SyntaxKind::VisibilityDefault,
13700                details: GreenNodeDetails::Node { children: children.into(), width },
13701            }
13702            .intern(db),
13703        )
13704    }
13705}
13706impl<'db> VisibilityDefault<'db> {}
13707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13708pub struct VisibilityDefaultPtr<'db>(pub SyntaxStablePtrId<'db>);
13709impl<'db> VisibilityDefaultPtr<'db> {}
13710impl<'db> TypedStablePtr<'db> for VisibilityDefaultPtr<'db> {
13711    type SyntaxNode = VisibilityDefault<'db>;
13712    fn untyped(self) -> SyntaxStablePtrId<'db> {
13713        self.0
13714    }
13715    fn lookup(&self, db: &'db dyn Database) -> VisibilityDefault<'db> {
13716        VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13717    }
13718}
13719impl<'db> From<VisibilityDefaultPtr<'db>> for SyntaxStablePtrId<'db> {
13720    fn from(ptr: VisibilityDefaultPtr<'db>) -> Self {
13721        ptr.untyped()
13722    }
13723}
13724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13725pub struct VisibilityDefaultGreen<'db>(pub GreenId<'db>);
13726impl<'db> TypedSyntaxNode<'db> for VisibilityDefault<'db> {
13727    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13728    type StablePtr = VisibilityDefaultPtr<'db>;
13729    type Green = VisibilityDefaultGreen<'db>;
13730    fn missing(db: &'db dyn Database) -> Self::Green {
13731        VisibilityDefaultGreen(
13732            GreenNode {
13733                kind: SyntaxKind::VisibilityDefault,
13734                details: GreenNodeDetails::Node {
13735                    children: [].into(),
13736                    width: TextWidth::default(),
13737                },
13738            }
13739            .intern(db),
13740        )
13741    }
13742    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13743        let kind = node.kind(db);
13744        assert_eq!(
13745            kind,
13746            SyntaxKind::VisibilityDefault,
13747            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13748            kind,
13749            SyntaxKind::VisibilityDefault
13750        );
13751        Self { node }
13752    }
13753    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13754        let kind = node.kind(db);
13755        if kind == SyntaxKind::VisibilityDefault {
13756            Some(Self::from_syntax_node(db, node))
13757        } else {
13758            None
13759        }
13760    }
13761    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13762        self.node
13763    }
13764    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13765        VisibilityDefaultPtr(self.node.stable_ptr(db))
13766    }
13767}
13768#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13769pub struct VisibilityPubArgumentClause<'db> {
13770    node: SyntaxNode<'db>,
13771}
13772impl<'db> VisibilityPubArgumentClause<'db> {
13773    pub const INDEX_LPAREN: usize = 0;
13774    pub const INDEX_ARGUMENT: usize = 1;
13775    pub const INDEX_RPAREN: usize = 2;
13776    pub fn new_green(
13777        db: &'db dyn Database,
13778        lparen: TerminalLParenGreen<'db>,
13779        argument: TerminalIdentifierGreen<'db>,
13780        rparen: TerminalRParenGreen<'db>,
13781    ) -> VisibilityPubArgumentClauseGreen<'db> {
13782        let children = [lparen.0, argument.0, rparen.0];
13783        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13784        VisibilityPubArgumentClauseGreen(
13785            GreenNode {
13786                kind: SyntaxKind::VisibilityPubArgumentClause,
13787                details: GreenNodeDetails::Node { children: children.into(), width },
13788            }
13789            .intern(db),
13790        )
13791    }
13792}
13793impl<'db> VisibilityPubArgumentClause<'db> {
13794    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
13795        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13796    }
13797    pub fn argument(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
13798        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13799    }
13800    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
13801        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13802    }
13803}
13804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13805pub struct VisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13806impl<'db> VisibilityPubArgumentClausePtr<'db> {}
13807impl<'db> TypedStablePtr<'db> for VisibilityPubArgumentClausePtr<'db> {
13808    type SyntaxNode = VisibilityPubArgumentClause<'db>;
13809    fn untyped(self) -> SyntaxStablePtrId<'db> {
13810        self.0
13811    }
13812    fn lookup(&self, db: &'db dyn Database) -> VisibilityPubArgumentClause<'db> {
13813        VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13814    }
13815}
13816impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13817    fn from(ptr: VisibilityPubArgumentClausePtr<'db>) -> Self {
13818        ptr.untyped()
13819    }
13820}
13821#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13822pub struct VisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13823impl<'db> TypedSyntaxNode<'db> for VisibilityPubArgumentClause<'db> {
13824    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13825    type StablePtr = VisibilityPubArgumentClausePtr<'db>;
13826    type Green = VisibilityPubArgumentClauseGreen<'db>;
13827    fn missing(db: &'db dyn Database) -> Self::Green {
13828        VisibilityPubArgumentClauseGreen(
13829            GreenNode {
13830                kind: SyntaxKind::VisibilityPubArgumentClause,
13831                details: GreenNodeDetails::Node {
13832                    children: [
13833                        TerminalLParen::missing(db).0,
13834                        TerminalIdentifier::missing(db).0,
13835                        TerminalRParen::missing(db).0,
13836                    ]
13837                    .into(),
13838                    width: TextWidth::default(),
13839                },
13840            }
13841            .intern(db),
13842        )
13843    }
13844    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13845        let kind = node.kind(db);
13846        assert_eq!(
13847            kind,
13848            SyntaxKind::VisibilityPubArgumentClause,
13849            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13850            kind,
13851            SyntaxKind::VisibilityPubArgumentClause
13852        );
13853        Self { node }
13854    }
13855    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13856        let kind = node.kind(db);
13857        if kind == SyntaxKind::VisibilityPubArgumentClause {
13858            Some(Self::from_syntax_node(db, node))
13859        } else {
13860            None
13861        }
13862    }
13863    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13864        self.node
13865    }
13866    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13867        VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13868    }
13869}
13870#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13871pub enum OptionVisibilityPubArgumentClause<'db> {
13872    Empty(OptionVisibilityPubArgumentClauseEmpty<'db>),
13873    VisibilityPubArgumentClause(VisibilityPubArgumentClause<'db>),
13874}
13875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13876pub struct OptionVisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13877impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClausePtr<'db> {
13878    type SyntaxNode = OptionVisibilityPubArgumentClause<'db>;
13879    fn untyped(self) -> SyntaxStablePtrId<'db> {
13880        self.0
13881    }
13882    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13883        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13884    }
13885}
13886impl<'db> From<OptionVisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13887    fn from(ptr: OptionVisibilityPubArgumentClausePtr<'db>) -> Self {
13888        ptr.untyped()
13889    }
13890}
13891impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>>
13892    for OptionVisibilityPubArgumentClausePtr<'db>
13893{
13894    fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13895        Self(value.0)
13896    }
13897}
13898impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for OptionVisibilityPubArgumentClausePtr<'db> {
13899    fn from(value: VisibilityPubArgumentClausePtr<'db>) -> Self {
13900        Self(value.0)
13901    }
13902}
13903impl<'db> From<OptionVisibilityPubArgumentClauseEmptyGreen<'db>>
13904    for OptionVisibilityPubArgumentClauseGreen<'db>
13905{
13906    fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen<'db>) -> Self {
13907        Self(value.0)
13908    }
13909}
13910impl<'db> From<VisibilityPubArgumentClauseGreen<'db>>
13911    for OptionVisibilityPubArgumentClauseGreen<'db>
13912{
13913    fn from(value: VisibilityPubArgumentClauseGreen<'db>) -> Self {
13914        Self(value.0)
13915    }
13916}
13917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13918pub struct OptionVisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13919impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClause<'db> {
13920    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13921    type StablePtr = OptionVisibilityPubArgumentClausePtr<'db>;
13922    type Green = OptionVisibilityPubArgumentClauseGreen<'db>;
13923    fn missing(db: &'db dyn Database) -> Self::Green {
13924        panic!("No missing variant.");
13925    }
13926    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13927        let kind = node.kind(db);
13928        match kind {
13929            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13930                OptionVisibilityPubArgumentClause::Empty(
13931                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13932                )
13933            }
13934            SyntaxKind::VisibilityPubArgumentClause => {
13935                OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13936                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13937                )
13938            }
13939            _ => panic!(
13940                "Unexpected syntax kind {:?} when constructing {}.",
13941                kind, "OptionVisibilityPubArgumentClause"
13942            ),
13943        }
13944    }
13945    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13946        let kind = node.kind(db);
13947        match kind {
13948            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13949                Some(OptionVisibilityPubArgumentClause::Empty(
13950                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13951                ))
13952            }
13953            SyntaxKind::VisibilityPubArgumentClause => {
13954                Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13955                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13956                ))
13957            }
13958            _ => None,
13959        }
13960    }
13961    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13962        match self {
13963            OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13964            OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13965        }
13966    }
13967    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13968        OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().stable_ptr(db))
13969    }
13970}
13971impl<'db> OptionVisibilityPubArgumentClause<'db> {
13972    /// Checks if a kind of a variant of [OptionVisibilityPubArgumentClause].
13973    pub fn is_variant(kind: SyntaxKind) -> bool {
13974        matches!(
13975            kind,
13976            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13977                | SyntaxKind::VisibilityPubArgumentClause
13978        )
13979    }
13980}
13981#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13982pub struct OptionVisibilityPubArgumentClauseEmpty<'db> {
13983    node: SyntaxNode<'db>,
13984}
13985impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {
13986    pub fn new_green(db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmptyGreen<'db> {
13987        let children = [];
13988        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13989        OptionVisibilityPubArgumentClauseEmptyGreen(
13990            GreenNode {
13991                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13992                details: GreenNodeDetails::Node { children: children.into(), width },
13993            }
13994            .intern(db),
13995        )
13996    }
13997}
13998impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {}
13999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14000pub struct OptionVisibilityPubArgumentClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
14001impl<'db> OptionVisibilityPubArgumentClauseEmptyPtr<'db> {}
14002impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClauseEmptyPtr<'db> {
14003    type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty<'db>;
14004    fn untyped(self) -> SyntaxStablePtrId<'db> {
14005        self.0
14006    }
14007    fn lookup(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmpty<'db> {
14008        OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
14009    }
14010}
14011impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
14012    fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
14013        ptr.untyped()
14014    }
14015}
14016#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14017pub struct OptionVisibilityPubArgumentClauseEmptyGreen<'db>(pub GreenId<'db>);
14018impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClauseEmpty<'db> {
14019    const OPTIONAL_KIND: Option<SyntaxKind> =
14020        Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
14021    type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr<'db>;
14022    type Green = OptionVisibilityPubArgumentClauseEmptyGreen<'db>;
14023    fn missing(db: &'db dyn Database) -> Self::Green {
14024        OptionVisibilityPubArgumentClauseEmptyGreen(
14025            GreenNode {
14026                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14027                details: GreenNodeDetails::Node {
14028                    children: [].into(),
14029                    width: TextWidth::default(),
14030                },
14031            }
14032            .intern(db),
14033        )
14034    }
14035    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14036        let kind = node.kind(db);
14037        assert_eq!(
14038            kind,
14039            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14040            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14041            kind,
14042            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14043        );
14044        Self { node }
14045    }
14046    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14047        let kind = node.kind(db);
14048        if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14049            Some(Self::from_syntax_node(db, node))
14050        } else {
14051            None
14052        }
14053    }
14054    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14055        self.node
14056    }
14057    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14058        OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
14059    }
14060}
14061#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14062pub struct VisibilityPub<'db> {
14063    node: SyntaxNode<'db>,
14064}
14065impl<'db> VisibilityPub<'db> {
14066    pub const INDEX_PUB_KW: usize = 0;
14067    pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14068    pub fn new_green(
14069        db: &'db dyn Database,
14070        pub_kw: TerminalPubGreen<'db>,
14071        argument_clause: OptionVisibilityPubArgumentClauseGreen<'db>,
14072    ) -> VisibilityPubGreen<'db> {
14073        let children = [pub_kw.0, argument_clause.0];
14074        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14075        VisibilityPubGreen(
14076            GreenNode {
14077                kind: SyntaxKind::VisibilityPub,
14078                details: GreenNodeDetails::Node { children: children.into(), width },
14079            }
14080            .intern(db),
14081        )
14082    }
14083}
14084impl<'db> VisibilityPub<'db> {
14085    pub fn pub_kw(&self, db: &'db dyn Database) -> TerminalPub<'db> {
14086        TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14087    }
14088    pub fn argument_clause(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClause<'db> {
14089        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14090    }
14091}
14092#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14093pub struct VisibilityPubPtr<'db>(pub SyntaxStablePtrId<'db>);
14094impl<'db> VisibilityPubPtr<'db> {}
14095impl<'db> TypedStablePtr<'db> for VisibilityPubPtr<'db> {
14096    type SyntaxNode = VisibilityPub<'db>;
14097    fn untyped(self) -> SyntaxStablePtrId<'db> {
14098        self.0
14099    }
14100    fn lookup(&self, db: &'db dyn Database) -> VisibilityPub<'db> {
14101        VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14102    }
14103}
14104impl<'db> From<VisibilityPubPtr<'db>> for SyntaxStablePtrId<'db> {
14105    fn from(ptr: VisibilityPubPtr<'db>) -> Self {
14106        ptr.untyped()
14107    }
14108}
14109#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14110pub struct VisibilityPubGreen<'db>(pub GreenId<'db>);
14111impl<'db> TypedSyntaxNode<'db> for VisibilityPub<'db> {
14112    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14113    type StablePtr = VisibilityPubPtr<'db>;
14114    type Green = VisibilityPubGreen<'db>;
14115    fn missing(db: &'db dyn Database) -> Self::Green {
14116        VisibilityPubGreen(
14117            GreenNode {
14118                kind: SyntaxKind::VisibilityPub,
14119                details: GreenNodeDetails::Node {
14120                    children: [
14121                        TerminalPub::missing(db).0,
14122                        OptionVisibilityPubArgumentClause::missing(db).0,
14123                    ]
14124                    .into(),
14125                    width: TextWidth::default(),
14126                },
14127            }
14128            .intern(db),
14129        )
14130    }
14131    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14132        let kind = node.kind(db);
14133        assert_eq!(
14134            kind,
14135            SyntaxKind::VisibilityPub,
14136            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14137            kind,
14138            SyntaxKind::VisibilityPub
14139        );
14140        Self { node }
14141    }
14142    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14143        let kind = node.kind(db);
14144        if kind == SyntaxKind::VisibilityPub {
14145            Some(Self::from_syntax_node(db, node))
14146        } else {
14147            None
14148        }
14149    }
14150    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14151        self.node
14152    }
14153    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14154        VisibilityPubPtr(self.node.stable_ptr(db))
14155    }
14156}
14157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14158pub enum Visibility<'db> {
14159    Default(VisibilityDefault<'db>),
14160    Pub(VisibilityPub<'db>),
14161}
14162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14163pub struct VisibilityPtr<'db>(pub SyntaxStablePtrId<'db>);
14164impl<'db> TypedStablePtr<'db> for VisibilityPtr<'db> {
14165    type SyntaxNode = Visibility<'db>;
14166    fn untyped(self) -> SyntaxStablePtrId<'db> {
14167        self.0
14168    }
14169    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14170        Visibility::from_syntax_node(db, self.0.lookup(db))
14171    }
14172}
14173impl<'db> From<VisibilityPtr<'db>> for SyntaxStablePtrId<'db> {
14174    fn from(ptr: VisibilityPtr<'db>) -> Self {
14175        ptr.untyped()
14176    }
14177}
14178impl<'db> From<VisibilityDefaultPtr<'db>> for VisibilityPtr<'db> {
14179    fn from(value: VisibilityDefaultPtr<'db>) -> Self {
14180        Self(value.0)
14181    }
14182}
14183impl<'db> From<VisibilityPubPtr<'db>> for VisibilityPtr<'db> {
14184    fn from(value: VisibilityPubPtr<'db>) -> Self {
14185        Self(value.0)
14186    }
14187}
14188impl<'db> From<VisibilityDefaultGreen<'db>> for VisibilityGreen<'db> {
14189    fn from(value: VisibilityDefaultGreen<'db>) -> Self {
14190        Self(value.0)
14191    }
14192}
14193impl<'db> From<VisibilityPubGreen<'db>> for VisibilityGreen<'db> {
14194    fn from(value: VisibilityPubGreen<'db>) -> Self {
14195        Self(value.0)
14196    }
14197}
14198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14199pub struct VisibilityGreen<'db>(pub GreenId<'db>);
14200impl<'db> TypedSyntaxNode<'db> for Visibility<'db> {
14201    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14202    type StablePtr = VisibilityPtr<'db>;
14203    type Green = VisibilityGreen<'db>;
14204    fn missing(db: &'db dyn Database) -> Self::Green {
14205        panic!("No missing variant.");
14206    }
14207    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14208        let kind = node.kind(db);
14209        match kind {
14210            SyntaxKind::VisibilityDefault => {
14211                Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14212            }
14213            SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14214            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14215        }
14216    }
14217    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14218        let kind = node.kind(db);
14219        match kind {
14220            SyntaxKind::VisibilityDefault => {
14221                Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14222            }
14223            SyntaxKind::VisibilityPub => {
14224                Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14225            }
14226            _ => None,
14227        }
14228    }
14229    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14230        match self {
14231            Visibility::Default(x) => x.as_syntax_node(),
14232            Visibility::Pub(x) => x.as_syntax_node(),
14233        }
14234    }
14235    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14236        VisibilityPtr(self.as_syntax_node().stable_ptr(db))
14237    }
14238}
14239impl<'db> Visibility<'db> {
14240    /// Checks if a kind of a variant of [Visibility].
14241    pub fn is_variant(kind: SyntaxKind) -> bool {
14242        matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14243    }
14244}
14245#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14246pub struct ItemModule<'db> {
14247    node: SyntaxNode<'db>,
14248}
14249impl<'db> ItemModule<'db> {
14250    pub const INDEX_ATTRIBUTES: usize = 0;
14251    pub const INDEX_VISIBILITY: usize = 1;
14252    pub const INDEX_MODULE_KW: usize = 2;
14253    pub const INDEX_NAME: usize = 3;
14254    pub const INDEX_BODY: usize = 4;
14255    pub fn new_green(
14256        db: &'db dyn Database,
14257        attributes: AttributeListGreen<'db>,
14258        visibility: VisibilityGreen<'db>,
14259        module_kw: TerminalModuleGreen<'db>,
14260        name: TerminalIdentifierGreen<'db>,
14261        body: MaybeModuleBodyGreen<'db>,
14262    ) -> ItemModuleGreen<'db> {
14263        let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14264        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14265        ItemModuleGreen(
14266            GreenNode {
14267                kind: SyntaxKind::ItemModule,
14268                details: GreenNodeDetails::Node { children: children.into(), width },
14269            }
14270            .intern(db),
14271        )
14272    }
14273}
14274impl<'db> ItemModule<'db> {
14275    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14276        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14277    }
14278    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14279        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14280    }
14281    pub fn module_kw(&self, db: &'db dyn Database) -> TerminalModule<'db> {
14282        TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14283    }
14284    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14285        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14286    }
14287    pub fn body(&self, db: &'db dyn Database) -> MaybeModuleBody<'db> {
14288        MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14289    }
14290}
14291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14292pub struct ItemModulePtr<'db>(pub SyntaxStablePtrId<'db>);
14293impl<'db> ItemModulePtr<'db> {
14294    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14295        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14296    }
14297}
14298impl<'db> TypedStablePtr<'db> for ItemModulePtr<'db> {
14299    type SyntaxNode = ItemModule<'db>;
14300    fn untyped(self) -> SyntaxStablePtrId<'db> {
14301        self.0
14302    }
14303    fn lookup(&self, db: &'db dyn Database) -> ItemModule<'db> {
14304        ItemModule::from_syntax_node(db, self.0.lookup(db))
14305    }
14306}
14307impl<'db> From<ItemModulePtr<'db>> for SyntaxStablePtrId<'db> {
14308    fn from(ptr: ItemModulePtr<'db>) -> Self {
14309        ptr.untyped()
14310    }
14311}
14312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14313pub struct ItemModuleGreen<'db>(pub GreenId<'db>);
14314impl<'db> TypedSyntaxNode<'db> for ItemModule<'db> {
14315    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14316    type StablePtr = ItemModulePtr<'db>;
14317    type Green = ItemModuleGreen<'db>;
14318    fn missing(db: &'db dyn Database) -> Self::Green {
14319        ItemModuleGreen(
14320            GreenNode {
14321                kind: SyntaxKind::ItemModule,
14322                details: GreenNodeDetails::Node {
14323                    children: [
14324                        AttributeList::missing(db).0,
14325                        Visibility::missing(db).0,
14326                        TerminalModule::missing(db).0,
14327                        TerminalIdentifier::missing(db).0,
14328                        MaybeModuleBody::missing(db).0,
14329                    ]
14330                    .into(),
14331                    width: TextWidth::default(),
14332                },
14333            }
14334            .intern(db),
14335        )
14336    }
14337    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14338        let kind = node.kind(db);
14339        assert_eq!(
14340            kind,
14341            SyntaxKind::ItemModule,
14342            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14343            kind,
14344            SyntaxKind::ItemModule
14345        );
14346        Self { node }
14347    }
14348    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14349        let kind = node.kind(db);
14350        if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14351    }
14352    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14353        self.node
14354    }
14355    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14356        ItemModulePtr(self.node.stable_ptr(db))
14357    }
14358}
14359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14360pub enum MaybeModuleBody<'db> {
14361    Some(ModuleBody<'db>),
14362    None(TerminalSemicolon<'db>),
14363}
14364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14365pub struct MaybeModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14366impl<'db> TypedStablePtr<'db> for MaybeModuleBodyPtr<'db> {
14367    type SyntaxNode = MaybeModuleBody<'db>;
14368    fn untyped(self) -> SyntaxStablePtrId<'db> {
14369        self.0
14370    }
14371    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14372        MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14373    }
14374}
14375impl<'db> From<MaybeModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14376    fn from(ptr: MaybeModuleBodyPtr<'db>) -> Self {
14377        ptr.untyped()
14378    }
14379}
14380impl<'db> From<ModuleBodyPtr<'db>> for MaybeModuleBodyPtr<'db> {
14381    fn from(value: ModuleBodyPtr<'db>) -> Self {
14382        Self(value.0)
14383    }
14384}
14385impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeModuleBodyPtr<'db> {
14386    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
14387        Self(value.0)
14388    }
14389}
14390impl<'db> From<ModuleBodyGreen<'db>> for MaybeModuleBodyGreen<'db> {
14391    fn from(value: ModuleBodyGreen<'db>) -> Self {
14392        Self(value.0)
14393    }
14394}
14395impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeModuleBodyGreen<'db> {
14396    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
14397        Self(value.0)
14398    }
14399}
14400#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14401pub struct MaybeModuleBodyGreen<'db>(pub GreenId<'db>);
14402impl<'db> TypedSyntaxNode<'db> for MaybeModuleBody<'db> {
14403    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14404    type StablePtr = MaybeModuleBodyPtr<'db>;
14405    type Green = MaybeModuleBodyGreen<'db>;
14406    fn missing(db: &'db dyn Database) -> Self::Green {
14407        panic!("No missing variant.");
14408    }
14409    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14410        let kind = node.kind(db);
14411        match kind {
14412            SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14413            SyntaxKind::TerminalSemicolon => {
14414                MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14415            }
14416            _ => {
14417                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14418            }
14419        }
14420    }
14421    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14422        let kind = node.kind(db);
14423        match kind {
14424            SyntaxKind::ModuleBody => {
14425                Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14426            }
14427            SyntaxKind::TerminalSemicolon => {
14428                Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14429            }
14430            _ => None,
14431        }
14432    }
14433    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14434        match self {
14435            MaybeModuleBody::Some(x) => x.as_syntax_node(),
14436            MaybeModuleBody::None(x) => x.as_syntax_node(),
14437        }
14438    }
14439    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14440        MaybeModuleBodyPtr(self.as_syntax_node().stable_ptr(db))
14441    }
14442}
14443impl<'db> MaybeModuleBody<'db> {
14444    /// Checks if a kind of a variant of [MaybeModuleBody].
14445    pub fn is_variant(kind: SyntaxKind) -> bool {
14446        matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14447    }
14448}
14449#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14450pub struct ModuleBody<'db> {
14451    node: SyntaxNode<'db>,
14452}
14453impl<'db> ModuleBody<'db> {
14454    pub const INDEX_LBRACE: usize = 0;
14455    pub const INDEX_ITEMS: usize = 1;
14456    pub const INDEX_RBRACE: usize = 2;
14457    pub fn new_green(
14458        db: &'db dyn Database,
14459        lbrace: TerminalLBraceGreen<'db>,
14460        items: ModuleItemListGreen<'db>,
14461        rbrace: TerminalRBraceGreen<'db>,
14462    ) -> ModuleBodyGreen<'db> {
14463        let children = [lbrace.0, items.0, rbrace.0];
14464        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14465        ModuleBodyGreen(
14466            GreenNode {
14467                kind: SyntaxKind::ModuleBody,
14468                details: GreenNodeDetails::Node { children: children.into(), width },
14469            }
14470            .intern(db),
14471        )
14472    }
14473}
14474impl<'db> ModuleBody<'db> {
14475    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
14476        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14477    }
14478    pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
14479        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14480    }
14481    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
14482        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14483    }
14484}
14485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14486pub struct ModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14487impl<'db> ModuleBodyPtr<'db> {}
14488impl<'db> TypedStablePtr<'db> for ModuleBodyPtr<'db> {
14489    type SyntaxNode = ModuleBody<'db>;
14490    fn untyped(self) -> SyntaxStablePtrId<'db> {
14491        self.0
14492    }
14493    fn lookup(&self, db: &'db dyn Database) -> ModuleBody<'db> {
14494        ModuleBody::from_syntax_node(db, self.0.lookup(db))
14495    }
14496}
14497impl<'db> From<ModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14498    fn from(ptr: ModuleBodyPtr<'db>) -> Self {
14499        ptr.untyped()
14500    }
14501}
14502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14503pub struct ModuleBodyGreen<'db>(pub GreenId<'db>);
14504impl<'db> TypedSyntaxNode<'db> for ModuleBody<'db> {
14505    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14506    type StablePtr = ModuleBodyPtr<'db>;
14507    type Green = ModuleBodyGreen<'db>;
14508    fn missing(db: &'db dyn Database) -> Self::Green {
14509        ModuleBodyGreen(
14510            GreenNode {
14511                kind: SyntaxKind::ModuleBody,
14512                details: GreenNodeDetails::Node {
14513                    children: [
14514                        TerminalLBrace::missing(db).0,
14515                        ModuleItemList::missing(db).0,
14516                        TerminalRBrace::missing(db).0,
14517                    ]
14518                    .into(),
14519                    width: TextWidth::default(),
14520                },
14521            }
14522            .intern(db),
14523        )
14524    }
14525    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14526        let kind = node.kind(db);
14527        assert_eq!(
14528            kind,
14529            SyntaxKind::ModuleBody,
14530            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14531            kind,
14532            SyntaxKind::ModuleBody
14533        );
14534        Self { node }
14535    }
14536    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14537        let kind = node.kind(db);
14538        if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14539    }
14540    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14541        self.node
14542    }
14543    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14544        ModuleBodyPtr(self.node.stable_ptr(db))
14545    }
14546}
14547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14548pub struct FunctionDeclaration<'db> {
14549    node: SyntaxNode<'db>,
14550}
14551impl<'db> FunctionDeclaration<'db> {
14552    pub const INDEX_OPTIONAL_CONST: usize = 0;
14553    pub const INDEX_FUNCTION_KW: usize = 1;
14554    pub const INDEX_NAME: usize = 2;
14555    pub const INDEX_GENERIC_PARAMS: usize = 3;
14556    pub const INDEX_SIGNATURE: usize = 4;
14557    pub fn new_green(
14558        db: &'db dyn Database,
14559        optional_const: OptionTerminalConstGreen<'db>,
14560        function_kw: TerminalFunctionGreen<'db>,
14561        name: TerminalIdentifierGreen<'db>,
14562        generic_params: OptionWrappedGenericParamListGreen<'db>,
14563        signature: FunctionSignatureGreen<'db>,
14564    ) -> FunctionDeclarationGreen<'db> {
14565        let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14566        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14567        FunctionDeclarationGreen(
14568            GreenNode {
14569                kind: SyntaxKind::FunctionDeclaration,
14570                details: GreenNodeDetails::Node { children: children.into(), width },
14571            }
14572            .intern(db),
14573        )
14574    }
14575}
14576impl<'db> FunctionDeclaration<'db> {
14577    pub fn optional_const(&self, db: &'db dyn Database) -> OptionTerminalConst<'db> {
14578        OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14579    }
14580    pub fn function_kw(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
14581        TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14582    }
14583    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14584        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14585    }
14586    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
14587        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14588    }
14589    pub fn signature(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
14590        FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14591    }
14592}
14593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14594pub struct FunctionDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
14595impl<'db> FunctionDeclarationPtr<'db> {
14596    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14597        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14598    }
14599}
14600impl<'db> TypedStablePtr<'db> for FunctionDeclarationPtr<'db> {
14601    type SyntaxNode = FunctionDeclaration<'db>;
14602    fn untyped(self) -> SyntaxStablePtrId<'db> {
14603        self.0
14604    }
14605    fn lookup(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14606        FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14607    }
14608}
14609impl<'db> From<FunctionDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
14610    fn from(ptr: FunctionDeclarationPtr<'db>) -> Self {
14611        ptr.untyped()
14612    }
14613}
14614#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14615pub struct FunctionDeclarationGreen<'db>(pub GreenId<'db>);
14616impl<'db> TypedSyntaxNode<'db> for FunctionDeclaration<'db> {
14617    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14618    type StablePtr = FunctionDeclarationPtr<'db>;
14619    type Green = FunctionDeclarationGreen<'db>;
14620    fn missing(db: &'db dyn Database) -> Self::Green {
14621        FunctionDeclarationGreen(
14622            GreenNode {
14623                kind: SyntaxKind::FunctionDeclaration,
14624                details: GreenNodeDetails::Node {
14625                    children: [
14626                        OptionTerminalConst::missing(db).0,
14627                        TerminalFunction::missing(db).0,
14628                        TerminalIdentifier::missing(db).0,
14629                        OptionWrappedGenericParamList::missing(db).0,
14630                        FunctionSignature::missing(db).0,
14631                    ]
14632                    .into(),
14633                    width: TextWidth::default(),
14634                },
14635            }
14636            .intern(db),
14637        )
14638    }
14639    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14640        let kind = node.kind(db);
14641        assert_eq!(
14642            kind,
14643            SyntaxKind::FunctionDeclaration,
14644            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14645            kind,
14646            SyntaxKind::FunctionDeclaration
14647        );
14648        Self { node }
14649    }
14650    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14651        let kind = node.kind(db);
14652        if kind == SyntaxKind::FunctionDeclaration {
14653            Some(Self::from_syntax_node(db, node))
14654        } else {
14655            None
14656        }
14657    }
14658    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14659        self.node
14660    }
14661    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14662        FunctionDeclarationPtr(self.node.stable_ptr(db))
14663    }
14664}
14665#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14666pub struct ItemConstant<'db> {
14667    node: SyntaxNode<'db>,
14668}
14669impl<'db> ItemConstant<'db> {
14670    pub const INDEX_ATTRIBUTES: usize = 0;
14671    pub const INDEX_VISIBILITY: usize = 1;
14672    pub const INDEX_CONST_KW: usize = 2;
14673    pub const INDEX_NAME: usize = 3;
14674    pub const INDEX_TYPE_CLAUSE: usize = 4;
14675    pub const INDEX_EQ: usize = 5;
14676    pub const INDEX_VALUE: usize = 6;
14677    pub const INDEX_SEMICOLON: usize = 7;
14678    pub fn new_green(
14679        db: &'db dyn Database,
14680        attributes: AttributeListGreen<'db>,
14681        visibility: VisibilityGreen<'db>,
14682        const_kw: TerminalConstGreen<'db>,
14683        name: TerminalIdentifierGreen<'db>,
14684        type_clause: TypeClauseGreen<'db>,
14685        eq: TerminalEqGreen<'db>,
14686        value: ExprGreen<'db>,
14687        semicolon: TerminalSemicolonGreen<'db>,
14688    ) -> ItemConstantGreen<'db> {
14689        let children = [
14690            attributes.0,
14691            visibility.0,
14692            const_kw.0,
14693            name.0,
14694            type_clause.0,
14695            eq.0,
14696            value.0,
14697            semicolon.0,
14698        ];
14699        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14700        ItemConstantGreen(
14701            GreenNode {
14702                kind: SyntaxKind::ItemConstant,
14703                details: GreenNodeDetails::Node { children: children.into(), width },
14704            }
14705            .intern(db),
14706        )
14707    }
14708}
14709impl<'db> ItemConstant<'db> {
14710    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14711        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14712    }
14713    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14714        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14715    }
14716    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
14717        TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14718    }
14719    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14720        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14721    }
14722    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
14723        TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14724    }
14725    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
14726        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14727    }
14728    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
14729        Expr::from_syntax_node(db, self.node.get_children(db)[6])
14730    }
14731    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14732        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14733    }
14734}
14735#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14736pub struct ItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
14737impl<'db> ItemConstantPtr<'db> {
14738    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14739        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14740    }
14741}
14742impl<'db> TypedStablePtr<'db> for ItemConstantPtr<'db> {
14743    type SyntaxNode = ItemConstant<'db>;
14744    fn untyped(self) -> SyntaxStablePtrId<'db> {
14745        self.0
14746    }
14747    fn lookup(&self, db: &'db dyn Database) -> ItemConstant<'db> {
14748        ItemConstant::from_syntax_node(db, self.0.lookup(db))
14749    }
14750}
14751impl<'db> From<ItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
14752    fn from(ptr: ItemConstantPtr<'db>) -> Self {
14753        ptr.untyped()
14754    }
14755}
14756#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14757pub struct ItemConstantGreen<'db>(pub GreenId<'db>);
14758impl<'db> TypedSyntaxNode<'db> for ItemConstant<'db> {
14759    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14760    type StablePtr = ItemConstantPtr<'db>;
14761    type Green = ItemConstantGreen<'db>;
14762    fn missing(db: &'db dyn Database) -> Self::Green {
14763        ItemConstantGreen(
14764            GreenNode {
14765                kind: SyntaxKind::ItemConstant,
14766                details: GreenNodeDetails::Node {
14767                    children: [
14768                        AttributeList::missing(db).0,
14769                        Visibility::missing(db).0,
14770                        TerminalConst::missing(db).0,
14771                        TerminalIdentifier::missing(db).0,
14772                        TypeClause::missing(db).0,
14773                        TerminalEq::missing(db).0,
14774                        Expr::missing(db).0,
14775                        TerminalSemicolon::missing(db).0,
14776                    ]
14777                    .into(),
14778                    width: TextWidth::default(),
14779                },
14780            }
14781            .intern(db),
14782        )
14783    }
14784    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14785        let kind = node.kind(db);
14786        assert_eq!(
14787            kind,
14788            SyntaxKind::ItemConstant,
14789            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14790            kind,
14791            SyntaxKind::ItemConstant
14792        );
14793        Self { node }
14794    }
14795    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14796        let kind = node.kind(db);
14797        if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14798    }
14799    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14800        self.node
14801    }
14802    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14803        ItemConstantPtr(self.node.stable_ptr(db))
14804    }
14805}
14806#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14807pub struct FunctionWithBody<'db> {
14808    node: SyntaxNode<'db>,
14809}
14810impl<'db> FunctionWithBody<'db> {
14811    pub const INDEX_ATTRIBUTES: usize = 0;
14812    pub const INDEX_VISIBILITY: usize = 1;
14813    pub const INDEX_DECLARATION: usize = 2;
14814    pub const INDEX_BODY: usize = 3;
14815    pub fn new_green(
14816        db: &'db dyn Database,
14817        attributes: AttributeListGreen<'db>,
14818        visibility: VisibilityGreen<'db>,
14819        declaration: FunctionDeclarationGreen<'db>,
14820        body: ExprBlockGreen<'db>,
14821    ) -> FunctionWithBodyGreen<'db> {
14822        let children = [attributes.0, visibility.0, declaration.0, body.0];
14823        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14824        FunctionWithBodyGreen(
14825            GreenNode {
14826                kind: SyntaxKind::FunctionWithBody,
14827                details: GreenNodeDetails::Node { children: children.into(), width },
14828            }
14829            .intern(db),
14830        )
14831    }
14832}
14833impl<'db> FunctionWithBody<'db> {
14834    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14835        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14836    }
14837    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14838        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14839    }
14840    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14841        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14842    }
14843    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
14844        ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14845    }
14846}
14847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14848pub struct FunctionWithBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14849impl<'db> FunctionWithBodyPtr<'db> {
14850    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14851        FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14852    }
14853}
14854impl<'db> TypedStablePtr<'db> for FunctionWithBodyPtr<'db> {
14855    type SyntaxNode = FunctionWithBody<'db>;
14856    fn untyped(self) -> SyntaxStablePtrId<'db> {
14857        self.0
14858    }
14859    fn lookup(&self, db: &'db dyn Database) -> FunctionWithBody<'db> {
14860        FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14861    }
14862}
14863impl<'db> From<FunctionWithBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14864    fn from(ptr: FunctionWithBodyPtr<'db>) -> Self {
14865        ptr.untyped()
14866    }
14867}
14868#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14869pub struct FunctionWithBodyGreen<'db>(pub GreenId<'db>);
14870impl<'db> TypedSyntaxNode<'db> for FunctionWithBody<'db> {
14871    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14872    type StablePtr = FunctionWithBodyPtr<'db>;
14873    type Green = FunctionWithBodyGreen<'db>;
14874    fn missing(db: &'db dyn Database) -> Self::Green {
14875        FunctionWithBodyGreen(
14876            GreenNode {
14877                kind: SyntaxKind::FunctionWithBody,
14878                details: GreenNodeDetails::Node {
14879                    children: [
14880                        AttributeList::missing(db).0,
14881                        Visibility::missing(db).0,
14882                        FunctionDeclaration::missing(db).0,
14883                        ExprBlock::missing(db).0,
14884                    ]
14885                    .into(),
14886                    width: TextWidth::default(),
14887                },
14888            }
14889            .intern(db),
14890        )
14891    }
14892    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14893        let kind = node.kind(db);
14894        assert_eq!(
14895            kind,
14896            SyntaxKind::FunctionWithBody,
14897            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14898            kind,
14899            SyntaxKind::FunctionWithBody
14900        );
14901        Self { node }
14902    }
14903    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14904        let kind = node.kind(db);
14905        if kind == SyntaxKind::FunctionWithBody {
14906            Some(Self::from_syntax_node(db, node))
14907        } else {
14908            None
14909        }
14910    }
14911    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14912        self.node
14913    }
14914    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14915        FunctionWithBodyPtr(self.node.stable_ptr(db))
14916    }
14917}
14918#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14919pub struct ItemExternFunction<'db> {
14920    node: SyntaxNode<'db>,
14921}
14922impl<'db> ItemExternFunction<'db> {
14923    pub const INDEX_ATTRIBUTES: usize = 0;
14924    pub const INDEX_VISIBILITY: usize = 1;
14925    pub const INDEX_EXTERN_KW: usize = 2;
14926    pub const INDEX_DECLARATION: usize = 3;
14927    pub const INDEX_SEMICOLON: usize = 4;
14928    pub fn new_green(
14929        db: &'db dyn Database,
14930        attributes: AttributeListGreen<'db>,
14931        visibility: VisibilityGreen<'db>,
14932        extern_kw: TerminalExternGreen<'db>,
14933        declaration: FunctionDeclarationGreen<'db>,
14934        semicolon: TerminalSemicolonGreen<'db>,
14935    ) -> ItemExternFunctionGreen<'db> {
14936        let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14937        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14938        ItemExternFunctionGreen(
14939            GreenNode {
14940                kind: SyntaxKind::ItemExternFunction,
14941                details: GreenNodeDetails::Node { children: children.into(), width },
14942            }
14943            .intern(db),
14944        )
14945    }
14946}
14947impl<'db> ItemExternFunction<'db> {
14948    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14949        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14950    }
14951    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14952        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14953    }
14954    pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
14955        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
14956    }
14957    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14958        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
14959    }
14960    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14961        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
14962    }
14963}
14964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14965pub struct ItemExternFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
14966impl<'db> ItemExternFunctionPtr<'db> {
14967    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14968        FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14969    }
14970}
14971impl<'db> TypedStablePtr<'db> for ItemExternFunctionPtr<'db> {
14972    type SyntaxNode = ItemExternFunction<'db>;
14973    fn untyped(self) -> SyntaxStablePtrId<'db> {
14974        self.0
14975    }
14976    fn lookup(&self, db: &'db dyn Database) -> ItemExternFunction<'db> {
14977        ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
14978    }
14979}
14980impl<'db> From<ItemExternFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
14981    fn from(ptr: ItemExternFunctionPtr<'db>) -> Self {
14982        ptr.untyped()
14983    }
14984}
14985#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14986pub struct ItemExternFunctionGreen<'db>(pub GreenId<'db>);
14987impl<'db> TypedSyntaxNode<'db> for ItemExternFunction<'db> {
14988    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
14989    type StablePtr = ItemExternFunctionPtr<'db>;
14990    type Green = ItemExternFunctionGreen<'db>;
14991    fn missing(db: &'db dyn Database) -> Self::Green {
14992        ItemExternFunctionGreen(
14993            GreenNode {
14994                kind: SyntaxKind::ItemExternFunction,
14995                details: GreenNodeDetails::Node {
14996                    children: [
14997                        AttributeList::missing(db).0,
14998                        Visibility::missing(db).0,
14999                        TerminalExtern::missing(db).0,
15000                        FunctionDeclaration::missing(db).0,
15001                        TerminalSemicolon::missing(db).0,
15002                    ]
15003                    .into(),
15004                    width: TextWidth::default(),
15005                },
15006            }
15007            .intern(db),
15008        )
15009    }
15010    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15011        let kind = node.kind(db);
15012        assert_eq!(
15013            kind,
15014            SyntaxKind::ItemExternFunction,
15015            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15016            kind,
15017            SyntaxKind::ItemExternFunction
15018        );
15019        Self { node }
15020    }
15021    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15022        let kind = node.kind(db);
15023        if kind == SyntaxKind::ItemExternFunction {
15024            Some(Self::from_syntax_node(db, node))
15025        } else {
15026            None
15027        }
15028    }
15029    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15030        self.node
15031    }
15032    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15033        ItemExternFunctionPtr(self.node.stable_ptr(db))
15034    }
15035}
15036#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15037pub struct ItemExternType<'db> {
15038    node: SyntaxNode<'db>,
15039}
15040impl<'db> ItemExternType<'db> {
15041    pub const INDEX_ATTRIBUTES: usize = 0;
15042    pub const INDEX_VISIBILITY: usize = 1;
15043    pub const INDEX_EXTERN_KW: usize = 2;
15044    pub const INDEX_TYPE_KW: usize = 3;
15045    pub const INDEX_NAME: usize = 4;
15046    pub const INDEX_GENERIC_PARAMS: usize = 5;
15047    pub const INDEX_SEMICOLON: usize = 6;
15048    pub fn new_green(
15049        db: &'db dyn Database,
15050        attributes: AttributeListGreen<'db>,
15051        visibility: VisibilityGreen<'db>,
15052        extern_kw: TerminalExternGreen<'db>,
15053        type_kw: TerminalTypeGreen<'db>,
15054        name: TerminalIdentifierGreen<'db>,
15055        generic_params: OptionWrappedGenericParamListGreen<'db>,
15056        semicolon: TerminalSemicolonGreen<'db>,
15057    ) -> ItemExternTypeGreen<'db> {
15058        let children = [
15059            attributes.0,
15060            visibility.0,
15061            extern_kw.0,
15062            type_kw.0,
15063            name.0,
15064            generic_params.0,
15065            semicolon.0,
15066        ];
15067        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15068        ItemExternTypeGreen(
15069            GreenNode {
15070                kind: SyntaxKind::ItemExternType,
15071                details: GreenNodeDetails::Node { children: children.into(), width },
15072            }
15073            .intern(db),
15074        )
15075    }
15076}
15077impl<'db> ItemExternType<'db> {
15078    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15079        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15080    }
15081    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15082        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15083    }
15084    pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
15085        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15086    }
15087    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15088        TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15089    }
15090    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15091        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15092    }
15093    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15094        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15095    }
15096    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15097        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15098    }
15099}
15100#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15101pub struct ItemExternTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15102impl<'db> ItemExternTypePtr<'db> {
15103    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15104        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15105    }
15106}
15107impl<'db> TypedStablePtr<'db> for ItemExternTypePtr<'db> {
15108    type SyntaxNode = ItemExternType<'db>;
15109    fn untyped(self) -> SyntaxStablePtrId<'db> {
15110        self.0
15111    }
15112    fn lookup(&self, db: &'db dyn Database) -> ItemExternType<'db> {
15113        ItemExternType::from_syntax_node(db, self.0.lookup(db))
15114    }
15115}
15116impl<'db> From<ItemExternTypePtr<'db>> for SyntaxStablePtrId<'db> {
15117    fn from(ptr: ItemExternTypePtr<'db>) -> Self {
15118        ptr.untyped()
15119    }
15120}
15121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15122pub struct ItemExternTypeGreen<'db>(pub GreenId<'db>);
15123impl<'db> TypedSyntaxNode<'db> for ItemExternType<'db> {
15124    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15125    type StablePtr = ItemExternTypePtr<'db>;
15126    type Green = ItemExternTypeGreen<'db>;
15127    fn missing(db: &'db dyn Database) -> Self::Green {
15128        ItemExternTypeGreen(
15129            GreenNode {
15130                kind: SyntaxKind::ItemExternType,
15131                details: GreenNodeDetails::Node {
15132                    children: [
15133                        AttributeList::missing(db).0,
15134                        Visibility::missing(db).0,
15135                        TerminalExtern::missing(db).0,
15136                        TerminalType::missing(db).0,
15137                        TerminalIdentifier::missing(db).0,
15138                        OptionWrappedGenericParamList::missing(db).0,
15139                        TerminalSemicolon::missing(db).0,
15140                    ]
15141                    .into(),
15142                    width: TextWidth::default(),
15143                },
15144            }
15145            .intern(db),
15146        )
15147    }
15148    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15149        let kind = node.kind(db);
15150        assert_eq!(
15151            kind,
15152            SyntaxKind::ItemExternType,
15153            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15154            kind,
15155            SyntaxKind::ItemExternType
15156        );
15157        Self { node }
15158    }
15159    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15160        let kind = node.kind(db);
15161        if kind == SyntaxKind::ItemExternType {
15162            Some(Self::from_syntax_node(db, node))
15163        } else {
15164            None
15165        }
15166    }
15167    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15168        self.node
15169    }
15170    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15171        ItemExternTypePtr(self.node.stable_ptr(db))
15172    }
15173}
15174#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15175pub struct ItemTrait<'db> {
15176    node: SyntaxNode<'db>,
15177}
15178impl<'db> ItemTrait<'db> {
15179    pub const INDEX_ATTRIBUTES: usize = 0;
15180    pub const INDEX_VISIBILITY: usize = 1;
15181    pub const INDEX_TRAIT_KW: usize = 2;
15182    pub const INDEX_NAME: usize = 3;
15183    pub const INDEX_GENERIC_PARAMS: usize = 4;
15184    pub const INDEX_BODY: usize = 5;
15185    pub fn new_green(
15186        db: &'db dyn Database,
15187        attributes: AttributeListGreen<'db>,
15188        visibility: VisibilityGreen<'db>,
15189        trait_kw: TerminalTraitGreen<'db>,
15190        name: TerminalIdentifierGreen<'db>,
15191        generic_params: OptionWrappedGenericParamListGreen<'db>,
15192        body: MaybeTraitBodyGreen<'db>,
15193    ) -> ItemTraitGreen<'db> {
15194        let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15195        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15196        ItemTraitGreen(
15197            GreenNode {
15198                kind: SyntaxKind::ItemTrait,
15199                details: GreenNodeDetails::Node { children: children.into(), width },
15200            }
15201            .intern(db),
15202        )
15203    }
15204}
15205impl<'db> ItemTrait<'db> {
15206    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15207        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15208    }
15209    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15210        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15211    }
15212    pub fn trait_kw(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
15213        TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15214    }
15215    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15216        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15217    }
15218    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15219        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15220    }
15221    pub fn body(&self, db: &'db dyn Database) -> MaybeTraitBody<'db> {
15222        MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15223    }
15224}
15225#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15226pub struct ItemTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
15227impl<'db> ItemTraitPtr<'db> {
15228    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15229        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15230    }
15231}
15232impl<'db> TypedStablePtr<'db> for ItemTraitPtr<'db> {
15233    type SyntaxNode = ItemTrait<'db>;
15234    fn untyped(self) -> SyntaxStablePtrId<'db> {
15235        self.0
15236    }
15237    fn lookup(&self, db: &'db dyn Database) -> ItemTrait<'db> {
15238        ItemTrait::from_syntax_node(db, self.0.lookup(db))
15239    }
15240}
15241impl<'db> From<ItemTraitPtr<'db>> for SyntaxStablePtrId<'db> {
15242    fn from(ptr: ItemTraitPtr<'db>) -> Self {
15243        ptr.untyped()
15244    }
15245}
15246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15247pub struct ItemTraitGreen<'db>(pub GreenId<'db>);
15248impl<'db> TypedSyntaxNode<'db> for ItemTrait<'db> {
15249    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15250    type StablePtr = ItemTraitPtr<'db>;
15251    type Green = ItemTraitGreen<'db>;
15252    fn missing(db: &'db dyn Database) -> Self::Green {
15253        ItemTraitGreen(
15254            GreenNode {
15255                kind: SyntaxKind::ItemTrait,
15256                details: GreenNodeDetails::Node {
15257                    children: [
15258                        AttributeList::missing(db).0,
15259                        Visibility::missing(db).0,
15260                        TerminalTrait::missing(db).0,
15261                        TerminalIdentifier::missing(db).0,
15262                        OptionWrappedGenericParamList::missing(db).0,
15263                        MaybeTraitBody::missing(db).0,
15264                    ]
15265                    .into(),
15266                    width: TextWidth::default(),
15267                },
15268            }
15269            .intern(db),
15270        )
15271    }
15272    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15273        let kind = node.kind(db);
15274        assert_eq!(
15275            kind,
15276            SyntaxKind::ItemTrait,
15277            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15278            kind,
15279            SyntaxKind::ItemTrait
15280        );
15281        Self { node }
15282    }
15283    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15284        let kind = node.kind(db);
15285        if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15286    }
15287    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15288        self.node
15289    }
15290    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15291        ItemTraitPtr(self.node.stable_ptr(db))
15292    }
15293}
15294#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15295pub enum MaybeTraitBody<'db> {
15296    Some(TraitBody<'db>),
15297    None(TerminalSemicolon<'db>),
15298}
15299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15300pub struct MaybeTraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15301impl<'db> TypedStablePtr<'db> for MaybeTraitBodyPtr<'db> {
15302    type SyntaxNode = MaybeTraitBody<'db>;
15303    fn untyped(self) -> SyntaxStablePtrId<'db> {
15304        self.0
15305    }
15306    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15307        MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15308    }
15309}
15310impl<'db> From<MaybeTraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15311    fn from(ptr: MaybeTraitBodyPtr<'db>) -> Self {
15312        ptr.untyped()
15313    }
15314}
15315impl<'db> From<TraitBodyPtr<'db>> for MaybeTraitBodyPtr<'db> {
15316    fn from(value: TraitBodyPtr<'db>) -> Self {
15317        Self(value.0)
15318    }
15319}
15320impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitBodyPtr<'db> {
15321    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
15322        Self(value.0)
15323    }
15324}
15325impl<'db> From<TraitBodyGreen<'db>> for MaybeTraitBodyGreen<'db> {
15326    fn from(value: TraitBodyGreen<'db>) -> Self {
15327        Self(value.0)
15328    }
15329}
15330impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitBodyGreen<'db> {
15331    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
15332        Self(value.0)
15333    }
15334}
15335#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15336pub struct MaybeTraitBodyGreen<'db>(pub GreenId<'db>);
15337impl<'db> TypedSyntaxNode<'db> for MaybeTraitBody<'db> {
15338    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15339    type StablePtr = MaybeTraitBodyPtr<'db>;
15340    type Green = MaybeTraitBodyGreen<'db>;
15341    fn missing(db: &'db dyn Database) -> Self::Green {
15342        panic!("No missing variant.");
15343    }
15344    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15345        let kind = node.kind(db);
15346        match kind {
15347            SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15348            SyntaxKind::TerminalSemicolon => {
15349                MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15350            }
15351            _ => {
15352                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15353            }
15354        }
15355    }
15356    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15357        let kind = node.kind(db);
15358        match kind {
15359            SyntaxKind::TraitBody => {
15360                Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15361            }
15362            SyntaxKind::TerminalSemicolon => {
15363                Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15364            }
15365            _ => None,
15366        }
15367    }
15368    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15369        match self {
15370            MaybeTraitBody::Some(x) => x.as_syntax_node(),
15371            MaybeTraitBody::None(x) => x.as_syntax_node(),
15372        }
15373    }
15374    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15375        MaybeTraitBodyPtr(self.as_syntax_node().stable_ptr(db))
15376    }
15377}
15378impl<'db> MaybeTraitBody<'db> {
15379    /// Checks if a kind of a variant of [MaybeTraitBody].
15380    pub fn is_variant(kind: SyntaxKind) -> bool {
15381        matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15382    }
15383}
15384#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15385pub struct TraitBody<'db> {
15386    node: SyntaxNode<'db>,
15387}
15388impl<'db> TraitBody<'db> {
15389    pub const INDEX_LBRACE: usize = 0;
15390    pub const INDEX_ITEMS: usize = 1;
15391    pub const INDEX_RBRACE: usize = 2;
15392    pub fn new_green(
15393        db: &'db dyn Database,
15394        lbrace: TerminalLBraceGreen<'db>,
15395        items: TraitItemListGreen<'db>,
15396        rbrace: TerminalRBraceGreen<'db>,
15397    ) -> TraitBodyGreen<'db> {
15398        let children = [lbrace.0, items.0, rbrace.0];
15399        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15400        TraitBodyGreen(
15401            GreenNode {
15402                kind: SyntaxKind::TraitBody,
15403                details: GreenNodeDetails::Node { children: children.into(), width },
15404            }
15405            .intern(db),
15406        )
15407    }
15408}
15409impl<'db> TraitBody<'db> {
15410    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
15411        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15412    }
15413    pub fn items(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15414        TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15415    }
15416    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
15417        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15418    }
15419}
15420#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15421pub struct TraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15422impl<'db> TraitBodyPtr<'db> {}
15423impl<'db> TypedStablePtr<'db> for TraitBodyPtr<'db> {
15424    type SyntaxNode = TraitBody<'db>;
15425    fn untyped(self) -> SyntaxStablePtrId<'db> {
15426        self.0
15427    }
15428    fn lookup(&self, db: &'db dyn Database) -> TraitBody<'db> {
15429        TraitBody::from_syntax_node(db, self.0.lookup(db))
15430    }
15431}
15432impl<'db> From<TraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15433    fn from(ptr: TraitBodyPtr<'db>) -> Self {
15434        ptr.untyped()
15435    }
15436}
15437#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15438pub struct TraitBodyGreen<'db>(pub GreenId<'db>);
15439impl<'db> TypedSyntaxNode<'db> for TraitBody<'db> {
15440    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15441    type StablePtr = TraitBodyPtr<'db>;
15442    type Green = TraitBodyGreen<'db>;
15443    fn missing(db: &'db dyn Database) -> Self::Green {
15444        TraitBodyGreen(
15445            GreenNode {
15446                kind: SyntaxKind::TraitBody,
15447                details: GreenNodeDetails::Node {
15448                    children: [
15449                        TerminalLBrace::missing(db).0,
15450                        TraitItemList::missing(db).0,
15451                        TerminalRBrace::missing(db).0,
15452                    ]
15453                    .into(),
15454                    width: TextWidth::default(),
15455                },
15456            }
15457            .intern(db),
15458        )
15459    }
15460    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15461        let kind = node.kind(db);
15462        assert_eq!(
15463            kind,
15464            SyntaxKind::TraitBody,
15465            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15466            kind,
15467            SyntaxKind::TraitBody
15468        );
15469        Self { node }
15470    }
15471    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15472        let kind = node.kind(db);
15473        if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15474    }
15475    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15476        self.node
15477    }
15478    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15479        TraitBodyPtr(self.node.stable_ptr(db))
15480    }
15481}
15482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15483pub struct TraitItemList<'db>(ElementList<'db, TraitItem<'db>, 1>);
15484impl<'db> Deref for TraitItemList<'db> {
15485    type Target = ElementList<'db, TraitItem<'db>, 1>;
15486    fn deref(&self) -> &Self::Target {
15487        &self.0
15488    }
15489}
15490impl<'db> TraitItemList<'db> {
15491    pub fn new_green(
15492        db: &'db dyn Database,
15493        children: &[TraitItemGreen<'db>],
15494    ) -> TraitItemListGreen<'db> {
15495        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
15496        TraitItemListGreen(
15497            GreenNode {
15498                kind: SyntaxKind::TraitItemList,
15499                details: GreenNodeDetails::Node {
15500                    children: children.iter().map(|x| x.0).collect(),
15501                    width,
15502                },
15503            }
15504            .intern(db),
15505        )
15506    }
15507}
15508#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15509pub struct TraitItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
15510impl<'db> TypedStablePtr<'db> for TraitItemListPtr<'db> {
15511    type SyntaxNode = TraitItemList<'db>;
15512    fn untyped(self) -> SyntaxStablePtrId<'db> {
15513        self.0
15514    }
15515    fn lookup(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15516        TraitItemList::from_syntax_node(db, self.0.lookup(db))
15517    }
15518}
15519impl<'db> From<TraitItemListPtr<'db>> for SyntaxStablePtrId<'db> {
15520    fn from(ptr: TraitItemListPtr<'db>) -> Self {
15521        ptr.untyped()
15522    }
15523}
15524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15525pub struct TraitItemListGreen<'db>(pub GreenId<'db>);
15526impl<'db> TypedSyntaxNode<'db> for TraitItemList<'db> {
15527    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15528    type StablePtr = TraitItemListPtr<'db>;
15529    type Green = TraitItemListGreen<'db>;
15530    fn missing(db: &'db dyn Database) -> Self::Green {
15531        TraitItemListGreen(
15532            GreenNode {
15533                kind: SyntaxKind::TraitItemList,
15534                details: GreenNodeDetails::Node {
15535                    children: [].into(),
15536                    width: TextWidth::default(),
15537                },
15538            }
15539            .intern(db),
15540        )
15541    }
15542    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15543        Self(ElementList::new(node))
15544    }
15545    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15546        if node.kind(db) == SyntaxKind::TraitItemList {
15547            Some(Self(ElementList::new(node)))
15548        } else {
15549            None
15550        }
15551    }
15552    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15553        self.node
15554    }
15555    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15556        TraitItemListPtr(self.node.stable_ptr(db))
15557    }
15558}
15559#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15560pub enum TraitItem<'db> {
15561    Function(TraitItemFunction<'db>),
15562    Type(TraitItemType<'db>),
15563    Constant(TraitItemConstant<'db>),
15564    Impl(TraitItemImpl<'db>),
15565    Missing(TraitItemMissing<'db>),
15566}
15567#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15568pub struct TraitItemPtr<'db>(pub SyntaxStablePtrId<'db>);
15569impl<'db> TypedStablePtr<'db> for TraitItemPtr<'db> {
15570    type SyntaxNode = TraitItem<'db>;
15571    fn untyped(self) -> SyntaxStablePtrId<'db> {
15572        self.0
15573    }
15574    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15575        TraitItem::from_syntax_node(db, self.0.lookup(db))
15576    }
15577}
15578impl<'db> From<TraitItemPtr<'db>> for SyntaxStablePtrId<'db> {
15579    fn from(ptr: TraitItemPtr<'db>) -> Self {
15580        ptr.untyped()
15581    }
15582}
15583impl<'db> From<TraitItemFunctionPtr<'db>> for TraitItemPtr<'db> {
15584    fn from(value: TraitItemFunctionPtr<'db>) -> Self {
15585        Self(value.0)
15586    }
15587}
15588impl<'db> From<TraitItemTypePtr<'db>> for TraitItemPtr<'db> {
15589    fn from(value: TraitItemTypePtr<'db>) -> Self {
15590        Self(value.0)
15591    }
15592}
15593impl<'db> From<TraitItemConstantPtr<'db>> for TraitItemPtr<'db> {
15594    fn from(value: TraitItemConstantPtr<'db>) -> Self {
15595        Self(value.0)
15596    }
15597}
15598impl<'db> From<TraitItemImplPtr<'db>> for TraitItemPtr<'db> {
15599    fn from(value: TraitItemImplPtr<'db>) -> Self {
15600        Self(value.0)
15601    }
15602}
15603impl<'db> From<TraitItemMissingPtr<'db>> for TraitItemPtr<'db> {
15604    fn from(value: TraitItemMissingPtr<'db>) -> Self {
15605        Self(value.0)
15606    }
15607}
15608impl<'db> From<TraitItemFunctionGreen<'db>> for TraitItemGreen<'db> {
15609    fn from(value: TraitItemFunctionGreen<'db>) -> Self {
15610        Self(value.0)
15611    }
15612}
15613impl<'db> From<TraitItemTypeGreen<'db>> for TraitItemGreen<'db> {
15614    fn from(value: TraitItemTypeGreen<'db>) -> Self {
15615        Self(value.0)
15616    }
15617}
15618impl<'db> From<TraitItemConstantGreen<'db>> for TraitItemGreen<'db> {
15619    fn from(value: TraitItemConstantGreen<'db>) -> Self {
15620        Self(value.0)
15621    }
15622}
15623impl<'db> From<TraitItemImplGreen<'db>> for TraitItemGreen<'db> {
15624    fn from(value: TraitItemImplGreen<'db>) -> Self {
15625        Self(value.0)
15626    }
15627}
15628impl<'db> From<TraitItemMissingGreen<'db>> for TraitItemGreen<'db> {
15629    fn from(value: TraitItemMissingGreen<'db>) -> Self {
15630        Self(value.0)
15631    }
15632}
15633#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15634pub struct TraitItemGreen<'db>(pub GreenId<'db>);
15635impl<'db> TypedSyntaxNode<'db> for TraitItem<'db> {
15636    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15637    type StablePtr = TraitItemPtr<'db>;
15638    type Green = TraitItemGreen<'db>;
15639    fn missing(db: &'db dyn Database) -> Self::Green {
15640        TraitItemGreen(TraitItemMissing::missing(db).0)
15641    }
15642    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15643        let kind = node.kind(db);
15644        match kind {
15645            SyntaxKind::TraitItemFunction => {
15646                TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15647            }
15648            SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15649            SyntaxKind::TraitItemConstant => {
15650                TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15651            }
15652            SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15653            SyntaxKind::TraitItemMissing => {
15654                TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15655            }
15656            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15657        }
15658    }
15659    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15660        let kind = node.kind(db);
15661        match kind {
15662            SyntaxKind::TraitItemFunction => {
15663                Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15664            }
15665            SyntaxKind::TraitItemType => {
15666                Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15667            }
15668            SyntaxKind::TraitItemConstant => {
15669                Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15670            }
15671            SyntaxKind::TraitItemImpl => {
15672                Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15673            }
15674            SyntaxKind::TraitItemMissing => {
15675                Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15676            }
15677            _ => None,
15678        }
15679    }
15680    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15681        match self {
15682            TraitItem::Function(x) => x.as_syntax_node(),
15683            TraitItem::Type(x) => x.as_syntax_node(),
15684            TraitItem::Constant(x) => x.as_syntax_node(),
15685            TraitItem::Impl(x) => x.as_syntax_node(),
15686            TraitItem::Missing(x) => x.as_syntax_node(),
15687        }
15688    }
15689    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15690        TraitItemPtr(self.as_syntax_node().stable_ptr(db))
15691    }
15692}
15693impl<'db> TraitItem<'db> {
15694    /// Checks if a kind of a variant of [TraitItem].
15695    pub fn is_variant(kind: SyntaxKind) -> bool {
15696        matches!(
15697            kind,
15698            SyntaxKind::TraitItemFunction
15699                | SyntaxKind::TraitItemType
15700                | SyntaxKind::TraitItemConstant
15701                | SyntaxKind::TraitItemImpl
15702                | SyntaxKind::TraitItemMissing
15703        )
15704    }
15705}
15706#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15707pub struct TraitItemMissing<'db> {
15708    node: SyntaxNode<'db>,
15709}
15710impl<'db> TraitItemMissing<'db> {
15711    pub fn new_green(db: &'db dyn Database) -> TraitItemMissingGreen<'db> {
15712        let children = [];
15713        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15714        TraitItemMissingGreen(
15715            GreenNode {
15716                kind: SyntaxKind::TraitItemMissing,
15717                details: GreenNodeDetails::Node { children: children.into(), width },
15718            }
15719            .intern(db),
15720        )
15721    }
15722}
15723impl<'db> TraitItemMissing<'db> {}
15724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15725pub struct TraitItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
15726impl<'db> TraitItemMissingPtr<'db> {}
15727impl<'db> TypedStablePtr<'db> for TraitItemMissingPtr<'db> {
15728    type SyntaxNode = TraitItemMissing<'db>;
15729    fn untyped(self) -> SyntaxStablePtrId<'db> {
15730        self.0
15731    }
15732    fn lookup(&self, db: &'db dyn Database) -> TraitItemMissing<'db> {
15733        TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15734    }
15735}
15736impl<'db> From<TraitItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
15737    fn from(ptr: TraitItemMissingPtr<'db>) -> Self {
15738        ptr.untyped()
15739    }
15740}
15741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15742pub struct TraitItemMissingGreen<'db>(pub GreenId<'db>);
15743impl<'db> TypedSyntaxNode<'db> for TraitItemMissing<'db> {
15744    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15745    type StablePtr = TraitItemMissingPtr<'db>;
15746    type Green = TraitItemMissingGreen<'db>;
15747    fn missing(db: &'db dyn Database) -> Self::Green {
15748        TraitItemMissingGreen(
15749            GreenNode {
15750                kind: SyntaxKind::TraitItemMissing,
15751                details: GreenNodeDetails::Node {
15752                    children: [].into(),
15753                    width: TextWidth::default(),
15754                },
15755            }
15756            .intern(db),
15757        )
15758    }
15759    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15760        let kind = node.kind(db);
15761        assert_eq!(
15762            kind,
15763            SyntaxKind::TraitItemMissing,
15764            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15765            kind,
15766            SyntaxKind::TraitItemMissing
15767        );
15768        Self { node }
15769    }
15770    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15771        let kind = node.kind(db);
15772        if kind == SyntaxKind::TraitItemMissing {
15773            Some(Self::from_syntax_node(db, node))
15774        } else {
15775            None
15776        }
15777    }
15778    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15779        self.node
15780    }
15781    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15782        TraitItemMissingPtr(self.node.stable_ptr(db))
15783    }
15784}
15785#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15786pub struct TraitItemFunction<'db> {
15787    node: SyntaxNode<'db>,
15788}
15789impl<'db> TraitItemFunction<'db> {
15790    pub const INDEX_ATTRIBUTES: usize = 0;
15791    pub const INDEX_DECLARATION: usize = 1;
15792    pub const INDEX_BODY: usize = 2;
15793    pub fn new_green(
15794        db: &'db dyn Database,
15795        attributes: AttributeListGreen<'db>,
15796        declaration: FunctionDeclarationGreen<'db>,
15797        body: MaybeTraitFunctionBodyGreen<'db>,
15798    ) -> TraitItemFunctionGreen<'db> {
15799        let children = [attributes.0, declaration.0, body.0];
15800        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15801        TraitItemFunctionGreen(
15802            GreenNode {
15803                kind: SyntaxKind::TraitItemFunction,
15804                details: GreenNodeDetails::Node { children: children.into(), width },
15805            }
15806            .intern(db),
15807        )
15808    }
15809}
15810impl<'db> TraitItemFunction<'db> {
15811    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15812        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15813    }
15814    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
15815        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15816    }
15817    pub fn body(&self, db: &'db dyn Database) -> MaybeTraitFunctionBody<'db> {
15818        MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15819    }
15820}
15821#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15822pub struct TraitItemFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15823impl<'db> TraitItemFunctionPtr<'db> {
15824    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15825        FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
15826    }
15827}
15828impl<'db> TypedStablePtr<'db> for TraitItemFunctionPtr<'db> {
15829    type SyntaxNode = TraitItemFunction<'db>;
15830    fn untyped(self) -> SyntaxStablePtrId<'db> {
15831        self.0
15832    }
15833    fn lookup(&self, db: &'db dyn Database) -> TraitItemFunction<'db> {
15834        TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15835    }
15836}
15837impl<'db> From<TraitItemFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15838    fn from(ptr: TraitItemFunctionPtr<'db>) -> Self {
15839        ptr.untyped()
15840    }
15841}
15842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15843pub struct TraitItemFunctionGreen<'db>(pub GreenId<'db>);
15844impl<'db> TypedSyntaxNode<'db> for TraitItemFunction<'db> {
15845    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15846    type StablePtr = TraitItemFunctionPtr<'db>;
15847    type Green = TraitItemFunctionGreen<'db>;
15848    fn missing(db: &'db dyn Database) -> Self::Green {
15849        TraitItemFunctionGreen(
15850            GreenNode {
15851                kind: SyntaxKind::TraitItemFunction,
15852                details: GreenNodeDetails::Node {
15853                    children: [
15854                        AttributeList::missing(db).0,
15855                        FunctionDeclaration::missing(db).0,
15856                        MaybeTraitFunctionBody::missing(db).0,
15857                    ]
15858                    .into(),
15859                    width: TextWidth::default(),
15860                },
15861            }
15862            .intern(db),
15863        )
15864    }
15865    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15866        let kind = node.kind(db);
15867        assert_eq!(
15868            kind,
15869            SyntaxKind::TraitItemFunction,
15870            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15871            kind,
15872            SyntaxKind::TraitItemFunction
15873        );
15874        Self { node }
15875    }
15876    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15877        let kind = node.kind(db);
15878        if kind == SyntaxKind::TraitItemFunction {
15879            Some(Self::from_syntax_node(db, node))
15880        } else {
15881            None
15882        }
15883    }
15884    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15885        self.node
15886    }
15887    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15888        TraitItemFunctionPtr(self.node.stable_ptr(db))
15889    }
15890}
15891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15892pub struct TraitItemType<'db> {
15893    node: SyntaxNode<'db>,
15894}
15895impl<'db> TraitItemType<'db> {
15896    pub const INDEX_ATTRIBUTES: usize = 0;
15897    pub const INDEX_TYPE_KW: usize = 1;
15898    pub const INDEX_NAME: usize = 2;
15899    pub const INDEX_GENERIC_PARAMS: usize = 3;
15900    pub const INDEX_SEMICOLON: usize = 4;
15901    pub fn new_green(
15902        db: &'db dyn Database,
15903        attributes: AttributeListGreen<'db>,
15904        type_kw: TerminalTypeGreen<'db>,
15905        name: TerminalIdentifierGreen<'db>,
15906        generic_params: OptionWrappedGenericParamListGreen<'db>,
15907        semicolon: TerminalSemicolonGreen<'db>,
15908    ) -> TraitItemTypeGreen<'db> {
15909        let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
15910        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15911        TraitItemTypeGreen(
15912            GreenNode {
15913                kind: SyntaxKind::TraitItemType,
15914                details: GreenNodeDetails::Node { children: children.into(), width },
15915            }
15916            .intern(db),
15917        )
15918    }
15919}
15920impl<'db> TraitItemType<'db> {
15921    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15922        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15923    }
15924    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15925        TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
15926    }
15927    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15928        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15929    }
15930    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15931        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
15932    }
15933    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15934        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15935    }
15936}
15937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15938pub struct TraitItemTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15939impl<'db> TraitItemTypePtr<'db> {
15940    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15941        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15942    }
15943}
15944impl<'db> TypedStablePtr<'db> for TraitItemTypePtr<'db> {
15945    type SyntaxNode = TraitItemType<'db>;
15946    fn untyped(self) -> SyntaxStablePtrId<'db> {
15947        self.0
15948    }
15949    fn lookup(&self, db: &'db dyn Database) -> TraitItemType<'db> {
15950        TraitItemType::from_syntax_node(db, self.0.lookup(db))
15951    }
15952}
15953impl<'db> From<TraitItemTypePtr<'db>> for SyntaxStablePtrId<'db> {
15954    fn from(ptr: TraitItemTypePtr<'db>) -> Self {
15955        ptr.untyped()
15956    }
15957}
15958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15959pub struct TraitItemTypeGreen<'db>(pub GreenId<'db>);
15960impl<'db> TypedSyntaxNode<'db> for TraitItemType<'db> {
15961    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
15962    type StablePtr = TraitItemTypePtr<'db>;
15963    type Green = TraitItemTypeGreen<'db>;
15964    fn missing(db: &'db dyn Database) -> Self::Green {
15965        TraitItemTypeGreen(
15966            GreenNode {
15967                kind: SyntaxKind::TraitItemType,
15968                details: GreenNodeDetails::Node {
15969                    children: [
15970                        AttributeList::missing(db).0,
15971                        TerminalType::missing(db).0,
15972                        TerminalIdentifier::missing(db).0,
15973                        OptionWrappedGenericParamList::missing(db).0,
15974                        TerminalSemicolon::missing(db).0,
15975                    ]
15976                    .into(),
15977                    width: TextWidth::default(),
15978                },
15979            }
15980            .intern(db),
15981        )
15982    }
15983    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15984        let kind = node.kind(db);
15985        assert_eq!(
15986            kind,
15987            SyntaxKind::TraitItemType,
15988            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15989            kind,
15990            SyntaxKind::TraitItemType
15991        );
15992        Self { node }
15993    }
15994    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15995        let kind = node.kind(db);
15996        if kind == SyntaxKind::TraitItemType {
15997            Some(Self::from_syntax_node(db, node))
15998        } else {
15999            None
16000        }
16001    }
16002    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16003        self.node
16004    }
16005    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16006        TraitItemTypePtr(self.node.stable_ptr(db))
16007    }
16008}
16009#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16010pub struct TraitItemConstant<'db> {
16011    node: SyntaxNode<'db>,
16012}
16013impl<'db> TraitItemConstant<'db> {
16014    pub const INDEX_ATTRIBUTES: usize = 0;
16015    pub const INDEX_CONST_KW: usize = 1;
16016    pub const INDEX_NAME: usize = 2;
16017    pub const INDEX_TYPE_CLAUSE: usize = 3;
16018    pub const INDEX_SEMICOLON: usize = 4;
16019    pub fn new_green(
16020        db: &'db dyn Database,
16021        attributes: AttributeListGreen<'db>,
16022        const_kw: TerminalConstGreen<'db>,
16023        name: TerminalIdentifierGreen<'db>,
16024        type_clause: TypeClauseGreen<'db>,
16025        semicolon: TerminalSemicolonGreen<'db>,
16026    ) -> TraitItemConstantGreen<'db> {
16027        let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16028        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16029        TraitItemConstantGreen(
16030            GreenNode {
16031                kind: SyntaxKind::TraitItemConstant,
16032                details: GreenNodeDetails::Node { children: children.into(), width },
16033            }
16034            .intern(db),
16035        )
16036    }
16037}
16038impl<'db> TraitItemConstant<'db> {
16039    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16040        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16041    }
16042    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
16043        TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
16044    }
16045    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16046        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16047    }
16048    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
16049        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
16050    }
16051    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16052        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
16053    }
16054}
16055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16056pub struct TraitItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
16057impl<'db> TraitItemConstantPtr<'db> {
16058    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16059        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16060    }
16061}
16062impl<'db> TypedStablePtr<'db> for TraitItemConstantPtr<'db> {
16063    type SyntaxNode = TraitItemConstant<'db>;
16064    fn untyped(self) -> SyntaxStablePtrId<'db> {
16065        self.0
16066    }
16067    fn lookup(&self, db: &'db dyn Database) -> TraitItemConstant<'db> {
16068        TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16069    }
16070}
16071impl<'db> From<TraitItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
16072    fn from(ptr: TraitItemConstantPtr<'db>) -> Self {
16073        ptr.untyped()
16074    }
16075}
16076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16077pub struct TraitItemConstantGreen<'db>(pub GreenId<'db>);
16078impl<'db> TypedSyntaxNode<'db> for TraitItemConstant<'db> {
16079    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16080    type StablePtr = TraitItemConstantPtr<'db>;
16081    type Green = TraitItemConstantGreen<'db>;
16082    fn missing(db: &'db dyn Database) -> Self::Green {
16083        TraitItemConstantGreen(
16084            GreenNode {
16085                kind: SyntaxKind::TraitItemConstant,
16086                details: GreenNodeDetails::Node {
16087                    children: [
16088                        AttributeList::missing(db).0,
16089                        TerminalConst::missing(db).0,
16090                        TerminalIdentifier::missing(db).0,
16091                        TypeClause::missing(db).0,
16092                        TerminalSemicolon::missing(db).0,
16093                    ]
16094                    .into(),
16095                    width: TextWidth::default(),
16096                },
16097            }
16098            .intern(db),
16099        )
16100    }
16101    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16102        let kind = node.kind(db);
16103        assert_eq!(
16104            kind,
16105            SyntaxKind::TraitItemConstant,
16106            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16107            kind,
16108            SyntaxKind::TraitItemConstant
16109        );
16110        Self { node }
16111    }
16112    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16113        let kind = node.kind(db);
16114        if kind == SyntaxKind::TraitItemConstant {
16115            Some(Self::from_syntax_node(db, node))
16116        } else {
16117            None
16118        }
16119    }
16120    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16121        self.node
16122    }
16123    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16124        TraitItemConstantPtr(self.node.stable_ptr(db))
16125    }
16126}
16127#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16128pub struct TraitItemImpl<'db> {
16129    node: SyntaxNode<'db>,
16130}
16131impl<'db> TraitItemImpl<'db> {
16132    pub const INDEX_ATTRIBUTES: usize = 0;
16133    pub const INDEX_IMPL_KW: usize = 1;
16134    pub const INDEX_NAME: usize = 2;
16135    pub const INDEX_COLON: usize = 3;
16136    pub const INDEX_TRAIT_PATH: usize = 4;
16137    pub const INDEX_SEMICOLON: usize = 5;
16138    pub fn new_green(
16139        db: &'db dyn Database,
16140        attributes: AttributeListGreen<'db>,
16141        impl_kw: TerminalImplGreen<'db>,
16142        name: TerminalIdentifierGreen<'db>,
16143        colon: TerminalColonGreen<'db>,
16144        trait_path: ExprPathGreen<'db>,
16145        semicolon: TerminalSemicolonGreen<'db>,
16146    ) -> TraitItemImplGreen<'db> {
16147        let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16148        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16149        TraitItemImplGreen(
16150            GreenNode {
16151                kind: SyntaxKind::TraitItemImpl,
16152                details: GreenNodeDetails::Node { children: children.into(), width },
16153            }
16154            .intern(db),
16155        )
16156    }
16157}
16158impl<'db> TraitItemImpl<'db> {
16159    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16160        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16161    }
16162    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16163        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16164    }
16165    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16166        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16167    }
16168    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
16169        TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16170    }
16171    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16172        ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16173    }
16174    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16175        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16176    }
16177}
16178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16179pub struct TraitItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16180impl<'db> TraitItemImplPtr<'db> {
16181    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16182        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16183    }
16184}
16185impl<'db> TypedStablePtr<'db> for TraitItemImplPtr<'db> {
16186    type SyntaxNode = TraitItemImpl<'db>;
16187    fn untyped(self) -> SyntaxStablePtrId<'db> {
16188        self.0
16189    }
16190    fn lookup(&self, db: &'db dyn Database) -> TraitItemImpl<'db> {
16191        TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16192    }
16193}
16194impl<'db> From<TraitItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16195    fn from(ptr: TraitItemImplPtr<'db>) -> Self {
16196        ptr.untyped()
16197    }
16198}
16199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16200pub struct TraitItemImplGreen<'db>(pub GreenId<'db>);
16201impl<'db> TypedSyntaxNode<'db> for TraitItemImpl<'db> {
16202    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16203    type StablePtr = TraitItemImplPtr<'db>;
16204    type Green = TraitItemImplGreen<'db>;
16205    fn missing(db: &'db dyn Database) -> Self::Green {
16206        TraitItemImplGreen(
16207            GreenNode {
16208                kind: SyntaxKind::TraitItemImpl,
16209                details: GreenNodeDetails::Node {
16210                    children: [
16211                        AttributeList::missing(db).0,
16212                        TerminalImpl::missing(db).0,
16213                        TerminalIdentifier::missing(db).0,
16214                        TerminalColon::missing(db).0,
16215                        ExprPath::missing(db).0,
16216                        TerminalSemicolon::missing(db).0,
16217                    ]
16218                    .into(),
16219                    width: TextWidth::default(),
16220                },
16221            }
16222            .intern(db),
16223        )
16224    }
16225    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16226        let kind = node.kind(db);
16227        assert_eq!(
16228            kind,
16229            SyntaxKind::TraitItemImpl,
16230            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16231            kind,
16232            SyntaxKind::TraitItemImpl
16233        );
16234        Self { node }
16235    }
16236    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16237        let kind = node.kind(db);
16238        if kind == SyntaxKind::TraitItemImpl {
16239            Some(Self::from_syntax_node(db, node))
16240        } else {
16241            None
16242        }
16243    }
16244    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16245        self.node
16246    }
16247    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16248        TraitItemImplPtr(self.node.stable_ptr(db))
16249    }
16250}
16251#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16252pub enum MaybeTraitFunctionBody<'db> {
16253    Some(ExprBlock<'db>),
16254    None(TerminalSemicolon<'db>),
16255}
16256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16257pub struct MaybeTraitFunctionBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16258impl<'db> TypedStablePtr<'db> for MaybeTraitFunctionBodyPtr<'db> {
16259    type SyntaxNode = MaybeTraitFunctionBody<'db>;
16260    fn untyped(self) -> SyntaxStablePtrId<'db> {
16261        self.0
16262    }
16263    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16264        MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16265    }
16266}
16267impl<'db> From<MaybeTraitFunctionBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16268    fn from(ptr: MaybeTraitFunctionBodyPtr<'db>) -> Self {
16269        ptr.untyped()
16270    }
16271}
16272impl<'db> From<ExprBlockPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16273    fn from(value: ExprBlockPtr<'db>) -> Self {
16274        Self(value.0)
16275    }
16276}
16277impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16278    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16279        Self(value.0)
16280    }
16281}
16282impl<'db> From<ExprBlockGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16283    fn from(value: ExprBlockGreen<'db>) -> Self {
16284        Self(value.0)
16285    }
16286}
16287impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16288    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16289        Self(value.0)
16290    }
16291}
16292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16293pub struct MaybeTraitFunctionBodyGreen<'db>(pub GreenId<'db>);
16294impl<'db> TypedSyntaxNode<'db> for MaybeTraitFunctionBody<'db> {
16295    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16296    type StablePtr = MaybeTraitFunctionBodyPtr<'db>;
16297    type Green = MaybeTraitFunctionBodyGreen<'db>;
16298    fn missing(db: &'db dyn Database) -> Self::Green {
16299        panic!("No missing variant.");
16300    }
16301    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16302        let kind = node.kind(db);
16303        match kind {
16304            SyntaxKind::ExprBlock => {
16305                MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16306            }
16307            SyntaxKind::TerminalSemicolon => {
16308                MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16309            }
16310            _ => panic!(
16311                "Unexpected syntax kind {:?} when constructing {}.",
16312                kind, "MaybeTraitFunctionBody"
16313            ),
16314        }
16315    }
16316    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16317        let kind = node.kind(db);
16318        match kind {
16319            SyntaxKind::ExprBlock => {
16320                Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16321            }
16322            SyntaxKind::TerminalSemicolon => {
16323                Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16324            }
16325            _ => None,
16326        }
16327    }
16328    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16329        match self {
16330            MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16331            MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16332        }
16333    }
16334    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16335        MaybeTraitFunctionBodyPtr(self.as_syntax_node().stable_ptr(db))
16336    }
16337}
16338impl<'db> MaybeTraitFunctionBody<'db> {
16339    /// Checks if a kind of a variant of [MaybeTraitFunctionBody].
16340    pub fn is_variant(kind: SyntaxKind) -> bool {
16341        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16342    }
16343}
16344#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16345pub struct ItemImpl<'db> {
16346    node: SyntaxNode<'db>,
16347}
16348impl<'db> ItemImpl<'db> {
16349    pub const INDEX_ATTRIBUTES: usize = 0;
16350    pub const INDEX_VISIBILITY: usize = 1;
16351    pub const INDEX_IMPL_KW: usize = 2;
16352    pub const INDEX_NAME: usize = 3;
16353    pub const INDEX_GENERIC_PARAMS: usize = 4;
16354    pub const INDEX_OF_KW: usize = 5;
16355    pub const INDEX_TRAIT_PATH: usize = 6;
16356    pub const INDEX_BODY: usize = 7;
16357    pub fn new_green(
16358        db: &'db dyn Database,
16359        attributes: AttributeListGreen<'db>,
16360        visibility: VisibilityGreen<'db>,
16361        impl_kw: TerminalImplGreen<'db>,
16362        name: TerminalIdentifierGreen<'db>,
16363        generic_params: OptionWrappedGenericParamListGreen<'db>,
16364        of_kw: TerminalOfGreen<'db>,
16365        trait_path: ExprPathGreen<'db>,
16366        body: MaybeImplBodyGreen<'db>,
16367    ) -> ItemImplGreen<'db> {
16368        let children = [
16369            attributes.0,
16370            visibility.0,
16371            impl_kw.0,
16372            name.0,
16373            generic_params.0,
16374            of_kw.0,
16375            trait_path.0,
16376            body.0,
16377        ];
16378        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16379        ItemImplGreen(
16380            GreenNode {
16381                kind: SyntaxKind::ItemImpl,
16382                details: GreenNodeDetails::Node { children: children.into(), width },
16383            }
16384            .intern(db),
16385        )
16386    }
16387}
16388impl<'db> ItemImpl<'db> {
16389    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16390        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16391    }
16392    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
16393        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16394    }
16395    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16396        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16397    }
16398    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16399        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16400    }
16401    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
16402        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16403    }
16404    pub fn of_kw(&self, db: &'db dyn Database) -> TerminalOf<'db> {
16405        TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16406    }
16407    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16408        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16409    }
16410    pub fn body(&self, db: &'db dyn Database) -> MaybeImplBody<'db> {
16411        MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16412    }
16413}
16414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16415pub struct ItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16416impl<'db> ItemImplPtr<'db> {
16417    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16418        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16419    }
16420}
16421impl<'db> TypedStablePtr<'db> for ItemImplPtr<'db> {
16422    type SyntaxNode = ItemImpl<'db>;
16423    fn untyped(self) -> SyntaxStablePtrId<'db> {
16424        self.0
16425    }
16426    fn lookup(&self, db: &'db dyn Database) -> ItemImpl<'db> {
16427        ItemImpl::from_syntax_node(db, self.0.lookup(db))
16428    }
16429}
16430impl<'db> From<ItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16431    fn from(ptr: ItemImplPtr<'db>) -> Self {
16432        ptr.untyped()
16433    }
16434}
16435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16436pub struct ItemImplGreen<'db>(pub GreenId<'db>);
16437impl<'db> TypedSyntaxNode<'db> for ItemImpl<'db> {
16438    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16439    type StablePtr = ItemImplPtr<'db>;
16440    type Green = ItemImplGreen<'db>;
16441    fn missing(db: &'db dyn Database) -> Self::Green {
16442        ItemImplGreen(
16443            GreenNode {
16444                kind: SyntaxKind::ItemImpl,
16445                details: GreenNodeDetails::Node {
16446                    children: [
16447                        AttributeList::missing(db).0,
16448                        Visibility::missing(db).0,
16449                        TerminalImpl::missing(db).0,
16450                        TerminalIdentifier::missing(db).0,
16451                        OptionWrappedGenericParamList::missing(db).0,
16452                        TerminalOf::missing(db).0,
16453                        ExprPath::missing(db).0,
16454                        MaybeImplBody::missing(db).0,
16455                    ]
16456                    .into(),
16457                    width: TextWidth::default(),
16458                },
16459            }
16460            .intern(db),
16461        )
16462    }
16463    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16464        let kind = node.kind(db);
16465        assert_eq!(
16466            kind,
16467            SyntaxKind::ItemImpl,
16468            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16469            kind,
16470            SyntaxKind::ItemImpl
16471        );
16472        Self { node }
16473    }
16474    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16475        let kind = node.kind(db);
16476        if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16477    }
16478    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16479        self.node
16480    }
16481    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16482        ItemImplPtr(self.node.stable_ptr(db))
16483    }
16484}
16485#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16486pub struct ItemHeaderDoc<'db> {
16487    node: SyntaxNode<'db>,
16488}
16489impl<'db> ItemHeaderDoc<'db> {
16490    pub const INDEX_EMPTY: usize = 0;
16491    pub fn new_green(
16492        db: &'db dyn Database,
16493        empty: TerminalEmptyGreen<'db>,
16494    ) -> ItemHeaderDocGreen<'db> {
16495        let children = [empty.0];
16496        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16497        ItemHeaderDocGreen(
16498            GreenNode {
16499                kind: SyntaxKind::ItemHeaderDoc,
16500                details: GreenNodeDetails::Node { children: children.into(), width },
16501            }
16502            .intern(db),
16503        )
16504    }
16505}
16506impl<'db> ItemHeaderDoc<'db> {
16507    pub fn empty(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
16508        TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16509    }
16510}
16511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16512pub struct ItemHeaderDocPtr<'db>(pub SyntaxStablePtrId<'db>);
16513impl<'db> ItemHeaderDocPtr<'db> {}
16514impl<'db> TypedStablePtr<'db> for ItemHeaderDocPtr<'db> {
16515    type SyntaxNode = ItemHeaderDoc<'db>;
16516    fn untyped(self) -> SyntaxStablePtrId<'db> {
16517        self.0
16518    }
16519    fn lookup(&self, db: &'db dyn Database) -> ItemHeaderDoc<'db> {
16520        ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16521    }
16522}
16523impl<'db> From<ItemHeaderDocPtr<'db>> for SyntaxStablePtrId<'db> {
16524    fn from(ptr: ItemHeaderDocPtr<'db>) -> Self {
16525        ptr.untyped()
16526    }
16527}
16528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16529pub struct ItemHeaderDocGreen<'db>(pub GreenId<'db>);
16530impl<'db> TypedSyntaxNode<'db> for ItemHeaderDoc<'db> {
16531    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16532    type StablePtr = ItemHeaderDocPtr<'db>;
16533    type Green = ItemHeaderDocGreen<'db>;
16534    fn missing(db: &'db dyn Database) -> Self::Green {
16535        ItemHeaderDocGreen(
16536            GreenNode {
16537                kind: SyntaxKind::ItemHeaderDoc,
16538                details: GreenNodeDetails::Node {
16539                    children: [TerminalEmpty::missing(db).0].into(),
16540                    width: TextWidth::default(),
16541                },
16542            }
16543            .intern(db),
16544        )
16545    }
16546    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16547        let kind = node.kind(db);
16548        assert_eq!(
16549            kind,
16550            SyntaxKind::ItemHeaderDoc,
16551            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16552            kind,
16553            SyntaxKind::ItemHeaderDoc
16554        );
16555        Self { node }
16556    }
16557    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16558        let kind = node.kind(db);
16559        if kind == SyntaxKind::ItemHeaderDoc {
16560            Some(Self::from_syntax_node(db, node))
16561        } else {
16562            None
16563        }
16564    }
16565    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16566        self.node
16567    }
16568    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16569        ItemHeaderDocPtr(self.node.stable_ptr(db))
16570    }
16571}
16572#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16573pub enum MaybeImplBody<'db> {
16574    Some(ImplBody<'db>),
16575    None(TerminalSemicolon<'db>),
16576}
16577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16578pub struct MaybeImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16579impl<'db> TypedStablePtr<'db> for MaybeImplBodyPtr<'db> {
16580    type SyntaxNode = MaybeImplBody<'db>;
16581    fn untyped(self) -> SyntaxStablePtrId<'db> {
16582        self.0
16583    }
16584    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16585        MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16586    }
16587}
16588impl<'db> From<MaybeImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16589    fn from(ptr: MaybeImplBodyPtr<'db>) -> Self {
16590        ptr.untyped()
16591    }
16592}
16593impl<'db> From<ImplBodyPtr<'db>> for MaybeImplBodyPtr<'db> {
16594    fn from(value: ImplBodyPtr<'db>) -> Self {
16595        Self(value.0)
16596    }
16597}
16598impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeImplBodyPtr<'db> {
16599    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16600        Self(value.0)
16601    }
16602}
16603impl<'db> From<ImplBodyGreen<'db>> for MaybeImplBodyGreen<'db> {
16604    fn from(value: ImplBodyGreen<'db>) -> Self {
16605        Self(value.0)
16606    }
16607}
16608impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeImplBodyGreen<'db> {
16609    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16610        Self(value.0)
16611    }
16612}
16613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16614pub struct MaybeImplBodyGreen<'db>(pub GreenId<'db>);
16615impl<'db> TypedSyntaxNode<'db> for MaybeImplBody<'db> {
16616    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16617    type StablePtr = MaybeImplBodyPtr<'db>;
16618    type Green = MaybeImplBodyGreen<'db>;
16619    fn missing(db: &'db dyn Database) -> Self::Green {
16620        panic!("No missing variant.");
16621    }
16622    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16623        let kind = node.kind(db);
16624        match kind {
16625            SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16626            SyntaxKind::TerminalSemicolon => {
16627                MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16628            }
16629            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16630        }
16631    }
16632    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16633        let kind = node.kind(db);
16634        match kind {
16635            SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16636            SyntaxKind::TerminalSemicolon => {
16637                Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16638            }
16639            _ => None,
16640        }
16641    }
16642    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16643        match self {
16644            MaybeImplBody::Some(x) => x.as_syntax_node(),
16645            MaybeImplBody::None(x) => x.as_syntax_node(),
16646        }
16647    }
16648    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16649        MaybeImplBodyPtr(self.as_syntax_node().stable_ptr(db))
16650    }
16651}
16652impl<'db> MaybeImplBody<'db> {
16653    /// Checks if a kind of a variant of [MaybeImplBody].
16654    pub fn is_variant(kind: SyntaxKind) -> bool {
16655        matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16656    }
16657}
16658#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16659pub struct ImplBody<'db> {
16660    node: SyntaxNode<'db>,
16661}
16662impl<'db> ImplBody<'db> {
16663    pub const INDEX_LBRACE: usize = 0;
16664    pub const INDEX_ITEMS: usize = 1;
16665    pub const INDEX_RBRACE: usize = 2;
16666    pub fn new_green(
16667        db: &'db dyn Database,
16668        lbrace: TerminalLBraceGreen<'db>,
16669        items: ImplItemListGreen<'db>,
16670        rbrace: TerminalRBraceGreen<'db>,
16671    ) -> ImplBodyGreen<'db> {
16672        let children = [lbrace.0, items.0, rbrace.0];
16673        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16674        ImplBodyGreen(
16675            GreenNode {
16676                kind: SyntaxKind::ImplBody,
16677                details: GreenNodeDetails::Node { children: children.into(), width },
16678            }
16679            .intern(db),
16680        )
16681    }
16682}
16683impl<'db> ImplBody<'db> {
16684    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
16685        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16686    }
16687    pub fn items(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16688        ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16689    }
16690    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
16691        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16692    }
16693}
16694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16695pub struct ImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16696impl<'db> ImplBodyPtr<'db> {}
16697impl<'db> TypedStablePtr<'db> for ImplBodyPtr<'db> {
16698    type SyntaxNode = ImplBody<'db>;
16699    fn untyped(self) -> SyntaxStablePtrId<'db> {
16700        self.0
16701    }
16702    fn lookup(&self, db: &'db dyn Database) -> ImplBody<'db> {
16703        ImplBody::from_syntax_node(db, self.0.lookup(db))
16704    }
16705}
16706impl<'db> From<ImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16707    fn from(ptr: ImplBodyPtr<'db>) -> Self {
16708        ptr.untyped()
16709    }
16710}
16711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16712pub struct ImplBodyGreen<'db>(pub GreenId<'db>);
16713impl<'db> TypedSyntaxNode<'db> for ImplBody<'db> {
16714    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16715    type StablePtr = ImplBodyPtr<'db>;
16716    type Green = ImplBodyGreen<'db>;
16717    fn missing(db: &'db dyn Database) -> Self::Green {
16718        ImplBodyGreen(
16719            GreenNode {
16720                kind: SyntaxKind::ImplBody,
16721                details: GreenNodeDetails::Node {
16722                    children: [
16723                        TerminalLBrace::missing(db).0,
16724                        ImplItemList::missing(db).0,
16725                        TerminalRBrace::missing(db).0,
16726                    ]
16727                    .into(),
16728                    width: TextWidth::default(),
16729                },
16730            }
16731            .intern(db),
16732        )
16733    }
16734    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16735        let kind = node.kind(db);
16736        assert_eq!(
16737            kind,
16738            SyntaxKind::ImplBody,
16739            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16740            kind,
16741            SyntaxKind::ImplBody
16742        );
16743        Self { node }
16744    }
16745    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16746        let kind = node.kind(db);
16747        if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16748    }
16749    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16750        self.node
16751    }
16752    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16753        ImplBodyPtr(self.node.stable_ptr(db))
16754    }
16755}
16756#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16757pub struct ImplItemList<'db>(ElementList<'db, ImplItem<'db>, 1>);
16758impl<'db> Deref for ImplItemList<'db> {
16759    type Target = ElementList<'db, ImplItem<'db>, 1>;
16760    fn deref(&self) -> &Self::Target {
16761        &self.0
16762    }
16763}
16764impl<'db> ImplItemList<'db> {
16765    pub fn new_green(
16766        db: &'db dyn Database,
16767        children: &[ImplItemGreen<'db>],
16768    ) -> ImplItemListGreen<'db> {
16769        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
16770        ImplItemListGreen(
16771            GreenNode {
16772                kind: SyntaxKind::ImplItemList,
16773                details: GreenNodeDetails::Node {
16774                    children: children.iter().map(|x| x.0).collect(),
16775                    width,
16776                },
16777            }
16778            .intern(db),
16779        )
16780    }
16781}
16782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16783pub struct ImplItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
16784impl<'db> TypedStablePtr<'db> for ImplItemListPtr<'db> {
16785    type SyntaxNode = ImplItemList<'db>;
16786    fn untyped(self) -> SyntaxStablePtrId<'db> {
16787        self.0
16788    }
16789    fn lookup(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16790        ImplItemList::from_syntax_node(db, self.0.lookup(db))
16791    }
16792}
16793impl<'db> From<ImplItemListPtr<'db>> for SyntaxStablePtrId<'db> {
16794    fn from(ptr: ImplItemListPtr<'db>) -> Self {
16795        ptr.untyped()
16796    }
16797}
16798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16799pub struct ImplItemListGreen<'db>(pub GreenId<'db>);
16800impl<'db> TypedSyntaxNode<'db> for ImplItemList<'db> {
16801    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16802    type StablePtr = ImplItemListPtr<'db>;
16803    type Green = ImplItemListGreen<'db>;
16804    fn missing(db: &'db dyn Database) -> Self::Green {
16805        ImplItemListGreen(
16806            GreenNode {
16807                kind: SyntaxKind::ImplItemList,
16808                details: GreenNodeDetails::Node {
16809                    children: [].into(),
16810                    width: TextWidth::default(),
16811                },
16812            }
16813            .intern(db),
16814        )
16815    }
16816    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16817        Self(ElementList::new(node))
16818    }
16819    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16820        if node.kind(db) == SyntaxKind::ImplItemList {
16821            Some(Self(ElementList::new(node)))
16822        } else {
16823            None
16824        }
16825    }
16826    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16827        self.node
16828    }
16829    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16830        ImplItemListPtr(self.node.stable_ptr(db))
16831    }
16832}
16833#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16834pub enum ImplItem<'db> {
16835    Function(FunctionWithBody<'db>),
16836    Type(ItemTypeAlias<'db>),
16837    Constant(ItemConstant<'db>),
16838    Impl(ItemImplAlias<'db>),
16839    Module(ItemModule<'db>),
16840    Use(ItemUse<'db>),
16841    ExternFunction(ItemExternFunction<'db>),
16842    ExternType(ItemExternType<'db>),
16843    Trait(ItemTrait<'db>),
16844    Struct(ItemStruct<'db>),
16845    Enum(ItemEnum<'db>),
16846    Missing(ImplItemMissing<'db>),
16847}
16848#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16849pub struct ImplItemPtr<'db>(pub SyntaxStablePtrId<'db>);
16850impl<'db> TypedStablePtr<'db> for ImplItemPtr<'db> {
16851    type SyntaxNode = ImplItem<'db>;
16852    fn untyped(self) -> SyntaxStablePtrId<'db> {
16853        self.0
16854    }
16855    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16856        ImplItem::from_syntax_node(db, self.0.lookup(db))
16857    }
16858}
16859impl<'db> From<ImplItemPtr<'db>> for SyntaxStablePtrId<'db> {
16860    fn from(ptr: ImplItemPtr<'db>) -> Self {
16861        ptr.untyped()
16862    }
16863}
16864impl<'db> From<FunctionWithBodyPtr<'db>> for ImplItemPtr<'db> {
16865    fn from(value: FunctionWithBodyPtr<'db>) -> Self {
16866        Self(value.0)
16867    }
16868}
16869impl<'db> From<ItemTypeAliasPtr<'db>> for ImplItemPtr<'db> {
16870    fn from(value: ItemTypeAliasPtr<'db>) -> Self {
16871        Self(value.0)
16872    }
16873}
16874impl<'db> From<ItemConstantPtr<'db>> for ImplItemPtr<'db> {
16875    fn from(value: ItemConstantPtr<'db>) -> Self {
16876        Self(value.0)
16877    }
16878}
16879impl<'db> From<ItemImplAliasPtr<'db>> for ImplItemPtr<'db> {
16880    fn from(value: ItemImplAliasPtr<'db>) -> Self {
16881        Self(value.0)
16882    }
16883}
16884impl<'db> From<ItemModulePtr<'db>> for ImplItemPtr<'db> {
16885    fn from(value: ItemModulePtr<'db>) -> Self {
16886        Self(value.0)
16887    }
16888}
16889impl<'db> From<ItemUsePtr<'db>> for ImplItemPtr<'db> {
16890    fn from(value: ItemUsePtr<'db>) -> Self {
16891        Self(value.0)
16892    }
16893}
16894impl<'db> From<ItemExternFunctionPtr<'db>> for ImplItemPtr<'db> {
16895    fn from(value: ItemExternFunctionPtr<'db>) -> Self {
16896        Self(value.0)
16897    }
16898}
16899impl<'db> From<ItemExternTypePtr<'db>> for ImplItemPtr<'db> {
16900    fn from(value: ItemExternTypePtr<'db>) -> Self {
16901        Self(value.0)
16902    }
16903}
16904impl<'db> From<ItemTraitPtr<'db>> for ImplItemPtr<'db> {
16905    fn from(value: ItemTraitPtr<'db>) -> Self {
16906        Self(value.0)
16907    }
16908}
16909impl<'db> From<ItemStructPtr<'db>> for ImplItemPtr<'db> {
16910    fn from(value: ItemStructPtr<'db>) -> Self {
16911        Self(value.0)
16912    }
16913}
16914impl<'db> From<ItemEnumPtr<'db>> for ImplItemPtr<'db> {
16915    fn from(value: ItemEnumPtr<'db>) -> Self {
16916        Self(value.0)
16917    }
16918}
16919impl<'db> From<ImplItemMissingPtr<'db>> for ImplItemPtr<'db> {
16920    fn from(value: ImplItemMissingPtr<'db>) -> Self {
16921        Self(value.0)
16922    }
16923}
16924impl<'db> From<FunctionWithBodyGreen<'db>> for ImplItemGreen<'db> {
16925    fn from(value: FunctionWithBodyGreen<'db>) -> Self {
16926        Self(value.0)
16927    }
16928}
16929impl<'db> From<ItemTypeAliasGreen<'db>> for ImplItemGreen<'db> {
16930    fn from(value: ItemTypeAliasGreen<'db>) -> Self {
16931        Self(value.0)
16932    }
16933}
16934impl<'db> From<ItemConstantGreen<'db>> for ImplItemGreen<'db> {
16935    fn from(value: ItemConstantGreen<'db>) -> Self {
16936        Self(value.0)
16937    }
16938}
16939impl<'db> From<ItemImplAliasGreen<'db>> for ImplItemGreen<'db> {
16940    fn from(value: ItemImplAliasGreen<'db>) -> Self {
16941        Self(value.0)
16942    }
16943}
16944impl<'db> From<ItemModuleGreen<'db>> for ImplItemGreen<'db> {
16945    fn from(value: ItemModuleGreen<'db>) -> Self {
16946        Self(value.0)
16947    }
16948}
16949impl<'db> From<ItemUseGreen<'db>> for ImplItemGreen<'db> {
16950    fn from(value: ItemUseGreen<'db>) -> Self {
16951        Self(value.0)
16952    }
16953}
16954impl<'db> From<ItemExternFunctionGreen<'db>> for ImplItemGreen<'db> {
16955    fn from(value: ItemExternFunctionGreen<'db>) -> Self {
16956        Self(value.0)
16957    }
16958}
16959impl<'db> From<ItemExternTypeGreen<'db>> for ImplItemGreen<'db> {
16960    fn from(value: ItemExternTypeGreen<'db>) -> Self {
16961        Self(value.0)
16962    }
16963}
16964impl<'db> From<ItemTraitGreen<'db>> for ImplItemGreen<'db> {
16965    fn from(value: ItemTraitGreen<'db>) -> Self {
16966        Self(value.0)
16967    }
16968}
16969impl<'db> From<ItemStructGreen<'db>> for ImplItemGreen<'db> {
16970    fn from(value: ItemStructGreen<'db>) -> Self {
16971        Self(value.0)
16972    }
16973}
16974impl<'db> From<ItemEnumGreen<'db>> for ImplItemGreen<'db> {
16975    fn from(value: ItemEnumGreen<'db>) -> Self {
16976        Self(value.0)
16977    }
16978}
16979impl<'db> From<ImplItemMissingGreen<'db>> for ImplItemGreen<'db> {
16980    fn from(value: ImplItemMissingGreen<'db>) -> Self {
16981        Self(value.0)
16982    }
16983}
16984#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16985pub struct ImplItemGreen<'db>(pub GreenId<'db>);
16986impl<'db> TypedSyntaxNode<'db> for ImplItem<'db> {
16987    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16988    type StablePtr = ImplItemPtr<'db>;
16989    type Green = ImplItemGreen<'db>;
16990    fn missing(db: &'db dyn Database) -> Self::Green {
16991        ImplItemGreen(ImplItemMissing::missing(db).0)
16992    }
16993    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16994        let kind = node.kind(db);
16995        match kind {
16996            SyntaxKind::FunctionWithBody => {
16997                ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
16998            }
16999            SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17000            SyntaxKind::ItemConstant => {
17001                ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17002            }
17003            SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17004            SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17005            SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17006            SyntaxKind::ItemExternFunction => {
17007                ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17008            }
17009            SyntaxKind::ItemExternType => {
17010                ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17011            }
17012            SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17013            SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17014            SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17015            SyntaxKind::ImplItemMissing => {
17016                ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17017            }
17018            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17019        }
17020    }
17021    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17022        let kind = node.kind(db);
17023        match kind {
17024            SyntaxKind::FunctionWithBody => {
17025                Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17026            }
17027            SyntaxKind::ItemTypeAlias => {
17028                Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17029            }
17030            SyntaxKind::ItemConstant => {
17031                Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17032            }
17033            SyntaxKind::ItemImplAlias => {
17034                Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17035            }
17036            SyntaxKind::ItemModule => {
17037                Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17038            }
17039            SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17040            SyntaxKind::ItemExternFunction => {
17041                Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17042            }
17043            SyntaxKind::ItemExternType => {
17044                Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17045            }
17046            SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17047            SyntaxKind::ItemStruct => {
17048                Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17049            }
17050            SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17051            SyntaxKind::ImplItemMissing => {
17052                Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17053            }
17054            _ => None,
17055        }
17056    }
17057    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17058        match self {
17059            ImplItem::Function(x) => x.as_syntax_node(),
17060            ImplItem::Type(x) => x.as_syntax_node(),
17061            ImplItem::Constant(x) => x.as_syntax_node(),
17062            ImplItem::Impl(x) => x.as_syntax_node(),
17063            ImplItem::Module(x) => x.as_syntax_node(),
17064            ImplItem::Use(x) => x.as_syntax_node(),
17065            ImplItem::ExternFunction(x) => x.as_syntax_node(),
17066            ImplItem::ExternType(x) => x.as_syntax_node(),
17067            ImplItem::Trait(x) => x.as_syntax_node(),
17068            ImplItem::Struct(x) => x.as_syntax_node(),
17069            ImplItem::Enum(x) => x.as_syntax_node(),
17070            ImplItem::Missing(x) => x.as_syntax_node(),
17071        }
17072    }
17073    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17074        ImplItemPtr(self.as_syntax_node().stable_ptr(db))
17075    }
17076}
17077impl<'db> ImplItem<'db> {
17078    /// Checks if a kind of a variant of [ImplItem].
17079    pub fn is_variant(kind: SyntaxKind) -> bool {
17080        matches!(
17081            kind,
17082            SyntaxKind::FunctionWithBody
17083                | SyntaxKind::ItemTypeAlias
17084                | SyntaxKind::ItemConstant
17085                | SyntaxKind::ItemImplAlias
17086                | SyntaxKind::ItemModule
17087                | SyntaxKind::ItemUse
17088                | SyntaxKind::ItemExternFunction
17089                | SyntaxKind::ItemExternType
17090                | SyntaxKind::ItemTrait
17091                | SyntaxKind::ItemStruct
17092                | SyntaxKind::ItemEnum
17093                | SyntaxKind::ImplItemMissing
17094        )
17095    }
17096}
17097#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17098pub struct ImplItemMissing<'db> {
17099    node: SyntaxNode<'db>,
17100}
17101impl<'db> ImplItemMissing<'db> {
17102    pub fn new_green(db: &'db dyn Database) -> ImplItemMissingGreen<'db> {
17103        let children = [];
17104        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17105        ImplItemMissingGreen(
17106            GreenNode {
17107                kind: SyntaxKind::ImplItemMissing,
17108                details: GreenNodeDetails::Node { children: children.into(), width },
17109            }
17110            .intern(db),
17111        )
17112    }
17113}
17114impl<'db> ImplItemMissing<'db> {}
17115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17116pub struct ImplItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
17117impl<'db> ImplItemMissingPtr<'db> {}
17118impl<'db> TypedStablePtr<'db> for ImplItemMissingPtr<'db> {
17119    type SyntaxNode = ImplItemMissing<'db>;
17120    fn untyped(self) -> SyntaxStablePtrId<'db> {
17121        self.0
17122    }
17123    fn lookup(&self, db: &'db dyn Database) -> ImplItemMissing<'db> {
17124        ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17125    }
17126}
17127impl<'db> From<ImplItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
17128    fn from(ptr: ImplItemMissingPtr<'db>) -> Self {
17129        ptr.untyped()
17130    }
17131}
17132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17133pub struct ImplItemMissingGreen<'db>(pub GreenId<'db>);
17134impl<'db> TypedSyntaxNode<'db> for ImplItemMissing<'db> {
17135    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17136    type StablePtr = ImplItemMissingPtr<'db>;
17137    type Green = ImplItemMissingGreen<'db>;
17138    fn missing(db: &'db dyn Database) -> Self::Green {
17139        ImplItemMissingGreen(
17140            GreenNode {
17141                kind: SyntaxKind::ImplItemMissing,
17142                details: GreenNodeDetails::Node {
17143                    children: [].into(),
17144                    width: TextWidth::default(),
17145                },
17146            }
17147            .intern(db),
17148        )
17149    }
17150    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17151        let kind = node.kind(db);
17152        assert_eq!(
17153            kind,
17154            SyntaxKind::ImplItemMissing,
17155            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17156            kind,
17157            SyntaxKind::ImplItemMissing
17158        );
17159        Self { node }
17160    }
17161    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17162        let kind = node.kind(db);
17163        if kind == SyntaxKind::ImplItemMissing {
17164            Some(Self::from_syntax_node(db, node))
17165        } else {
17166            None
17167        }
17168    }
17169    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17170        self.node
17171    }
17172    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17173        ImplItemMissingPtr(self.node.stable_ptr(db))
17174    }
17175}
17176#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17177pub struct ItemImplAlias<'db> {
17178    node: SyntaxNode<'db>,
17179}
17180impl<'db> ItemImplAlias<'db> {
17181    pub const INDEX_ATTRIBUTES: usize = 0;
17182    pub const INDEX_VISIBILITY: usize = 1;
17183    pub const INDEX_IMPL_KW: usize = 2;
17184    pub const INDEX_NAME: usize = 3;
17185    pub const INDEX_GENERIC_PARAMS: usize = 4;
17186    pub const INDEX_EQ: usize = 5;
17187    pub const INDEX_IMPL_PATH: usize = 6;
17188    pub const INDEX_SEMICOLON: usize = 7;
17189    pub fn new_green(
17190        db: &'db dyn Database,
17191        attributes: AttributeListGreen<'db>,
17192        visibility: VisibilityGreen<'db>,
17193        impl_kw: TerminalImplGreen<'db>,
17194        name: TerminalIdentifierGreen<'db>,
17195        generic_params: OptionWrappedGenericParamListGreen<'db>,
17196        eq: TerminalEqGreen<'db>,
17197        impl_path: ExprPathGreen<'db>,
17198        semicolon: TerminalSemicolonGreen<'db>,
17199    ) -> ItemImplAliasGreen<'db> {
17200        let children = [
17201            attributes.0,
17202            visibility.0,
17203            impl_kw.0,
17204            name.0,
17205            generic_params.0,
17206            eq.0,
17207            impl_path.0,
17208            semicolon.0,
17209        ];
17210        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17211        ItemImplAliasGreen(
17212            GreenNode {
17213                kind: SyntaxKind::ItemImplAlias,
17214                details: GreenNodeDetails::Node { children: children.into(), width },
17215            }
17216            .intern(db),
17217        )
17218    }
17219}
17220impl<'db> ItemImplAlias<'db> {
17221    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17222        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17223    }
17224    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17225        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17226    }
17227    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
17228        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17229    }
17230    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17231        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17232    }
17233    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17234        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17235    }
17236    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17237        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17238    }
17239    pub fn impl_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
17240        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17241    }
17242    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17243        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17244    }
17245}
17246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17247pub struct ItemImplAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17248impl<'db> ItemImplAliasPtr<'db> {
17249    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17250        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17251    }
17252}
17253impl<'db> TypedStablePtr<'db> for ItemImplAliasPtr<'db> {
17254    type SyntaxNode = ItemImplAlias<'db>;
17255    fn untyped(self) -> SyntaxStablePtrId<'db> {
17256        self.0
17257    }
17258    fn lookup(&self, db: &'db dyn Database) -> ItemImplAlias<'db> {
17259        ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17260    }
17261}
17262impl<'db> From<ItemImplAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17263    fn from(ptr: ItemImplAliasPtr<'db>) -> Self {
17264        ptr.untyped()
17265    }
17266}
17267#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17268pub struct ItemImplAliasGreen<'db>(pub GreenId<'db>);
17269impl<'db> TypedSyntaxNode<'db> for ItemImplAlias<'db> {
17270    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17271    type StablePtr = ItemImplAliasPtr<'db>;
17272    type Green = ItemImplAliasGreen<'db>;
17273    fn missing(db: &'db dyn Database) -> Self::Green {
17274        ItemImplAliasGreen(
17275            GreenNode {
17276                kind: SyntaxKind::ItemImplAlias,
17277                details: GreenNodeDetails::Node {
17278                    children: [
17279                        AttributeList::missing(db).0,
17280                        Visibility::missing(db).0,
17281                        TerminalImpl::missing(db).0,
17282                        TerminalIdentifier::missing(db).0,
17283                        OptionWrappedGenericParamList::missing(db).0,
17284                        TerminalEq::missing(db).0,
17285                        ExprPath::missing(db).0,
17286                        TerminalSemicolon::missing(db).0,
17287                    ]
17288                    .into(),
17289                    width: TextWidth::default(),
17290                },
17291            }
17292            .intern(db),
17293        )
17294    }
17295    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17296        let kind = node.kind(db);
17297        assert_eq!(
17298            kind,
17299            SyntaxKind::ItemImplAlias,
17300            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17301            kind,
17302            SyntaxKind::ItemImplAlias
17303        );
17304        Self { node }
17305    }
17306    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17307        let kind = node.kind(db);
17308        if kind == SyntaxKind::ItemImplAlias {
17309            Some(Self::from_syntax_node(db, node))
17310        } else {
17311            None
17312        }
17313    }
17314    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17315        self.node
17316    }
17317    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17318        ItemImplAliasPtr(self.node.stable_ptr(db))
17319    }
17320}
17321#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17322pub struct ItemStruct<'db> {
17323    node: SyntaxNode<'db>,
17324}
17325impl<'db> ItemStruct<'db> {
17326    pub const INDEX_ATTRIBUTES: usize = 0;
17327    pub const INDEX_VISIBILITY: usize = 1;
17328    pub const INDEX_STRUCT_KW: usize = 2;
17329    pub const INDEX_NAME: usize = 3;
17330    pub const INDEX_GENERIC_PARAMS: usize = 4;
17331    pub const INDEX_LBRACE: usize = 5;
17332    pub const INDEX_MEMBERS: usize = 6;
17333    pub const INDEX_RBRACE: usize = 7;
17334    pub fn new_green(
17335        db: &'db dyn Database,
17336        attributes: AttributeListGreen<'db>,
17337        visibility: VisibilityGreen<'db>,
17338        struct_kw: TerminalStructGreen<'db>,
17339        name: TerminalIdentifierGreen<'db>,
17340        generic_params: OptionWrappedGenericParamListGreen<'db>,
17341        lbrace: TerminalLBraceGreen<'db>,
17342        members: MemberListGreen<'db>,
17343        rbrace: TerminalRBraceGreen<'db>,
17344    ) -> ItemStructGreen<'db> {
17345        let children = [
17346            attributes.0,
17347            visibility.0,
17348            struct_kw.0,
17349            name.0,
17350            generic_params.0,
17351            lbrace.0,
17352            members.0,
17353            rbrace.0,
17354        ];
17355        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17356        ItemStructGreen(
17357            GreenNode {
17358                kind: SyntaxKind::ItemStruct,
17359                details: GreenNodeDetails::Node { children: children.into(), width },
17360            }
17361            .intern(db),
17362        )
17363    }
17364}
17365impl<'db> ItemStruct<'db> {
17366    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17367        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17368    }
17369    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17370        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17371    }
17372    pub fn struct_kw(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
17373        TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17374    }
17375    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17376        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17377    }
17378    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17379        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17380    }
17381    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17382        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17383    }
17384    pub fn members(&self, db: &'db dyn Database) -> MemberList<'db> {
17385        MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17386    }
17387    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17388        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17389    }
17390}
17391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17392pub struct ItemStructPtr<'db>(pub SyntaxStablePtrId<'db>);
17393impl<'db> ItemStructPtr<'db> {
17394    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17395        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17396    }
17397}
17398impl<'db> TypedStablePtr<'db> for ItemStructPtr<'db> {
17399    type SyntaxNode = ItemStruct<'db>;
17400    fn untyped(self) -> SyntaxStablePtrId<'db> {
17401        self.0
17402    }
17403    fn lookup(&self, db: &'db dyn Database) -> ItemStruct<'db> {
17404        ItemStruct::from_syntax_node(db, self.0.lookup(db))
17405    }
17406}
17407impl<'db> From<ItemStructPtr<'db>> for SyntaxStablePtrId<'db> {
17408    fn from(ptr: ItemStructPtr<'db>) -> Self {
17409        ptr.untyped()
17410    }
17411}
17412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17413pub struct ItemStructGreen<'db>(pub GreenId<'db>);
17414impl<'db> TypedSyntaxNode<'db> for ItemStruct<'db> {
17415    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17416    type StablePtr = ItemStructPtr<'db>;
17417    type Green = ItemStructGreen<'db>;
17418    fn missing(db: &'db dyn Database) -> Self::Green {
17419        ItemStructGreen(
17420            GreenNode {
17421                kind: SyntaxKind::ItemStruct,
17422                details: GreenNodeDetails::Node {
17423                    children: [
17424                        AttributeList::missing(db).0,
17425                        Visibility::missing(db).0,
17426                        TerminalStruct::missing(db).0,
17427                        TerminalIdentifier::missing(db).0,
17428                        OptionWrappedGenericParamList::missing(db).0,
17429                        TerminalLBrace::missing(db).0,
17430                        MemberList::missing(db).0,
17431                        TerminalRBrace::missing(db).0,
17432                    ]
17433                    .into(),
17434                    width: TextWidth::default(),
17435                },
17436            }
17437            .intern(db),
17438        )
17439    }
17440    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17441        let kind = node.kind(db);
17442        assert_eq!(
17443            kind,
17444            SyntaxKind::ItemStruct,
17445            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17446            kind,
17447            SyntaxKind::ItemStruct
17448        );
17449        Self { node }
17450    }
17451    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17452        let kind = node.kind(db);
17453        if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17454    }
17455    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17456        self.node
17457    }
17458    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17459        ItemStructPtr(self.node.stable_ptr(db))
17460    }
17461}
17462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17463pub struct ItemEnum<'db> {
17464    node: SyntaxNode<'db>,
17465}
17466impl<'db> ItemEnum<'db> {
17467    pub const INDEX_ATTRIBUTES: usize = 0;
17468    pub const INDEX_VISIBILITY: usize = 1;
17469    pub const INDEX_ENUM_KW: usize = 2;
17470    pub const INDEX_NAME: usize = 3;
17471    pub const INDEX_GENERIC_PARAMS: usize = 4;
17472    pub const INDEX_LBRACE: usize = 5;
17473    pub const INDEX_VARIANTS: usize = 6;
17474    pub const INDEX_RBRACE: usize = 7;
17475    pub fn new_green(
17476        db: &'db dyn Database,
17477        attributes: AttributeListGreen<'db>,
17478        visibility: VisibilityGreen<'db>,
17479        enum_kw: TerminalEnumGreen<'db>,
17480        name: TerminalIdentifierGreen<'db>,
17481        generic_params: OptionWrappedGenericParamListGreen<'db>,
17482        lbrace: TerminalLBraceGreen<'db>,
17483        variants: VariantListGreen<'db>,
17484        rbrace: TerminalRBraceGreen<'db>,
17485    ) -> ItemEnumGreen<'db> {
17486        let children = [
17487            attributes.0,
17488            visibility.0,
17489            enum_kw.0,
17490            name.0,
17491            generic_params.0,
17492            lbrace.0,
17493            variants.0,
17494            rbrace.0,
17495        ];
17496        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17497        ItemEnumGreen(
17498            GreenNode {
17499                kind: SyntaxKind::ItemEnum,
17500                details: GreenNodeDetails::Node { children: children.into(), width },
17501            }
17502            .intern(db),
17503        )
17504    }
17505}
17506impl<'db> ItemEnum<'db> {
17507    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17508        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17509    }
17510    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17511        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17512    }
17513    pub fn enum_kw(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
17514        TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17515    }
17516    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17517        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17518    }
17519    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17520        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17521    }
17522    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17523        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17524    }
17525    pub fn variants(&self, db: &'db dyn Database) -> VariantList<'db> {
17526        VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17527    }
17528    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17529        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17530    }
17531}
17532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17533pub struct ItemEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
17534impl<'db> ItemEnumPtr<'db> {
17535    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17536        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17537    }
17538}
17539impl<'db> TypedStablePtr<'db> for ItemEnumPtr<'db> {
17540    type SyntaxNode = ItemEnum<'db>;
17541    fn untyped(self) -> SyntaxStablePtrId<'db> {
17542        self.0
17543    }
17544    fn lookup(&self, db: &'db dyn Database) -> ItemEnum<'db> {
17545        ItemEnum::from_syntax_node(db, self.0.lookup(db))
17546    }
17547}
17548impl<'db> From<ItemEnumPtr<'db>> for SyntaxStablePtrId<'db> {
17549    fn from(ptr: ItemEnumPtr<'db>) -> Self {
17550        ptr.untyped()
17551    }
17552}
17553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17554pub struct ItemEnumGreen<'db>(pub GreenId<'db>);
17555impl<'db> TypedSyntaxNode<'db> for ItemEnum<'db> {
17556    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17557    type StablePtr = ItemEnumPtr<'db>;
17558    type Green = ItemEnumGreen<'db>;
17559    fn missing(db: &'db dyn Database) -> Self::Green {
17560        ItemEnumGreen(
17561            GreenNode {
17562                kind: SyntaxKind::ItemEnum,
17563                details: GreenNodeDetails::Node {
17564                    children: [
17565                        AttributeList::missing(db).0,
17566                        Visibility::missing(db).0,
17567                        TerminalEnum::missing(db).0,
17568                        TerminalIdentifier::missing(db).0,
17569                        OptionWrappedGenericParamList::missing(db).0,
17570                        TerminalLBrace::missing(db).0,
17571                        VariantList::missing(db).0,
17572                        TerminalRBrace::missing(db).0,
17573                    ]
17574                    .into(),
17575                    width: TextWidth::default(),
17576                },
17577            }
17578            .intern(db),
17579        )
17580    }
17581    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17582        let kind = node.kind(db);
17583        assert_eq!(
17584            kind,
17585            SyntaxKind::ItemEnum,
17586            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17587            kind,
17588            SyntaxKind::ItemEnum
17589        );
17590        Self { node }
17591    }
17592    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17593        let kind = node.kind(db);
17594        if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17595    }
17596    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17597        self.node
17598    }
17599    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17600        ItemEnumPtr(self.node.stable_ptr(db))
17601    }
17602}
17603#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17604pub struct ItemTypeAlias<'db> {
17605    node: SyntaxNode<'db>,
17606}
17607impl<'db> ItemTypeAlias<'db> {
17608    pub const INDEX_ATTRIBUTES: usize = 0;
17609    pub const INDEX_VISIBILITY: usize = 1;
17610    pub const INDEX_TYPE_KW: usize = 2;
17611    pub const INDEX_NAME: usize = 3;
17612    pub const INDEX_GENERIC_PARAMS: usize = 4;
17613    pub const INDEX_EQ: usize = 5;
17614    pub const INDEX_TY: usize = 6;
17615    pub const INDEX_SEMICOLON: usize = 7;
17616    pub fn new_green(
17617        db: &'db dyn Database,
17618        attributes: AttributeListGreen<'db>,
17619        visibility: VisibilityGreen<'db>,
17620        type_kw: TerminalTypeGreen<'db>,
17621        name: TerminalIdentifierGreen<'db>,
17622        generic_params: OptionWrappedGenericParamListGreen<'db>,
17623        eq: TerminalEqGreen<'db>,
17624        ty: ExprGreen<'db>,
17625        semicolon: TerminalSemicolonGreen<'db>,
17626    ) -> ItemTypeAliasGreen<'db> {
17627        let children = [
17628            attributes.0,
17629            visibility.0,
17630            type_kw.0,
17631            name.0,
17632            generic_params.0,
17633            eq.0,
17634            ty.0,
17635            semicolon.0,
17636        ];
17637        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17638        ItemTypeAliasGreen(
17639            GreenNode {
17640                kind: SyntaxKind::ItemTypeAlias,
17641                details: GreenNodeDetails::Node { children: children.into(), width },
17642            }
17643            .intern(db),
17644        )
17645    }
17646}
17647impl<'db> ItemTypeAlias<'db> {
17648    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17649        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17650    }
17651    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17652        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17653    }
17654    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
17655        TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17656    }
17657    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17658        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17659    }
17660    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17661        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17662    }
17663    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17664        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17665    }
17666    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
17667        Expr::from_syntax_node(db, self.node.get_children(db)[6])
17668    }
17669    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17670        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17671    }
17672}
17673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17674pub struct ItemTypeAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17675impl<'db> ItemTypeAliasPtr<'db> {
17676    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17677        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17678    }
17679}
17680impl<'db> TypedStablePtr<'db> for ItemTypeAliasPtr<'db> {
17681    type SyntaxNode = ItemTypeAlias<'db>;
17682    fn untyped(self) -> SyntaxStablePtrId<'db> {
17683        self.0
17684    }
17685    fn lookup(&self, db: &'db dyn Database) -> ItemTypeAlias<'db> {
17686        ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17687    }
17688}
17689impl<'db> From<ItemTypeAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17690    fn from(ptr: ItemTypeAliasPtr<'db>) -> Self {
17691        ptr.untyped()
17692    }
17693}
17694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17695pub struct ItemTypeAliasGreen<'db>(pub GreenId<'db>);
17696impl<'db> TypedSyntaxNode<'db> for ItemTypeAlias<'db> {
17697    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17698    type StablePtr = ItemTypeAliasPtr<'db>;
17699    type Green = ItemTypeAliasGreen<'db>;
17700    fn missing(db: &'db dyn Database) -> Self::Green {
17701        ItemTypeAliasGreen(
17702            GreenNode {
17703                kind: SyntaxKind::ItemTypeAlias,
17704                details: GreenNodeDetails::Node {
17705                    children: [
17706                        AttributeList::missing(db).0,
17707                        Visibility::missing(db).0,
17708                        TerminalType::missing(db).0,
17709                        TerminalIdentifier::missing(db).0,
17710                        OptionWrappedGenericParamList::missing(db).0,
17711                        TerminalEq::missing(db).0,
17712                        Expr::missing(db).0,
17713                        TerminalSemicolon::missing(db).0,
17714                    ]
17715                    .into(),
17716                    width: TextWidth::default(),
17717                },
17718            }
17719            .intern(db),
17720        )
17721    }
17722    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17723        let kind = node.kind(db);
17724        assert_eq!(
17725            kind,
17726            SyntaxKind::ItemTypeAlias,
17727            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17728            kind,
17729            SyntaxKind::ItemTypeAlias
17730        );
17731        Self { node }
17732    }
17733    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17734        let kind = node.kind(db);
17735        if kind == SyntaxKind::ItemTypeAlias {
17736            Some(Self::from_syntax_node(db, node))
17737        } else {
17738            None
17739        }
17740    }
17741    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17742        self.node
17743    }
17744    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17745        ItemTypeAliasPtr(self.node.stable_ptr(db))
17746    }
17747}
17748#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17749pub struct ItemUse<'db> {
17750    node: SyntaxNode<'db>,
17751}
17752impl<'db> ItemUse<'db> {
17753    pub const INDEX_ATTRIBUTES: usize = 0;
17754    pub const INDEX_VISIBILITY: usize = 1;
17755    pub const INDEX_USE_KW: usize = 2;
17756    pub const INDEX_DOLLAR: usize = 3;
17757    pub const INDEX_USE_PATH: usize = 4;
17758    pub const INDEX_SEMICOLON: usize = 5;
17759    pub fn new_green(
17760        db: &'db dyn Database,
17761        attributes: AttributeListGreen<'db>,
17762        visibility: VisibilityGreen<'db>,
17763        use_kw: TerminalUseGreen<'db>,
17764        dollar: OptionTerminalDollarGreen<'db>,
17765        use_path: UsePathGreen<'db>,
17766        semicolon: TerminalSemicolonGreen<'db>,
17767    ) -> ItemUseGreen<'db> {
17768        let children = [attributes.0, visibility.0, use_kw.0, dollar.0, use_path.0, semicolon.0];
17769        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17770        ItemUseGreen(
17771            GreenNode {
17772                kind: SyntaxKind::ItemUse,
17773                details: GreenNodeDetails::Node { children: children.into(), width },
17774            }
17775            .intern(db),
17776        )
17777    }
17778}
17779impl<'db> ItemUse<'db> {
17780    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17781        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17782    }
17783    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17784        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17785    }
17786    pub fn use_kw(&self, db: &'db dyn Database) -> TerminalUse<'db> {
17787        TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17788    }
17789    pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
17790        OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[3])
17791    }
17792    pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
17793        UsePath::from_syntax_node(db, self.node.get_children(db)[4])
17794    }
17795    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17796        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
17797    }
17798}
17799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17800pub struct ItemUsePtr<'db>(pub SyntaxStablePtrId<'db>);
17801impl<'db> ItemUsePtr<'db> {
17802    pub fn use_path_green(self, db: &'db dyn Database) -> UsePathGreen<'db> {
17803        UsePathGreen(self.0.0.key_fields(db)[0])
17804    }
17805}
17806impl<'db> TypedStablePtr<'db> for ItemUsePtr<'db> {
17807    type SyntaxNode = ItemUse<'db>;
17808    fn untyped(self) -> SyntaxStablePtrId<'db> {
17809        self.0
17810    }
17811    fn lookup(&self, db: &'db dyn Database) -> ItemUse<'db> {
17812        ItemUse::from_syntax_node(db, self.0.lookup(db))
17813    }
17814}
17815impl<'db> From<ItemUsePtr<'db>> for SyntaxStablePtrId<'db> {
17816    fn from(ptr: ItemUsePtr<'db>) -> Self {
17817        ptr.untyped()
17818    }
17819}
17820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17821pub struct ItemUseGreen<'db>(pub GreenId<'db>);
17822impl<'db> TypedSyntaxNode<'db> for ItemUse<'db> {
17823    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
17824    type StablePtr = ItemUsePtr<'db>;
17825    type Green = ItemUseGreen<'db>;
17826    fn missing(db: &'db dyn Database) -> Self::Green {
17827        ItemUseGreen(
17828            GreenNode {
17829                kind: SyntaxKind::ItemUse,
17830                details: GreenNodeDetails::Node {
17831                    children: [
17832                        AttributeList::missing(db).0,
17833                        Visibility::missing(db).0,
17834                        TerminalUse::missing(db).0,
17835                        OptionTerminalDollar::missing(db).0,
17836                        UsePath::missing(db).0,
17837                        TerminalSemicolon::missing(db).0,
17838                    ]
17839                    .into(),
17840                    width: TextWidth::default(),
17841                },
17842            }
17843            .intern(db),
17844        )
17845    }
17846    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17847        let kind = node.kind(db);
17848        assert_eq!(
17849            kind,
17850            SyntaxKind::ItemUse,
17851            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17852            kind,
17853            SyntaxKind::ItemUse
17854        );
17855        Self { node }
17856    }
17857    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17858        let kind = node.kind(db);
17859        if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
17860    }
17861    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17862        self.node
17863    }
17864    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17865        ItemUsePtr(self.node.stable_ptr(db))
17866    }
17867}
17868#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17869pub enum UsePath<'db> {
17870    Leaf(UsePathLeaf<'db>),
17871    Single(UsePathSingle<'db>),
17872    Multi(UsePathMulti<'db>),
17873    Star(UsePathStar<'db>),
17874}
17875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17876pub struct UsePathPtr<'db>(pub SyntaxStablePtrId<'db>);
17877impl<'db> TypedStablePtr<'db> for UsePathPtr<'db> {
17878    type SyntaxNode = UsePath<'db>;
17879    fn untyped(self) -> SyntaxStablePtrId<'db> {
17880        self.0
17881    }
17882    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
17883        UsePath::from_syntax_node(db, self.0.lookup(db))
17884    }
17885}
17886impl<'db> From<UsePathPtr<'db>> for SyntaxStablePtrId<'db> {
17887    fn from(ptr: UsePathPtr<'db>) -> Self {
17888        ptr.untyped()
17889    }
17890}
17891impl<'db> From<UsePathLeafPtr<'db>> for UsePathPtr<'db> {
17892    fn from(value: UsePathLeafPtr<'db>) -> Self {
17893        Self(value.0)
17894    }
17895}
17896impl<'db> From<UsePathSinglePtr<'db>> for UsePathPtr<'db> {
17897    fn from(value: UsePathSinglePtr<'db>) -> Self {
17898        Self(value.0)
17899    }
17900}
17901impl<'db> From<UsePathMultiPtr<'db>> for UsePathPtr<'db> {
17902    fn from(value: UsePathMultiPtr<'db>) -> Self {
17903        Self(value.0)
17904    }
17905}
17906impl<'db> From<UsePathStarPtr<'db>> for UsePathPtr<'db> {
17907    fn from(value: UsePathStarPtr<'db>) -> Self {
17908        Self(value.0)
17909    }
17910}
17911impl<'db> From<UsePathLeafGreen<'db>> for UsePathGreen<'db> {
17912    fn from(value: UsePathLeafGreen<'db>) -> Self {
17913        Self(value.0)
17914    }
17915}
17916impl<'db> From<UsePathSingleGreen<'db>> for UsePathGreen<'db> {
17917    fn from(value: UsePathSingleGreen<'db>) -> Self {
17918        Self(value.0)
17919    }
17920}
17921impl<'db> From<UsePathMultiGreen<'db>> for UsePathGreen<'db> {
17922    fn from(value: UsePathMultiGreen<'db>) -> Self {
17923        Self(value.0)
17924    }
17925}
17926impl<'db> From<UsePathStarGreen<'db>> for UsePathGreen<'db> {
17927    fn from(value: UsePathStarGreen<'db>) -> Self {
17928        Self(value.0)
17929    }
17930}
17931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17932pub struct UsePathGreen<'db>(pub GreenId<'db>);
17933impl<'db> TypedSyntaxNode<'db> for UsePath<'db> {
17934    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17935    type StablePtr = UsePathPtr<'db>;
17936    type Green = UsePathGreen<'db>;
17937    fn missing(db: &'db dyn Database) -> Self::Green {
17938        panic!("No missing variant.");
17939    }
17940    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17941        let kind = node.kind(db);
17942        match kind {
17943            SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
17944            SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
17945            SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
17946            SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
17947            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
17948        }
17949    }
17950    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17951        let kind = node.kind(db);
17952        match kind {
17953            SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
17954            SyntaxKind::UsePathSingle => {
17955                Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
17956            }
17957            SyntaxKind::UsePathMulti => {
17958                Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
17959            }
17960            SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
17961            _ => None,
17962        }
17963    }
17964    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17965        match self {
17966            UsePath::Leaf(x) => x.as_syntax_node(),
17967            UsePath::Single(x) => x.as_syntax_node(),
17968            UsePath::Multi(x) => x.as_syntax_node(),
17969            UsePath::Star(x) => x.as_syntax_node(),
17970        }
17971    }
17972    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17973        UsePathPtr(self.as_syntax_node().stable_ptr(db))
17974    }
17975}
17976impl<'db> UsePath<'db> {
17977    /// Checks if a kind of a variant of [UsePath].
17978    pub fn is_variant(kind: SyntaxKind) -> bool {
17979        matches!(
17980            kind,
17981            SyntaxKind::UsePathLeaf
17982                | SyntaxKind::UsePathSingle
17983                | SyntaxKind::UsePathMulti
17984                | SyntaxKind::UsePathStar
17985        )
17986    }
17987}
17988#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17989pub struct UsePathLeaf<'db> {
17990    node: SyntaxNode<'db>,
17991}
17992impl<'db> UsePathLeaf<'db> {
17993    pub const INDEX_IDENT: usize = 0;
17994    pub const INDEX_ALIAS_CLAUSE: usize = 1;
17995    pub fn new_green(
17996        db: &'db dyn Database,
17997        ident: PathSegmentGreen<'db>,
17998        alias_clause: OptionAliasClauseGreen<'db>,
17999    ) -> UsePathLeafGreen<'db> {
18000        let children = [ident.0, alias_clause.0];
18001        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18002        UsePathLeafGreen(
18003            GreenNode {
18004                kind: SyntaxKind::UsePathLeaf,
18005                details: GreenNodeDetails::Node { children: children.into(), width },
18006            }
18007            .intern(db),
18008        )
18009    }
18010}
18011impl<'db> UsePathLeaf<'db> {
18012    pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18013        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18014    }
18015    pub fn alias_clause(&self, db: &'db dyn Database) -> OptionAliasClause<'db> {
18016        OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
18017    }
18018}
18019#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18020pub struct UsePathLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
18021impl<'db> UsePathLeafPtr<'db> {
18022    pub fn ident_green(self, db: &'db dyn Database) -> PathSegmentGreen<'db> {
18023        PathSegmentGreen(self.0.0.key_fields(db)[0])
18024    }
18025    pub fn alias_clause_green(self, db: &'db dyn Database) -> OptionAliasClauseGreen<'db> {
18026        OptionAliasClauseGreen(self.0.0.key_fields(db)[1])
18027    }
18028}
18029impl<'db> TypedStablePtr<'db> for UsePathLeafPtr<'db> {
18030    type SyntaxNode = UsePathLeaf<'db>;
18031    fn untyped(self) -> SyntaxStablePtrId<'db> {
18032        self.0
18033    }
18034    fn lookup(&self, db: &'db dyn Database) -> UsePathLeaf<'db> {
18035        UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18036    }
18037}
18038impl<'db> From<UsePathLeafPtr<'db>> for SyntaxStablePtrId<'db> {
18039    fn from(ptr: UsePathLeafPtr<'db>) -> Self {
18040        ptr.untyped()
18041    }
18042}
18043#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18044pub struct UsePathLeafGreen<'db>(pub GreenId<'db>);
18045impl<'db> TypedSyntaxNode<'db> for UsePathLeaf<'db> {
18046    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18047    type StablePtr = UsePathLeafPtr<'db>;
18048    type Green = UsePathLeafGreen<'db>;
18049    fn missing(db: &'db dyn Database) -> Self::Green {
18050        UsePathLeafGreen(
18051            GreenNode {
18052                kind: SyntaxKind::UsePathLeaf,
18053                details: GreenNodeDetails::Node {
18054                    children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
18055                    width: TextWidth::default(),
18056                },
18057            }
18058            .intern(db),
18059        )
18060    }
18061    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18062        let kind = node.kind(db);
18063        assert_eq!(
18064            kind,
18065            SyntaxKind::UsePathLeaf,
18066            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18067            kind,
18068            SyntaxKind::UsePathLeaf
18069        );
18070        Self { node }
18071    }
18072    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18073        let kind = node.kind(db);
18074        if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18075    }
18076    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18077        self.node
18078    }
18079    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18080        UsePathLeafPtr(self.node.stable_ptr(db))
18081    }
18082}
18083#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18084pub struct UsePathSingle<'db> {
18085    node: SyntaxNode<'db>,
18086}
18087impl<'db> UsePathSingle<'db> {
18088    pub const INDEX_IDENT: usize = 0;
18089    pub const INDEX_COLON_COLON: usize = 1;
18090    pub const INDEX_USE_PATH: usize = 2;
18091    pub fn new_green(
18092        db: &'db dyn Database,
18093        ident: PathSegmentGreen<'db>,
18094        colon_colon: TerminalColonColonGreen<'db>,
18095        use_path: UsePathGreen<'db>,
18096    ) -> UsePathSingleGreen<'db> {
18097        let children = [ident.0, colon_colon.0, use_path.0];
18098        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18099        UsePathSingleGreen(
18100            GreenNode {
18101                kind: SyntaxKind::UsePathSingle,
18102                details: GreenNodeDetails::Node { children: children.into(), width },
18103            }
18104            .intern(db),
18105        )
18106    }
18107}
18108impl<'db> UsePathSingle<'db> {
18109    pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18110        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18111    }
18112    pub fn colon_colon(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
18113        TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18114    }
18115    pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
18116        UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18117    }
18118}
18119#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18120pub struct UsePathSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
18121impl<'db> UsePathSinglePtr<'db> {}
18122impl<'db> TypedStablePtr<'db> for UsePathSinglePtr<'db> {
18123    type SyntaxNode = UsePathSingle<'db>;
18124    fn untyped(self) -> SyntaxStablePtrId<'db> {
18125        self.0
18126    }
18127    fn lookup(&self, db: &'db dyn Database) -> UsePathSingle<'db> {
18128        UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18129    }
18130}
18131impl<'db> From<UsePathSinglePtr<'db>> for SyntaxStablePtrId<'db> {
18132    fn from(ptr: UsePathSinglePtr<'db>) -> Self {
18133        ptr.untyped()
18134    }
18135}
18136#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18137pub struct UsePathSingleGreen<'db>(pub GreenId<'db>);
18138impl<'db> TypedSyntaxNode<'db> for UsePathSingle<'db> {
18139    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18140    type StablePtr = UsePathSinglePtr<'db>;
18141    type Green = UsePathSingleGreen<'db>;
18142    fn missing(db: &'db dyn Database) -> Self::Green {
18143        UsePathSingleGreen(
18144            GreenNode {
18145                kind: SyntaxKind::UsePathSingle,
18146                details: GreenNodeDetails::Node {
18147                    children: [
18148                        PathSegment::missing(db).0,
18149                        TerminalColonColon::missing(db).0,
18150                        UsePath::missing(db).0,
18151                    ]
18152                    .into(),
18153                    width: TextWidth::default(),
18154                },
18155            }
18156            .intern(db),
18157        )
18158    }
18159    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18160        let kind = node.kind(db);
18161        assert_eq!(
18162            kind,
18163            SyntaxKind::UsePathSingle,
18164            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18165            kind,
18166            SyntaxKind::UsePathSingle
18167        );
18168        Self { node }
18169    }
18170    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18171        let kind = node.kind(db);
18172        if kind == SyntaxKind::UsePathSingle {
18173            Some(Self::from_syntax_node(db, node))
18174        } else {
18175            None
18176        }
18177    }
18178    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18179        self.node
18180    }
18181    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18182        UsePathSinglePtr(self.node.stable_ptr(db))
18183    }
18184}
18185#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18186pub struct UsePathMulti<'db> {
18187    node: SyntaxNode<'db>,
18188}
18189impl<'db> UsePathMulti<'db> {
18190    pub const INDEX_LBRACE: usize = 0;
18191    pub const INDEX_USE_PATHS: usize = 1;
18192    pub const INDEX_RBRACE: usize = 2;
18193    pub fn new_green(
18194        db: &'db dyn Database,
18195        lbrace: TerminalLBraceGreen<'db>,
18196        use_paths: UsePathListGreen<'db>,
18197        rbrace: TerminalRBraceGreen<'db>,
18198    ) -> UsePathMultiGreen<'db> {
18199        let children = [lbrace.0, use_paths.0, rbrace.0];
18200        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18201        UsePathMultiGreen(
18202            GreenNode {
18203                kind: SyntaxKind::UsePathMulti,
18204                details: GreenNodeDetails::Node { children: children.into(), width },
18205            }
18206            .intern(db),
18207        )
18208    }
18209}
18210impl<'db> UsePathMulti<'db> {
18211    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
18212        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18213    }
18214    pub fn use_paths(&self, db: &'db dyn Database) -> UsePathList<'db> {
18215        UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18216    }
18217    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
18218        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18219    }
18220}
18221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18222pub struct UsePathMultiPtr<'db>(pub SyntaxStablePtrId<'db>);
18223impl<'db> UsePathMultiPtr<'db> {}
18224impl<'db> TypedStablePtr<'db> for UsePathMultiPtr<'db> {
18225    type SyntaxNode = UsePathMulti<'db>;
18226    fn untyped(self) -> SyntaxStablePtrId<'db> {
18227        self.0
18228    }
18229    fn lookup(&self, db: &'db dyn Database) -> UsePathMulti<'db> {
18230        UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18231    }
18232}
18233impl<'db> From<UsePathMultiPtr<'db>> for SyntaxStablePtrId<'db> {
18234    fn from(ptr: UsePathMultiPtr<'db>) -> Self {
18235        ptr.untyped()
18236    }
18237}
18238#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18239pub struct UsePathMultiGreen<'db>(pub GreenId<'db>);
18240impl<'db> TypedSyntaxNode<'db> for UsePathMulti<'db> {
18241    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18242    type StablePtr = UsePathMultiPtr<'db>;
18243    type Green = UsePathMultiGreen<'db>;
18244    fn missing(db: &'db dyn Database) -> Self::Green {
18245        UsePathMultiGreen(
18246            GreenNode {
18247                kind: SyntaxKind::UsePathMulti,
18248                details: GreenNodeDetails::Node {
18249                    children: [
18250                        TerminalLBrace::missing(db).0,
18251                        UsePathList::missing(db).0,
18252                        TerminalRBrace::missing(db).0,
18253                    ]
18254                    .into(),
18255                    width: TextWidth::default(),
18256                },
18257            }
18258            .intern(db),
18259        )
18260    }
18261    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18262        let kind = node.kind(db);
18263        assert_eq!(
18264            kind,
18265            SyntaxKind::UsePathMulti,
18266            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18267            kind,
18268            SyntaxKind::UsePathMulti
18269        );
18270        Self { node }
18271    }
18272    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18273        let kind = node.kind(db);
18274        if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18275    }
18276    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18277        self.node
18278    }
18279    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18280        UsePathMultiPtr(self.node.stable_ptr(db))
18281    }
18282}
18283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18284pub struct UsePathStar<'db> {
18285    node: SyntaxNode<'db>,
18286}
18287impl<'db> UsePathStar<'db> {
18288    pub const INDEX_STAR: usize = 0;
18289    pub fn new_green(db: &'db dyn Database, star: TerminalMulGreen<'db>) -> UsePathStarGreen<'db> {
18290        let children = [star.0];
18291        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18292        UsePathStarGreen(
18293            GreenNode {
18294                kind: SyntaxKind::UsePathStar,
18295                details: GreenNodeDetails::Node { children: children.into(), width },
18296            }
18297            .intern(db),
18298        )
18299    }
18300}
18301impl<'db> UsePathStar<'db> {
18302    pub fn star(&self, db: &'db dyn Database) -> TerminalMul<'db> {
18303        TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18304    }
18305}
18306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18307pub struct UsePathStarPtr<'db>(pub SyntaxStablePtrId<'db>);
18308impl<'db> UsePathStarPtr<'db> {}
18309impl<'db> TypedStablePtr<'db> for UsePathStarPtr<'db> {
18310    type SyntaxNode = UsePathStar<'db>;
18311    fn untyped(self) -> SyntaxStablePtrId<'db> {
18312        self.0
18313    }
18314    fn lookup(&self, db: &'db dyn Database) -> UsePathStar<'db> {
18315        UsePathStar::from_syntax_node(db, self.0.lookup(db))
18316    }
18317}
18318impl<'db> From<UsePathStarPtr<'db>> for SyntaxStablePtrId<'db> {
18319    fn from(ptr: UsePathStarPtr<'db>) -> Self {
18320        ptr.untyped()
18321    }
18322}
18323#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18324pub struct UsePathStarGreen<'db>(pub GreenId<'db>);
18325impl<'db> TypedSyntaxNode<'db> for UsePathStar<'db> {
18326    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18327    type StablePtr = UsePathStarPtr<'db>;
18328    type Green = UsePathStarGreen<'db>;
18329    fn missing(db: &'db dyn Database) -> Self::Green {
18330        UsePathStarGreen(
18331            GreenNode {
18332                kind: SyntaxKind::UsePathStar,
18333                details: GreenNodeDetails::Node {
18334                    children: [TerminalMul::missing(db).0].into(),
18335                    width: TextWidth::default(),
18336                },
18337            }
18338            .intern(db),
18339        )
18340    }
18341    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18342        let kind = node.kind(db);
18343        assert_eq!(
18344            kind,
18345            SyntaxKind::UsePathStar,
18346            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18347            kind,
18348            SyntaxKind::UsePathStar
18349        );
18350        Self { node }
18351    }
18352    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18353        let kind = node.kind(db);
18354        if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18355    }
18356    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18357        self.node
18358    }
18359    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18360        UsePathStarPtr(self.node.stable_ptr(db))
18361    }
18362}
18363#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18364pub struct UsePathList<'db>(ElementList<'db, UsePath<'db>, 2>);
18365impl<'db> Deref for UsePathList<'db> {
18366    type Target = ElementList<'db, UsePath<'db>, 2>;
18367    fn deref(&self) -> &Self::Target {
18368        &self.0
18369    }
18370}
18371impl<'db> UsePathList<'db> {
18372    pub fn new_green(
18373        db: &'db dyn Database,
18374        children: &[UsePathListElementOrSeparatorGreen<'db>],
18375    ) -> UsePathListGreen<'db> {
18376        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
18377        UsePathListGreen(
18378            GreenNode {
18379                kind: SyntaxKind::UsePathList,
18380                details: GreenNodeDetails::Node {
18381                    children: children.iter().map(|x| x.id()).collect(),
18382                    width,
18383                },
18384            }
18385            .intern(db),
18386        )
18387    }
18388}
18389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18390pub struct UsePathListPtr<'db>(pub SyntaxStablePtrId<'db>);
18391impl<'db> TypedStablePtr<'db> for UsePathListPtr<'db> {
18392    type SyntaxNode = UsePathList<'db>;
18393    fn untyped(self) -> SyntaxStablePtrId<'db> {
18394        self.0
18395    }
18396    fn lookup(&self, db: &'db dyn Database) -> UsePathList<'db> {
18397        UsePathList::from_syntax_node(db, self.0.lookup(db))
18398    }
18399}
18400impl<'db> From<UsePathListPtr<'db>> for SyntaxStablePtrId<'db> {
18401    fn from(ptr: UsePathListPtr<'db>) -> Self {
18402        ptr.untyped()
18403    }
18404}
18405#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18406pub enum UsePathListElementOrSeparatorGreen<'db> {
18407    Separator(TerminalCommaGreen<'db>),
18408    Element(UsePathGreen<'db>),
18409}
18410impl<'db> From<TerminalCommaGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18411    fn from(value: TerminalCommaGreen<'db>) -> Self {
18412        UsePathListElementOrSeparatorGreen::Separator(value)
18413    }
18414}
18415impl<'db> From<UsePathGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18416    fn from(value: UsePathGreen<'db>) -> Self {
18417        UsePathListElementOrSeparatorGreen::Element(value)
18418    }
18419}
18420impl<'db> UsePathListElementOrSeparatorGreen<'db> {
18421    fn id(&self) -> GreenId<'db> {
18422        match self {
18423            UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18424            UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18425        }
18426    }
18427}
18428#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18429pub struct UsePathListGreen<'db>(pub GreenId<'db>);
18430impl<'db> TypedSyntaxNode<'db> for UsePathList<'db> {
18431    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18432    type StablePtr = UsePathListPtr<'db>;
18433    type Green = UsePathListGreen<'db>;
18434    fn missing(db: &'db dyn Database) -> Self::Green {
18435        UsePathListGreen(
18436            GreenNode {
18437                kind: SyntaxKind::UsePathList,
18438                details: GreenNodeDetails::Node {
18439                    children: [].into(),
18440                    width: TextWidth::default(),
18441                },
18442            }
18443            .intern(db),
18444        )
18445    }
18446    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18447        Self(ElementList::new(node))
18448    }
18449    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18450        if node.kind(db) == SyntaxKind::UsePathList {
18451            Some(Self(ElementList::new(node)))
18452        } else {
18453            None
18454        }
18455    }
18456    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18457        self.node
18458    }
18459    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18460        UsePathListPtr(self.node.stable_ptr(db))
18461    }
18462}
18463#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18464pub struct AliasClause<'db> {
18465    node: SyntaxNode<'db>,
18466}
18467impl<'db> AliasClause<'db> {
18468    pub const INDEX_AS_KW: usize = 0;
18469    pub const INDEX_ALIAS: usize = 1;
18470    pub fn new_green(
18471        db: &'db dyn Database,
18472        as_kw: TerminalAsGreen<'db>,
18473        alias: TerminalIdentifierGreen<'db>,
18474    ) -> AliasClauseGreen<'db> {
18475        let children = [as_kw.0, alias.0];
18476        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18477        AliasClauseGreen(
18478            GreenNode {
18479                kind: SyntaxKind::AliasClause,
18480                details: GreenNodeDetails::Node { children: children.into(), width },
18481            }
18482            .intern(db),
18483        )
18484    }
18485}
18486impl<'db> AliasClause<'db> {
18487    pub fn as_kw(&self, db: &'db dyn Database) -> TerminalAs<'db> {
18488        TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18489    }
18490    pub fn alias(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18491        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18492    }
18493}
18494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18495pub struct AliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18496impl<'db> AliasClausePtr<'db> {
18497    pub fn alias_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
18498        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
18499    }
18500}
18501impl<'db> TypedStablePtr<'db> for AliasClausePtr<'db> {
18502    type SyntaxNode = AliasClause<'db>;
18503    fn untyped(self) -> SyntaxStablePtrId<'db> {
18504        self.0
18505    }
18506    fn lookup(&self, db: &'db dyn Database) -> AliasClause<'db> {
18507        AliasClause::from_syntax_node(db, self.0.lookup(db))
18508    }
18509}
18510impl<'db> From<AliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18511    fn from(ptr: AliasClausePtr<'db>) -> Self {
18512        ptr.untyped()
18513    }
18514}
18515#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18516pub struct AliasClauseGreen<'db>(pub GreenId<'db>);
18517impl<'db> TypedSyntaxNode<'db> for AliasClause<'db> {
18518    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18519    type StablePtr = AliasClausePtr<'db>;
18520    type Green = AliasClauseGreen<'db>;
18521    fn missing(db: &'db dyn Database) -> Self::Green {
18522        AliasClauseGreen(
18523            GreenNode {
18524                kind: SyntaxKind::AliasClause,
18525                details: GreenNodeDetails::Node {
18526                    children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18527                    width: TextWidth::default(),
18528                },
18529            }
18530            .intern(db),
18531        )
18532    }
18533    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18534        let kind = node.kind(db);
18535        assert_eq!(
18536            kind,
18537            SyntaxKind::AliasClause,
18538            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18539            kind,
18540            SyntaxKind::AliasClause
18541        );
18542        Self { node }
18543    }
18544    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18545        let kind = node.kind(db);
18546        if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18547    }
18548    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18549        self.node
18550    }
18551    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18552        AliasClausePtr(self.node.stable_ptr(db))
18553    }
18554}
18555#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18556pub enum OptionAliasClause<'db> {
18557    Empty(OptionAliasClauseEmpty<'db>),
18558    AliasClause(AliasClause<'db>),
18559}
18560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18561pub struct OptionAliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18562impl<'db> TypedStablePtr<'db> for OptionAliasClausePtr<'db> {
18563    type SyntaxNode = OptionAliasClause<'db>;
18564    fn untyped(self) -> SyntaxStablePtrId<'db> {
18565        self.0
18566    }
18567    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18568        OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18569    }
18570}
18571impl<'db> From<OptionAliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18572    fn from(ptr: OptionAliasClausePtr<'db>) -> Self {
18573        ptr.untyped()
18574    }
18575}
18576impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for OptionAliasClausePtr<'db> {
18577    fn from(value: OptionAliasClauseEmptyPtr<'db>) -> Self {
18578        Self(value.0)
18579    }
18580}
18581impl<'db> From<AliasClausePtr<'db>> for OptionAliasClausePtr<'db> {
18582    fn from(value: AliasClausePtr<'db>) -> Self {
18583        Self(value.0)
18584    }
18585}
18586impl<'db> From<OptionAliasClauseEmptyGreen<'db>> for OptionAliasClauseGreen<'db> {
18587    fn from(value: OptionAliasClauseEmptyGreen<'db>) -> Self {
18588        Self(value.0)
18589    }
18590}
18591impl<'db> From<AliasClauseGreen<'db>> for OptionAliasClauseGreen<'db> {
18592    fn from(value: AliasClauseGreen<'db>) -> Self {
18593        Self(value.0)
18594    }
18595}
18596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18597pub struct OptionAliasClauseGreen<'db>(pub GreenId<'db>);
18598impl<'db> TypedSyntaxNode<'db> for OptionAliasClause<'db> {
18599    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18600    type StablePtr = OptionAliasClausePtr<'db>;
18601    type Green = OptionAliasClauseGreen<'db>;
18602    fn missing(db: &'db dyn Database) -> Self::Green {
18603        panic!("No missing variant.");
18604    }
18605    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18606        let kind = node.kind(db);
18607        match kind {
18608            SyntaxKind::OptionAliasClauseEmpty => {
18609                OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18610            }
18611            SyntaxKind::AliasClause => {
18612                OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18613            }
18614            _ => panic!(
18615                "Unexpected syntax kind {:?} when constructing {}.",
18616                kind, "OptionAliasClause"
18617            ),
18618        }
18619    }
18620    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18621        let kind = node.kind(db);
18622        match kind {
18623            SyntaxKind::OptionAliasClauseEmpty => {
18624                Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18625            }
18626            SyntaxKind::AliasClause => {
18627                Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18628            }
18629            _ => None,
18630        }
18631    }
18632    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18633        match self {
18634            OptionAliasClause::Empty(x) => x.as_syntax_node(),
18635            OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18636        }
18637    }
18638    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18639        OptionAliasClausePtr(self.as_syntax_node().stable_ptr(db))
18640    }
18641}
18642impl<'db> OptionAliasClause<'db> {
18643    /// Checks if a kind of a variant of [OptionAliasClause].
18644    pub fn is_variant(kind: SyntaxKind) -> bool {
18645        matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18646    }
18647}
18648#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18649pub struct OptionAliasClauseEmpty<'db> {
18650    node: SyntaxNode<'db>,
18651}
18652impl<'db> OptionAliasClauseEmpty<'db> {
18653    pub fn new_green(db: &'db dyn Database) -> OptionAliasClauseEmptyGreen<'db> {
18654        let children = [];
18655        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18656        OptionAliasClauseEmptyGreen(
18657            GreenNode {
18658                kind: SyntaxKind::OptionAliasClauseEmpty,
18659                details: GreenNodeDetails::Node { children: children.into(), width },
18660            }
18661            .intern(db),
18662        )
18663    }
18664}
18665impl<'db> OptionAliasClauseEmpty<'db> {}
18666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18667pub struct OptionAliasClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
18668impl<'db> OptionAliasClauseEmptyPtr<'db> {}
18669impl<'db> TypedStablePtr<'db> for OptionAliasClauseEmptyPtr<'db> {
18670    type SyntaxNode = OptionAliasClauseEmpty<'db>;
18671    fn untyped(self) -> SyntaxStablePtrId<'db> {
18672        self.0
18673    }
18674    fn lookup(&self, db: &'db dyn Database) -> OptionAliasClauseEmpty<'db> {
18675        OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18676    }
18677}
18678impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
18679    fn from(ptr: OptionAliasClauseEmptyPtr<'db>) -> Self {
18680        ptr.untyped()
18681    }
18682}
18683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18684pub struct OptionAliasClauseEmptyGreen<'db>(pub GreenId<'db>);
18685impl<'db> TypedSyntaxNode<'db> for OptionAliasClauseEmpty<'db> {
18686    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18687    type StablePtr = OptionAliasClauseEmptyPtr<'db>;
18688    type Green = OptionAliasClauseEmptyGreen<'db>;
18689    fn missing(db: &'db dyn Database) -> Self::Green {
18690        OptionAliasClauseEmptyGreen(
18691            GreenNode {
18692                kind: SyntaxKind::OptionAliasClauseEmpty,
18693                details: GreenNodeDetails::Node {
18694                    children: [].into(),
18695                    width: TextWidth::default(),
18696                },
18697            }
18698            .intern(db),
18699        )
18700    }
18701    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18702        let kind = node.kind(db);
18703        assert_eq!(
18704            kind,
18705            SyntaxKind::OptionAliasClauseEmpty,
18706            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18707            kind,
18708            SyntaxKind::OptionAliasClauseEmpty
18709        );
18710        Self { node }
18711    }
18712    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18713        let kind = node.kind(db);
18714        if kind == SyntaxKind::OptionAliasClauseEmpty {
18715            Some(Self::from_syntax_node(db, node))
18716        } else {
18717            None
18718        }
18719    }
18720    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18721        self.node
18722    }
18723    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18724        OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18725    }
18726}
18727#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18728pub enum GenericArg<'db> {
18729    Unnamed(GenericArgUnnamed<'db>),
18730    Named(GenericArgNamed<'db>),
18731}
18732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18733pub struct GenericArgPtr<'db>(pub SyntaxStablePtrId<'db>);
18734impl<'db> TypedStablePtr<'db> for GenericArgPtr<'db> {
18735    type SyntaxNode = GenericArg<'db>;
18736    fn untyped(self) -> SyntaxStablePtrId<'db> {
18737        self.0
18738    }
18739    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18740        GenericArg::from_syntax_node(db, self.0.lookup(db))
18741    }
18742}
18743impl<'db> From<GenericArgPtr<'db>> for SyntaxStablePtrId<'db> {
18744    fn from(ptr: GenericArgPtr<'db>) -> Self {
18745        ptr.untyped()
18746    }
18747}
18748impl<'db> From<GenericArgUnnamedPtr<'db>> for GenericArgPtr<'db> {
18749    fn from(value: GenericArgUnnamedPtr<'db>) -> Self {
18750        Self(value.0)
18751    }
18752}
18753impl<'db> From<GenericArgNamedPtr<'db>> for GenericArgPtr<'db> {
18754    fn from(value: GenericArgNamedPtr<'db>) -> Self {
18755        Self(value.0)
18756    }
18757}
18758impl<'db> From<GenericArgUnnamedGreen<'db>> for GenericArgGreen<'db> {
18759    fn from(value: GenericArgUnnamedGreen<'db>) -> Self {
18760        Self(value.0)
18761    }
18762}
18763impl<'db> From<GenericArgNamedGreen<'db>> for GenericArgGreen<'db> {
18764    fn from(value: GenericArgNamedGreen<'db>) -> Self {
18765        Self(value.0)
18766    }
18767}
18768#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18769pub struct GenericArgGreen<'db>(pub GreenId<'db>);
18770impl<'db> TypedSyntaxNode<'db> for GenericArg<'db> {
18771    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18772    type StablePtr = GenericArgPtr<'db>;
18773    type Green = GenericArgGreen<'db>;
18774    fn missing(db: &'db dyn Database) -> Self::Green {
18775        panic!("No missing variant.");
18776    }
18777    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18778        let kind = node.kind(db);
18779        match kind {
18780            SyntaxKind::GenericArgUnnamed => {
18781                GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18782            }
18783            SyntaxKind::GenericArgNamed => {
18784                GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18785            }
18786            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18787        }
18788    }
18789    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18790        let kind = node.kind(db);
18791        match kind {
18792            SyntaxKind::GenericArgUnnamed => {
18793                Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18794            }
18795            SyntaxKind::GenericArgNamed => {
18796                Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18797            }
18798            _ => None,
18799        }
18800    }
18801    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18802        match self {
18803            GenericArg::Unnamed(x) => x.as_syntax_node(),
18804            GenericArg::Named(x) => x.as_syntax_node(),
18805        }
18806    }
18807    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18808        GenericArgPtr(self.as_syntax_node().stable_ptr(db))
18809    }
18810}
18811impl<'db> GenericArg<'db> {
18812    /// Checks if a kind of a variant of [GenericArg].
18813    pub fn is_variant(kind: SyntaxKind) -> bool {
18814        matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
18815    }
18816}
18817#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18818pub struct GenericArgNamed<'db> {
18819    node: SyntaxNode<'db>,
18820}
18821impl<'db> GenericArgNamed<'db> {
18822    pub const INDEX_NAME: usize = 0;
18823    pub const INDEX_COLON: usize = 1;
18824    pub const INDEX_VALUE: usize = 2;
18825    pub fn new_green(
18826        db: &'db dyn Database,
18827        name: TerminalIdentifierGreen<'db>,
18828        colon: TerminalColonGreen<'db>,
18829        value: GenericArgValueGreen<'db>,
18830    ) -> GenericArgNamedGreen<'db> {
18831        let children = [name.0, colon.0, value.0];
18832        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18833        GenericArgNamedGreen(
18834            GreenNode {
18835                kind: SyntaxKind::GenericArgNamed,
18836                details: GreenNodeDetails::Node { children: children.into(), width },
18837            }
18838            .intern(db),
18839        )
18840    }
18841}
18842impl<'db> GenericArgNamed<'db> {
18843    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18844        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
18845    }
18846    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
18847        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
18848    }
18849    pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
18850        GenericArgValue::from_syntax_node(db, self.node.get_children(db)[2])
18851    }
18852}
18853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18854pub struct GenericArgNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18855impl<'db> GenericArgNamedPtr<'db> {}
18856impl<'db> TypedStablePtr<'db> for GenericArgNamedPtr<'db> {
18857    type SyntaxNode = GenericArgNamed<'db>;
18858    fn untyped(self) -> SyntaxStablePtrId<'db> {
18859        self.0
18860    }
18861    fn lookup(&self, db: &'db dyn Database) -> GenericArgNamed<'db> {
18862        GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
18863    }
18864}
18865impl<'db> From<GenericArgNamedPtr<'db>> for SyntaxStablePtrId<'db> {
18866    fn from(ptr: GenericArgNamedPtr<'db>) -> Self {
18867        ptr.untyped()
18868    }
18869}
18870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18871pub struct GenericArgNamedGreen<'db>(pub GreenId<'db>);
18872impl<'db> TypedSyntaxNode<'db> for GenericArgNamed<'db> {
18873    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
18874    type StablePtr = GenericArgNamedPtr<'db>;
18875    type Green = GenericArgNamedGreen<'db>;
18876    fn missing(db: &'db dyn Database) -> Self::Green {
18877        GenericArgNamedGreen(
18878            GreenNode {
18879                kind: SyntaxKind::GenericArgNamed,
18880                details: GreenNodeDetails::Node {
18881                    children: [
18882                        TerminalIdentifier::missing(db).0,
18883                        TerminalColon::missing(db).0,
18884                        GenericArgValue::missing(db).0,
18885                    ]
18886                    .into(),
18887                    width: TextWidth::default(),
18888                },
18889            }
18890            .intern(db),
18891        )
18892    }
18893    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18894        let kind = node.kind(db);
18895        assert_eq!(
18896            kind,
18897            SyntaxKind::GenericArgNamed,
18898            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18899            kind,
18900            SyntaxKind::GenericArgNamed
18901        );
18902        Self { node }
18903    }
18904    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18905        let kind = node.kind(db);
18906        if kind == SyntaxKind::GenericArgNamed {
18907            Some(Self::from_syntax_node(db, node))
18908        } else {
18909            None
18910        }
18911    }
18912    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18913        self.node
18914    }
18915    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18916        GenericArgNamedPtr(self.node.stable_ptr(db))
18917    }
18918}
18919#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18920pub struct GenericArgUnnamed<'db> {
18921    node: SyntaxNode<'db>,
18922}
18923impl<'db> GenericArgUnnamed<'db> {
18924    pub const INDEX_VALUE: usize = 0;
18925    pub fn new_green(
18926        db: &'db dyn Database,
18927        value: GenericArgValueGreen<'db>,
18928    ) -> GenericArgUnnamedGreen<'db> {
18929        let children = [value.0];
18930        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18931        GenericArgUnnamedGreen(
18932            GreenNode {
18933                kind: SyntaxKind::GenericArgUnnamed,
18934                details: GreenNodeDetails::Node { children: children.into(), width },
18935            }
18936            .intern(db),
18937        )
18938    }
18939}
18940impl<'db> GenericArgUnnamed<'db> {
18941    pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
18942        GenericArgValue::from_syntax_node(db, self.node.get_children(db)[0])
18943    }
18944}
18945#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18946pub struct GenericArgUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18947impl<'db> GenericArgUnnamedPtr<'db> {}
18948impl<'db> TypedStablePtr<'db> for GenericArgUnnamedPtr<'db> {
18949    type SyntaxNode = GenericArgUnnamed<'db>;
18950    fn untyped(self) -> SyntaxStablePtrId<'db> {
18951        self.0
18952    }
18953    fn lookup(&self, db: &'db dyn Database) -> GenericArgUnnamed<'db> {
18954        GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
18955    }
18956}
18957impl<'db> From<GenericArgUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
18958    fn from(ptr: GenericArgUnnamedPtr<'db>) -> Self {
18959        ptr.untyped()
18960    }
18961}
18962#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18963pub struct GenericArgUnnamedGreen<'db>(pub GreenId<'db>);
18964impl<'db> TypedSyntaxNode<'db> for GenericArgUnnamed<'db> {
18965    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
18966    type StablePtr = GenericArgUnnamedPtr<'db>;
18967    type Green = GenericArgUnnamedGreen<'db>;
18968    fn missing(db: &'db dyn Database) -> Self::Green {
18969        GenericArgUnnamedGreen(
18970            GreenNode {
18971                kind: SyntaxKind::GenericArgUnnamed,
18972                details: GreenNodeDetails::Node {
18973                    children: [GenericArgValue::missing(db).0].into(),
18974                    width: TextWidth::default(),
18975                },
18976            }
18977            .intern(db),
18978        )
18979    }
18980    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18981        let kind = node.kind(db);
18982        assert_eq!(
18983            kind,
18984            SyntaxKind::GenericArgUnnamed,
18985            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18986            kind,
18987            SyntaxKind::GenericArgUnnamed
18988        );
18989        Self { node }
18990    }
18991    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18992        let kind = node.kind(db);
18993        if kind == SyntaxKind::GenericArgUnnamed {
18994            Some(Self::from_syntax_node(db, node))
18995        } else {
18996            None
18997        }
18998    }
18999    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19000        self.node
19001    }
19002    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19003        GenericArgUnnamedPtr(self.node.stable_ptr(db))
19004    }
19005}
19006#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19007pub enum GenericArgValue<'db> {
19008    Expr(GenericArgValueExpr<'db>),
19009    Underscore(TerminalUnderscore<'db>),
19010}
19011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19012pub struct GenericArgValuePtr<'db>(pub SyntaxStablePtrId<'db>);
19013impl<'db> TypedStablePtr<'db> for GenericArgValuePtr<'db> {
19014    type SyntaxNode = GenericArgValue<'db>;
19015    fn untyped(self) -> SyntaxStablePtrId<'db> {
19016        self.0
19017    }
19018    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19019        GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19020    }
19021}
19022impl<'db> From<GenericArgValuePtr<'db>> for SyntaxStablePtrId<'db> {
19023    fn from(ptr: GenericArgValuePtr<'db>) -> Self {
19024        ptr.untyped()
19025    }
19026}
19027impl<'db> From<GenericArgValueExprPtr<'db>> for GenericArgValuePtr<'db> {
19028    fn from(value: GenericArgValueExprPtr<'db>) -> Self {
19029        Self(value.0)
19030    }
19031}
19032impl<'db> From<TerminalUnderscorePtr<'db>> for GenericArgValuePtr<'db> {
19033    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
19034        Self(value.0)
19035    }
19036}
19037impl<'db> From<GenericArgValueExprGreen<'db>> for GenericArgValueGreen<'db> {
19038    fn from(value: GenericArgValueExprGreen<'db>) -> Self {
19039        Self(value.0)
19040    }
19041}
19042impl<'db> From<TerminalUnderscoreGreen<'db>> for GenericArgValueGreen<'db> {
19043    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
19044        Self(value.0)
19045    }
19046}
19047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19048pub struct GenericArgValueGreen<'db>(pub GreenId<'db>);
19049impl<'db> TypedSyntaxNode<'db> for GenericArgValue<'db> {
19050    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19051    type StablePtr = GenericArgValuePtr<'db>;
19052    type Green = GenericArgValueGreen<'db>;
19053    fn missing(db: &'db dyn Database) -> Self::Green {
19054        panic!("No missing variant.");
19055    }
19056    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19057        let kind = node.kind(db);
19058        match kind {
19059            SyntaxKind::GenericArgValueExpr => {
19060                GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19061            }
19062            SyntaxKind::TerminalUnderscore => {
19063                GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19064            }
19065            _ => {
19066                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19067            }
19068        }
19069    }
19070    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19071        let kind = node.kind(db);
19072        match kind {
19073            SyntaxKind::GenericArgValueExpr => {
19074                Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19075            }
19076            SyntaxKind::TerminalUnderscore => {
19077                Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19078            }
19079            _ => None,
19080        }
19081    }
19082    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19083        match self {
19084            GenericArgValue::Expr(x) => x.as_syntax_node(),
19085            GenericArgValue::Underscore(x) => x.as_syntax_node(),
19086        }
19087    }
19088    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19089        GenericArgValuePtr(self.as_syntax_node().stable_ptr(db))
19090    }
19091}
19092impl<'db> GenericArgValue<'db> {
19093    /// Checks if a kind of a variant of [GenericArgValue].
19094    pub fn is_variant(kind: SyntaxKind) -> bool {
19095        matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19096    }
19097}
19098#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19099pub struct GenericArgValueExpr<'db> {
19100    node: SyntaxNode<'db>,
19101}
19102impl<'db> GenericArgValueExpr<'db> {
19103    pub const INDEX_EXPR: usize = 0;
19104    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> GenericArgValueExprGreen<'db> {
19105        let children = [expr.0];
19106        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19107        GenericArgValueExprGreen(
19108            GreenNode {
19109                kind: SyntaxKind::GenericArgValueExpr,
19110                details: GreenNodeDetails::Node { children: children.into(), width },
19111            }
19112            .intern(db),
19113        )
19114    }
19115}
19116impl<'db> GenericArgValueExpr<'db> {
19117    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
19118        Expr::from_syntax_node(db, self.node.get_children(db)[0])
19119    }
19120}
19121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19122pub struct GenericArgValueExprPtr<'db>(pub SyntaxStablePtrId<'db>);
19123impl<'db> GenericArgValueExprPtr<'db> {}
19124impl<'db> TypedStablePtr<'db> for GenericArgValueExprPtr<'db> {
19125    type SyntaxNode = GenericArgValueExpr<'db>;
19126    fn untyped(self) -> SyntaxStablePtrId<'db> {
19127        self.0
19128    }
19129    fn lookup(&self, db: &'db dyn Database) -> GenericArgValueExpr<'db> {
19130        GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19131    }
19132}
19133impl<'db> From<GenericArgValueExprPtr<'db>> for SyntaxStablePtrId<'db> {
19134    fn from(ptr: GenericArgValueExprPtr<'db>) -> Self {
19135        ptr.untyped()
19136    }
19137}
19138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19139pub struct GenericArgValueExprGreen<'db>(pub GreenId<'db>);
19140impl<'db> TypedSyntaxNode<'db> for GenericArgValueExpr<'db> {
19141    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19142    type StablePtr = GenericArgValueExprPtr<'db>;
19143    type Green = GenericArgValueExprGreen<'db>;
19144    fn missing(db: &'db dyn Database) -> Self::Green {
19145        GenericArgValueExprGreen(
19146            GreenNode {
19147                kind: SyntaxKind::GenericArgValueExpr,
19148                details: GreenNodeDetails::Node {
19149                    children: [Expr::missing(db).0].into(),
19150                    width: TextWidth::default(),
19151                },
19152            }
19153            .intern(db),
19154        )
19155    }
19156    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19157        let kind = node.kind(db);
19158        assert_eq!(
19159            kind,
19160            SyntaxKind::GenericArgValueExpr,
19161            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19162            kind,
19163            SyntaxKind::GenericArgValueExpr
19164        );
19165        Self { node }
19166    }
19167    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19168        let kind = node.kind(db);
19169        if kind == SyntaxKind::GenericArgValueExpr {
19170            Some(Self::from_syntax_node(db, node))
19171        } else {
19172            None
19173        }
19174    }
19175    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19176        self.node
19177    }
19178    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19179        GenericArgValueExprPtr(self.node.stable_ptr(db))
19180    }
19181}
19182#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19183pub struct GenericArgs<'db> {
19184    node: SyntaxNode<'db>,
19185}
19186impl<'db> GenericArgs<'db> {
19187    pub const INDEX_LANGLE: usize = 0;
19188    pub const INDEX_GENERIC_ARGS: usize = 1;
19189    pub const INDEX_RANGLE: usize = 2;
19190    pub fn new_green(
19191        db: &'db dyn Database,
19192        langle: TerminalLTGreen<'db>,
19193        generic_args: GenericArgListGreen<'db>,
19194        rangle: TerminalGTGreen<'db>,
19195    ) -> GenericArgsGreen<'db> {
19196        let children = [langle.0, generic_args.0, rangle.0];
19197        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19198        GenericArgsGreen(
19199            GreenNode {
19200                kind: SyntaxKind::GenericArgs,
19201                details: GreenNodeDetails::Node { children: children.into(), width },
19202            }
19203            .intern(db),
19204        )
19205    }
19206}
19207impl<'db> GenericArgs<'db> {
19208    pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
19209        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19210    }
19211    pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19212        GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
19213    }
19214    pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
19215        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19216    }
19217}
19218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19219pub struct GenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
19220impl<'db> GenericArgsPtr<'db> {}
19221impl<'db> TypedStablePtr<'db> for GenericArgsPtr<'db> {
19222    type SyntaxNode = GenericArgs<'db>;
19223    fn untyped(self) -> SyntaxStablePtrId<'db> {
19224        self.0
19225    }
19226    fn lookup(&self, db: &'db dyn Database) -> GenericArgs<'db> {
19227        GenericArgs::from_syntax_node(db, self.0.lookup(db))
19228    }
19229}
19230impl<'db> From<GenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
19231    fn from(ptr: GenericArgsPtr<'db>) -> Self {
19232        ptr.untyped()
19233    }
19234}
19235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19236pub struct GenericArgsGreen<'db>(pub GreenId<'db>);
19237impl<'db> TypedSyntaxNode<'db> for GenericArgs<'db> {
19238    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19239    type StablePtr = GenericArgsPtr<'db>;
19240    type Green = GenericArgsGreen<'db>;
19241    fn missing(db: &'db dyn Database) -> Self::Green {
19242        GenericArgsGreen(
19243            GreenNode {
19244                kind: SyntaxKind::GenericArgs,
19245                details: GreenNodeDetails::Node {
19246                    children: [
19247                        TerminalLT::missing(db).0,
19248                        GenericArgList::missing(db).0,
19249                        TerminalGT::missing(db).0,
19250                    ]
19251                    .into(),
19252                    width: TextWidth::default(),
19253                },
19254            }
19255            .intern(db),
19256        )
19257    }
19258    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19259        let kind = node.kind(db);
19260        assert_eq!(
19261            kind,
19262            SyntaxKind::GenericArgs,
19263            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19264            kind,
19265            SyntaxKind::GenericArgs
19266        );
19267        Self { node }
19268    }
19269    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19270        let kind = node.kind(db);
19271        if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19272    }
19273    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19274        self.node
19275    }
19276    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19277        GenericArgsPtr(self.node.stable_ptr(db))
19278    }
19279}
19280#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19281pub struct GenericArgList<'db>(ElementList<'db, GenericArg<'db>, 2>);
19282impl<'db> Deref for GenericArgList<'db> {
19283    type Target = ElementList<'db, GenericArg<'db>, 2>;
19284    fn deref(&self) -> &Self::Target {
19285        &self.0
19286    }
19287}
19288impl<'db> GenericArgList<'db> {
19289    pub fn new_green(
19290        db: &'db dyn Database,
19291        children: &[GenericArgListElementOrSeparatorGreen<'db>],
19292    ) -> GenericArgListGreen<'db> {
19293        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19294        GenericArgListGreen(
19295            GreenNode {
19296                kind: SyntaxKind::GenericArgList,
19297                details: GreenNodeDetails::Node {
19298                    children: children.iter().map(|x| x.id()).collect(),
19299                    width,
19300                },
19301            }
19302            .intern(db),
19303        )
19304    }
19305}
19306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19307pub struct GenericArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
19308impl<'db> TypedStablePtr<'db> for GenericArgListPtr<'db> {
19309    type SyntaxNode = GenericArgList<'db>;
19310    fn untyped(self) -> SyntaxStablePtrId<'db> {
19311        self.0
19312    }
19313    fn lookup(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19314        GenericArgList::from_syntax_node(db, self.0.lookup(db))
19315    }
19316}
19317impl<'db> From<GenericArgListPtr<'db>> for SyntaxStablePtrId<'db> {
19318    fn from(ptr: GenericArgListPtr<'db>) -> Self {
19319        ptr.untyped()
19320    }
19321}
19322#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19323pub enum GenericArgListElementOrSeparatorGreen<'db> {
19324    Separator(TerminalCommaGreen<'db>),
19325    Element(GenericArgGreen<'db>),
19326}
19327impl<'db> From<TerminalCommaGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19328    fn from(value: TerminalCommaGreen<'db>) -> Self {
19329        GenericArgListElementOrSeparatorGreen::Separator(value)
19330    }
19331}
19332impl<'db> From<GenericArgGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19333    fn from(value: GenericArgGreen<'db>) -> Self {
19334        GenericArgListElementOrSeparatorGreen::Element(value)
19335    }
19336}
19337impl<'db> GenericArgListElementOrSeparatorGreen<'db> {
19338    fn id(&self) -> GreenId<'db> {
19339        match self {
19340            GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19341            GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19342        }
19343    }
19344}
19345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19346pub struct GenericArgListGreen<'db>(pub GreenId<'db>);
19347impl<'db> TypedSyntaxNode<'db> for GenericArgList<'db> {
19348    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19349    type StablePtr = GenericArgListPtr<'db>;
19350    type Green = GenericArgListGreen<'db>;
19351    fn missing(db: &'db dyn Database) -> Self::Green {
19352        GenericArgListGreen(
19353            GreenNode {
19354                kind: SyntaxKind::GenericArgList,
19355                details: GreenNodeDetails::Node {
19356                    children: [].into(),
19357                    width: TextWidth::default(),
19358                },
19359            }
19360            .intern(db),
19361        )
19362    }
19363    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19364        Self(ElementList::new(node))
19365    }
19366    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19367        if node.kind(db) == SyntaxKind::GenericArgList {
19368            Some(Self(ElementList::new(node)))
19369        } else {
19370            None
19371        }
19372    }
19373    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19374        self.node
19375    }
19376    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19377        GenericArgListPtr(self.node.stable_ptr(db))
19378    }
19379}
19380#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19381pub struct AssociatedItemConstraint<'db> {
19382    node: SyntaxNode<'db>,
19383}
19384impl<'db> AssociatedItemConstraint<'db> {
19385    pub const INDEX_ITEM: usize = 0;
19386    pub const INDEX_COLON: usize = 1;
19387    pub const INDEX_VALUE: usize = 2;
19388    pub fn new_green(
19389        db: &'db dyn Database,
19390        item: TerminalIdentifierGreen<'db>,
19391        colon: TerminalColonGreen<'db>,
19392        value: ExprGreen<'db>,
19393    ) -> AssociatedItemConstraintGreen<'db> {
19394        let children = [item.0, colon.0, value.0];
19395        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19396        AssociatedItemConstraintGreen(
19397            GreenNode {
19398                kind: SyntaxKind::AssociatedItemConstraint,
19399                details: GreenNodeDetails::Node { children: children.into(), width },
19400            }
19401            .intern(db),
19402        )
19403    }
19404}
19405impl<'db> AssociatedItemConstraint<'db> {
19406    pub fn item(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
19407        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19408    }
19409    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
19410        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19411    }
19412    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
19413        Expr::from_syntax_node(db, self.node.get_children(db)[2])
19414    }
19415}
19416#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19417pub struct AssociatedItemConstraintPtr<'db>(pub SyntaxStablePtrId<'db>);
19418impl<'db> AssociatedItemConstraintPtr<'db> {}
19419impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintPtr<'db> {
19420    type SyntaxNode = AssociatedItemConstraint<'db>;
19421    fn untyped(self) -> SyntaxStablePtrId<'db> {
19422        self.0
19423    }
19424    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraint<'db> {
19425        AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19426    }
19427}
19428impl<'db> From<AssociatedItemConstraintPtr<'db>> for SyntaxStablePtrId<'db> {
19429    fn from(ptr: AssociatedItemConstraintPtr<'db>) -> Self {
19430        ptr.untyped()
19431    }
19432}
19433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19434pub struct AssociatedItemConstraintGreen<'db>(pub GreenId<'db>);
19435impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraint<'db> {
19436    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19437    type StablePtr = AssociatedItemConstraintPtr<'db>;
19438    type Green = AssociatedItemConstraintGreen<'db>;
19439    fn missing(db: &'db dyn Database) -> Self::Green {
19440        AssociatedItemConstraintGreen(
19441            GreenNode {
19442                kind: SyntaxKind::AssociatedItemConstraint,
19443                details: GreenNodeDetails::Node {
19444                    children: [
19445                        TerminalIdentifier::missing(db).0,
19446                        TerminalColon::missing(db).0,
19447                        Expr::missing(db).0,
19448                    ]
19449                    .into(),
19450                    width: TextWidth::default(),
19451                },
19452            }
19453            .intern(db),
19454        )
19455    }
19456    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19457        let kind = node.kind(db);
19458        assert_eq!(
19459            kind,
19460            SyntaxKind::AssociatedItemConstraint,
19461            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19462            kind,
19463            SyntaxKind::AssociatedItemConstraint
19464        );
19465        Self { node }
19466    }
19467    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19468        let kind = node.kind(db);
19469        if kind == SyntaxKind::AssociatedItemConstraint {
19470            Some(Self::from_syntax_node(db, node))
19471        } else {
19472            None
19473        }
19474    }
19475    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19476        self.node
19477    }
19478    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19479        AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19480    }
19481}
19482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19483pub struct AssociatedItemConstraints<'db> {
19484    node: SyntaxNode<'db>,
19485}
19486impl<'db> AssociatedItemConstraints<'db> {
19487    pub const INDEX_LBRACK: usize = 0;
19488    pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19489    pub const INDEX_RBRACK: usize = 2;
19490    pub fn new_green(
19491        db: &'db dyn Database,
19492        lbrack: TerminalLBrackGreen<'db>,
19493        associated_item_constraints: AssociatedItemConstraintListGreen<'db>,
19494        rbrack: TerminalRBrackGreen<'db>,
19495    ) -> AssociatedItemConstraintsGreen<'db> {
19496        let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19497        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19498        AssociatedItemConstraintsGreen(
19499            GreenNode {
19500                kind: SyntaxKind::AssociatedItemConstraints,
19501                details: GreenNodeDetails::Node { children: children.into(), width },
19502            }
19503            .intern(db),
19504        )
19505    }
19506}
19507impl<'db> AssociatedItemConstraints<'db> {
19508    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
19509        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19510    }
19511    pub fn associated_item_constraints(
19512        &self,
19513        db: &'db dyn Database,
19514    ) -> AssociatedItemConstraintList<'db> {
19515        AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19516    }
19517    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
19518        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19519    }
19520}
19521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19522pub struct AssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19523impl<'db> AssociatedItemConstraintsPtr<'db> {}
19524impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintsPtr<'db> {
19525    type SyntaxNode = AssociatedItemConstraints<'db>;
19526    fn untyped(self) -> SyntaxStablePtrId<'db> {
19527        self.0
19528    }
19529    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraints<'db> {
19530        AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19531    }
19532}
19533impl<'db> From<AssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19534    fn from(ptr: AssociatedItemConstraintsPtr<'db>) -> Self {
19535        ptr.untyped()
19536    }
19537}
19538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19539pub struct AssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19540impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraints<'db> {
19541    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19542    type StablePtr = AssociatedItemConstraintsPtr<'db>;
19543    type Green = AssociatedItemConstraintsGreen<'db>;
19544    fn missing(db: &'db dyn Database) -> Self::Green {
19545        AssociatedItemConstraintsGreen(
19546            GreenNode {
19547                kind: SyntaxKind::AssociatedItemConstraints,
19548                details: GreenNodeDetails::Node {
19549                    children: [
19550                        TerminalLBrack::missing(db).0,
19551                        AssociatedItemConstraintList::missing(db).0,
19552                        TerminalRBrack::missing(db).0,
19553                    ]
19554                    .into(),
19555                    width: TextWidth::default(),
19556                },
19557            }
19558            .intern(db),
19559        )
19560    }
19561    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19562        let kind = node.kind(db);
19563        assert_eq!(
19564            kind,
19565            SyntaxKind::AssociatedItemConstraints,
19566            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19567            kind,
19568            SyntaxKind::AssociatedItemConstraints
19569        );
19570        Self { node }
19571    }
19572    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19573        let kind = node.kind(db);
19574        if kind == SyntaxKind::AssociatedItemConstraints {
19575            Some(Self::from_syntax_node(db, node))
19576        } else {
19577            None
19578        }
19579    }
19580    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19581        self.node
19582    }
19583    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19584        AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19585    }
19586}
19587#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19588pub struct AssociatedItemConstraintList<'db>(ElementList<'db, AssociatedItemConstraint<'db>, 2>);
19589impl<'db> Deref for AssociatedItemConstraintList<'db> {
19590    type Target = ElementList<'db, AssociatedItemConstraint<'db>, 2>;
19591    fn deref(&self) -> &Self::Target {
19592        &self.0
19593    }
19594}
19595impl<'db> AssociatedItemConstraintList<'db> {
19596    pub fn new_green(
19597        db: &'db dyn Database,
19598        children: &[AssociatedItemConstraintListElementOrSeparatorGreen<'db>],
19599    ) -> AssociatedItemConstraintListGreen<'db> {
19600        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19601        AssociatedItemConstraintListGreen(
19602            GreenNode {
19603                kind: SyntaxKind::AssociatedItemConstraintList,
19604                details: GreenNodeDetails::Node {
19605                    children: children.iter().map(|x| x.id()).collect(),
19606                    width,
19607                },
19608            }
19609            .intern(db),
19610        )
19611    }
19612}
19613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19614pub struct AssociatedItemConstraintListPtr<'db>(pub SyntaxStablePtrId<'db>);
19615impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintListPtr<'db> {
19616    type SyntaxNode = AssociatedItemConstraintList<'db>;
19617    fn untyped(self) -> SyntaxStablePtrId<'db> {
19618        self.0
19619    }
19620    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraintList<'db> {
19621        AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19622    }
19623}
19624impl<'db> From<AssociatedItemConstraintListPtr<'db>> for SyntaxStablePtrId<'db> {
19625    fn from(ptr: AssociatedItemConstraintListPtr<'db>) -> Self {
19626        ptr.untyped()
19627    }
19628}
19629#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19630pub enum AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19631    Separator(TerminalCommaGreen<'db>),
19632    Element(AssociatedItemConstraintGreen<'db>),
19633}
19634impl<'db> From<TerminalCommaGreen<'db>>
19635    for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19636{
19637    fn from(value: TerminalCommaGreen<'db>) -> Self {
19638        AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19639    }
19640}
19641impl<'db> From<AssociatedItemConstraintGreen<'db>>
19642    for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19643{
19644    fn from(value: AssociatedItemConstraintGreen<'db>) -> Self {
19645        AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19646    }
19647}
19648impl<'db> AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19649    fn id(&self) -> GreenId<'db> {
19650        match self {
19651            AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19652            AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19653        }
19654    }
19655}
19656#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19657pub struct AssociatedItemConstraintListGreen<'db>(pub GreenId<'db>);
19658impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraintList<'db> {
19659    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19660    type StablePtr = AssociatedItemConstraintListPtr<'db>;
19661    type Green = AssociatedItemConstraintListGreen<'db>;
19662    fn missing(db: &'db dyn Database) -> Self::Green {
19663        AssociatedItemConstraintListGreen(
19664            GreenNode {
19665                kind: SyntaxKind::AssociatedItemConstraintList,
19666                details: GreenNodeDetails::Node {
19667                    children: [].into(),
19668                    width: TextWidth::default(),
19669                },
19670            }
19671            .intern(db),
19672        )
19673    }
19674    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19675        Self(ElementList::new(node))
19676    }
19677    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19678        if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19679            Some(Self(ElementList::new(node)))
19680        } else {
19681            None
19682        }
19683    }
19684    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19685        self.node
19686    }
19687    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19688        AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19689    }
19690}
19691#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19692pub enum OptionAssociatedItemConstraints<'db> {
19693    Empty(OptionAssociatedItemConstraintsEmpty<'db>),
19694    AssociatedItemConstraints(AssociatedItemConstraints<'db>),
19695}
19696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19697pub struct OptionAssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19698impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsPtr<'db> {
19699    type SyntaxNode = OptionAssociatedItemConstraints<'db>;
19700    fn untyped(self) -> SyntaxStablePtrId<'db> {
19701        self.0
19702    }
19703    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19704        OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19705    }
19706}
19707impl<'db> From<OptionAssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19708    fn from(ptr: OptionAssociatedItemConstraintsPtr<'db>) -> Self {
19709        ptr.untyped()
19710    }
19711}
19712impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>>
19713    for OptionAssociatedItemConstraintsPtr<'db>
19714{
19715    fn from(value: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19716        Self(value.0)
19717    }
19718}
19719impl<'db> From<AssociatedItemConstraintsPtr<'db>> for OptionAssociatedItemConstraintsPtr<'db> {
19720    fn from(value: AssociatedItemConstraintsPtr<'db>) -> Self {
19721        Self(value.0)
19722    }
19723}
19724impl<'db> From<OptionAssociatedItemConstraintsEmptyGreen<'db>>
19725    for OptionAssociatedItemConstraintsGreen<'db>
19726{
19727    fn from(value: OptionAssociatedItemConstraintsEmptyGreen<'db>) -> Self {
19728        Self(value.0)
19729    }
19730}
19731impl<'db> From<AssociatedItemConstraintsGreen<'db>> for OptionAssociatedItemConstraintsGreen<'db> {
19732    fn from(value: AssociatedItemConstraintsGreen<'db>) -> Self {
19733        Self(value.0)
19734    }
19735}
19736#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19737pub struct OptionAssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19738impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraints<'db> {
19739    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19740    type StablePtr = OptionAssociatedItemConstraintsPtr<'db>;
19741    type Green = OptionAssociatedItemConstraintsGreen<'db>;
19742    fn missing(db: &'db dyn Database) -> Self::Green {
19743        panic!("No missing variant.");
19744    }
19745    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19746        let kind = node.kind(db);
19747        match kind {
19748            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19749                OptionAssociatedItemConstraints::Empty(
19750                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19751                )
19752            }
19753            SyntaxKind::AssociatedItemConstraints => {
19754                OptionAssociatedItemConstraints::AssociatedItemConstraints(
19755                    AssociatedItemConstraints::from_syntax_node(db, node),
19756                )
19757            }
19758            _ => panic!(
19759                "Unexpected syntax kind {:?} when constructing {}.",
19760                kind, "OptionAssociatedItemConstraints"
19761            ),
19762        }
19763    }
19764    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19765        let kind = node.kind(db);
19766        match kind {
19767            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19768                Some(OptionAssociatedItemConstraints::Empty(
19769                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19770                ))
19771            }
19772            SyntaxKind::AssociatedItemConstraints => {
19773                Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19774                    AssociatedItemConstraints::from_syntax_node(db, node),
19775                ))
19776            }
19777            _ => None,
19778        }
19779    }
19780    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19781        match self {
19782            OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19783            OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19784        }
19785    }
19786    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19787        OptionAssociatedItemConstraintsPtr(self.as_syntax_node().stable_ptr(db))
19788    }
19789}
19790impl<'db> OptionAssociatedItemConstraints<'db> {
19791    /// Checks if a kind of a variant of [OptionAssociatedItemConstraints].
19792    pub fn is_variant(kind: SyntaxKind) -> bool {
19793        matches!(
19794            kind,
19795            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19796                | SyntaxKind::AssociatedItemConstraints
19797        )
19798    }
19799}
19800#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19801pub struct OptionAssociatedItemConstraintsEmpty<'db> {
19802    node: SyntaxNode<'db>,
19803}
19804impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {
19805    pub fn new_green(db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmptyGreen<'db> {
19806        let children = [];
19807        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19808        OptionAssociatedItemConstraintsEmptyGreen(
19809            GreenNode {
19810                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19811                details: GreenNodeDetails::Node { children: children.into(), width },
19812            }
19813            .intern(db),
19814        )
19815    }
19816}
19817impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {}
19818#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19819pub struct OptionAssociatedItemConstraintsEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19820impl<'db> OptionAssociatedItemConstraintsEmptyPtr<'db> {}
19821impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsEmptyPtr<'db> {
19822    type SyntaxNode = OptionAssociatedItemConstraintsEmpty<'db>;
19823    fn untyped(self) -> SyntaxStablePtrId<'db> {
19824        self.0
19825    }
19826    fn lookup(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmpty<'db> {
19827        OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
19828    }
19829}
19830impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19831    fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19832        ptr.untyped()
19833    }
19834}
19835#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19836pub struct OptionAssociatedItemConstraintsEmptyGreen<'db>(pub GreenId<'db>);
19837impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraintsEmpty<'db> {
19838    const OPTIONAL_KIND: Option<SyntaxKind> =
19839        Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
19840    type StablePtr = OptionAssociatedItemConstraintsEmptyPtr<'db>;
19841    type Green = OptionAssociatedItemConstraintsEmptyGreen<'db>;
19842    fn missing(db: &'db dyn Database) -> Self::Green {
19843        OptionAssociatedItemConstraintsEmptyGreen(
19844            GreenNode {
19845                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19846                details: GreenNodeDetails::Node {
19847                    children: [].into(),
19848                    width: TextWidth::default(),
19849                },
19850            }
19851            .intern(db),
19852        )
19853    }
19854    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19855        let kind = node.kind(db);
19856        assert_eq!(
19857            kind,
19858            SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19859            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19860            kind,
19861            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19862        );
19863        Self { node }
19864    }
19865    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19866        let kind = node.kind(db);
19867        if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
19868            Some(Self::from_syntax_node(db, node))
19869        } else {
19870            None
19871        }
19872    }
19873    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19874        self.node
19875    }
19876    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19877        OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
19878    }
19879}
19880#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19881pub enum OptionWrappedGenericParamList<'db> {
19882    Empty(OptionWrappedGenericParamListEmpty<'db>),
19883    WrappedGenericParamList(WrappedGenericParamList<'db>),
19884}
19885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19886pub struct OptionWrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19887impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListPtr<'db> {
19888    type SyntaxNode = OptionWrappedGenericParamList<'db>;
19889    fn untyped(self) -> SyntaxStablePtrId<'db> {
19890        self.0
19891    }
19892    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19893        OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
19894    }
19895}
19896impl<'db> From<OptionWrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19897    fn from(ptr: OptionWrappedGenericParamListPtr<'db>) -> Self {
19898        ptr.untyped()
19899    }
19900}
19901impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>>
19902    for OptionWrappedGenericParamListPtr<'db>
19903{
19904    fn from(value: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
19905        Self(value.0)
19906    }
19907}
19908impl<'db> From<WrappedGenericParamListPtr<'db>> for OptionWrappedGenericParamListPtr<'db> {
19909    fn from(value: WrappedGenericParamListPtr<'db>) -> Self {
19910        Self(value.0)
19911    }
19912}
19913impl<'db> From<OptionWrappedGenericParamListEmptyGreen<'db>>
19914    for OptionWrappedGenericParamListGreen<'db>
19915{
19916    fn from(value: OptionWrappedGenericParamListEmptyGreen<'db>) -> Self {
19917        Self(value.0)
19918    }
19919}
19920impl<'db> From<WrappedGenericParamListGreen<'db>> for OptionWrappedGenericParamListGreen<'db> {
19921    fn from(value: WrappedGenericParamListGreen<'db>) -> Self {
19922        Self(value.0)
19923    }
19924}
19925#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19926pub struct OptionWrappedGenericParamListGreen<'db>(pub GreenId<'db>);
19927impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamList<'db> {
19928    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19929    type StablePtr = OptionWrappedGenericParamListPtr<'db>;
19930    type Green = OptionWrappedGenericParamListGreen<'db>;
19931    fn missing(db: &'db dyn Database) -> Self::Green {
19932        panic!("No missing variant.");
19933    }
19934    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19935        let kind = node.kind(db);
19936        match kind {
19937            SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
19938                OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19939            ),
19940            SyntaxKind::WrappedGenericParamList => {
19941                OptionWrappedGenericParamList::WrappedGenericParamList(
19942                    WrappedGenericParamList::from_syntax_node(db, node),
19943                )
19944            }
19945            _ => panic!(
19946                "Unexpected syntax kind {:?} when constructing {}.",
19947                kind, "OptionWrappedGenericParamList"
19948            ),
19949        }
19950    }
19951    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19952        let kind = node.kind(db);
19953        match kind {
19954            SyntaxKind::OptionWrappedGenericParamListEmpty => {
19955                Some(OptionWrappedGenericParamList::Empty(
19956                    OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19957                ))
19958            }
19959            SyntaxKind::WrappedGenericParamList => {
19960                Some(OptionWrappedGenericParamList::WrappedGenericParamList(
19961                    WrappedGenericParamList::from_syntax_node(db, node),
19962                ))
19963            }
19964            _ => None,
19965        }
19966    }
19967    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19968        match self {
19969            OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
19970            OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
19971        }
19972    }
19973    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19974        OptionWrappedGenericParamListPtr(self.as_syntax_node().stable_ptr(db))
19975    }
19976}
19977impl<'db> OptionWrappedGenericParamList<'db> {
19978    /// Checks if a kind of a variant of [OptionWrappedGenericParamList].
19979    pub fn is_variant(kind: SyntaxKind) -> bool {
19980        matches!(
19981            kind,
19982            SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
19983        )
19984    }
19985}
19986#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19987pub struct OptionWrappedGenericParamListEmpty<'db> {
19988    node: SyntaxNode<'db>,
19989}
19990impl<'db> OptionWrappedGenericParamListEmpty<'db> {
19991    pub fn new_green(db: &'db dyn Database) -> OptionWrappedGenericParamListEmptyGreen<'db> {
19992        let children = [];
19993        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19994        OptionWrappedGenericParamListEmptyGreen(
19995            GreenNode {
19996                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
19997                details: GreenNodeDetails::Node { children: children.into(), width },
19998            }
19999            .intern(db),
20000        )
20001    }
20002}
20003impl<'db> OptionWrappedGenericParamListEmpty<'db> {}
20004#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20005pub struct OptionWrappedGenericParamListEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
20006impl<'db> OptionWrappedGenericParamListEmptyPtr<'db> {}
20007impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListEmptyPtr<'db> {
20008    type SyntaxNode = OptionWrappedGenericParamListEmpty<'db>;
20009    fn untyped(self) -> SyntaxStablePtrId<'db> {
20010        self.0
20011    }
20012    fn lookup(&self, db: &'db dyn Database) -> OptionWrappedGenericParamListEmpty<'db> {
20013        OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20014    }
20015}
20016impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
20017    fn from(ptr: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
20018        ptr.untyped()
20019    }
20020}
20021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20022pub struct OptionWrappedGenericParamListEmptyGreen<'db>(pub GreenId<'db>);
20023impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamListEmpty<'db> {
20024    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20025    type StablePtr = OptionWrappedGenericParamListEmptyPtr<'db>;
20026    type Green = OptionWrappedGenericParamListEmptyGreen<'db>;
20027    fn missing(db: &'db dyn Database) -> Self::Green {
20028        OptionWrappedGenericParamListEmptyGreen(
20029            GreenNode {
20030                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20031                details: GreenNodeDetails::Node {
20032                    children: [].into(),
20033                    width: TextWidth::default(),
20034                },
20035            }
20036            .intern(db),
20037        )
20038    }
20039    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20040        let kind = node.kind(db);
20041        assert_eq!(
20042            kind,
20043            SyntaxKind::OptionWrappedGenericParamListEmpty,
20044            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20045            kind,
20046            SyntaxKind::OptionWrappedGenericParamListEmpty
20047        );
20048        Self { node }
20049    }
20050    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20051        let kind = node.kind(db);
20052        if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20053            Some(Self::from_syntax_node(db, node))
20054        } else {
20055            None
20056        }
20057    }
20058    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20059        self.node
20060    }
20061    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20062        OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
20063    }
20064}
20065#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20066pub struct WrappedGenericParamList<'db> {
20067    node: SyntaxNode<'db>,
20068}
20069impl<'db> WrappedGenericParamList<'db> {
20070    pub const INDEX_LANGLE: usize = 0;
20071    pub const INDEX_GENERIC_PARAMS: usize = 1;
20072    pub const INDEX_RANGLE: usize = 2;
20073    pub fn new_green(
20074        db: &'db dyn Database,
20075        langle: TerminalLTGreen<'db>,
20076        generic_params: GenericParamListGreen<'db>,
20077        rangle: TerminalGTGreen<'db>,
20078    ) -> WrappedGenericParamListGreen<'db> {
20079        let children = [langle.0, generic_params.0, rangle.0];
20080        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20081        WrappedGenericParamListGreen(
20082            GreenNode {
20083                kind: SyntaxKind::WrappedGenericParamList,
20084                details: GreenNodeDetails::Node { children: children.into(), width },
20085            }
20086            .intern(db),
20087        )
20088    }
20089}
20090impl<'db> WrappedGenericParamList<'db> {
20091    pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
20092        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
20093    }
20094    pub fn generic_params(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20095        GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
20096    }
20097    pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
20098        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
20099    }
20100}
20101#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20102pub struct WrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20103impl<'db> WrappedGenericParamListPtr<'db> {}
20104impl<'db> TypedStablePtr<'db> for WrappedGenericParamListPtr<'db> {
20105    type SyntaxNode = WrappedGenericParamList<'db>;
20106    fn untyped(self) -> SyntaxStablePtrId<'db> {
20107        self.0
20108    }
20109    fn lookup(&self, db: &'db dyn Database) -> WrappedGenericParamList<'db> {
20110        WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20111    }
20112}
20113impl<'db> From<WrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20114    fn from(ptr: WrappedGenericParamListPtr<'db>) -> Self {
20115        ptr.untyped()
20116    }
20117}
20118#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20119pub struct WrappedGenericParamListGreen<'db>(pub GreenId<'db>);
20120impl<'db> TypedSyntaxNode<'db> for WrappedGenericParamList<'db> {
20121    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20122    type StablePtr = WrappedGenericParamListPtr<'db>;
20123    type Green = WrappedGenericParamListGreen<'db>;
20124    fn missing(db: &'db dyn Database) -> Self::Green {
20125        WrappedGenericParamListGreen(
20126            GreenNode {
20127                kind: SyntaxKind::WrappedGenericParamList,
20128                details: GreenNodeDetails::Node {
20129                    children: [
20130                        TerminalLT::missing(db).0,
20131                        GenericParamList::missing(db).0,
20132                        TerminalGT::missing(db).0,
20133                    ]
20134                    .into(),
20135                    width: TextWidth::default(),
20136                },
20137            }
20138            .intern(db),
20139        )
20140    }
20141    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20142        let kind = node.kind(db);
20143        assert_eq!(
20144            kind,
20145            SyntaxKind::WrappedGenericParamList,
20146            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20147            kind,
20148            SyntaxKind::WrappedGenericParamList
20149        );
20150        Self { node }
20151    }
20152    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20153        let kind = node.kind(db);
20154        if kind == SyntaxKind::WrappedGenericParamList {
20155            Some(Self::from_syntax_node(db, node))
20156        } else {
20157            None
20158        }
20159    }
20160    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20161        self.node
20162    }
20163    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20164        WrappedGenericParamListPtr(self.node.stable_ptr(db))
20165    }
20166}
20167#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20168pub struct GenericParamList<'db>(ElementList<'db, GenericParam<'db>, 2>);
20169impl<'db> Deref for GenericParamList<'db> {
20170    type Target = ElementList<'db, GenericParam<'db>, 2>;
20171    fn deref(&self) -> &Self::Target {
20172        &self.0
20173    }
20174}
20175impl<'db> GenericParamList<'db> {
20176    pub fn new_green(
20177        db: &'db dyn Database,
20178        children: &[GenericParamListElementOrSeparatorGreen<'db>],
20179    ) -> GenericParamListGreen<'db> {
20180        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
20181        GenericParamListGreen(
20182            GreenNode {
20183                kind: SyntaxKind::GenericParamList,
20184                details: GreenNodeDetails::Node {
20185                    children: children.iter().map(|x| x.id()).collect(),
20186                    width,
20187                },
20188            }
20189            .intern(db),
20190        )
20191    }
20192}
20193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20194pub struct GenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20195impl<'db> TypedStablePtr<'db> for GenericParamListPtr<'db> {
20196    type SyntaxNode = GenericParamList<'db>;
20197    fn untyped(self) -> SyntaxStablePtrId<'db> {
20198        self.0
20199    }
20200    fn lookup(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20201        GenericParamList::from_syntax_node(db, self.0.lookup(db))
20202    }
20203}
20204impl<'db> From<GenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20205    fn from(ptr: GenericParamListPtr<'db>) -> Self {
20206        ptr.untyped()
20207    }
20208}
20209#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20210pub enum GenericParamListElementOrSeparatorGreen<'db> {
20211    Separator(TerminalCommaGreen<'db>),
20212    Element(GenericParamGreen<'db>),
20213}
20214impl<'db> From<TerminalCommaGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20215    fn from(value: TerminalCommaGreen<'db>) -> Self {
20216        GenericParamListElementOrSeparatorGreen::Separator(value)
20217    }
20218}
20219impl<'db> From<GenericParamGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20220    fn from(value: GenericParamGreen<'db>) -> Self {
20221        GenericParamListElementOrSeparatorGreen::Element(value)
20222    }
20223}
20224impl<'db> GenericParamListElementOrSeparatorGreen<'db> {
20225    fn id(&self) -> GreenId<'db> {
20226        match self {
20227            GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20228            GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20229        }
20230    }
20231}
20232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20233pub struct GenericParamListGreen<'db>(pub GreenId<'db>);
20234impl<'db> TypedSyntaxNode<'db> for GenericParamList<'db> {
20235    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20236    type StablePtr = GenericParamListPtr<'db>;
20237    type Green = GenericParamListGreen<'db>;
20238    fn missing(db: &'db dyn Database) -> Self::Green {
20239        GenericParamListGreen(
20240            GreenNode {
20241                kind: SyntaxKind::GenericParamList,
20242                details: GreenNodeDetails::Node {
20243                    children: [].into(),
20244                    width: TextWidth::default(),
20245                },
20246            }
20247            .intern(db),
20248        )
20249    }
20250    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20251        Self(ElementList::new(node))
20252    }
20253    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20254        if node.kind(db) == SyntaxKind::GenericParamList {
20255            Some(Self(ElementList::new(node)))
20256        } else {
20257            None
20258        }
20259    }
20260    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20261        self.node
20262    }
20263    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20264        GenericParamListPtr(self.node.stable_ptr(db))
20265    }
20266}
20267#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20268pub enum GenericParam<'db> {
20269    Type(GenericParamType<'db>),
20270    Const(GenericParamConst<'db>),
20271    ImplNamed(GenericParamImplNamed<'db>),
20272    ImplAnonymous(GenericParamImplAnonymous<'db>),
20273    NegativeImpl(GenericParamNegativeImpl<'db>),
20274}
20275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20276pub struct GenericParamPtr<'db>(pub SyntaxStablePtrId<'db>);
20277impl<'db> TypedStablePtr<'db> for GenericParamPtr<'db> {
20278    type SyntaxNode = GenericParam<'db>;
20279    fn untyped(self) -> SyntaxStablePtrId<'db> {
20280        self.0
20281    }
20282    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20283        GenericParam::from_syntax_node(db, self.0.lookup(db))
20284    }
20285}
20286impl<'db> From<GenericParamPtr<'db>> for SyntaxStablePtrId<'db> {
20287    fn from(ptr: GenericParamPtr<'db>) -> Self {
20288        ptr.untyped()
20289    }
20290}
20291impl<'db> From<GenericParamTypePtr<'db>> for GenericParamPtr<'db> {
20292    fn from(value: GenericParamTypePtr<'db>) -> Self {
20293        Self(value.0)
20294    }
20295}
20296impl<'db> From<GenericParamConstPtr<'db>> for GenericParamPtr<'db> {
20297    fn from(value: GenericParamConstPtr<'db>) -> Self {
20298        Self(value.0)
20299    }
20300}
20301impl<'db> From<GenericParamImplNamedPtr<'db>> for GenericParamPtr<'db> {
20302    fn from(value: GenericParamImplNamedPtr<'db>) -> Self {
20303        Self(value.0)
20304    }
20305}
20306impl<'db> From<GenericParamImplAnonymousPtr<'db>> for GenericParamPtr<'db> {
20307    fn from(value: GenericParamImplAnonymousPtr<'db>) -> Self {
20308        Self(value.0)
20309    }
20310}
20311impl<'db> From<GenericParamNegativeImplPtr<'db>> for GenericParamPtr<'db> {
20312    fn from(value: GenericParamNegativeImplPtr<'db>) -> Self {
20313        Self(value.0)
20314    }
20315}
20316impl<'db> From<GenericParamTypeGreen<'db>> for GenericParamGreen<'db> {
20317    fn from(value: GenericParamTypeGreen<'db>) -> Self {
20318        Self(value.0)
20319    }
20320}
20321impl<'db> From<GenericParamConstGreen<'db>> for GenericParamGreen<'db> {
20322    fn from(value: GenericParamConstGreen<'db>) -> Self {
20323        Self(value.0)
20324    }
20325}
20326impl<'db> From<GenericParamImplNamedGreen<'db>> for GenericParamGreen<'db> {
20327    fn from(value: GenericParamImplNamedGreen<'db>) -> Self {
20328        Self(value.0)
20329    }
20330}
20331impl<'db> From<GenericParamImplAnonymousGreen<'db>> for GenericParamGreen<'db> {
20332    fn from(value: GenericParamImplAnonymousGreen<'db>) -> Self {
20333        Self(value.0)
20334    }
20335}
20336impl<'db> From<GenericParamNegativeImplGreen<'db>> for GenericParamGreen<'db> {
20337    fn from(value: GenericParamNegativeImplGreen<'db>) -> Self {
20338        Self(value.0)
20339    }
20340}
20341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20342pub struct GenericParamGreen<'db>(pub GreenId<'db>);
20343impl<'db> TypedSyntaxNode<'db> for GenericParam<'db> {
20344    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20345    type StablePtr = GenericParamPtr<'db>;
20346    type Green = GenericParamGreen<'db>;
20347    fn missing(db: &'db dyn Database) -> Self::Green {
20348        panic!("No missing variant.");
20349    }
20350    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20351        let kind = node.kind(db);
20352        match kind {
20353            SyntaxKind::GenericParamType => {
20354                GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20355            }
20356            SyntaxKind::GenericParamConst => {
20357                GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20358            }
20359            SyntaxKind::GenericParamImplNamed => {
20360                GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20361            }
20362            SyntaxKind::GenericParamImplAnonymous => {
20363                GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20364            }
20365            SyntaxKind::GenericParamNegativeImpl => {
20366                GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20367            }
20368            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20369        }
20370    }
20371    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20372        let kind = node.kind(db);
20373        match kind {
20374            SyntaxKind::GenericParamType => {
20375                Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20376            }
20377            SyntaxKind::GenericParamConst => {
20378                Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20379            }
20380            SyntaxKind::GenericParamImplNamed => {
20381                Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20382            }
20383            SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20384                GenericParamImplAnonymous::from_syntax_node(db, node),
20385            )),
20386            SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20387                GenericParamNegativeImpl::from_syntax_node(db, node),
20388            )),
20389            _ => None,
20390        }
20391    }
20392    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20393        match self {
20394            GenericParam::Type(x) => x.as_syntax_node(),
20395            GenericParam::Const(x) => x.as_syntax_node(),
20396            GenericParam::ImplNamed(x) => x.as_syntax_node(),
20397            GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20398            GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20399        }
20400    }
20401    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20402        GenericParamPtr(self.as_syntax_node().stable_ptr(db))
20403    }
20404}
20405impl<'db> GenericParam<'db> {
20406    /// Checks if a kind of a variant of [GenericParam].
20407    pub fn is_variant(kind: SyntaxKind) -> bool {
20408        matches!(
20409            kind,
20410            SyntaxKind::GenericParamType
20411                | SyntaxKind::GenericParamConst
20412                | SyntaxKind::GenericParamImplNamed
20413                | SyntaxKind::GenericParamImplAnonymous
20414                | SyntaxKind::GenericParamNegativeImpl
20415        )
20416    }
20417}
20418#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20419pub struct GenericParamType<'db> {
20420    node: SyntaxNode<'db>,
20421}
20422impl<'db> GenericParamType<'db> {
20423    pub const INDEX_NAME: usize = 0;
20424    pub fn new_green(
20425        db: &'db dyn Database,
20426        name: TerminalIdentifierGreen<'db>,
20427    ) -> GenericParamTypeGreen<'db> {
20428        let children = [name.0];
20429        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20430        GenericParamTypeGreen(
20431            GreenNode {
20432                kind: SyntaxKind::GenericParamType,
20433                details: GreenNodeDetails::Node { children: children.into(), width },
20434            }
20435            .intern(db),
20436        )
20437    }
20438}
20439impl<'db> GenericParamType<'db> {
20440    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20441        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20442    }
20443}
20444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20445pub struct GenericParamTypePtr<'db>(pub SyntaxStablePtrId<'db>);
20446impl<'db> GenericParamTypePtr<'db> {
20447    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20448        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20449    }
20450}
20451impl<'db> TypedStablePtr<'db> for GenericParamTypePtr<'db> {
20452    type SyntaxNode = GenericParamType<'db>;
20453    fn untyped(self) -> SyntaxStablePtrId<'db> {
20454        self.0
20455    }
20456    fn lookup(&self, db: &'db dyn Database) -> GenericParamType<'db> {
20457        GenericParamType::from_syntax_node(db, self.0.lookup(db))
20458    }
20459}
20460impl<'db> From<GenericParamTypePtr<'db>> for SyntaxStablePtrId<'db> {
20461    fn from(ptr: GenericParamTypePtr<'db>) -> Self {
20462        ptr.untyped()
20463    }
20464}
20465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20466pub struct GenericParamTypeGreen<'db>(pub GreenId<'db>);
20467impl<'db> TypedSyntaxNode<'db> for GenericParamType<'db> {
20468    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20469    type StablePtr = GenericParamTypePtr<'db>;
20470    type Green = GenericParamTypeGreen<'db>;
20471    fn missing(db: &'db dyn Database) -> Self::Green {
20472        GenericParamTypeGreen(
20473            GreenNode {
20474                kind: SyntaxKind::GenericParamType,
20475                details: GreenNodeDetails::Node {
20476                    children: [TerminalIdentifier::missing(db).0].into(),
20477                    width: TextWidth::default(),
20478                },
20479            }
20480            .intern(db),
20481        )
20482    }
20483    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20484        let kind = node.kind(db);
20485        assert_eq!(
20486            kind,
20487            SyntaxKind::GenericParamType,
20488            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20489            kind,
20490            SyntaxKind::GenericParamType
20491        );
20492        Self { node }
20493    }
20494    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20495        let kind = node.kind(db);
20496        if kind == SyntaxKind::GenericParamType {
20497            Some(Self::from_syntax_node(db, node))
20498        } else {
20499            None
20500        }
20501    }
20502    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20503        self.node
20504    }
20505    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20506        GenericParamTypePtr(self.node.stable_ptr(db))
20507    }
20508}
20509#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20510pub struct GenericParamConst<'db> {
20511    node: SyntaxNode<'db>,
20512}
20513impl<'db> GenericParamConst<'db> {
20514    pub const INDEX_CONST_KW: usize = 0;
20515    pub const INDEX_NAME: usize = 1;
20516    pub const INDEX_COLON: usize = 2;
20517    pub const INDEX_TY: usize = 3;
20518    pub fn new_green(
20519        db: &'db dyn Database,
20520        const_kw: TerminalConstGreen<'db>,
20521        name: TerminalIdentifierGreen<'db>,
20522        colon: TerminalColonGreen<'db>,
20523        ty: ExprGreen<'db>,
20524    ) -> GenericParamConstGreen<'db> {
20525        let children = [const_kw.0, name.0, colon.0, ty.0];
20526        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20527        GenericParamConstGreen(
20528            GreenNode {
20529                kind: SyntaxKind::GenericParamConst,
20530                details: GreenNodeDetails::Node { children: children.into(), width },
20531            }
20532            .intern(db),
20533        )
20534    }
20535}
20536impl<'db> GenericParamConst<'db> {
20537    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
20538        TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20539    }
20540    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20541        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20542    }
20543    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20544        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20545    }
20546    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
20547        Expr::from_syntax_node(db, self.node.get_children(db)[3])
20548    }
20549}
20550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20551pub struct GenericParamConstPtr<'db>(pub SyntaxStablePtrId<'db>);
20552impl<'db> GenericParamConstPtr<'db> {
20553    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20554        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20555    }
20556}
20557impl<'db> TypedStablePtr<'db> for GenericParamConstPtr<'db> {
20558    type SyntaxNode = GenericParamConst<'db>;
20559    fn untyped(self) -> SyntaxStablePtrId<'db> {
20560        self.0
20561    }
20562    fn lookup(&self, db: &'db dyn Database) -> GenericParamConst<'db> {
20563        GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20564    }
20565}
20566impl<'db> From<GenericParamConstPtr<'db>> for SyntaxStablePtrId<'db> {
20567    fn from(ptr: GenericParamConstPtr<'db>) -> Self {
20568        ptr.untyped()
20569    }
20570}
20571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20572pub struct GenericParamConstGreen<'db>(pub GreenId<'db>);
20573impl<'db> TypedSyntaxNode<'db> for GenericParamConst<'db> {
20574    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20575    type StablePtr = GenericParamConstPtr<'db>;
20576    type Green = GenericParamConstGreen<'db>;
20577    fn missing(db: &'db dyn Database) -> Self::Green {
20578        GenericParamConstGreen(
20579            GreenNode {
20580                kind: SyntaxKind::GenericParamConst,
20581                details: GreenNodeDetails::Node {
20582                    children: [
20583                        TerminalConst::missing(db).0,
20584                        TerminalIdentifier::missing(db).0,
20585                        TerminalColon::missing(db).0,
20586                        Expr::missing(db).0,
20587                    ]
20588                    .into(),
20589                    width: TextWidth::default(),
20590                },
20591            }
20592            .intern(db),
20593        )
20594    }
20595    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20596        let kind = node.kind(db);
20597        assert_eq!(
20598            kind,
20599            SyntaxKind::GenericParamConst,
20600            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20601            kind,
20602            SyntaxKind::GenericParamConst
20603        );
20604        Self { node }
20605    }
20606    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20607        let kind = node.kind(db);
20608        if kind == SyntaxKind::GenericParamConst {
20609            Some(Self::from_syntax_node(db, node))
20610        } else {
20611            None
20612        }
20613    }
20614    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20615        self.node
20616    }
20617    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20618        GenericParamConstPtr(self.node.stable_ptr(db))
20619    }
20620}
20621#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20622pub struct GenericParamImplNamed<'db> {
20623    node: SyntaxNode<'db>,
20624}
20625impl<'db> GenericParamImplNamed<'db> {
20626    pub const INDEX_IMPL_KW: usize = 0;
20627    pub const INDEX_NAME: usize = 1;
20628    pub const INDEX_COLON: usize = 2;
20629    pub const INDEX_TRAIT_PATH: usize = 3;
20630    pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20631    pub fn new_green(
20632        db: &'db dyn Database,
20633        impl_kw: TerminalImplGreen<'db>,
20634        name: TerminalIdentifierGreen<'db>,
20635        colon: TerminalColonGreen<'db>,
20636        trait_path: ExprPathGreen<'db>,
20637        type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20638    ) -> GenericParamImplNamedGreen<'db> {
20639        let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20640        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20641        GenericParamImplNamedGreen(
20642            GreenNode {
20643                kind: SyntaxKind::GenericParamImplNamed,
20644                details: GreenNodeDetails::Node { children: children.into(), width },
20645            }
20646            .intern(db),
20647        )
20648    }
20649}
20650impl<'db> GenericParamImplNamed<'db> {
20651    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
20652        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20653    }
20654    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20655        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20656    }
20657    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20658        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20659    }
20660    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20661        ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20662    }
20663    pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20664        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20665    }
20666}
20667#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20668pub struct GenericParamImplNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
20669impl<'db> GenericParamImplNamedPtr<'db> {
20670    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20671        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20672    }
20673}
20674impl<'db> TypedStablePtr<'db> for GenericParamImplNamedPtr<'db> {
20675    type SyntaxNode = GenericParamImplNamed<'db>;
20676    fn untyped(self) -> SyntaxStablePtrId<'db> {
20677        self.0
20678    }
20679    fn lookup(&self, db: &'db dyn Database) -> GenericParamImplNamed<'db> {
20680        GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20681    }
20682}
20683impl<'db> From<GenericParamImplNamedPtr<'db>> for SyntaxStablePtrId<'db> {
20684    fn from(ptr: GenericParamImplNamedPtr<'db>) -> Self {
20685        ptr.untyped()
20686    }
20687}
20688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20689pub struct GenericParamImplNamedGreen<'db>(pub GreenId<'db>);
20690impl<'db> TypedSyntaxNode<'db> for GenericParamImplNamed<'db> {
20691    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20692    type StablePtr = GenericParamImplNamedPtr<'db>;
20693    type Green = GenericParamImplNamedGreen<'db>;
20694    fn missing(db: &'db dyn Database) -> Self::Green {
20695        GenericParamImplNamedGreen(
20696            GreenNode {
20697                kind: SyntaxKind::GenericParamImplNamed,
20698                details: GreenNodeDetails::Node {
20699                    children: [
20700                        TerminalImpl::missing(db).0,
20701                        TerminalIdentifier::missing(db).0,
20702                        TerminalColon::missing(db).0,
20703                        ExprPath::missing(db).0,
20704                        OptionAssociatedItemConstraints::missing(db).0,
20705                    ]
20706                    .into(),
20707                    width: TextWidth::default(),
20708                },
20709            }
20710            .intern(db),
20711        )
20712    }
20713    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20714        let kind = node.kind(db);
20715        assert_eq!(
20716            kind,
20717            SyntaxKind::GenericParamImplNamed,
20718            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20719            kind,
20720            SyntaxKind::GenericParamImplNamed
20721        );
20722        Self { node }
20723    }
20724    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20725        let kind = node.kind(db);
20726        if kind == SyntaxKind::GenericParamImplNamed {
20727            Some(Self::from_syntax_node(db, node))
20728        } else {
20729            None
20730        }
20731    }
20732    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20733        self.node
20734    }
20735    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20736        GenericParamImplNamedPtr(self.node.stable_ptr(db))
20737    }
20738}
20739#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20740pub struct GenericParamImplAnonymous<'db> {
20741    node: SyntaxNode<'db>,
20742}
20743impl<'db> GenericParamImplAnonymous<'db> {
20744    pub const INDEX_PLUS: usize = 0;
20745    pub const INDEX_TRAIT_PATH: usize = 1;
20746    pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20747    pub fn new_green(
20748        db: &'db dyn Database,
20749        plus: TerminalPlusGreen<'db>,
20750        trait_path: ExprPathGreen<'db>,
20751        type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20752    ) -> GenericParamImplAnonymousGreen<'db> {
20753        let children = [plus.0, trait_path.0, type_constrains.0];
20754        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20755        GenericParamImplAnonymousGreen(
20756            GreenNode {
20757                kind: SyntaxKind::GenericParamImplAnonymous,
20758                details: GreenNodeDetails::Node { children: children.into(), width },
20759            }
20760            .intern(db),
20761        )
20762    }
20763}
20764impl<'db> GenericParamImplAnonymous<'db> {
20765    pub fn plus(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
20766        TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20767    }
20768    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20769        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20770    }
20771    pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20772        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20773    }
20774}
20775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20776pub struct GenericParamImplAnonymousPtr<'db>(pub SyntaxStablePtrId<'db>);
20777impl<'db> GenericParamImplAnonymousPtr<'db> {}
20778impl<'db> TypedStablePtr<'db> for GenericParamImplAnonymousPtr<'db> {
20779    type SyntaxNode = GenericParamImplAnonymous<'db>;
20780    fn untyped(self) -> SyntaxStablePtrId<'db> {
20781        self.0
20782    }
20783    fn lookup(&self, db: &'db dyn Database) -> GenericParamImplAnonymous<'db> {
20784        GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20785    }
20786}
20787impl<'db> From<GenericParamImplAnonymousPtr<'db>> for SyntaxStablePtrId<'db> {
20788    fn from(ptr: GenericParamImplAnonymousPtr<'db>) -> Self {
20789        ptr.untyped()
20790    }
20791}
20792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20793pub struct GenericParamImplAnonymousGreen<'db>(pub GreenId<'db>);
20794impl<'db> TypedSyntaxNode<'db> for GenericParamImplAnonymous<'db> {
20795    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20796    type StablePtr = GenericParamImplAnonymousPtr<'db>;
20797    type Green = GenericParamImplAnonymousGreen<'db>;
20798    fn missing(db: &'db dyn Database) -> Self::Green {
20799        GenericParamImplAnonymousGreen(
20800            GreenNode {
20801                kind: SyntaxKind::GenericParamImplAnonymous,
20802                details: GreenNodeDetails::Node {
20803                    children: [
20804                        TerminalPlus::missing(db).0,
20805                        ExprPath::missing(db).0,
20806                        OptionAssociatedItemConstraints::missing(db).0,
20807                    ]
20808                    .into(),
20809                    width: TextWidth::default(),
20810                },
20811            }
20812            .intern(db),
20813        )
20814    }
20815    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20816        let kind = node.kind(db);
20817        assert_eq!(
20818            kind,
20819            SyntaxKind::GenericParamImplAnonymous,
20820            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20821            kind,
20822            SyntaxKind::GenericParamImplAnonymous
20823        );
20824        Self { node }
20825    }
20826    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20827        let kind = node.kind(db);
20828        if kind == SyntaxKind::GenericParamImplAnonymous {
20829            Some(Self::from_syntax_node(db, node))
20830        } else {
20831            None
20832        }
20833    }
20834    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20835        self.node
20836    }
20837    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20838        GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
20839    }
20840}
20841#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20842pub struct GenericParamNegativeImpl<'db> {
20843    node: SyntaxNode<'db>,
20844}
20845impl<'db> GenericParamNegativeImpl<'db> {
20846    pub const INDEX_MINUS: usize = 0;
20847    pub const INDEX_TRAIT_PATH: usize = 1;
20848    pub fn new_green(
20849        db: &'db dyn Database,
20850        minus: TerminalMinusGreen<'db>,
20851        trait_path: ExprPathGreen<'db>,
20852    ) -> GenericParamNegativeImplGreen<'db> {
20853        let children = [minus.0, trait_path.0];
20854        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20855        GenericParamNegativeImplGreen(
20856            GreenNode {
20857                kind: SyntaxKind::GenericParamNegativeImpl,
20858                details: GreenNodeDetails::Node { children: children.into(), width },
20859            }
20860            .intern(db),
20861        )
20862    }
20863}
20864impl<'db> GenericParamNegativeImpl<'db> {
20865    pub fn minus(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
20866        TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
20867    }
20868    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20869        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20870    }
20871}
20872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20873pub struct GenericParamNegativeImplPtr<'db>(pub SyntaxStablePtrId<'db>);
20874impl<'db> GenericParamNegativeImplPtr<'db> {}
20875impl<'db> TypedStablePtr<'db> for GenericParamNegativeImplPtr<'db> {
20876    type SyntaxNode = GenericParamNegativeImpl<'db>;
20877    fn untyped(self) -> SyntaxStablePtrId<'db> {
20878        self.0
20879    }
20880    fn lookup(&self, db: &'db dyn Database) -> GenericParamNegativeImpl<'db> {
20881        GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
20882    }
20883}
20884impl<'db> From<GenericParamNegativeImplPtr<'db>> for SyntaxStablePtrId<'db> {
20885    fn from(ptr: GenericParamNegativeImplPtr<'db>) -> Self {
20886        ptr.untyped()
20887    }
20888}
20889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20890pub struct GenericParamNegativeImplGreen<'db>(pub GreenId<'db>);
20891impl<'db> TypedSyntaxNode<'db> for GenericParamNegativeImpl<'db> {
20892    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
20893    type StablePtr = GenericParamNegativeImplPtr<'db>;
20894    type Green = GenericParamNegativeImplGreen<'db>;
20895    fn missing(db: &'db dyn Database) -> Self::Green {
20896        GenericParamNegativeImplGreen(
20897            GreenNode {
20898                kind: SyntaxKind::GenericParamNegativeImpl,
20899                details: GreenNodeDetails::Node {
20900                    children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
20901                    width: TextWidth::default(),
20902                },
20903            }
20904            .intern(db),
20905        )
20906    }
20907    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20908        let kind = node.kind(db);
20909        assert_eq!(
20910            kind,
20911            SyntaxKind::GenericParamNegativeImpl,
20912            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20913            kind,
20914            SyntaxKind::GenericParamNegativeImpl
20915        );
20916        Self { node }
20917    }
20918    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20919        let kind = node.kind(db);
20920        if kind == SyntaxKind::GenericParamNegativeImpl {
20921            Some(Self::from_syntax_node(db, node))
20922        } else {
20923            None
20924        }
20925    }
20926    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20927        self.node
20928    }
20929    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20930        GenericParamNegativeImplPtr(self.node.stable_ptr(db))
20931    }
20932}
20933#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20934pub struct TokenList<'db>(ElementList<'db, TokenTree<'db>, 1>);
20935impl<'db> Deref for TokenList<'db> {
20936    type Target = ElementList<'db, TokenTree<'db>, 1>;
20937    fn deref(&self) -> &Self::Target {
20938        &self.0
20939    }
20940}
20941impl<'db> TokenList<'db> {
20942    pub fn new_green(
20943        db: &'db dyn Database,
20944        children: &[TokenTreeGreen<'db>],
20945    ) -> TokenListGreen<'db> {
20946        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
20947        TokenListGreen(
20948            GreenNode {
20949                kind: SyntaxKind::TokenList,
20950                details: GreenNodeDetails::Node {
20951                    children: children.iter().map(|x| x.0).collect(),
20952                    width,
20953                },
20954            }
20955            .intern(db),
20956        )
20957    }
20958}
20959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20960pub struct TokenListPtr<'db>(pub SyntaxStablePtrId<'db>);
20961impl<'db> TypedStablePtr<'db> for TokenListPtr<'db> {
20962    type SyntaxNode = TokenList<'db>;
20963    fn untyped(self) -> SyntaxStablePtrId<'db> {
20964        self.0
20965    }
20966    fn lookup(&self, db: &'db dyn Database) -> TokenList<'db> {
20967        TokenList::from_syntax_node(db, self.0.lookup(db))
20968    }
20969}
20970impl<'db> From<TokenListPtr<'db>> for SyntaxStablePtrId<'db> {
20971    fn from(ptr: TokenListPtr<'db>) -> Self {
20972        ptr.untyped()
20973    }
20974}
20975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20976pub struct TokenListGreen<'db>(pub GreenId<'db>);
20977impl<'db> TypedSyntaxNode<'db> for TokenList<'db> {
20978    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
20979    type StablePtr = TokenListPtr<'db>;
20980    type Green = TokenListGreen<'db>;
20981    fn missing(db: &'db dyn Database) -> Self::Green {
20982        TokenListGreen(
20983            GreenNode {
20984                kind: SyntaxKind::TokenList,
20985                details: GreenNodeDetails::Node {
20986                    children: [].into(),
20987                    width: TextWidth::default(),
20988                },
20989            }
20990            .intern(db),
20991        )
20992    }
20993    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20994        Self(ElementList::new(node))
20995    }
20996    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20997        if node.kind(db) == SyntaxKind::TokenList {
20998            Some(Self(ElementList::new(node)))
20999        } else {
21000            None
21001        }
21002    }
21003    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21004        self.node
21005    }
21006    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21007        TokenListPtr(self.node.stable_ptr(db))
21008    }
21009}
21010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21011pub struct TokenTreeLeaf<'db> {
21012    node: SyntaxNode<'db>,
21013}
21014impl<'db> TokenTreeLeaf<'db> {
21015    pub const INDEX_LEAF: usize = 0;
21016    pub fn new_green(db: &'db dyn Database, leaf: TokenNodeGreen<'db>) -> TokenTreeLeafGreen<'db> {
21017        let children = [leaf.0];
21018        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21019        TokenTreeLeafGreen(
21020            GreenNode {
21021                kind: SyntaxKind::TokenTreeLeaf,
21022                details: GreenNodeDetails::Node { children: children.into(), width },
21023            }
21024            .intern(db),
21025        )
21026    }
21027}
21028impl<'db> TokenTreeLeaf<'db> {
21029    pub fn leaf(&self, db: &'db dyn Database) -> TokenNode<'db> {
21030        TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
21031    }
21032}
21033#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21034pub struct TokenTreeLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
21035impl<'db> TokenTreeLeafPtr<'db> {}
21036impl<'db> TypedStablePtr<'db> for TokenTreeLeafPtr<'db> {
21037    type SyntaxNode = TokenTreeLeaf<'db>;
21038    fn untyped(self) -> SyntaxStablePtrId<'db> {
21039        self.0
21040    }
21041    fn lookup(&self, db: &'db dyn Database) -> TokenTreeLeaf<'db> {
21042        TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
21043    }
21044}
21045impl<'db> From<TokenTreeLeafPtr<'db>> for SyntaxStablePtrId<'db> {
21046    fn from(ptr: TokenTreeLeafPtr<'db>) -> Self {
21047        ptr.untyped()
21048    }
21049}
21050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21051pub struct TokenTreeLeafGreen<'db>(pub GreenId<'db>);
21052impl<'db> TypedSyntaxNode<'db> for TokenTreeLeaf<'db> {
21053    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
21054    type StablePtr = TokenTreeLeafPtr<'db>;
21055    type Green = TokenTreeLeafGreen<'db>;
21056    fn missing(db: &'db dyn Database) -> Self::Green {
21057        TokenTreeLeafGreen(
21058            GreenNode {
21059                kind: SyntaxKind::TokenTreeLeaf,
21060                details: GreenNodeDetails::Node {
21061                    children: [TokenNode::missing(db).0].into(),
21062                    width: TextWidth::default(),
21063                },
21064            }
21065            .intern(db),
21066        )
21067    }
21068    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21069        let kind = node.kind(db);
21070        assert_eq!(
21071            kind,
21072            SyntaxKind::TokenTreeLeaf,
21073            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21074            kind,
21075            SyntaxKind::TokenTreeLeaf
21076        );
21077        Self { node }
21078    }
21079    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21080        let kind = node.kind(db);
21081        if kind == SyntaxKind::TokenTreeLeaf {
21082            Some(Self::from_syntax_node(db, node))
21083        } else {
21084            None
21085        }
21086    }
21087    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21088        self.node
21089    }
21090    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21091        TokenTreeLeafPtr(self.node.stable_ptr(db))
21092    }
21093}
21094#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21095pub struct TokenTreeNode<'db> {
21096    node: SyntaxNode<'db>,
21097}
21098impl<'db> TokenTreeNode<'db> {
21099    pub const INDEX_SUBTREE: usize = 0;
21100    pub fn new_green(
21101        db: &'db dyn Database,
21102        subtree: WrappedTokenTreeGreen<'db>,
21103    ) -> TokenTreeNodeGreen<'db> {
21104        let children = [subtree.0];
21105        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21106        TokenTreeNodeGreen(
21107            GreenNode {
21108                kind: SyntaxKind::TokenTreeNode,
21109                details: GreenNodeDetails::Node { children: children.into(), width },
21110            }
21111            .intern(db),
21112        )
21113    }
21114}
21115impl<'db> TokenTreeNode<'db> {
21116    pub fn subtree(&self, db: &'db dyn Database) -> WrappedTokenTree<'db> {
21117        WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
21118    }
21119}
21120#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21121pub struct TokenTreeNodePtr<'db>(pub SyntaxStablePtrId<'db>);
21122impl<'db> TokenTreeNodePtr<'db> {}
21123impl<'db> TypedStablePtr<'db> for TokenTreeNodePtr<'db> {
21124    type SyntaxNode = TokenTreeNode<'db>;
21125    fn untyped(self) -> SyntaxStablePtrId<'db> {
21126        self.0
21127    }
21128    fn lookup(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
21129        TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
21130    }
21131}
21132impl<'db> From<TokenTreeNodePtr<'db>> for SyntaxStablePtrId<'db> {
21133    fn from(ptr: TokenTreeNodePtr<'db>) -> Self {
21134        ptr.untyped()
21135    }
21136}
21137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21138pub struct TokenTreeNodeGreen<'db>(pub GreenId<'db>);
21139impl<'db> TypedSyntaxNode<'db> for TokenTreeNode<'db> {
21140    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
21141    type StablePtr = TokenTreeNodePtr<'db>;
21142    type Green = TokenTreeNodeGreen<'db>;
21143    fn missing(db: &'db dyn Database) -> Self::Green {
21144        TokenTreeNodeGreen(
21145            GreenNode {
21146                kind: SyntaxKind::TokenTreeNode,
21147                details: GreenNodeDetails::Node {
21148                    children: [WrappedTokenTree::missing(db).0].into(),
21149                    width: TextWidth::default(),
21150                },
21151            }
21152            .intern(db),
21153        )
21154    }
21155    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21156        let kind = node.kind(db);
21157        assert_eq!(
21158            kind,
21159            SyntaxKind::TokenTreeNode,
21160            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21161            kind,
21162            SyntaxKind::TokenTreeNode
21163        );
21164        Self { node }
21165    }
21166    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21167        let kind = node.kind(db);
21168        if kind == SyntaxKind::TokenTreeNode {
21169            Some(Self::from_syntax_node(db, node))
21170        } else {
21171            None
21172        }
21173    }
21174    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21175        self.node
21176    }
21177    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21178        TokenTreeNodePtr(self.node.stable_ptr(db))
21179    }
21180}
21181#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21182pub struct TokenTreeRepetition<'db> {
21183    node: SyntaxNode<'db>,
21184}
21185impl<'db> TokenTreeRepetition<'db> {
21186    pub const INDEX_DOLLAR: usize = 0;
21187    pub const INDEX_LPAREN: usize = 1;
21188    pub const INDEX_ELEMENTS: usize = 2;
21189    pub const INDEX_RPAREN: usize = 3;
21190    pub const INDEX_SEPARATOR: usize = 4;
21191    pub const INDEX_OPERATOR: usize = 5;
21192    pub fn new_green(
21193        db: &'db dyn Database,
21194        dollar: TerminalDollarGreen<'db>,
21195        lparen: TerminalLParenGreen<'db>,
21196        elements: TokenListGreen<'db>,
21197        rparen: TerminalRParenGreen<'db>,
21198        separator: OptionTerminalCommaGreen<'db>,
21199        operator: MacroRepetitionOperatorGreen<'db>,
21200    ) -> TokenTreeRepetitionGreen<'db> {
21201        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
21202        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21203        TokenTreeRepetitionGreen(
21204            GreenNode {
21205                kind: SyntaxKind::TokenTreeRepetition,
21206                details: GreenNodeDetails::Node { children: children.into(), width },
21207            }
21208            .intern(db),
21209        )
21210    }
21211}
21212impl<'db> TokenTreeRepetition<'db> {
21213    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21214        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21215    }
21216    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21217        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
21218    }
21219    pub fn elements(&self, db: &'db dyn Database) -> TokenList<'db> {
21220        TokenList::from_syntax_node(db, self.node.get_children(db)[2])
21221    }
21222    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21223        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
21224    }
21225    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
21226        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
21227    }
21228    pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
21229        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
21230    }
21231}
21232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21233pub struct TokenTreeRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
21234impl<'db> TokenTreeRepetitionPtr<'db> {}
21235impl<'db> TypedStablePtr<'db> for TokenTreeRepetitionPtr<'db> {
21236    type SyntaxNode = TokenTreeRepetition<'db>;
21237    fn untyped(self) -> SyntaxStablePtrId<'db> {
21238        self.0
21239    }
21240    fn lookup(&self, db: &'db dyn Database) -> TokenTreeRepetition<'db> {
21241        TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
21242    }
21243}
21244impl<'db> From<TokenTreeRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
21245    fn from(ptr: TokenTreeRepetitionPtr<'db>) -> Self {
21246        ptr.untyped()
21247    }
21248}
21249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21250pub struct TokenTreeRepetitionGreen<'db>(pub GreenId<'db>);
21251impl<'db> TypedSyntaxNode<'db> for TokenTreeRepetition<'db> {
21252    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21253    type StablePtr = TokenTreeRepetitionPtr<'db>;
21254    type Green = TokenTreeRepetitionGreen<'db>;
21255    fn missing(db: &'db dyn Database) -> Self::Green {
21256        TokenTreeRepetitionGreen(
21257            GreenNode {
21258                kind: SyntaxKind::TokenTreeRepetition,
21259                details: GreenNodeDetails::Node {
21260                    children: [
21261                        TerminalDollar::missing(db).0,
21262                        TerminalLParen::missing(db).0,
21263                        TokenList::missing(db).0,
21264                        TerminalRParen::missing(db).0,
21265                        OptionTerminalComma::missing(db).0,
21266                        MacroRepetitionOperator::missing(db).0,
21267                    ]
21268                    .into(),
21269                    width: TextWidth::default(),
21270                },
21271            }
21272            .intern(db),
21273        )
21274    }
21275    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21276        let kind = node.kind(db);
21277        assert_eq!(
21278            kind,
21279            SyntaxKind::TokenTreeRepetition,
21280            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21281            kind,
21282            SyntaxKind::TokenTreeRepetition
21283        );
21284        Self { node }
21285    }
21286    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21287        let kind = node.kind(db);
21288        if kind == SyntaxKind::TokenTreeRepetition {
21289            Some(Self::from_syntax_node(db, node))
21290        } else {
21291            None
21292        }
21293    }
21294    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21295        self.node
21296    }
21297    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21298        TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21299    }
21300}
21301#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21302pub struct TokenTreeParam<'db> {
21303    node: SyntaxNode<'db>,
21304}
21305impl<'db> TokenTreeParam<'db> {
21306    pub const INDEX_DOLLAR: usize = 0;
21307    pub const INDEX_NAME: usize = 1;
21308    pub fn new_green(
21309        db: &'db dyn Database,
21310        dollar: TerminalDollarGreen<'db>,
21311        name: TerminalIdentifierGreen<'db>,
21312    ) -> TokenTreeParamGreen<'db> {
21313        let children = [dollar.0, name.0];
21314        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21315        TokenTreeParamGreen(
21316            GreenNode {
21317                kind: SyntaxKind::TokenTreeParam,
21318                details: GreenNodeDetails::Node { children: children.into(), width },
21319            }
21320            .intern(db),
21321        )
21322    }
21323}
21324impl<'db> TokenTreeParam<'db> {
21325    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21326        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21327    }
21328    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
21329        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21330    }
21331}
21332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21333pub struct TokenTreeParamPtr<'db>(pub SyntaxStablePtrId<'db>);
21334impl<'db> TokenTreeParamPtr<'db> {}
21335impl<'db> TypedStablePtr<'db> for TokenTreeParamPtr<'db> {
21336    type SyntaxNode = TokenTreeParam<'db>;
21337    fn untyped(self) -> SyntaxStablePtrId<'db> {
21338        self.0
21339    }
21340    fn lookup(&self, db: &'db dyn Database) -> TokenTreeParam<'db> {
21341        TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21342    }
21343}
21344impl<'db> From<TokenTreeParamPtr<'db>> for SyntaxStablePtrId<'db> {
21345    fn from(ptr: TokenTreeParamPtr<'db>) -> Self {
21346        ptr.untyped()
21347    }
21348}
21349#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21350pub struct TokenTreeParamGreen<'db>(pub GreenId<'db>);
21351impl<'db> TypedSyntaxNode<'db> for TokenTreeParam<'db> {
21352    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21353    type StablePtr = TokenTreeParamPtr<'db>;
21354    type Green = TokenTreeParamGreen<'db>;
21355    fn missing(db: &'db dyn Database) -> Self::Green {
21356        TokenTreeParamGreen(
21357            GreenNode {
21358                kind: SyntaxKind::TokenTreeParam,
21359                details: GreenNodeDetails::Node {
21360                    children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21361                        .into(),
21362                    width: TextWidth::default(),
21363                },
21364            }
21365            .intern(db),
21366        )
21367    }
21368    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21369        let kind = node.kind(db);
21370        assert_eq!(
21371            kind,
21372            SyntaxKind::TokenTreeParam,
21373            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21374            kind,
21375            SyntaxKind::TokenTreeParam
21376        );
21377        Self { node }
21378    }
21379    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21380        let kind = node.kind(db);
21381        if kind == SyntaxKind::TokenTreeParam {
21382            Some(Self::from_syntax_node(db, node))
21383        } else {
21384            None
21385        }
21386    }
21387    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21388        self.node
21389    }
21390    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21391        TokenTreeParamPtr(self.node.stable_ptr(db))
21392    }
21393}
21394#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21395pub enum TokenTree<'db> {
21396    Token(TokenTreeLeaf<'db>),
21397    Subtree(TokenTreeNode<'db>),
21398    Repetition(TokenTreeRepetition<'db>),
21399    Param(TokenTreeParam<'db>),
21400    Missing(TokenTreeMissing<'db>),
21401}
21402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21403pub struct TokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21404impl<'db> TypedStablePtr<'db> for TokenTreePtr<'db> {
21405    type SyntaxNode = TokenTree<'db>;
21406    fn untyped(self) -> SyntaxStablePtrId<'db> {
21407        self.0
21408    }
21409    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21410        TokenTree::from_syntax_node(db, self.0.lookup(db))
21411    }
21412}
21413impl<'db> From<TokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21414    fn from(ptr: TokenTreePtr<'db>) -> Self {
21415        ptr.untyped()
21416    }
21417}
21418impl<'db> From<TokenTreeLeafPtr<'db>> for TokenTreePtr<'db> {
21419    fn from(value: TokenTreeLeafPtr<'db>) -> Self {
21420        Self(value.0)
21421    }
21422}
21423impl<'db> From<TokenTreeNodePtr<'db>> for TokenTreePtr<'db> {
21424    fn from(value: TokenTreeNodePtr<'db>) -> Self {
21425        Self(value.0)
21426    }
21427}
21428impl<'db> From<TokenTreeRepetitionPtr<'db>> for TokenTreePtr<'db> {
21429    fn from(value: TokenTreeRepetitionPtr<'db>) -> Self {
21430        Self(value.0)
21431    }
21432}
21433impl<'db> From<TokenTreeParamPtr<'db>> for TokenTreePtr<'db> {
21434    fn from(value: TokenTreeParamPtr<'db>) -> Self {
21435        Self(value.0)
21436    }
21437}
21438impl<'db> From<TokenTreeMissingPtr<'db>> for TokenTreePtr<'db> {
21439    fn from(value: TokenTreeMissingPtr<'db>) -> Self {
21440        Self(value.0)
21441    }
21442}
21443impl<'db> From<TokenTreeLeafGreen<'db>> for TokenTreeGreen<'db> {
21444    fn from(value: TokenTreeLeafGreen<'db>) -> Self {
21445        Self(value.0)
21446    }
21447}
21448impl<'db> From<TokenTreeNodeGreen<'db>> for TokenTreeGreen<'db> {
21449    fn from(value: TokenTreeNodeGreen<'db>) -> Self {
21450        Self(value.0)
21451    }
21452}
21453impl<'db> From<TokenTreeRepetitionGreen<'db>> for TokenTreeGreen<'db> {
21454    fn from(value: TokenTreeRepetitionGreen<'db>) -> Self {
21455        Self(value.0)
21456    }
21457}
21458impl<'db> From<TokenTreeParamGreen<'db>> for TokenTreeGreen<'db> {
21459    fn from(value: TokenTreeParamGreen<'db>) -> Self {
21460        Self(value.0)
21461    }
21462}
21463impl<'db> From<TokenTreeMissingGreen<'db>> for TokenTreeGreen<'db> {
21464    fn from(value: TokenTreeMissingGreen<'db>) -> Self {
21465        Self(value.0)
21466    }
21467}
21468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21469pub struct TokenTreeGreen<'db>(pub GreenId<'db>);
21470impl<'db> TypedSyntaxNode<'db> for TokenTree<'db> {
21471    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21472    type StablePtr = TokenTreePtr<'db>;
21473    type Green = TokenTreeGreen<'db>;
21474    fn missing(db: &'db dyn Database) -> Self::Green {
21475        TokenTreeGreen(TokenTreeMissing::missing(db).0)
21476    }
21477    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21478        let kind = node.kind(db);
21479        match kind {
21480            SyntaxKind::TokenTreeLeaf => {
21481                TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21482            }
21483            SyntaxKind::TokenTreeNode => {
21484                TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21485            }
21486            SyntaxKind::TokenTreeRepetition => {
21487                TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21488            }
21489            SyntaxKind::TokenTreeParam => {
21490                TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21491            }
21492            SyntaxKind::TokenTreeMissing => {
21493                TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21494            }
21495            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21496        }
21497    }
21498    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21499        let kind = node.kind(db);
21500        match kind {
21501            SyntaxKind::TokenTreeLeaf => {
21502                Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21503            }
21504            SyntaxKind::TokenTreeNode => {
21505                Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21506            }
21507            SyntaxKind::TokenTreeRepetition => {
21508                Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21509            }
21510            SyntaxKind::TokenTreeParam => {
21511                Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21512            }
21513            SyntaxKind::TokenTreeMissing => {
21514                Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21515            }
21516            _ => None,
21517        }
21518    }
21519    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21520        match self {
21521            TokenTree::Token(x) => x.as_syntax_node(),
21522            TokenTree::Subtree(x) => x.as_syntax_node(),
21523            TokenTree::Repetition(x) => x.as_syntax_node(),
21524            TokenTree::Param(x) => x.as_syntax_node(),
21525            TokenTree::Missing(x) => x.as_syntax_node(),
21526        }
21527    }
21528    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21529        TokenTreePtr(self.as_syntax_node().stable_ptr(db))
21530    }
21531}
21532impl<'db> TokenTree<'db> {
21533    /// Checks if a kind of a variant of [TokenTree].
21534    pub fn is_variant(kind: SyntaxKind) -> bool {
21535        matches!(
21536            kind,
21537            SyntaxKind::TokenTreeLeaf
21538                | SyntaxKind::TokenTreeNode
21539                | SyntaxKind::TokenTreeRepetition
21540                | SyntaxKind::TokenTreeParam
21541                | SyntaxKind::TokenTreeMissing
21542        )
21543    }
21544}
21545#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21546pub struct TokenTreeMissing<'db> {
21547    node: SyntaxNode<'db>,
21548}
21549impl<'db> TokenTreeMissing<'db> {
21550    pub fn new_green(db: &'db dyn Database) -> TokenTreeMissingGreen<'db> {
21551        let children = [];
21552        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21553        TokenTreeMissingGreen(
21554            GreenNode {
21555                kind: SyntaxKind::TokenTreeMissing,
21556                details: GreenNodeDetails::Node { children: children.into(), width },
21557            }
21558            .intern(db),
21559        )
21560    }
21561}
21562impl<'db> TokenTreeMissing<'db> {}
21563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21564pub struct TokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21565impl<'db> TokenTreeMissingPtr<'db> {}
21566impl<'db> TypedStablePtr<'db> for TokenTreeMissingPtr<'db> {
21567    type SyntaxNode = TokenTreeMissing<'db>;
21568    fn untyped(self) -> SyntaxStablePtrId<'db> {
21569        self.0
21570    }
21571    fn lookup(&self, db: &'db dyn Database) -> TokenTreeMissing<'db> {
21572        TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21573    }
21574}
21575impl<'db> From<TokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21576    fn from(ptr: TokenTreeMissingPtr<'db>) -> Self {
21577        ptr.untyped()
21578    }
21579}
21580#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21581pub struct TokenTreeMissingGreen<'db>(pub GreenId<'db>);
21582impl<'db> TypedSyntaxNode<'db> for TokenTreeMissing<'db> {
21583    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21584    type StablePtr = TokenTreeMissingPtr<'db>;
21585    type Green = TokenTreeMissingGreen<'db>;
21586    fn missing(db: &'db dyn Database) -> Self::Green {
21587        TokenTreeMissingGreen(
21588            GreenNode {
21589                kind: SyntaxKind::TokenTreeMissing,
21590                details: GreenNodeDetails::Node {
21591                    children: [].into(),
21592                    width: TextWidth::default(),
21593                },
21594            }
21595            .intern(db),
21596        )
21597    }
21598    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21599        let kind = node.kind(db);
21600        assert_eq!(
21601            kind,
21602            SyntaxKind::TokenTreeMissing,
21603            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21604            kind,
21605            SyntaxKind::TokenTreeMissing
21606        );
21607        Self { node }
21608    }
21609    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21610        let kind = node.kind(db);
21611        if kind == SyntaxKind::TokenTreeMissing {
21612            Some(Self::from_syntax_node(db, node))
21613        } else {
21614            None
21615        }
21616    }
21617    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21618        self.node
21619    }
21620    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21621        TokenTreeMissingPtr(self.node.stable_ptr(db))
21622    }
21623}
21624#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21625pub enum WrappedTokenTree<'db> {
21626    Parenthesized(ParenthesizedTokenTree<'db>),
21627    Braced(BracedTokenTree<'db>),
21628    Bracketed(BracketedTokenTree<'db>),
21629    Missing(WrappedTokenTreeMissing<'db>),
21630}
21631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21632pub struct WrappedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21633impl<'db> TypedStablePtr<'db> for WrappedTokenTreePtr<'db> {
21634    type SyntaxNode = WrappedTokenTree<'db>;
21635    fn untyped(self) -> SyntaxStablePtrId<'db> {
21636        self.0
21637    }
21638    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21639        WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21640    }
21641}
21642impl<'db> From<WrappedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21643    fn from(ptr: WrappedTokenTreePtr<'db>) -> Self {
21644        ptr.untyped()
21645    }
21646}
21647impl<'db> From<ParenthesizedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21648    fn from(value: ParenthesizedTokenTreePtr<'db>) -> Self {
21649        Self(value.0)
21650    }
21651}
21652impl<'db> From<BracedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21653    fn from(value: BracedTokenTreePtr<'db>) -> Self {
21654        Self(value.0)
21655    }
21656}
21657impl<'db> From<BracketedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21658    fn from(value: BracketedTokenTreePtr<'db>) -> Self {
21659        Self(value.0)
21660    }
21661}
21662impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for WrappedTokenTreePtr<'db> {
21663    fn from(value: WrappedTokenTreeMissingPtr<'db>) -> Self {
21664        Self(value.0)
21665    }
21666}
21667impl<'db> From<ParenthesizedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21668    fn from(value: ParenthesizedTokenTreeGreen<'db>) -> Self {
21669        Self(value.0)
21670    }
21671}
21672impl<'db> From<BracedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21673    fn from(value: BracedTokenTreeGreen<'db>) -> Self {
21674        Self(value.0)
21675    }
21676}
21677impl<'db> From<BracketedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21678    fn from(value: BracketedTokenTreeGreen<'db>) -> Self {
21679        Self(value.0)
21680    }
21681}
21682impl<'db> From<WrappedTokenTreeMissingGreen<'db>> for WrappedTokenTreeGreen<'db> {
21683    fn from(value: WrappedTokenTreeMissingGreen<'db>) -> Self {
21684        Self(value.0)
21685    }
21686}
21687#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21688pub struct WrappedTokenTreeGreen<'db>(pub GreenId<'db>);
21689impl<'db> TypedSyntaxNode<'db> for WrappedTokenTree<'db> {
21690    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21691    type StablePtr = WrappedTokenTreePtr<'db>;
21692    type Green = WrappedTokenTreeGreen<'db>;
21693    fn missing(db: &'db dyn Database) -> Self::Green {
21694        WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21695    }
21696    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21697        let kind = node.kind(db);
21698        match kind {
21699            SyntaxKind::ParenthesizedTokenTree => {
21700                WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21701            }
21702            SyntaxKind::BracedTokenTree => {
21703                WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21704            }
21705            SyntaxKind::BracketedTokenTree => {
21706                WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21707            }
21708            SyntaxKind::WrappedTokenTreeMissing => {
21709                WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21710            }
21711            _ => panic!(
21712                "Unexpected syntax kind {:?} when constructing {}.",
21713                kind, "WrappedTokenTree"
21714            ),
21715        }
21716    }
21717    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21718        let kind = node.kind(db);
21719        match kind {
21720            SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21721                ParenthesizedTokenTree::from_syntax_node(db, node),
21722            )),
21723            SyntaxKind::BracedTokenTree => {
21724                Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21725            }
21726            SyntaxKind::BracketedTokenTree => {
21727                Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21728            }
21729            SyntaxKind::WrappedTokenTreeMissing => {
21730                Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21731            }
21732            _ => None,
21733        }
21734    }
21735    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21736        match self {
21737            WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21738            WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21739            WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21740            WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21741        }
21742    }
21743    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21744        WrappedTokenTreePtr(self.as_syntax_node().stable_ptr(db))
21745    }
21746}
21747impl<'db> WrappedTokenTree<'db> {
21748    /// Checks if a kind of a variant of [WrappedTokenTree].
21749    pub fn is_variant(kind: SyntaxKind) -> bool {
21750        matches!(
21751            kind,
21752            SyntaxKind::ParenthesizedTokenTree
21753                | SyntaxKind::BracedTokenTree
21754                | SyntaxKind::BracketedTokenTree
21755                | SyntaxKind::WrappedTokenTreeMissing
21756        )
21757    }
21758}
21759#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21760pub struct WrappedTokenTreeMissing<'db> {
21761    node: SyntaxNode<'db>,
21762}
21763impl<'db> WrappedTokenTreeMissing<'db> {
21764    pub fn new_green(db: &'db dyn Database) -> WrappedTokenTreeMissingGreen<'db> {
21765        let children = [];
21766        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21767        WrappedTokenTreeMissingGreen(
21768            GreenNode {
21769                kind: SyntaxKind::WrappedTokenTreeMissing,
21770                details: GreenNodeDetails::Node { children: children.into(), width },
21771            }
21772            .intern(db),
21773        )
21774    }
21775}
21776impl<'db> WrappedTokenTreeMissing<'db> {}
21777#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21778pub struct WrappedTokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21779impl<'db> WrappedTokenTreeMissingPtr<'db> {}
21780impl<'db> TypedStablePtr<'db> for WrappedTokenTreeMissingPtr<'db> {
21781    type SyntaxNode = WrappedTokenTreeMissing<'db>;
21782    fn untyped(self) -> SyntaxStablePtrId<'db> {
21783        self.0
21784    }
21785    fn lookup(&self, db: &'db dyn Database) -> WrappedTokenTreeMissing<'db> {
21786        WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21787    }
21788}
21789impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21790    fn from(ptr: WrappedTokenTreeMissingPtr<'db>) -> Self {
21791        ptr.untyped()
21792    }
21793}
21794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21795pub struct WrappedTokenTreeMissingGreen<'db>(pub GreenId<'db>);
21796impl<'db> TypedSyntaxNode<'db> for WrappedTokenTreeMissing<'db> {
21797    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21798    type StablePtr = WrappedTokenTreeMissingPtr<'db>;
21799    type Green = WrappedTokenTreeMissingGreen<'db>;
21800    fn missing(db: &'db dyn Database) -> Self::Green {
21801        WrappedTokenTreeMissingGreen(
21802            GreenNode {
21803                kind: SyntaxKind::WrappedTokenTreeMissing,
21804                details: GreenNodeDetails::Node {
21805                    children: [].into(),
21806                    width: TextWidth::default(),
21807                },
21808            }
21809            .intern(db),
21810        )
21811    }
21812    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21813        let kind = node.kind(db);
21814        assert_eq!(
21815            kind,
21816            SyntaxKind::WrappedTokenTreeMissing,
21817            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21818            kind,
21819            SyntaxKind::WrappedTokenTreeMissing
21820        );
21821        Self { node }
21822    }
21823    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21824        let kind = node.kind(db);
21825        if kind == SyntaxKind::WrappedTokenTreeMissing {
21826            Some(Self::from_syntax_node(db, node))
21827        } else {
21828            None
21829        }
21830    }
21831    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21832        self.node
21833    }
21834    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21835        WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
21836    }
21837}
21838#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21839pub struct ParenthesizedTokenTree<'db> {
21840    node: SyntaxNode<'db>,
21841}
21842impl<'db> ParenthesizedTokenTree<'db> {
21843    pub const INDEX_LPAREN: usize = 0;
21844    pub const INDEX_TOKENS: usize = 1;
21845    pub const INDEX_RPAREN: usize = 2;
21846    pub fn new_green(
21847        db: &'db dyn Database,
21848        lparen: TerminalLParenGreen<'db>,
21849        tokens: TokenListGreen<'db>,
21850        rparen: TerminalRParenGreen<'db>,
21851    ) -> ParenthesizedTokenTreeGreen<'db> {
21852        let children = [lparen.0, tokens.0, rparen.0];
21853        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21854        ParenthesizedTokenTreeGreen(
21855            GreenNode {
21856                kind: SyntaxKind::ParenthesizedTokenTree,
21857                details: GreenNodeDetails::Node { children: children.into(), width },
21858            }
21859            .intern(db),
21860        )
21861    }
21862}
21863impl<'db> ParenthesizedTokenTree<'db> {
21864    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21865        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
21866    }
21867    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21868        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21869    }
21870    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21871        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
21872    }
21873}
21874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21875pub struct ParenthesizedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21876impl<'db> ParenthesizedTokenTreePtr<'db> {}
21877impl<'db> TypedStablePtr<'db> for ParenthesizedTokenTreePtr<'db> {
21878    type SyntaxNode = ParenthesizedTokenTree<'db>;
21879    fn untyped(self) -> SyntaxStablePtrId<'db> {
21880        self.0
21881    }
21882    fn lookup(&self, db: &'db dyn Database) -> ParenthesizedTokenTree<'db> {
21883        ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
21884    }
21885}
21886impl<'db> From<ParenthesizedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21887    fn from(ptr: ParenthesizedTokenTreePtr<'db>) -> Self {
21888        ptr.untyped()
21889    }
21890}
21891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21892pub struct ParenthesizedTokenTreeGreen<'db>(pub GreenId<'db>);
21893impl<'db> TypedSyntaxNode<'db> for ParenthesizedTokenTree<'db> {
21894    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
21895    type StablePtr = ParenthesizedTokenTreePtr<'db>;
21896    type Green = ParenthesizedTokenTreeGreen<'db>;
21897    fn missing(db: &'db dyn Database) -> Self::Green {
21898        ParenthesizedTokenTreeGreen(
21899            GreenNode {
21900                kind: SyntaxKind::ParenthesizedTokenTree,
21901                details: GreenNodeDetails::Node {
21902                    children: [
21903                        TerminalLParen::missing(db).0,
21904                        TokenList::missing(db).0,
21905                        TerminalRParen::missing(db).0,
21906                    ]
21907                    .into(),
21908                    width: TextWidth::default(),
21909                },
21910            }
21911            .intern(db),
21912        )
21913    }
21914    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21915        let kind = node.kind(db);
21916        assert_eq!(
21917            kind,
21918            SyntaxKind::ParenthesizedTokenTree,
21919            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21920            kind,
21921            SyntaxKind::ParenthesizedTokenTree
21922        );
21923        Self { node }
21924    }
21925    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21926        let kind = node.kind(db);
21927        if kind == SyntaxKind::ParenthesizedTokenTree {
21928            Some(Self::from_syntax_node(db, node))
21929        } else {
21930            None
21931        }
21932    }
21933    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21934        self.node
21935    }
21936    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21937        ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
21938    }
21939}
21940#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21941pub struct BracedTokenTree<'db> {
21942    node: SyntaxNode<'db>,
21943}
21944impl<'db> BracedTokenTree<'db> {
21945    pub const INDEX_LBRACE: usize = 0;
21946    pub const INDEX_TOKENS: usize = 1;
21947    pub const INDEX_RBRACE: usize = 2;
21948    pub fn new_green(
21949        db: &'db dyn Database,
21950        lbrace: TerminalLBraceGreen<'db>,
21951        tokens: TokenListGreen<'db>,
21952        rbrace: TerminalRBraceGreen<'db>,
21953    ) -> BracedTokenTreeGreen<'db> {
21954        let children = [lbrace.0, tokens.0, rbrace.0];
21955        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21956        BracedTokenTreeGreen(
21957            GreenNode {
21958                kind: SyntaxKind::BracedTokenTree,
21959                details: GreenNodeDetails::Node { children: children.into(), width },
21960            }
21961            .intern(db),
21962        )
21963    }
21964}
21965impl<'db> BracedTokenTree<'db> {
21966    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
21967        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
21968    }
21969    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21970        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21971    }
21972    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
21973        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
21974    }
21975}
21976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21977pub struct BracedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21978impl<'db> BracedTokenTreePtr<'db> {}
21979impl<'db> TypedStablePtr<'db> for BracedTokenTreePtr<'db> {
21980    type SyntaxNode = BracedTokenTree<'db>;
21981    fn untyped(self) -> SyntaxStablePtrId<'db> {
21982        self.0
21983    }
21984    fn lookup(&self, db: &'db dyn Database) -> BracedTokenTree<'db> {
21985        BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
21986    }
21987}
21988impl<'db> From<BracedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21989    fn from(ptr: BracedTokenTreePtr<'db>) -> Self {
21990        ptr.untyped()
21991    }
21992}
21993#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21994pub struct BracedTokenTreeGreen<'db>(pub GreenId<'db>);
21995impl<'db> TypedSyntaxNode<'db> for BracedTokenTree<'db> {
21996    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
21997    type StablePtr = BracedTokenTreePtr<'db>;
21998    type Green = BracedTokenTreeGreen<'db>;
21999    fn missing(db: &'db dyn Database) -> Self::Green {
22000        BracedTokenTreeGreen(
22001            GreenNode {
22002                kind: SyntaxKind::BracedTokenTree,
22003                details: GreenNodeDetails::Node {
22004                    children: [
22005                        TerminalLBrace::missing(db).0,
22006                        TokenList::missing(db).0,
22007                        TerminalRBrace::missing(db).0,
22008                    ]
22009                    .into(),
22010                    width: TextWidth::default(),
22011                },
22012            }
22013            .intern(db),
22014        )
22015    }
22016    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22017        let kind = node.kind(db);
22018        assert_eq!(
22019            kind,
22020            SyntaxKind::BracedTokenTree,
22021            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22022            kind,
22023            SyntaxKind::BracedTokenTree
22024        );
22025        Self { node }
22026    }
22027    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22028        let kind = node.kind(db);
22029        if kind == SyntaxKind::BracedTokenTree {
22030            Some(Self::from_syntax_node(db, node))
22031        } else {
22032            None
22033        }
22034    }
22035    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22036        self.node
22037    }
22038    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22039        BracedTokenTreePtr(self.node.stable_ptr(db))
22040    }
22041}
22042#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22043pub struct BracketedTokenTree<'db> {
22044    node: SyntaxNode<'db>,
22045}
22046impl<'db> BracketedTokenTree<'db> {
22047    pub const INDEX_LBRACK: usize = 0;
22048    pub const INDEX_TOKENS: usize = 1;
22049    pub const INDEX_RBRACK: usize = 2;
22050    pub fn new_green(
22051        db: &'db dyn Database,
22052        lbrack: TerminalLBrackGreen<'db>,
22053        tokens: TokenListGreen<'db>,
22054        rbrack: TerminalRBrackGreen<'db>,
22055    ) -> BracketedTokenTreeGreen<'db> {
22056        let children = [lbrack.0, tokens.0, rbrack.0];
22057        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22058        BracketedTokenTreeGreen(
22059            GreenNode {
22060                kind: SyntaxKind::BracketedTokenTree,
22061                details: GreenNodeDetails::Node { children: children.into(), width },
22062            }
22063            .intern(db),
22064        )
22065    }
22066}
22067impl<'db> BracketedTokenTree<'db> {
22068    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
22069        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
22070    }
22071    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22072        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22073    }
22074    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
22075        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
22076    }
22077}
22078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22079pub struct BracketedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22080impl<'db> BracketedTokenTreePtr<'db> {}
22081impl<'db> TypedStablePtr<'db> for BracketedTokenTreePtr<'db> {
22082    type SyntaxNode = BracketedTokenTree<'db>;
22083    fn untyped(self) -> SyntaxStablePtrId<'db> {
22084        self.0
22085    }
22086    fn lookup(&self, db: &'db dyn Database) -> BracketedTokenTree<'db> {
22087        BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
22088    }
22089}
22090impl<'db> From<BracketedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22091    fn from(ptr: BracketedTokenTreePtr<'db>) -> Self {
22092        ptr.untyped()
22093    }
22094}
22095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22096pub struct BracketedTokenTreeGreen<'db>(pub GreenId<'db>);
22097impl<'db> TypedSyntaxNode<'db> for BracketedTokenTree<'db> {
22098    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
22099    type StablePtr = BracketedTokenTreePtr<'db>;
22100    type Green = BracketedTokenTreeGreen<'db>;
22101    fn missing(db: &'db dyn Database) -> Self::Green {
22102        BracketedTokenTreeGreen(
22103            GreenNode {
22104                kind: SyntaxKind::BracketedTokenTree,
22105                details: GreenNodeDetails::Node {
22106                    children: [
22107                        TerminalLBrack::missing(db).0,
22108                        TokenList::missing(db).0,
22109                        TerminalRBrack::missing(db).0,
22110                    ]
22111                    .into(),
22112                    width: TextWidth::default(),
22113                },
22114            }
22115            .intern(db),
22116        )
22117    }
22118    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22119        let kind = node.kind(db);
22120        assert_eq!(
22121            kind,
22122            SyntaxKind::BracketedTokenTree,
22123            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22124            kind,
22125            SyntaxKind::BracketedTokenTree
22126        );
22127        Self { node }
22128    }
22129    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22130        let kind = node.kind(db);
22131        if kind == SyntaxKind::BracketedTokenTree {
22132            Some(Self::from_syntax_node(db, node))
22133        } else {
22134            None
22135        }
22136    }
22137    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22138        self.node
22139    }
22140    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22141        BracketedTokenTreePtr(self.node.stable_ptr(db))
22142    }
22143}
22144#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22145pub struct ExprInlineMacro<'db> {
22146    node: SyntaxNode<'db>,
22147}
22148impl<'db> ExprInlineMacro<'db> {
22149    pub const INDEX_PATH: usize = 0;
22150    pub const INDEX_BANG: usize = 1;
22151    pub const INDEX_ARGUMENTS: usize = 2;
22152    pub fn new_green(
22153        db: &'db dyn Database,
22154        path: ExprPathGreen<'db>,
22155        bang: TerminalNotGreen<'db>,
22156        arguments: TokenTreeNodeGreen<'db>,
22157    ) -> ExprInlineMacroGreen<'db> {
22158        let children = [path.0, bang.0, arguments.0];
22159        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22160        ExprInlineMacroGreen(
22161            GreenNode {
22162                kind: SyntaxKind::ExprInlineMacro,
22163                details: GreenNodeDetails::Node { children: children.into(), width },
22164            }
22165            .intern(db),
22166        )
22167    }
22168}
22169impl<'db> ExprInlineMacro<'db> {
22170    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22171        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
22172    }
22173    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22174        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
22175    }
22176    pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22177        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
22178    }
22179}
22180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22181pub struct ExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22182impl<'db> ExprInlineMacroPtr<'db> {}
22183impl<'db> TypedStablePtr<'db> for ExprInlineMacroPtr<'db> {
22184    type SyntaxNode = ExprInlineMacro<'db>;
22185    fn untyped(self) -> SyntaxStablePtrId<'db> {
22186        self.0
22187    }
22188    fn lookup(&self, db: &'db dyn Database) -> ExprInlineMacro<'db> {
22189        ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
22190    }
22191}
22192impl<'db> From<ExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22193    fn from(ptr: ExprInlineMacroPtr<'db>) -> Self {
22194        ptr.untyped()
22195    }
22196}
22197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22198pub struct ExprInlineMacroGreen<'db>(pub GreenId<'db>);
22199impl<'db> TypedSyntaxNode<'db> for ExprInlineMacro<'db> {
22200    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
22201    type StablePtr = ExprInlineMacroPtr<'db>;
22202    type Green = ExprInlineMacroGreen<'db>;
22203    fn missing(db: &'db dyn Database) -> Self::Green {
22204        ExprInlineMacroGreen(
22205            GreenNode {
22206                kind: SyntaxKind::ExprInlineMacro,
22207                details: GreenNodeDetails::Node {
22208                    children: [
22209                        ExprPath::missing(db).0,
22210                        TerminalNot::missing(db).0,
22211                        TokenTreeNode::missing(db).0,
22212                    ]
22213                    .into(),
22214                    width: TextWidth::default(),
22215                },
22216            }
22217            .intern(db),
22218        )
22219    }
22220    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22221        let kind = node.kind(db);
22222        assert_eq!(
22223            kind,
22224            SyntaxKind::ExprInlineMacro,
22225            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22226            kind,
22227            SyntaxKind::ExprInlineMacro
22228        );
22229        Self { node }
22230    }
22231    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22232        let kind = node.kind(db);
22233        if kind == SyntaxKind::ExprInlineMacro {
22234            Some(Self::from_syntax_node(db, node))
22235        } else {
22236            None
22237        }
22238    }
22239    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22240        self.node
22241    }
22242    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22243        ExprInlineMacroPtr(self.node.stable_ptr(db))
22244    }
22245}
22246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22247pub struct ItemInlineMacro<'db> {
22248    node: SyntaxNode<'db>,
22249}
22250impl<'db> ItemInlineMacro<'db> {
22251    pub const INDEX_ATTRIBUTES: usize = 0;
22252    pub const INDEX_PATH: usize = 1;
22253    pub const INDEX_BANG: usize = 2;
22254    pub const INDEX_ARGUMENTS: usize = 3;
22255    pub const INDEX_SEMICOLON: usize = 4;
22256    pub fn new_green(
22257        db: &'db dyn Database,
22258        attributes: AttributeListGreen<'db>,
22259        path: ExprPathGreen<'db>,
22260        bang: TerminalNotGreen<'db>,
22261        arguments: TokenTreeNodeGreen<'db>,
22262        semicolon: TerminalSemicolonGreen<'db>,
22263    ) -> ItemInlineMacroGreen<'db> {
22264        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22265        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22266        ItemInlineMacroGreen(
22267            GreenNode {
22268                kind: SyntaxKind::ItemInlineMacro,
22269                details: GreenNodeDetails::Node { children: children.into(), width },
22270            }
22271            .intern(db),
22272        )
22273    }
22274}
22275impl<'db> ItemInlineMacro<'db> {
22276    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22277        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22278    }
22279    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22280        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22281    }
22282    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22283        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22284    }
22285    pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22286        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22287    }
22288    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22289        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22290    }
22291}
22292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22293pub struct ItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22294impl<'db> ItemInlineMacroPtr<'db> {}
22295impl<'db> TypedStablePtr<'db> for ItemInlineMacroPtr<'db> {
22296    type SyntaxNode = ItemInlineMacro<'db>;
22297    fn untyped(self) -> SyntaxStablePtrId<'db> {
22298        self.0
22299    }
22300    fn lookup(&self, db: &'db dyn Database) -> ItemInlineMacro<'db> {
22301        ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22302    }
22303}
22304impl<'db> From<ItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22305    fn from(ptr: ItemInlineMacroPtr<'db>) -> Self {
22306        ptr.untyped()
22307    }
22308}
22309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22310pub struct ItemInlineMacroGreen<'db>(pub GreenId<'db>);
22311impl<'db> TypedSyntaxNode<'db> for ItemInlineMacro<'db> {
22312    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22313    type StablePtr = ItemInlineMacroPtr<'db>;
22314    type Green = ItemInlineMacroGreen<'db>;
22315    fn missing(db: &'db dyn Database) -> Self::Green {
22316        ItemInlineMacroGreen(
22317            GreenNode {
22318                kind: SyntaxKind::ItemInlineMacro,
22319                details: GreenNodeDetails::Node {
22320                    children: [
22321                        AttributeList::missing(db).0,
22322                        ExprPath::missing(db).0,
22323                        TerminalNot::missing(db).0,
22324                        TokenTreeNode::missing(db).0,
22325                        TerminalSemicolon::missing(db).0,
22326                    ]
22327                    .into(),
22328                    width: TextWidth::default(),
22329                },
22330            }
22331            .intern(db),
22332        )
22333    }
22334    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22335        let kind = node.kind(db);
22336        assert_eq!(
22337            kind,
22338            SyntaxKind::ItemInlineMacro,
22339            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22340            kind,
22341            SyntaxKind::ItemInlineMacro
22342        );
22343        Self { node }
22344    }
22345    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22346        let kind = node.kind(db);
22347        if kind == SyntaxKind::ItemInlineMacro {
22348            Some(Self::from_syntax_node(db, node))
22349        } else {
22350            None
22351        }
22352    }
22353    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22354        self.node
22355    }
22356    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22357        ItemInlineMacroPtr(self.node.stable_ptr(db))
22358    }
22359}
22360#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22361pub struct ItemMacroDeclaration<'db> {
22362    node: SyntaxNode<'db>,
22363}
22364impl<'db> ItemMacroDeclaration<'db> {
22365    pub const INDEX_ATTRIBUTES: usize = 0;
22366    pub const INDEX_VISIBILITY: usize = 1;
22367    pub const INDEX_MACRO_KW: usize = 2;
22368    pub const INDEX_NAME: usize = 3;
22369    pub const INDEX_LBRACE: usize = 4;
22370    pub const INDEX_RULES: usize = 5;
22371    pub const INDEX_RBRACE: usize = 6;
22372    pub fn new_green(
22373        db: &'db dyn Database,
22374        attributes: AttributeListGreen<'db>,
22375        visibility: VisibilityGreen<'db>,
22376        macro_kw: TerminalMacroGreen<'db>,
22377        name: TerminalIdentifierGreen<'db>,
22378        lbrace: TerminalLBraceGreen<'db>,
22379        rules: MacroRulesListGreen<'db>,
22380        rbrace: TerminalRBraceGreen<'db>,
22381    ) -> ItemMacroDeclarationGreen<'db> {
22382        let children =
22383            [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22384        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22385        ItemMacroDeclarationGreen(
22386            GreenNode {
22387                kind: SyntaxKind::ItemMacroDeclaration,
22388                details: GreenNodeDetails::Node { children: children.into(), width },
22389            }
22390            .intern(db),
22391        )
22392    }
22393}
22394impl<'db> ItemMacroDeclaration<'db> {
22395    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22396        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22397    }
22398    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
22399        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22400    }
22401    pub fn macro_kw(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
22402        TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22403    }
22404    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22405        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22406    }
22407    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22408        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22409    }
22410    pub fn rules(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22411        MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22412    }
22413    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22414        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22415    }
22416}
22417#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22418pub struct ItemMacroDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
22419impl<'db> ItemMacroDeclarationPtr<'db> {
22420    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
22421        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
22422    }
22423}
22424impl<'db> TypedStablePtr<'db> for ItemMacroDeclarationPtr<'db> {
22425    type SyntaxNode = ItemMacroDeclaration<'db>;
22426    fn untyped(self) -> SyntaxStablePtrId<'db> {
22427        self.0
22428    }
22429    fn lookup(&self, db: &'db dyn Database) -> ItemMacroDeclaration<'db> {
22430        ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22431    }
22432}
22433impl<'db> From<ItemMacroDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
22434    fn from(ptr: ItemMacroDeclarationPtr<'db>) -> Self {
22435        ptr.untyped()
22436    }
22437}
22438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22439pub struct ItemMacroDeclarationGreen<'db>(pub GreenId<'db>);
22440impl<'db> TypedSyntaxNode<'db> for ItemMacroDeclaration<'db> {
22441    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22442    type StablePtr = ItemMacroDeclarationPtr<'db>;
22443    type Green = ItemMacroDeclarationGreen<'db>;
22444    fn missing(db: &'db dyn Database) -> Self::Green {
22445        ItemMacroDeclarationGreen(
22446            GreenNode {
22447                kind: SyntaxKind::ItemMacroDeclaration,
22448                details: GreenNodeDetails::Node {
22449                    children: [
22450                        AttributeList::missing(db).0,
22451                        Visibility::missing(db).0,
22452                        TerminalMacro::missing(db).0,
22453                        TerminalIdentifier::missing(db).0,
22454                        TerminalLBrace::missing(db).0,
22455                        MacroRulesList::missing(db).0,
22456                        TerminalRBrace::missing(db).0,
22457                    ]
22458                    .into(),
22459                    width: TextWidth::default(),
22460                },
22461            }
22462            .intern(db),
22463        )
22464    }
22465    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22466        let kind = node.kind(db);
22467        assert_eq!(
22468            kind,
22469            SyntaxKind::ItemMacroDeclaration,
22470            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22471            kind,
22472            SyntaxKind::ItemMacroDeclaration
22473        );
22474        Self { node }
22475    }
22476    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22477        let kind = node.kind(db);
22478        if kind == SyntaxKind::ItemMacroDeclaration {
22479            Some(Self::from_syntax_node(db, node))
22480        } else {
22481            None
22482        }
22483    }
22484    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22485        self.node
22486    }
22487    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22488        ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22489    }
22490}
22491#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22492pub struct MacroRulesList<'db>(ElementList<'db, MacroRule<'db>, 1>);
22493impl<'db> Deref for MacroRulesList<'db> {
22494    type Target = ElementList<'db, MacroRule<'db>, 1>;
22495    fn deref(&self) -> &Self::Target {
22496        &self.0
22497    }
22498}
22499impl<'db> MacroRulesList<'db> {
22500    pub fn new_green(
22501        db: &'db dyn Database,
22502        children: &[MacroRuleGreen<'db>],
22503    ) -> MacroRulesListGreen<'db> {
22504        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
22505        MacroRulesListGreen(
22506            GreenNode {
22507                kind: SyntaxKind::MacroRulesList,
22508                details: GreenNodeDetails::Node {
22509                    children: children.iter().map(|x| x.0).collect(),
22510                    width,
22511                },
22512            }
22513            .intern(db),
22514        )
22515    }
22516}
22517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22518pub struct MacroRulesListPtr<'db>(pub SyntaxStablePtrId<'db>);
22519impl<'db> TypedStablePtr<'db> for MacroRulesListPtr<'db> {
22520    type SyntaxNode = MacroRulesList<'db>;
22521    fn untyped(self) -> SyntaxStablePtrId<'db> {
22522        self.0
22523    }
22524    fn lookup(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22525        MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22526    }
22527}
22528impl<'db> From<MacroRulesListPtr<'db>> for SyntaxStablePtrId<'db> {
22529    fn from(ptr: MacroRulesListPtr<'db>) -> Self {
22530        ptr.untyped()
22531    }
22532}
22533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22534pub struct MacroRulesListGreen<'db>(pub GreenId<'db>);
22535impl<'db> TypedSyntaxNode<'db> for MacroRulesList<'db> {
22536    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22537    type StablePtr = MacroRulesListPtr<'db>;
22538    type Green = MacroRulesListGreen<'db>;
22539    fn missing(db: &'db dyn Database) -> Self::Green {
22540        MacroRulesListGreen(
22541            GreenNode {
22542                kind: SyntaxKind::MacroRulesList,
22543                details: GreenNodeDetails::Node {
22544                    children: [].into(),
22545                    width: TextWidth::default(),
22546                },
22547            }
22548            .intern(db),
22549        )
22550    }
22551    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22552        Self(ElementList::new(node))
22553    }
22554    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22555        if node.kind(db) == SyntaxKind::MacroRulesList {
22556            Some(Self(ElementList::new(node)))
22557        } else {
22558            None
22559        }
22560    }
22561    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22562        self.node
22563    }
22564    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22565        MacroRulesListPtr(self.node.stable_ptr(db))
22566    }
22567}
22568#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22569pub struct MacroRule<'db> {
22570    node: SyntaxNode<'db>,
22571}
22572impl<'db> MacroRule<'db> {
22573    pub const INDEX_LHS: usize = 0;
22574    pub const INDEX_FAT_ARROW: usize = 1;
22575    pub const INDEX_RHS: usize = 2;
22576    pub const INDEX_SEMICOLON: usize = 3;
22577    pub fn new_green(
22578        db: &'db dyn Database,
22579        lhs: WrappedMacroGreen<'db>,
22580        fat_arrow: TerminalMatchArrowGreen<'db>,
22581        rhs: BracedMacroGreen<'db>,
22582        semicolon: TerminalSemicolonGreen<'db>,
22583    ) -> MacroRuleGreen<'db> {
22584        let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22585        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22586        MacroRuleGreen(
22587            GreenNode {
22588                kind: SyntaxKind::MacroRule,
22589                details: GreenNodeDetails::Node { children: children.into(), width },
22590            }
22591            .intern(db),
22592        )
22593    }
22594}
22595impl<'db> MacroRule<'db> {
22596    pub fn lhs(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
22597        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22598    }
22599    pub fn fat_arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
22600        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22601    }
22602    pub fn rhs(&self, db: &'db dyn Database) -> BracedMacro<'db> {
22603        BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22604    }
22605    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22606        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22607    }
22608}
22609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22610pub struct MacroRulePtr<'db>(pub SyntaxStablePtrId<'db>);
22611impl<'db> MacroRulePtr<'db> {}
22612impl<'db> TypedStablePtr<'db> for MacroRulePtr<'db> {
22613    type SyntaxNode = MacroRule<'db>;
22614    fn untyped(self) -> SyntaxStablePtrId<'db> {
22615        self.0
22616    }
22617    fn lookup(&self, db: &'db dyn Database) -> MacroRule<'db> {
22618        MacroRule::from_syntax_node(db, self.0.lookup(db))
22619    }
22620}
22621impl<'db> From<MacroRulePtr<'db>> for SyntaxStablePtrId<'db> {
22622    fn from(ptr: MacroRulePtr<'db>) -> Self {
22623        ptr.untyped()
22624    }
22625}
22626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22627pub struct MacroRuleGreen<'db>(pub GreenId<'db>);
22628impl<'db> TypedSyntaxNode<'db> for MacroRule<'db> {
22629    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22630    type StablePtr = MacroRulePtr<'db>;
22631    type Green = MacroRuleGreen<'db>;
22632    fn missing(db: &'db dyn Database) -> Self::Green {
22633        MacroRuleGreen(
22634            GreenNode {
22635                kind: SyntaxKind::MacroRule,
22636                details: GreenNodeDetails::Node {
22637                    children: [
22638                        WrappedMacro::missing(db).0,
22639                        TerminalMatchArrow::missing(db).0,
22640                        BracedMacro::missing(db).0,
22641                        TerminalSemicolon::missing(db).0,
22642                    ]
22643                    .into(),
22644                    width: TextWidth::default(),
22645                },
22646            }
22647            .intern(db),
22648        )
22649    }
22650    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22651        let kind = node.kind(db);
22652        assert_eq!(
22653            kind,
22654            SyntaxKind::MacroRule,
22655            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22656            kind,
22657            SyntaxKind::MacroRule
22658        );
22659        Self { node }
22660    }
22661    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22662        let kind = node.kind(db);
22663        if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22664    }
22665    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22666        self.node
22667    }
22668    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22669        MacroRulePtr(self.node.stable_ptr(db))
22670    }
22671}
22672#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22673pub struct ParamKind<'db> {
22674    node: SyntaxNode<'db>,
22675}
22676impl<'db> ParamKind<'db> {
22677    pub const INDEX_COLON: usize = 0;
22678    pub const INDEX_KIND: usize = 1;
22679    pub fn new_green(
22680        db: &'db dyn Database,
22681        colon: TerminalColonGreen<'db>,
22682        kind: MacroParamKindGreen<'db>,
22683    ) -> ParamKindGreen<'db> {
22684        let children = [colon.0, kind.0];
22685        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22686        ParamKindGreen(
22687            GreenNode {
22688                kind: SyntaxKind::ParamKind,
22689                details: GreenNodeDetails::Node { children: children.into(), width },
22690            }
22691            .intern(db),
22692        )
22693    }
22694}
22695impl<'db> ParamKind<'db> {
22696    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
22697        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22698    }
22699    pub fn kind(&self, db: &'db dyn Database) -> MacroParamKind<'db> {
22700        MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22701    }
22702}
22703#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22704pub struct ParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22705impl<'db> ParamKindPtr<'db> {}
22706impl<'db> TypedStablePtr<'db> for ParamKindPtr<'db> {
22707    type SyntaxNode = ParamKind<'db>;
22708    fn untyped(self) -> SyntaxStablePtrId<'db> {
22709        self.0
22710    }
22711    fn lookup(&self, db: &'db dyn Database) -> ParamKind<'db> {
22712        ParamKind::from_syntax_node(db, self.0.lookup(db))
22713    }
22714}
22715impl<'db> From<ParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22716    fn from(ptr: ParamKindPtr<'db>) -> Self {
22717        ptr.untyped()
22718    }
22719}
22720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22721pub struct ParamKindGreen<'db>(pub GreenId<'db>);
22722impl<'db> TypedSyntaxNode<'db> for ParamKind<'db> {
22723    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22724    type StablePtr = ParamKindPtr<'db>;
22725    type Green = ParamKindGreen<'db>;
22726    fn missing(db: &'db dyn Database) -> Self::Green {
22727        ParamKindGreen(
22728            GreenNode {
22729                kind: SyntaxKind::ParamKind,
22730                details: GreenNodeDetails::Node {
22731                    children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22732                    width: TextWidth::default(),
22733                },
22734            }
22735            .intern(db),
22736        )
22737    }
22738    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22739        let kind = node.kind(db);
22740        assert_eq!(
22741            kind,
22742            SyntaxKind::ParamKind,
22743            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22744            kind,
22745            SyntaxKind::ParamKind
22746        );
22747        Self { node }
22748    }
22749    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22750        let kind = node.kind(db);
22751        if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22752    }
22753    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22754        self.node
22755    }
22756    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22757        ParamKindPtr(self.node.stable_ptr(db))
22758    }
22759}
22760#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22761pub enum OptionParamKind<'db> {
22762    Empty(OptionParamKindEmpty<'db>),
22763    ParamKind(ParamKind<'db>),
22764}
22765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22766pub struct OptionParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22767impl<'db> TypedStablePtr<'db> for OptionParamKindPtr<'db> {
22768    type SyntaxNode = OptionParamKind<'db>;
22769    fn untyped(self) -> SyntaxStablePtrId<'db> {
22770        self.0
22771    }
22772    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22773        OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22774    }
22775}
22776impl<'db> From<OptionParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22777    fn from(ptr: OptionParamKindPtr<'db>) -> Self {
22778        ptr.untyped()
22779    }
22780}
22781impl<'db> From<OptionParamKindEmptyPtr<'db>> for OptionParamKindPtr<'db> {
22782    fn from(value: OptionParamKindEmptyPtr<'db>) -> Self {
22783        Self(value.0)
22784    }
22785}
22786impl<'db> From<ParamKindPtr<'db>> for OptionParamKindPtr<'db> {
22787    fn from(value: ParamKindPtr<'db>) -> Self {
22788        Self(value.0)
22789    }
22790}
22791impl<'db> From<OptionParamKindEmptyGreen<'db>> for OptionParamKindGreen<'db> {
22792    fn from(value: OptionParamKindEmptyGreen<'db>) -> Self {
22793        Self(value.0)
22794    }
22795}
22796impl<'db> From<ParamKindGreen<'db>> for OptionParamKindGreen<'db> {
22797    fn from(value: ParamKindGreen<'db>) -> Self {
22798        Self(value.0)
22799    }
22800}
22801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22802pub struct OptionParamKindGreen<'db>(pub GreenId<'db>);
22803impl<'db> TypedSyntaxNode<'db> for OptionParamKind<'db> {
22804    const OPTIONAL_KIND: Option<SyntaxKind> = None;
22805    type StablePtr = OptionParamKindPtr<'db>;
22806    type Green = OptionParamKindGreen<'db>;
22807    fn missing(db: &'db dyn Database) -> Self::Green {
22808        panic!("No missing variant.");
22809    }
22810    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22811        let kind = node.kind(db);
22812        match kind {
22813            SyntaxKind::OptionParamKindEmpty => {
22814                OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
22815            }
22816            SyntaxKind::ParamKind => {
22817                OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
22818            }
22819            _ => {
22820                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
22821            }
22822        }
22823    }
22824    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22825        let kind = node.kind(db);
22826        match kind {
22827            SyntaxKind::OptionParamKindEmpty => {
22828                Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
22829            }
22830            SyntaxKind::ParamKind => {
22831                Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
22832            }
22833            _ => None,
22834        }
22835    }
22836    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22837        match self {
22838            OptionParamKind::Empty(x) => x.as_syntax_node(),
22839            OptionParamKind::ParamKind(x) => x.as_syntax_node(),
22840        }
22841    }
22842    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22843        OptionParamKindPtr(self.as_syntax_node().stable_ptr(db))
22844    }
22845}
22846impl<'db> OptionParamKind<'db> {
22847    /// Checks if a kind of a variant of [OptionParamKind].
22848    pub fn is_variant(kind: SyntaxKind) -> bool {
22849        matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
22850    }
22851}
22852#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22853pub struct OptionParamKindEmpty<'db> {
22854    node: SyntaxNode<'db>,
22855}
22856impl<'db> OptionParamKindEmpty<'db> {
22857    pub fn new_green(db: &'db dyn Database) -> OptionParamKindEmptyGreen<'db> {
22858        let children = [];
22859        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22860        OptionParamKindEmptyGreen(
22861            GreenNode {
22862                kind: SyntaxKind::OptionParamKindEmpty,
22863                details: GreenNodeDetails::Node { children: children.into(), width },
22864            }
22865            .intern(db),
22866        )
22867    }
22868}
22869impl<'db> OptionParamKindEmpty<'db> {}
22870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22871pub struct OptionParamKindEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
22872impl<'db> OptionParamKindEmptyPtr<'db> {}
22873impl<'db> TypedStablePtr<'db> for OptionParamKindEmptyPtr<'db> {
22874    type SyntaxNode = OptionParamKindEmpty<'db>;
22875    fn untyped(self) -> SyntaxStablePtrId<'db> {
22876        self.0
22877    }
22878    fn lookup(&self, db: &'db dyn Database) -> OptionParamKindEmpty<'db> {
22879        OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
22880    }
22881}
22882impl<'db> From<OptionParamKindEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
22883    fn from(ptr: OptionParamKindEmptyPtr<'db>) -> Self {
22884        ptr.untyped()
22885    }
22886}
22887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22888pub struct OptionParamKindEmptyGreen<'db>(pub GreenId<'db>);
22889impl<'db> TypedSyntaxNode<'db> for OptionParamKindEmpty<'db> {
22890    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
22891    type StablePtr = OptionParamKindEmptyPtr<'db>;
22892    type Green = OptionParamKindEmptyGreen<'db>;
22893    fn missing(db: &'db dyn Database) -> Self::Green {
22894        OptionParamKindEmptyGreen(
22895            GreenNode {
22896                kind: SyntaxKind::OptionParamKindEmpty,
22897                details: GreenNodeDetails::Node {
22898                    children: [].into(),
22899                    width: TextWidth::default(),
22900                },
22901            }
22902            .intern(db),
22903        )
22904    }
22905    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22906        let kind = node.kind(db);
22907        assert_eq!(
22908            kind,
22909            SyntaxKind::OptionParamKindEmpty,
22910            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22911            kind,
22912            SyntaxKind::OptionParamKindEmpty
22913        );
22914        Self { node }
22915    }
22916    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22917        let kind = node.kind(db);
22918        if kind == SyntaxKind::OptionParamKindEmpty {
22919            Some(Self::from_syntax_node(db, node))
22920        } else {
22921            None
22922        }
22923    }
22924    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22925        self.node
22926    }
22927    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22928        OptionParamKindEmptyPtr(self.node.stable_ptr(db))
22929    }
22930}
22931#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22932pub struct MacroParam<'db> {
22933    node: SyntaxNode<'db>,
22934}
22935impl<'db> MacroParam<'db> {
22936    pub const INDEX_DOLLAR: usize = 0;
22937    pub const INDEX_NAME: usize = 1;
22938    pub const INDEX_KIND: usize = 2;
22939    pub fn new_green(
22940        db: &'db dyn Database,
22941        dollar: TerminalDollarGreen<'db>,
22942        name: TerminalIdentifierGreen<'db>,
22943        kind: OptionParamKindGreen<'db>,
22944    ) -> MacroParamGreen<'db> {
22945        let children = [dollar.0, name.0, kind.0];
22946        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22947        MacroParamGreen(
22948            GreenNode {
22949                kind: SyntaxKind::MacroParam,
22950                details: GreenNodeDetails::Node { children: children.into(), width },
22951            }
22952            .intern(db),
22953        )
22954    }
22955}
22956impl<'db> MacroParam<'db> {
22957    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
22958        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
22959    }
22960    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22961        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
22962    }
22963    pub fn kind(&self, db: &'db dyn Database) -> OptionParamKind<'db> {
22964        OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
22965    }
22966}
22967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22968pub struct MacroParamPtr<'db>(pub SyntaxStablePtrId<'db>);
22969impl<'db> MacroParamPtr<'db> {}
22970impl<'db> TypedStablePtr<'db> for MacroParamPtr<'db> {
22971    type SyntaxNode = MacroParam<'db>;
22972    fn untyped(self) -> SyntaxStablePtrId<'db> {
22973        self.0
22974    }
22975    fn lookup(&self, db: &'db dyn Database) -> MacroParam<'db> {
22976        MacroParam::from_syntax_node(db, self.0.lookup(db))
22977    }
22978}
22979impl<'db> From<MacroParamPtr<'db>> for SyntaxStablePtrId<'db> {
22980    fn from(ptr: MacroParamPtr<'db>) -> Self {
22981        ptr.untyped()
22982    }
22983}
22984#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22985pub struct MacroParamGreen<'db>(pub GreenId<'db>);
22986impl<'db> TypedSyntaxNode<'db> for MacroParam<'db> {
22987    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
22988    type StablePtr = MacroParamPtr<'db>;
22989    type Green = MacroParamGreen<'db>;
22990    fn missing(db: &'db dyn Database) -> Self::Green {
22991        MacroParamGreen(
22992            GreenNode {
22993                kind: SyntaxKind::MacroParam,
22994                details: GreenNodeDetails::Node {
22995                    children: [
22996                        TerminalDollar::missing(db).0,
22997                        TerminalIdentifier::missing(db).0,
22998                        OptionParamKind::missing(db).0,
22999                    ]
23000                    .into(),
23001                    width: TextWidth::default(),
23002                },
23003            }
23004            .intern(db),
23005        )
23006    }
23007    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23008        let kind = node.kind(db);
23009        assert_eq!(
23010            kind,
23011            SyntaxKind::MacroParam,
23012            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23013            kind,
23014            SyntaxKind::MacroParam
23015        );
23016        Self { node }
23017    }
23018    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23019        let kind = node.kind(db);
23020        if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
23021    }
23022    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23023        self.node
23024    }
23025    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23026        MacroParamPtr(self.node.stable_ptr(db))
23027    }
23028}
23029#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23030pub struct MacroRepetition<'db> {
23031    node: SyntaxNode<'db>,
23032}
23033impl<'db> MacroRepetition<'db> {
23034    pub const INDEX_DOLLAR: usize = 0;
23035    pub const INDEX_LPAREN: usize = 1;
23036    pub const INDEX_ELEMENTS: usize = 2;
23037    pub const INDEX_RPAREN: usize = 3;
23038    pub const INDEX_SEPARATOR: usize = 4;
23039    pub const INDEX_OPERATOR: usize = 5;
23040    pub fn new_green(
23041        db: &'db dyn Database,
23042        dollar: TerminalDollarGreen<'db>,
23043        lparen: TerminalLParenGreen<'db>,
23044        elements: MacroElementsGreen<'db>,
23045        rparen: TerminalRParenGreen<'db>,
23046        separator: OptionTerminalCommaGreen<'db>,
23047        operator: MacroRepetitionOperatorGreen<'db>,
23048    ) -> MacroRepetitionGreen<'db> {
23049        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
23050        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23051        MacroRepetitionGreen(
23052            GreenNode {
23053                kind: SyntaxKind::MacroRepetition,
23054                details: GreenNodeDetails::Node { children: children.into(), width },
23055            }
23056            .intern(db),
23057        )
23058    }
23059}
23060impl<'db> MacroRepetition<'db> {
23061    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
23062        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23063    }
23064    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
23065        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
23066    }
23067    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
23068        MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
23069    }
23070    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
23071        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
23072    }
23073    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
23074        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
23075    }
23076    pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
23077        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
23078    }
23079}
23080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23081pub struct MacroRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
23082impl<'db> MacroRepetitionPtr<'db> {}
23083impl<'db> TypedStablePtr<'db> for MacroRepetitionPtr<'db> {
23084    type SyntaxNode = MacroRepetition<'db>;
23085    fn untyped(self) -> SyntaxStablePtrId<'db> {
23086        self.0
23087    }
23088    fn lookup(&self, db: &'db dyn Database) -> MacroRepetition<'db> {
23089        MacroRepetition::from_syntax_node(db, self.0.lookup(db))
23090    }
23091}
23092impl<'db> From<MacroRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
23093    fn from(ptr: MacroRepetitionPtr<'db>) -> Self {
23094        ptr.untyped()
23095    }
23096}
23097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23098pub struct MacroRepetitionGreen<'db>(pub GreenId<'db>);
23099impl<'db> TypedSyntaxNode<'db> for MacroRepetition<'db> {
23100    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
23101    type StablePtr = MacroRepetitionPtr<'db>;
23102    type Green = MacroRepetitionGreen<'db>;
23103    fn missing(db: &'db dyn Database) -> Self::Green {
23104        MacroRepetitionGreen(
23105            GreenNode {
23106                kind: SyntaxKind::MacroRepetition,
23107                details: GreenNodeDetails::Node {
23108                    children: [
23109                        TerminalDollar::missing(db).0,
23110                        TerminalLParen::missing(db).0,
23111                        MacroElements::missing(db).0,
23112                        TerminalRParen::missing(db).0,
23113                        OptionTerminalComma::missing(db).0,
23114                        MacroRepetitionOperator::missing(db).0,
23115                    ]
23116                    .into(),
23117                    width: TextWidth::default(),
23118                },
23119            }
23120            .intern(db),
23121        )
23122    }
23123    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23124        let kind = node.kind(db);
23125        assert_eq!(
23126            kind,
23127            SyntaxKind::MacroRepetition,
23128            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23129            kind,
23130            SyntaxKind::MacroRepetition
23131        );
23132        Self { node }
23133    }
23134    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23135        let kind = node.kind(db);
23136        if kind == SyntaxKind::MacroRepetition {
23137            Some(Self::from_syntax_node(db, node))
23138        } else {
23139            None
23140        }
23141    }
23142    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23143        self.node
23144    }
23145    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23146        MacroRepetitionPtr(self.node.stable_ptr(db))
23147    }
23148}
23149#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23150pub enum OptionTerminalComma<'db> {
23151    Empty(OptionTerminalCommaEmpty<'db>),
23152    TerminalComma(TerminalComma<'db>),
23153}
23154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23155pub struct OptionTerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
23156impl<'db> TypedStablePtr<'db> for OptionTerminalCommaPtr<'db> {
23157    type SyntaxNode = OptionTerminalComma<'db>;
23158    fn untyped(self) -> SyntaxStablePtrId<'db> {
23159        self.0
23160    }
23161    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23162        OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
23163    }
23164}
23165impl<'db> From<OptionTerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
23166    fn from(ptr: OptionTerminalCommaPtr<'db>) -> Self {
23167        ptr.untyped()
23168    }
23169}
23170impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for OptionTerminalCommaPtr<'db> {
23171    fn from(value: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23172        Self(value.0)
23173    }
23174}
23175impl<'db> From<TerminalCommaPtr<'db>> for OptionTerminalCommaPtr<'db> {
23176    fn from(value: TerminalCommaPtr<'db>) -> Self {
23177        Self(value.0)
23178    }
23179}
23180impl<'db> From<OptionTerminalCommaEmptyGreen<'db>> for OptionTerminalCommaGreen<'db> {
23181    fn from(value: OptionTerminalCommaEmptyGreen<'db>) -> Self {
23182        Self(value.0)
23183    }
23184}
23185impl<'db> From<TerminalCommaGreen<'db>> for OptionTerminalCommaGreen<'db> {
23186    fn from(value: TerminalCommaGreen<'db>) -> Self {
23187        Self(value.0)
23188    }
23189}
23190#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23191pub struct OptionTerminalCommaGreen<'db>(pub GreenId<'db>);
23192impl<'db> TypedSyntaxNode<'db> for OptionTerminalComma<'db> {
23193    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23194    type StablePtr = OptionTerminalCommaPtr<'db>;
23195    type Green = OptionTerminalCommaGreen<'db>;
23196    fn missing(db: &'db dyn Database) -> Self::Green {
23197        panic!("No missing variant.");
23198    }
23199    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23200        let kind = node.kind(db);
23201        match kind {
23202            SyntaxKind::OptionTerminalCommaEmpty => {
23203                OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
23204            }
23205            SyntaxKind::TerminalComma => {
23206                OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
23207            }
23208            _ => panic!(
23209                "Unexpected syntax kind {:?} when constructing {}.",
23210                kind, "OptionTerminalComma"
23211            ),
23212        }
23213    }
23214    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23215        let kind = node.kind(db);
23216        match kind {
23217            SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
23218                OptionTerminalCommaEmpty::from_syntax_node(db, node),
23219            )),
23220            SyntaxKind::TerminalComma => {
23221                Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
23222            }
23223            _ => None,
23224        }
23225    }
23226    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23227        match self {
23228            OptionTerminalComma::Empty(x) => x.as_syntax_node(),
23229            OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
23230        }
23231    }
23232    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23233        OptionTerminalCommaPtr(self.as_syntax_node().stable_ptr(db))
23234    }
23235}
23236impl<'db> OptionTerminalComma<'db> {
23237    /// Checks if a kind of a variant of [OptionTerminalComma].
23238    pub fn is_variant(kind: SyntaxKind) -> bool {
23239        matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
23240    }
23241}
23242#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23243pub struct OptionTerminalCommaEmpty<'db> {
23244    node: SyntaxNode<'db>,
23245}
23246impl<'db> OptionTerminalCommaEmpty<'db> {
23247    pub fn new_green(db: &'db dyn Database) -> OptionTerminalCommaEmptyGreen<'db> {
23248        let children = [];
23249        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23250        OptionTerminalCommaEmptyGreen(
23251            GreenNode {
23252                kind: SyntaxKind::OptionTerminalCommaEmpty,
23253                details: GreenNodeDetails::Node { children: children.into(), width },
23254            }
23255            .intern(db),
23256        )
23257    }
23258}
23259impl<'db> OptionTerminalCommaEmpty<'db> {}
23260#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23261pub struct OptionTerminalCommaEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23262impl<'db> OptionTerminalCommaEmptyPtr<'db> {}
23263impl<'db> TypedStablePtr<'db> for OptionTerminalCommaEmptyPtr<'db> {
23264    type SyntaxNode = OptionTerminalCommaEmpty<'db>;
23265    fn untyped(self) -> SyntaxStablePtrId<'db> {
23266        self.0
23267    }
23268    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalCommaEmpty<'db> {
23269        OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23270    }
23271}
23272impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23273    fn from(ptr: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23274        ptr.untyped()
23275    }
23276}
23277#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23278pub struct OptionTerminalCommaEmptyGreen<'db>(pub GreenId<'db>);
23279impl<'db> TypedSyntaxNode<'db> for OptionTerminalCommaEmpty<'db> {
23280    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23281    type StablePtr = OptionTerminalCommaEmptyPtr<'db>;
23282    type Green = OptionTerminalCommaEmptyGreen<'db>;
23283    fn missing(db: &'db dyn Database) -> Self::Green {
23284        OptionTerminalCommaEmptyGreen(
23285            GreenNode {
23286                kind: SyntaxKind::OptionTerminalCommaEmpty,
23287                details: GreenNodeDetails::Node {
23288                    children: [].into(),
23289                    width: TextWidth::default(),
23290                },
23291            }
23292            .intern(db),
23293        )
23294    }
23295    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23296        let kind = node.kind(db);
23297        assert_eq!(
23298            kind,
23299            SyntaxKind::OptionTerminalCommaEmpty,
23300            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23301            kind,
23302            SyntaxKind::OptionTerminalCommaEmpty
23303        );
23304        Self { node }
23305    }
23306    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23307        let kind = node.kind(db);
23308        if kind == SyntaxKind::OptionTerminalCommaEmpty {
23309            Some(Self::from_syntax_node(db, node))
23310        } else {
23311            None
23312        }
23313    }
23314    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23315        self.node
23316    }
23317    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23318        OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23319    }
23320}
23321#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23322pub enum MacroRepetitionOperator<'db> {
23323    ZeroOrOne(TerminalQuestionMark<'db>),
23324    OneOrMore(TerminalPlus<'db>),
23325    ZeroOrMore(TerminalMul<'db>),
23326    Missing(MacroRepetitionOperatorMissing<'db>),
23327}
23328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23329pub struct MacroRepetitionOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
23330impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorPtr<'db> {
23331    type SyntaxNode = MacroRepetitionOperator<'db>;
23332    fn untyped(self) -> SyntaxStablePtrId<'db> {
23333        self.0
23334    }
23335    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23336        MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23337    }
23338}
23339impl<'db> From<MacroRepetitionOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
23340    fn from(ptr: MacroRepetitionOperatorPtr<'db>) -> Self {
23341        ptr.untyped()
23342    }
23343}
23344impl<'db> From<TerminalQuestionMarkPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23345    fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
23346        Self(value.0)
23347    }
23348}
23349impl<'db> From<TerminalPlusPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23350    fn from(value: TerminalPlusPtr<'db>) -> Self {
23351        Self(value.0)
23352    }
23353}
23354impl<'db> From<TerminalMulPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23355    fn from(value: TerminalMulPtr<'db>) -> Self {
23356        Self(value.0)
23357    }
23358}
23359impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23360    fn from(value: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23361        Self(value.0)
23362    }
23363}
23364impl<'db> From<TerminalQuestionMarkGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23365    fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
23366        Self(value.0)
23367    }
23368}
23369impl<'db> From<TerminalPlusGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23370    fn from(value: TerminalPlusGreen<'db>) -> Self {
23371        Self(value.0)
23372    }
23373}
23374impl<'db> From<TerminalMulGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23375    fn from(value: TerminalMulGreen<'db>) -> Self {
23376        Self(value.0)
23377    }
23378}
23379impl<'db> From<MacroRepetitionOperatorMissingGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23380    fn from(value: MacroRepetitionOperatorMissingGreen<'db>) -> Self {
23381        Self(value.0)
23382    }
23383}
23384#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23385pub struct MacroRepetitionOperatorGreen<'db>(pub GreenId<'db>);
23386impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperator<'db> {
23387    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23388    type StablePtr = MacroRepetitionOperatorPtr<'db>;
23389    type Green = MacroRepetitionOperatorGreen<'db>;
23390    fn missing(db: &'db dyn Database) -> Self::Green {
23391        MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23392    }
23393    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23394        let kind = node.kind(db);
23395        match kind {
23396            SyntaxKind::TerminalQuestionMark => {
23397                MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23398            }
23399            SyntaxKind::TerminalPlus => {
23400                MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23401            }
23402            SyntaxKind::TerminalMul => {
23403                MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23404            }
23405            SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23406                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23407            ),
23408            _ => panic!(
23409                "Unexpected syntax kind {:?} when constructing {}.",
23410                kind, "MacroRepetitionOperator"
23411            ),
23412        }
23413    }
23414    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23415        let kind = node.kind(db);
23416        match kind {
23417            SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23418                TerminalQuestionMark::from_syntax_node(db, node),
23419            )),
23420            SyntaxKind::TerminalPlus => {
23421                Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23422            }
23423            SyntaxKind::TerminalMul => {
23424                Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23425            }
23426            SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23427                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23428            )),
23429            _ => None,
23430        }
23431    }
23432    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23433        match self {
23434            MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23435            MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23436            MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23437            MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23438        }
23439    }
23440    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23441        MacroRepetitionOperatorPtr(self.as_syntax_node().stable_ptr(db))
23442    }
23443}
23444impl<'db> MacroRepetitionOperator<'db> {
23445    /// Checks if a kind of a variant of [MacroRepetitionOperator].
23446    pub fn is_variant(kind: SyntaxKind) -> bool {
23447        matches!(
23448            kind,
23449            SyntaxKind::TerminalQuestionMark
23450                | SyntaxKind::TerminalPlus
23451                | SyntaxKind::TerminalMul
23452                | SyntaxKind::MacroRepetitionOperatorMissing
23453        )
23454    }
23455}
23456#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23457pub struct MacroRepetitionOperatorMissing<'db> {
23458    node: SyntaxNode<'db>,
23459}
23460impl<'db> MacroRepetitionOperatorMissing<'db> {
23461    pub fn new_green(db: &'db dyn Database) -> MacroRepetitionOperatorMissingGreen<'db> {
23462        let children = [];
23463        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23464        MacroRepetitionOperatorMissingGreen(
23465            GreenNode {
23466                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23467                details: GreenNodeDetails::Node { children: children.into(), width },
23468            }
23469            .intern(db),
23470        )
23471    }
23472}
23473impl<'db> MacroRepetitionOperatorMissing<'db> {}
23474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23475pub struct MacroRepetitionOperatorMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23476impl<'db> MacroRepetitionOperatorMissingPtr<'db> {}
23477impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorMissingPtr<'db> {
23478    type SyntaxNode = MacroRepetitionOperatorMissing<'db>;
23479    fn untyped(self) -> SyntaxStablePtrId<'db> {
23480        self.0
23481    }
23482    fn lookup(&self, db: &'db dyn Database) -> MacroRepetitionOperatorMissing<'db> {
23483        MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23484    }
23485}
23486impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23487    fn from(ptr: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23488        ptr.untyped()
23489    }
23490}
23491#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23492pub struct MacroRepetitionOperatorMissingGreen<'db>(pub GreenId<'db>);
23493impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperatorMissing<'db> {
23494    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23495    type StablePtr = MacroRepetitionOperatorMissingPtr<'db>;
23496    type Green = MacroRepetitionOperatorMissingGreen<'db>;
23497    fn missing(db: &'db dyn Database) -> Self::Green {
23498        MacroRepetitionOperatorMissingGreen(
23499            GreenNode {
23500                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23501                details: GreenNodeDetails::Node {
23502                    children: [].into(),
23503                    width: TextWidth::default(),
23504                },
23505            }
23506            .intern(db),
23507        )
23508    }
23509    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23510        let kind = node.kind(db);
23511        assert_eq!(
23512            kind,
23513            SyntaxKind::MacroRepetitionOperatorMissing,
23514            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23515            kind,
23516            SyntaxKind::MacroRepetitionOperatorMissing
23517        );
23518        Self { node }
23519    }
23520    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23521        let kind = node.kind(db);
23522        if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23523            Some(Self::from_syntax_node(db, node))
23524        } else {
23525            None
23526        }
23527    }
23528    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23529        self.node
23530    }
23531    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23532        MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23533    }
23534}
23535#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23536pub struct ParamIdent<'db> {
23537    node: SyntaxNode<'db>,
23538}
23539impl<'db> ParamIdent<'db> {
23540    pub const INDEX_IDENT: usize = 0;
23541    pub fn new_green(
23542        db: &'db dyn Database,
23543        ident: TerminalIdentifierGreen<'db>,
23544    ) -> ParamIdentGreen<'db> {
23545        let children = [ident.0];
23546        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23547        ParamIdentGreen(
23548            GreenNode {
23549                kind: SyntaxKind::ParamIdent,
23550                details: GreenNodeDetails::Node { children: children.into(), width },
23551            }
23552            .intern(db),
23553        )
23554    }
23555}
23556impl<'db> ParamIdent<'db> {
23557    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23558        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23559    }
23560}
23561#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23562pub struct ParamIdentPtr<'db>(pub SyntaxStablePtrId<'db>);
23563impl<'db> ParamIdentPtr<'db> {}
23564impl<'db> TypedStablePtr<'db> for ParamIdentPtr<'db> {
23565    type SyntaxNode = ParamIdent<'db>;
23566    fn untyped(self) -> SyntaxStablePtrId<'db> {
23567        self.0
23568    }
23569    fn lookup(&self, db: &'db dyn Database) -> ParamIdent<'db> {
23570        ParamIdent::from_syntax_node(db, self.0.lookup(db))
23571    }
23572}
23573impl<'db> From<ParamIdentPtr<'db>> for SyntaxStablePtrId<'db> {
23574    fn from(ptr: ParamIdentPtr<'db>) -> Self {
23575        ptr.untyped()
23576    }
23577}
23578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23579pub struct ParamIdentGreen<'db>(pub GreenId<'db>);
23580impl<'db> TypedSyntaxNode<'db> for ParamIdent<'db> {
23581    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23582    type StablePtr = ParamIdentPtr<'db>;
23583    type Green = ParamIdentGreen<'db>;
23584    fn missing(db: &'db dyn Database) -> Self::Green {
23585        ParamIdentGreen(
23586            GreenNode {
23587                kind: SyntaxKind::ParamIdent,
23588                details: GreenNodeDetails::Node {
23589                    children: [TerminalIdentifier::missing(db).0].into(),
23590                    width: TextWidth::default(),
23591                },
23592            }
23593            .intern(db),
23594        )
23595    }
23596    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23597        let kind = node.kind(db);
23598        assert_eq!(
23599            kind,
23600            SyntaxKind::ParamIdent,
23601            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23602            kind,
23603            SyntaxKind::ParamIdent
23604        );
23605        Self { node }
23606    }
23607    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23608        let kind = node.kind(db);
23609        if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23610    }
23611    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23612        self.node
23613    }
23614    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23615        ParamIdentPtr(self.node.stable_ptr(db))
23616    }
23617}
23618#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23619pub struct ParamExpr<'db> {
23620    node: SyntaxNode<'db>,
23621}
23622impl<'db> ParamExpr<'db> {
23623    pub const INDEX_EXPR: usize = 0;
23624    pub fn new_green(
23625        db: &'db dyn Database,
23626        expr: TerminalIdentifierGreen<'db>,
23627    ) -> ParamExprGreen<'db> {
23628        let children = [expr.0];
23629        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23630        ParamExprGreen(
23631            GreenNode {
23632                kind: SyntaxKind::ParamExpr,
23633                details: GreenNodeDetails::Node { children: children.into(), width },
23634            }
23635            .intern(db),
23636        )
23637    }
23638}
23639impl<'db> ParamExpr<'db> {
23640    pub fn expr(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23641        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23642    }
23643}
23644#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23645pub struct ParamExprPtr<'db>(pub SyntaxStablePtrId<'db>);
23646impl<'db> ParamExprPtr<'db> {}
23647impl<'db> TypedStablePtr<'db> for ParamExprPtr<'db> {
23648    type SyntaxNode = ParamExpr<'db>;
23649    fn untyped(self) -> SyntaxStablePtrId<'db> {
23650        self.0
23651    }
23652    fn lookup(&self, db: &'db dyn Database) -> ParamExpr<'db> {
23653        ParamExpr::from_syntax_node(db, self.0.lookup(db))
23654    }
23655}
23656impl<'db> From<ParamExprPtr<'db>> for SyntaxStablePtrId<'db> {
23657    fn from(ptr: ParamExprPtr<'db>) -> Self {
23658        ptr.untyped()
23659    }
23660}
23661#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23662pub struct ParamExprGreen<'db>(pub GreenId<'db>);
23663impl<'db> TypedSyntaxNode<'db> for ParamExpr<'db> {
23664    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23665    type StablePtr = ParamExprPtr<'db>;
23666    type Green = ParamExprGreen<'db>;
23667    fn missing(db: &'db dyn Database) -> Self::Green {
23668        ParamExprGreen(
23669            GreenNode {
23670                kind: SyntaxKind::ParamExpr,
23671                details: GreenNodeDetails::Node {
23672                    children: [TerminalIdentifier::missing(db).0].into(),
23673                    width: TextWidth::default(),
23674                },
23675            }
23676            .intern(db),
23677        )
23678    }
23679    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23680        let kind = node.kind(db);
23681        assert_eq!(
23682            kind,
23683            SyntaxKind::ParamExpr,
23684            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23685            kind,
23686            SyntaxKind::ParamExpr
23687        );
23688        Self { node }
23689    }
23690    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23691        let kind = node.kind(db);
23692        if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23693    }
23694    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23695        self.node
23696    }
23697    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23698        ParamExprPtr(self.node.stable_ptr(db))
23699    }
23700}
23701#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23702pub enum MacroParamKind<'db> {
23703    Identifier(ParamIdent<'db>),
23704    Expr(ParamExpr<'db>),
23705    Missing(MacroParamKindMissing<'db>),
23706}
23707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23708pub struct MacroParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
23709impl<'db> TypedStablePtr<'db> for MacroParamKindPtr<'db> {
23710    type SyntaxNode = MacroParamKind<'db>;
23711    fn untyped(self) -> SyntaxStablePtrId<'db> {
23712        self.0
23713    }
23714    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23715        MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23716    }
23717}
23718impl<'db> From<MacroParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
23719    fn from(ptr: MacroParamKindPtr<'db>) -> Self {
23720        ptr.untyped()
23721    }
23722}
23723impl<'db> From<ParamIdentPtr<'db>> for MacroParamKindPtr<'db> {
23724    fn from(value: ParamIdentPtr<'db>) -> Self {
23725        Self(value.0)
23726    }
23727}
23728impl<'db> From<ParamExprPtr<'db>> for MacroParamKindPtr<'db> {
23729    fn from(value: ParamExprPtr<'db>) -> Self {
23730        Self(value.0)
23731    }
23732}
23733impl<'db> From<MacroParamKindMissingPtr<'db>> for MacroParamKindPtr<'db> {
23734    fn from(value: MacroParamKindMissingPtr<'db>) -> Self {
23735        Self(value.0)
23736    }
23737}
23738impl<'db> From<ParamIdentGreen<'db>> for MacroParamKindGreen<'db> {
23739    fn from(value: ParamIdentGreen<'db>) -> Self {
23740        Self(value.0)
23741    }
23742}
23743impl<'db> From<ParamExprGreen<'db>> for MacroParamKindGreen<'db> {
23744    fn from(value: ParamExprGreen<'db>) -> Self {
23745        Self(value.0)
23746    }
23747}
23748impl<'db> From<MacroParamKindMissingGreen<'db>> for MacroParamKindGreen<'db> {
23749    fn from(value: MacroParamKindMissingGreen<'db>) -> Self {
23750        Self(value.0)
23751    }
23752}
23753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23754pub struct MacroParamKindGreen<'db>(pub GreenId<'db>);
23755impl<'db> TypedSyntaxNode<'db> for MacroParamKind<'db> {
23756    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23757    type StablePtr = MacroParamKindPtr<'db>;
23758    type Green = MacroParamKindGreen<'db>;
23759    fn missing(db: &'db dyn Database) -> Self::Green {
23760        MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23761    }
23762    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23763        let kind = node.kind(db);
23764        match kind {
23765            SyntaxKind::ParamIdent => {
23766                MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23767            }
23768            SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23769            SyntaxKind::MacroParamKindMissing => {
23770                MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23771            }
23772            _ => {
23773                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23774            }
23775        }
23776    }
23777    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23778        let kind = node.kind(db);
23779        match kind {
23780            SyntaxKind::ParamIdent => {
23781                Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23782            }
23783            SyntaxKind::ParamExpr => {
23784                Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23785            }
23786            SyntaxKind::MacroParamKindMissing => {
23787                Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23788            }
23789            _ => None,
23790        }
23791    }
23792    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23793        match self {
23794            MacroParamKind::Identifier(x) => x.as_syntax_node(),
23795            MacroParamKind::Expr(x) => x.as_syntax_node(),
23796            MacroParamKind::Missing(x) => x.as_syntax_node(),
23797        }
23798    }
23799    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23800        MacroParamKindPtr(self.as_syntax_node().stable_ptr(db))
23801    }
23802}
23803impl<'db> MacroParamKind<'db> {
23804    /// Checks if a kind of a variant of [MacroParamKind].
23805    pub fn is_variant(kind: SyntaxKind) -> bool {
23806        matches!(
23807            kind,
23808            SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23809        )
23810    }
23811}
23812#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23813pub struct MacroParamKindMissing<'db> {
23814    node: SyntaxNode<'db>,
23815}
23816impl<'db> MacroParamKindMissing<'db> {
23817    pub fn new_green(db: &'db dyn Database) -> MacroParamKindMissingGreen<'db> {
23818        let children = [];
23819        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23820        MacroParamKindMissingGreen(
23821            GreenNode {
23822                kind: SyntaxKind::MacroParamKindMissing,
23823                details: GreenNodeDetails::Node { children: children.into(), width },
23824            }
23825            .intern(db),
23826        )
23827    }
23828}
23829impl<'db> MacroParamKindMissing<'db> {}
23830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23831pub struct MacroParamKindMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23832impl<'db> MacroParamKindMissingPtr<'db> {}
23833impl<'db> TypedStablePtr<'db> for MacroParamKindMissingPtr<'db> {
23834    type SyntaxNode = MacroParamKindMissing<'db>;
23835    fn untyped(self) -> SyntaxStablePtrId<'db> {
23836        self.0
23837    }
23838    fn lookup(&self, db: &'db dyn Database) -> MacroParamKindMissing<'db> {
23839        MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
23840    }
23841}
23842impl<'db> From<MacroParamKindMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23843    fn from(ptr: MacroParamKindMissingPtr<'db>) -> Self {
23844        ptr.untyped()
23845    }
23846}
23847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23848pub struct MacroParamKindMissingGreen<'db>(pub GreenId<'db>);
23849impl<'db> TypedSyntaxNode<'db> for MacroParamKindMissing<'db> {
23850    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
23851    type StablePtr = MacroParamKindMissingPtr<'db>;
23852    type Green = MacroParamKindMissingGreen<'db>;
23853    fn missing(db: &'db dyn Database) -> Self::Green {
23854        MacroParamKindMissingGreen(
23855            GreenNode {
23856                kind: SyntaxKind::MacroParamKindMissing,
23857                details: GreenNodeDetails::Node {
23858                    children: [].into(),
23859                    width: TextWidth::default(),
23860                },
23861            }
23862            .intern(db),
23863        )
23864    }
23865    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23866        let kind = node.kind(db);
23867        assert_eq!(
23868            kind,
23869            SyntaxKind::MacroParamKindMissing,
23870            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23871            kind,
23872            SyntaxKind::MacroParamKindMissing
23873        );
23874        Self { node }
23875    }
23876    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23877        let kind = node.kind(db);
23878        if kind == SyntaxKind::MacroParamKindMissing {
23879            Some(Self::from_syntax_node(db, node))
23880        } else {
23881            None
23882        }
23883    }
23884    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23885        self.node
23886    }
23887    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23888        MacroParamKindMissingPtr(self.node.stable_ptr(db))
23889    }
23890}
23891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23892pub enum MacroElement<'db> {
23893    Token(TokenTreeLeaf<'db>),
23894    Param(MacroParam<'db>),
23895    Subtree(MacroWrapper<'db>),
23896    Repetition(MacroRepetition<'db>),
23897}
23898#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23899pub struct MacroElementPtr<'db>(pub SyntaxStablePtrId<'db>);
23900impl<'db> TypedStablePtr<'db> for MacroElementPtr<'db> {
23901    type SyntaxNode = MacroElement<'db>;
23902    fn untyped(self) -> SyntaxStablePtrId<'db> {
23903        self.0
23904    }
23905    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23906        MacroElement::from_syntax_node(db, self.0.lookup(db))
23907    }
23908}
23909impl<'db> From<MacroElementPtr<'db>> for SyntaxStablePtrId<'db> {
23910    fn from(ptr: MacroElementPtr<'db>) -> Self {
23911        ptr.untyped()
23912    }
23913}
23914impl<'db> From<TokenTreeLeafPtr<'db>> for MacroElementPtr<'db> {
23915    fn from(value: TokenTreeLeafPtr<'db>) -> Self {
23916        Self(value.0)
23917    }
23918}
23919impl<'db> From<MacroParamPtr<'db>> for MacroElementPtr<'db> {
23920    fn from(value: MacroParamPtr<'db>) -> Self {
23921        Self(value.0)
23922    }
23923}
23924impl<'db> From<MacroWrapperPtr<'db>> for MacroElementPtr<'db> {
23925    fn from(value: MacroWrapperPtr<'db>) -> Self {
23926        Self(value.0)
23927    }
23928}
23929impl<'db> From<MacroRepetitionPtr<'db>> for MacroElementPtr<'db> {
23930    fn from(value: MacroRepetitionPtr<'db>) -> Self {
23931        Self(value.0)
23932    }
23933}
23934impl<'db> From<TokenTreeLeafGreen<'db>> for MacroElementGreen<'db> {
23935    fn from(value: TokenTreeLeafGreen<'db>) -> Self {
23936        Self(value.0)
23937    }
23938}
23939impl<'db> From<MacroParamGreen<'db>> for MacroElementGreen<'db> {
23940    fn from(value: MacroParamGreen<'db>) -> Self {
23941        Self(value.0)
23942    }
23943}
23944impl<'db> From<MacroWrapperGreen<'db>> for MacroElementGreen<'db> {
23945    fn from(value: MacroWrapperGreen<'db>) -> Self {
23946        Self(value.0)
23947    }
23948}
23949impl<'db> From<MacroRepetitionGreen<'db>> for MacroElementGreen<'db> {
23950    fn from(value: MacroRepetitionGreen<'db>) -> Self {
23951        Self(value.0)
23952    }
23953}
23954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23955pub struct MacroElementGreen<'db>(pub GreenId<'db>);
23956impl<'db> TypedSyntaxNode<'db> for MacroElement<'db> {
23957    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23958    type StablePtr = MacroElementPtr<'db>;
23959    type Green = MacroElementGreen<'db>;
23960    fn missing(db: &'db dyn Database) -> Self::Green {
23961        panic!("No missing variant.");
23962    }
23963    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23964        let kind = node.kind(db);
23965        match kind {
23966            SyntaxKind::TokenTreeLeaf => {
23967                MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
23968            }
23969            SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
23970            SyntaxKind::MacroWrapper => {
23971                MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
23972            }
23973            SyntaxKind::MacroRepetition => {
23974                MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
23975            }
23976            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
23977        }
23978    }
23979    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23980        let kind = node.kind(db);
23981        match kind {
23982            SyntaxKind::TokenTreeLeaf => {
23983                Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
23984            }
23985            SyntaxKind::MacroParam => {
23986                Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
23987            }
23988            SyntaxKind::MacroWrapper => {
23989                Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
23990            }
23991            SyntaxKind::MacroRepetition => {
23992                Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
23993            }
23994            _ => None,
23995        }
23996    }
23997    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23998        match self {
23999            MacroElement::Token(x) => x.as_syntax_node(),
24000            MacroElement::Param(x) => x.as_syntax_node(),
24001            MacroElement::Subtree(x) => x.as_syntax_node(),
24002            MacroElement::Repetition(x) => x.as_syntax_node(),
24003        }
24004    }
24005    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24006        MacroElementPtr(self.as_syntax_node().stable_ptr(db))
24007    }
24008}
24009impl<'db> MacroElement<'db> {
24010    /// Checks if a kind of a variant of [MacroElement].
24011    pub fn is_variant(kind: SyntaxKind) -> bool {
24012        matches!(
24013            kind,
24014            SyntaxKind::TokenTreeLeaf
24015                | SyntaxKind::MacroParam
24016                | SyntaxKind::MacroWrapper
24017                | SyntaxKind::MacroRepetition
24018        )
24019    }
24020}
24021#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24022pub struct MacroElements<'db>(ElementList<'db, MacroElement<'db>, 1>);
24023impl<'db> Deref for MacroElements<'db> {
24024    type Target = ElementList<'db, MacroElement<'db>, 1>;
24025    fn deref(&self) -> &Self::Target {
24026        &self.0
24027    }
24028}
24029impl<'db> MacroElements<'db> {
24030    pub fn new_green(
24031        db: &'db dyn Database,
24032        children: &[MacroElementGreen<'db>],
24033    ) -> MacroElementsGreen<'db> {
24034        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
24035        MacroElementsGreen(
24036            GreenNode {
24037                kind: SyntaxKind::MacroElements,
24038                details: GreenNodeDetails::Node {
24039                    children: children.iter().map(|x| x.0).collect(),
24040                    width,
24041                },
24042            }
24043            .intern(db),
24044        )
24045    }
24046}
24047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24048pub struct MacroElementsPtr<'db>(pub SyntaxStablePtrId<'db>);
24049impl<'db> TypedStablePtr<'db> for MacroElementsPtr<'db> {
24050    type SyntaxNode = MacroElements<'db>;
24051    fn untyped(self) -> SyntaxStablePtrId<'db> {
24052        self.0
24053    }
24054    fn lookup(&self, db: &'db dyn Database) -> MacroElements<'db> {
24055        MacroElements::from_syntax_node(db, self.0.lookup(db))
24056    }
24057}
24058impl<'db> From<MacroElementsPtr<'db>> for SyntaxStablePtrId<'db> {
24059    fn from(ptr: MacroElementsPtr<'db>) -> Self {
24060        ptr.untyped()
24061    }
24062}
24063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24064pub struct MacroElementsGreen<'db>(pub GreenId<'db>);
24065impl<'db> TypedSyntaxNode<'db> for MacroElements<'db> {
24066    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
24067    type StablePtr = MacroElementsPtr<'db>;
24068    type Green = MacroElementsGreen<'db>;
24069    fn missing(db: &'db dyn Database) -> Self::Green {
24070        MacroElementsGreen(
24071            GreenNode {
24072                kind: SyntaxKind::MacroElements,
24073                details: GreenNodeDetails::Node {
24074                    children: [].into(),
24075                    width: TextWidth::default(),
24076                },
24077            }
24078            .intern(db),
24079        )
24080    }
24081    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24082        Self(ElementList::new(node))
24083    }
24084    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24085        if node.kind(db) == SyntaxKind::MacroElements {
24086            Some(Self(ElementList::new(node)))
24087        } else {
24088            None
24089        }
24090    }
24091    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24092        self.node
24093    }
24094    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24095        MacroElementsPtr(self.node.stable_ptr(db))
24096    }
24097}
24098#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24099pub struct MacroWrapper<'db> {
24100    node: SyntaxNode<'db>,
24101}
24102impl<'db> MacroWrapper<'db> {
24103    pub const INDEX_SUBTREE: usize = 0;
24104    pub fn new_green(
24105        db: &'db dyn Database,
24106        subtree: WrappedMacroGreen<'db>,
24107    ) -> MacroWrapperGreen<'db> {
24108        let children = [subtree.0];
24109        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24110        MacroWrapperGreen(
24111            GreenNode {
24112                kind: SyntaxKind::MacroWrapper,
24113                details: GreenNodeDetails::Node { children: children.into(), width },
24114            }
24115            .intern(db),
24116        )
24117    }
24118}
24119impl<'db> MacroWrapper<'db> {
24120    pub fn subtree(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
24121        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
24122    }
24123}
24124#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24125pub struct MacroWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
24126impl<'db> MacroWrapperPtr<'db> {}
24127impl<'db> TypedStablePtr<'db> for MacroWrapperPtr<'db> {
24128    type SyntaxNode = MacroWrapper<'db>;
24129    fn untyped(self) -> SyntaxStablePtrId<'db> {
24130        self.0
24131    }
24132    fn lookup(&self, db: &'db dyn Database) -> MacroWrapper<'db> {
24133        MacroWrapper::from_syntax_node(db, self.0.lookup(db))
24134    }
24135}
24136impl<'db> From<MacroWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
24137    fn from(ptr: MacroWrapperPtr<'db>) -> Self {
24138        ptr.untyped()
24139    }
24140}
24141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24142pub struct MacroWrapperGreen<'db>(pub GreenId<'db>);
24143impl<'db> TypedSyntaxNode<'db> for MacroWrapper<'db> {
24144    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
24145    type StablePtr = MacroWrapperPtr<'db>;
24146    type Green = MacroWrapperGreen<'db>;
24147    fn missing(db: &'db dyn Database) -> Self::Green {
24148        MacroWrapperGreen(
24149            GreenNode {
24150                kind: SyntaxKind::MacroWrapper,
24151                details: GreenNodeDetails::Node {
24152                    children: [WrappedMacro::missing(db).0].into(),
24153                    width: TextWidth::default(),
24154                },
24155            }
24156            .intern(db),
24157        )
24158    }
24159    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24160        let kind = node.kind(db);
24161        assert_eq!(
24162            kind,
24163            SyntaxKind::MacroWrapper,
24164            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24165            kind,
24166            SyntaxKind::MacroWrapper
24167        );
24168        Self { node }
24169    }
24170    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24171        let kind = node.kind(db);
24172        if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
24173    }
24174    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24175        self.node
24176    }
24177    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24178        MacroWrapperPtr(self.node.stable_ptr(db))
24179    }
24180}
24181#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24182pub enum WrappedMacro<'db> {
24183    Parenthesized(ParenthesizedMacro<'db>),
24184    Braced(BracedMacro<'db>),
24185    Bracketed(BracketedMacro<'db>),
24186}
24187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24188pub struct WrappedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24189impl<'db> TypedStablePtr<'db> for WrappedMacroPtr<'db> {
24190    type SyntaxNode = WrappedMacro<'db>;
24191    fn untyped(self) -> SyntaxStablePtrId<'db> {
24192        self.0
24193    }
24194    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24195        WrappedMacro::from_syntax_node(db, self.0.lookup(db))
24196    }
24197}
24198impl<'db> From<WrappedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24199    fn from(ptr: WrappedMacroPtr<'db>) -> Self {
24200        ptr.untyped()
24201    }
24202}
24203impl<'db> From<ParenthesizedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24204    fn from(value: ParenthesizedMacroPtr<'db>) -> Self {
24205        Self(value.0)
24206    }
24207}
24208impl<'db> From<BracedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24209    fn from(value: BracedMacroPtr<'db>) -> Self {
24210        Self(value.0)
24211    }
24212}
24213impl<'db> From<BracketedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24214    fn from(value: BracketedMacroPtr<'db>) -> Self {
24215        Self(value.0)
24216    }
24217}
24218impl<'db> From<ParenthesizedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24219    fn from(value: ParenthesizedMacroGreen<'db>) -> Self {
24220        Self(value.0)
24221    }
24222}
24223impl<'db> From<BracedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24224    fn from(value: BracedMacroGreen<'db>) -> Self {
24225        Self(value.0)
24226    }
24227}
24228impl<'db> From<BracketedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24229    fn from(value: BracketedMacroGreen<'db>) -> Self {
24230        Self(value.0)
24231    }
24232}
24233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24234pub struct WrappedMacroGreen<'db>(pub GreenId<'db>);
24235impl<'db> TypedSyntaxNode<'db> for WrappedMacro<'db> {
24236    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24237    type StablePtr = WrappedMacroPtr<'db>;
24238    type Green = WrappedMacroGreen<'db>;
24239    fn missing(db: &'db dyn Database) -> Self::Green {
24240        panic!("No missing variant.");
24241    }
24242    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24243        let kind = node.kind(db);
24244        match kind {
24245            SyntaxKind::ParenthesizedMacro => {
24246                WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
24247            }
24248            SyntaxKind::BracedMacro => {
24249                WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
24250            }
24251            SyntaxKind::BracketedMacro => {
24252                WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24253            }
24254            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24255        }
24256    }
24257    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24258        let kind = node.kind(db);
24259        match kind {
24260            SyntaxKind::ParenthesizedMacro => {
24261                Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24262            }
24263            SyntaxKind::BracedMacro => {
24264                Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24265            }
24266            SyntaxKind::BracketedMacro => {
24267                Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24268            }
24269            _ => None,
24270        }
24271    }
24272    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24273        match self {
24274            WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24275            WrappedMacro::Braced(x) => x.as_syntax_node(),
24276            WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24277        }
24278    }
24279    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24280        WrappedMacroPtr(self.as_syntax_node().stable_ptr(db))
24281    }
24282}
24283impl<'db> WrappedMacro<'db> {
24284    /// Checks if a kind of a variant of [WrappedMacro].
24285    pub fn is_variant(kind: SyntaxKind) -> bool {
24286        matches!(
24287            kind,
24288            SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24289        )
24290    }
24291}
24292#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24293pub struct ParenthesizedMacro<'db> {
24294    node: SyntaxNode<'db>,
24295}
24296impl<'db> ParenthesizedMacro<'db> {
24297    pub const INDEX_LPAREN: usize = 0;
24298    pub const INDEX_ELEMENTS: usize = 1;
24299    pub const INDEX_RPAREN: usize = 2;
24300    pub fn new_green(
24301        db: &'db dyn Database,
24302        lparen: TerminalLParenGreen<'db>,
24303        elements: MacroElementsGreen<'db>,
24304        rparen: TerminalRParenGreen<'db>,
24305    ) -> ParenthesizedMacroGreen<'db> {
24306        let children = [lparen.0, elements.0, rparen.0];
24307        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24308        ParenthesizedMacroGreen(
24309            GreenNode {
24310                kind: SyntaxKind::ParenthesizedMacro,
24311                details: GreenNodeDetails::Node { children: children.into(), width },
24312            }
24313            .intern(db),
24314        )
24315    }
24316}
24317impl<'db> ParenthesizedMacro<'db> {
24318    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
24319        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24320    }
24321    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24322        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24323    }
24324    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
24325        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24326    }
24327}
24328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24329pub struct ParenthesizedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24330impl<'db> ParenthesizedMacroPtr<'db> {}
24331impl<'db> TypedStablePtr<'db> for ParenthesizedMacroPtr<'db> {
24332    type SyntaxNode = ParenthesizedMacro<'db>;
24333    fn untyped(self) -> SyntaxStablePtrId<'db> {
24334        self.0
24335    }
24336    fn lookup(&self, db: &'db dyn Database) -> ParenthesizedMacro<'db> {
24337        ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24338    }
24339}
24340impl<'db> From<ParenthesizedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24341    fn from(ptr: ParenthesizedMacroPtr<'db>) -> Self {
24342        ptr.untyped()
24343    }
24344}
24345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24346pub struct ParenthesizedMacroGreen<'db>(pub GreenId<'db>);
24347impl<'db> TypedSyntaxNode<'db> for ParenthesizedMacro<'db> {
24348    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24349    type StablePtr = ParenthesizedMacroPtr<'db>;
24350    type Green = ParenthesizedMacroGreen<'db>;
24351    fn missing(db: &'db dyn Database) -> Self::Green {
24352        ParenthesizedMacroGreen(
24353            GreenNode {
24354                kind: SyntaxKind::ParenthesizedMacro,
24355                details: GreenNodeDetails::Node {
24356                    children: [
24357                        TerminalLParen::missing(db).0,
24358                        MacroElements::missing(db).0,
24359                        TerminalRParen::missing(db).0,
24360                    ]
24361                    .into(),
24362                    width: TextWidth::default(),
24363                },
24364            }
24365            .intern(db),
24366        )
24367    }
24368    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24369        let kind = node.kind(db);
24370        assert_eq!(
24371            kind,
24372            SyntaxKind::ParenthesizedMacro,
24373            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24374            kind,
24375            SyntaxKind::ParenthesizedMacro
24376        );
24377        Self { node }
24378    }
24379    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24380        let kind = node.kind(db);
24381        if kind == SyntaxKind::ParenthesizedMacro {
24382            Some(Self::from_syntax_node(db, node))
24383        } else {
24384            None
24385        }
24386    }
24387    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24388        self.node
24389    }
24390    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24391        ParenthesizedMacroPtr(self.node.stable_ptr(db))
24392    }
24393}
24394#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24395pub struct BracedMacro<'db> {
24396    node: SyntaxNode<'db>,
24397}
24398impl<'db> BracedMacro<'db> {
24399    pub const INDEX_LBRACE: usize = 0;
24400    pub const INDEX_ELEMENTS: usize = 1;
24401    pub const INDEX_RBRACE: usize = 2;
24402    pub fn new_green(
24403        db: &'db dyn Database,
24404        lbrace: TerminalLBraceGreen<'db>,
24405        elements: MacroElementsGreen<'db>,
24406        rbrace: TerminalRBraceGreen<'db>,
24407    ) -> BracedMacroGreen<'db> {
24408        let children = [lbrace.0, elements.0, rbrace.0];
24409        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24410        BracedMacroGreen(
24411            GreenNode {
24412                kind: SyntaxKind::BracedMacro,
24413                details: GreenNodeDetails::Node { children: children.into(), width },
24414            }
24415            .intern(db),
24416        )
24417    }
24418}
24419impl<'db> BracedMacro<'db> {
24420    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
24421        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24422    }
24423    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24424        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24425    }
24426    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
24427        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24428    }
24429}
24430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24431pub struct BracedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24432impl<'db> BracedMacroPtr<'db> {}
24433impl<'db> TypedStablePtr<'db> for BracedMacroPtr<'db> {
24434    type SyntaxNode = BracedMacro<'db>;
24435    fn untyped(self) -> SyntaxStablePtrId<'db> {
24436        self.0
24437    }
24438    fn lookup(&self, db: &'db dyn Database) -> BracedMacro<'db> {
24439        BracedMacro::from_syntax_node(db, self.0.lookup(db))
24440    }
24441}
24442impl<'db> From<BracedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24443    fn from(ptr: BracedMacroPtr<'db>) -> Self {
24444        ptr.untyped()
24445    }
24446}
24447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24448pub struct BracedMacroGreen<'db>(pub GreenId<'db>);
24449impl<'db> TypedSyntaxNode<'db> for BracedMacro<'db> {
24450    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24451    type StablePtr = BracedMacroPtr<'db>;
24452    type Green = BracedMacroGreen<'db>;
24453    fn missing(db: &'db dyn Database) -> Self::Green {
24454        BracedMacroGreen(
24455            GreenNode {
24456                kind: SyntaxKind::BracedMacro,
24457                details: GreenNodeDetails::Node {
24458                    children: [
24459                        TerminalLBrace::missing(db).0,
24460                        MacroElements::missing(db).0,
24461                        TerminalRBrace::missing(db).0,
24462                    ]
24463                    .into(),
24464                    width: TextWidth::default(),
24465                },
24466            }
24467            .intern(db),
24468        )
24469    }
24470    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24471        let kind = node.kind(db);
24472        assert_eq!(
24473            kind,
24474            SyntaxKind::BracedMacro,
24475            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24476            kind,
24477            SyntaxKind::BracedMacro
24478        );
24479        Self { node }
24480    }
24481    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24482        let kind = node.kind(db);
24483        if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24484    }
24485    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24486        self.node
24487    }
24488    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24489        BracedMacroPtr(self.node.stable_ptr(db))
24490    }
24491}
24492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24493pub struct BracketedMacro<'db> {
24494    node: SyntaxNode<'db>,
24495}
24496impl<'db> BracketedMacro<'db> {
24497    pub const INDEX_LBRACK: usize = 0;
24498    pub const INDEX_ELEMENTS: usize = 1;
24499    pub const INDEX_RBRACK: usize = 2;
24500    pub fn new_green(
24501        db: &'db dyn Database,
24502        lbrack: TerminalLBrackGreen<'db>,
24503        elements: MacroElementsGreen<'db>,
24504        rbrack: TerminalRBrackGreen<'db>,
24505    ) -> BracketedMacroGreen<'db> {
24506        let children = [lbrack.0, elements.0, rbrack.0];
24507        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24508        BracketedMacroGreen(
24509            GreenNode {
24510                kind: SyntaxKind::BracketedMacro,
24511                details: GreenNodeDetails::Node { children: children.into(), width },
24512            }
24513            .intern(db),
24514        )
24515    }
24516}
24517impl<'db> BracketedMacro<'db> {
24518    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
24519        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24520    }
24521    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24522        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24523    }
24524    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
24525        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24526    }
24527}
24528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24529pub struct BracketedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24530impl<'db> BracketedMacroPtr<'db> {}
24531impl<'db> TypedStablePtr<'db> for BracketedMacroPtr<'db> {
24532    type SyntaxNode = BracketedMacro<'db>;
24533    fn untyped(self) -> SyntaxStablePtrId<'db> {
24534        self.0
24535    }
24536    fn lookup(&self, db: &'db dyn Database) -> BracketedMacro<'db> {
24537        BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24538    }
24539}
24540impl<'db> From<BracketedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24541    fn from(ptr: BracketedMacroPtr<'db>) -> Self {
24542        ptr.untyped()
24543    }
24544}
24545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24546pub struct BracketedMacroGreen<'db>(pub GreenId<'db>);
24547impl<'db> TypedSyntaxNode<'db> for BracketedMacro<'db> {
24548    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24549    type StablePtr = BracketedMacroPtr<'db>;
24550    type Green = BracketedMacroGreen<'db>;
24551    fn missing(db: &'db dyn Database) -> Self::Green {
24552        BracketedMacroGreen(
24553            GreenNode {
24554                kind: SyntaxKind::BracketedMacro,
24555                details: GreenNodeDetails::Node {
24556                    children: [
24557                        TerminalLBrack::missing(db).0,
24558                        MacroElements::missing(db).0,
24559                        TerminalRBrack::missing(db).0,
24560                    ]
24561                    .into(),
24562                    width: TextWidth::default(),
24563                },
24564            }
24565            .intern(db),
24566        )
24567    }
24568    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24569        let kind = node.kind(db);
24570        assert_eq!(
24571            kind,
24572            SyntaxKind::BracketedMacro,
24573            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24574            kind,
24575            SyntaxKind::BracketedMacro
24576        );
24577        Self { node }
24578    }
24579    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24580        let kind = node.kind(db);
24581        if kind == SyntaxKind::BracketedMacro {
24582            Some(Self::from_syntax_node(db, node))
24583        } else {
24584            None
24585        }
24586    }
24587    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24588        self.node
24589    }
24590    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24591        BracketedMacroPtr(self.node.stable_ptr(db))
24592    }
24593}
24594#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24595pub struct LegacyExprInlineMacro<'db> {
24596    node: SyntaxNode<'db>,
24597}
24598impl<'db> LegacyExprInlineMacro<'db> {
24599    pub const INDEX_PATH: usize = 0;
24600    pub const INDEX_BANG: usize = 1;
24601    pub const INDEX_ARGUMENTS: usize = 2;
24602    pub fn new_green(
24603        db: &'db dyn Database,
24604        path: ExprPathGreen<'db>,
24605        bang: TerminalNotGreen<'db>,
24606        arguments: WrappedArgListGreen<'db>,
24607    ) -> LegacyExprInlineMacroGreen<'db> {
24608        let children = [path.0, bang.0, arguments.0];
24609        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24610        LegacyExprInlineMacroGreen(
24611            GreenNode {
24612                kind: SyntaxKind::LegacyExprInlineMacro,
24613                details: GreenNodeDetails::Node { children: children.into(), width },
24614            }
24615            .intern(db),
24616        )
24617    }
24618}
24619impl<'db> LegacyExprInlineMacro<'db> {
24620    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24621        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24622    }
24623    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24624        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24625    }
24626    pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24627        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24628    }
24629}
24630#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24631pub struct LegacyExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24632impl<'db> LegacyExprInlineMacroPtr<'db> {}
24633impl<'db> TypedStablePtr<'db> for LegacyExprInlineMacroPtr<'db> {
24634    type SyntaxNode = LegacyExprInlineMacro<'db>;
24635    fn untyped(self) -> SyntaxStablePtrId<'db> {
24636        self.0
24637    }
24638    fn lookup(&self, db: &'db dyn Database) -> LegacyExprInlineMacro<'db> {
24639        LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24640    }
24641}
24642impl<'db> From<LegacyExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24643    fn from(ptr: LegacyExprInlineMacroPtr<'db>) -> Self {
24644        ptr.untyped()
24645    }
24646}
24647#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24648pub struct LegacyExprInlineMacroGreen<'db>(pub GreenId<'db>);
24649impl<'db> TypedSyntaxNode<'db> for LegacyExprInlineMacro<'db> {
24650    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24651    type StablePtr = LegacyExprInlineMacroPtr<'db>;
24652    type Green = LegacyExprInlineMacroGreen<'db>;
24653    fn missing(db: &'db dyn Database) -> Self::Green {
24654        LegacyExprInlineMacroGreen(
24655            GreenNode {
24656                kind: SyntaxKind::LegacyExprInlineMacro,
24657                details: GreenNodeDetails::Node {
24658                    children: [
24659                        ExprPath::missing(db).0,
24660                        TerminalNot::missing(db).0,
24661                        WrappedArgList::missing(db).0,
24662                    ]
24663                    .into(),
24664                    width: TextWidth::default(),
24665                },
24666            }
24667            .intern(db),
24668        )
24669    }
24670    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24671        let kind = node.kind(db);
24672        assert_eq!(
24673            kind,
24674            SyntaxKind::LegacyExprInlineMacro,
24675            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24676            kind,
24677            SyntaxKind::LegacyExprInlineMacro
24678        );
24679        Self { node }
24680    }
24681    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24682        let kind = node.kind(db);
24683        if kind == SyntaxKind::LegacyExprInlineMacro {
24684            Some(Self::from_syntax_node(db, node))
24685        } else {
24686            None
24687        }
24688    }
24689    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24690        self.node
24691    }
24692    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24693        LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24694    }
24695}
24696#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24697pub struct LegacyItemInlineMacro<'db> {
24698    node: SyntaxNode<'db>,
24699}
24700impl<'db> LegacyItemInlineMacro<'db> {
24701    pub const INDEX_ATTRIBUTES: usize = 0;
24702    pub const INDEX_PATH: usize = 1;
24703    pub const INDEX_BANG: usize = 2;
24704    pub const INDEX_ARGUMENTS: usize = 3;
24705    pub const INDEX_SEMICOLON: usize = 4;
24706    pub fn new_green(
24707        db: &'db dyn Database,
24708        attributes: AttributeListGreen<'db>,
24709        path: ExprPathGreen<'db>,
24710        bang: TerminalNotGreen<'db>,
24711        arguments: WrappedArgListGreen<'db>,
24712        semicolon: TerminalSemicolonGreen<'db>,
24713    ) -> LegacyItemInlineMacroGreen<'db> {
24714        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24715        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24716        LegacyItemInlineMacroGreen(
24717            GreenNode {
24718                kind: SyntaxKind::LegacyItemInlineMacro,
24719                details: GreenNodeDetails::Node { children: children.into(), width },
24720            }
24721            .intern(db),
24722        )
24723    }
24724}
24725impl<'db> LegacyItemInlineMacro<'db> {
24726    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
24727        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24728    }
24729    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24730        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24731    }
24732    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24733        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24734    }
24735    pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24736        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24737    }
24738    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
24739        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24740    }
24741}
24742#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24743pub struct LegacyItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24744impl<'db> LegacyItemInlineMacroPtr<'db> {}
24745impl<'db> TypedStablePtr<'db> for LegacyItemInlineMacroPtr<'db> {
24746    type SyntaxNode = LegacyItemInlineMacro<'db>;
24747    fn untyped(self) -> SyntaxStablePtrId<'db> {
24748        self.0
24749    }
24750    fn lookup(&self, db: &'db dyn Database) -> LegacyItemInlineMacro<'db> {
24751        LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24752    }
24753}
24754impl<'db> From<LegacyItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24755    fn from(ptr: LegacyItemInlineMacroPtr<'db>) -> Self {
24756        ptr.untyped()
24757    }
24758}
24759#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24760pub struct LegacyItemInlineMacroGreen<'db>(pub GreenId<'db>);
24761impl<'db> TypedSyntaxNode<'db> for LegacyItemInlineMacro<'db> {
24762    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24763    type StablePtr = LegacyItemInlineMacroPtr<'db>;
24764    type Green = LegacyItemInlineMacroGreen<'db>;
24765    fn missing(db: &'db dyn Database) -> Self::Green {
24766        LegacyItemInlineMacroGreen(
24767            GreenNode {
24768                kind: SyntaxKind::LegacyItemInlineMacro,
24769                details: GreenNodeDetails::Node {
24770                    children: [
24771                        AttributeList::missing(db).0,
24772                        ExprPath::missing(db).0,
24773                        TerminalNot::missing(db).0,
24774                        WrappedArgList::missing(db).0,
24775                        TerminalSemicolon::missing(db).0,
24776                    ]
24777                    .into(),
24778                    width: TextWidth::default(),
24779                },
24780            }
24781            .intern(db),
24782        )
24783    }
24784    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24785        let kind = node.kind(db);
24786        assert_eq!(
24787            kind,
24788            SyntaxKind::LegacyItemInlineMacro,
24789            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24790            kind,
24791            SyntaxKind::LegacyItemInlineMacro
24792        );
24793        Self { node }
24794    }
24795    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24796        let kind = node.kind(db);
24797        if kind == SyntaxKind::LegacyItemInlineMacro {
24798            Some(Self::from_syntax_node(db, node))
24799        } else {
24800            None
24801        }
24802    }
24803    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24804        self.node
24805    }
24806    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24807        LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24808    }
24809}
24810#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24811pub struct TriviumSkippedNode<'db> {
24812    node: SyntaxNode<'db>,
24813}
24814impl<'db> TriviumSkippedNode<'db> {
24815    pub const INDEX_NODE: usize = 0;
24816    pub fn new_green(
24817        db: &'db dyn Database,
24818        node: SkippedNodeGreen<'db>,
24819    ) -> TriviumSkippedNodeGreen<'db> {
24820        let children = [node.0];
24821        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24822        TriviumSkippedNodeGreen(
24823            GreenNode {
24824                kind: SyntaxKind::TriviumSkippedNode,
24825                details: GreenNodeDetails::Node { children: children.into(), width },
24826            }
24827            .intern(db),
24828        )
24829    }
24830}
24831impl<'db> TriviumSkippedNode<'db> {
24832    pub fn node(&self, db: &'db dyn Database) -> SkippedNode<'db> {
24833        SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
24834    }
24835}
24836#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24837pub struct TriviumSkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24838impl<'db> TriviumSkippedNodePtr<'db> {}
24839impl<'db> TypedStablePtr<'db> for TriviumSkippedNodePtr<'db> {
24840    type SyntaxNode = TriviumSkippedNode<'db>;
24841    fn untyped(self) -> SyntaxStablePtrId<'db> {
24842        self.0
24843    }
24844    fn lookup(&self, db: &'db dyn Database) -> TriviumSkippedNode<'db> {
24845        TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
24846    }
24847}
24848impl<'db> From<TriviumSkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24849    fn from(ptr: TriviumSkippedNodePtr<'db>) -> Self {
24850        ptr.untyped()
24851    }
24852}
24853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24854pub struct TriviumSkippedNodeGreen<'db>(pub GreenId<'db>);
24855impl<'db> TypedSyntaxNode<'db> for TriviumSkippedNode<'db> {
24856    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
24857    type StablePtr = TriviumSkippedNodePtr<'db>;
24858    type Green = TriviumSkippedNodeGreen<'db>;
24859    fn missing(db: &'db dyn Database) -> Self::Green {
24860        TriviumSkippedNodeGreen(
24861            GreenNode {
24862                kind: SyntaxKind::TriviumSkippedNode,
24863                details: GreenNodeDetails::Node {
24864                    children: [SkippedNode::missing(db).0].into(),
24865                    width: TextWidth::default(),
24866                },
24867            }
24868            .intern(db),
24869        )
24870    }
24871    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24872        let kind = node.kind(db);
24873        assert_eq!(
24874            kind,
24875            SyntaxKind::TriviumSkippedNode,
24876            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24877            kind,
24878            SyntaxKind::TriviumSkippedNode
24879        );
24880        Self { node }
24881    }
24882    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24883        let kind = node.kind(db);
24884        if kind == SyntaxKind::TriviumSkippedNode {
24885            Some(Self::from_syntax_node(db, node))
24886        } else {
24887            None
24888        }
24889    }
24890    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24891        self.node
24892    }
24893    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24894        TriviumSkippedNodePtr(self.node.stable_ptr(db))
24895    }
24896}
24897#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24898pub enum SkippedNode<'db> {
24899    AttributeList(AttributeList<'db>),
24900    VisibilityPub(VisibilityPub<'db>),
24901    ExprPath(ExprPath<'db>),
24902}
24903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24904pub struct SkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24905impl<'db> TypedStablePtr<'db> for SkippedNodePtr<'db> {
24906    type SyntaxNode = SkippedNode<'db>;
24907    fn untyped(self) -> SyntaxStablePtrId<'db> {
24908        self.0
24909    }
24910    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24911        SkippedNode::from_syntax_node(db, self.0.lookup(db))
24912    }
24913}
24914impl<'db> From<SkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24915    fn from(ptr: SkippedNodePtr<'db>) -> Self {
24916        ptr.untyped()
24917    }
24918}
24919impl<'db> From<AttributeListPtr<'db>> for SkippedNodePtr<'db> {
24920    fn from(value: AttributeListPtr<'db>) -> Self {
24921        Self(value.0)
24922    }
24923}
24924impl<'db> From<VisibilityPubPtr<'db>> for SkippedNodePtr<'db> {
24925    fn from(value: VisibilityPubPtr<'db>) -> Self {
24926        Self(value.0)
24927    }
24928}
24929impl<'db> From<ExprPathPtr<'db>> for SkippedNodePtr<'db> {
24930    fn from(value: ExprPathPtr<'db>) -> Self {
24931        Self(value.0)
24932    }
24933}
24934impl<'db> From<AttributeListGreen<'db>> for SkippedNodeGreen<'db> {
24935    fn from(value: AttributeListGreen<'db>) -> Self {
24936        Self(value.0)
24937    }
24938}
24939impl<'db> From<VisibilityPubGreen<'db>> for SkippedNodeGreen<'db> {
24940    fn from(value: VisibilityPubGreen<'db>) -> Self {
24941        Self(value.0)
24942    }
24943}
24944impl<'db> From<ExprPathGreen<'db>> for SkippedNodeGreen<'db> {
24945    fn from(value: ExprPathGreen<'db>) -> Self {
24946        Self(value.0)
24947    }
24948}
24949#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24950pub struct SkippedNodeGreen<'db>(pub GreenId<'db>);
24951impl<'db> TypedSyntaxNode<'db> for SkippedNode<'db> {
24952    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24953    type StablePtr = SkippedNodePtr<'db>;
24954    type Green = SkippedNodeGreen<'db>;
24955    fn missing(db: &'db dyn Database) -> Self::Green {
24956        panic!("No missing variant.");
24957    }
24958    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24959        let kind = node.kind(db);
24960        match kind {
24961            SyntaxKind::AttributeList => {
24962                SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
24963            }
24964            SyntaxKind::VisibilityPub => {
24965                SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
24966            }
24967            SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
24968            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
24969        }
24970    }
24971    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24972        let kind = node.kind(db);
24973        match kind {
24974            SyntaxKind::AttributeList => {
24975                Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
24976            }
24977            SyntaxKind::VisibilityPub => {
24978                Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
24979            }
24980            SyntaxKind::ExprPath => {
24981                Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
24982            }
24983            _ => None,
24984        }
24985    }
24986    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24987        match self {
24988            SkippedNode::AttributeList(x) => x.as_syntax_node(),
24989            SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
24990            SkippedNode::ExprPath(x) => x.as_syntax_node(),
24991        }
24992    }
24993    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24994        SkippedNodePtr(self.as_syntax_node().stable_ptr(db))
24995    }
24996}
24997impl<'db> SkippedNode<'db> {
24998    /// Checks if a kind of a variant of [SkippedNode].
24999    pub fn is_variant(kind: SyntaxKind) -> bool {
25000        matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
25001    }
25002}
25003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25004pub struct TokenIdentifier<'db> {
25005    node: SyntaxNode<'db>,
25006}
25007impl<'db> Token<'db> for TokenIdentifier<'db> {
25008    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25009        TokenIdentifierGreen(
25010            GreenNode { kind: SyntaxKind::TokenIdentifier, details: GreenNodeDetails::Token(text) }
25011                .intern(db),
25012        )
25013    }
25014    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25015        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25016    }
25017}
25018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25019pub struct TokenIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25020impl<'db> TypedStablePtr<'db> for TokenIdentifierPtr<'db> {
25021    type SyntaxNode = TokenIdentifier<'db>;
25022    fn untyped(self) -> SyntaxStablePtrId<'db> {
25023        self.0
25024    }
25025    fn lookup(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25026        TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
25027    }
25028}
25029impl<'db> From<TokenIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25030    fn from(ptr: TokenIdentifierPtr<'db>) -> Self {
25031        ptr.untyped()
25032    }
25033}
25034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25035pub struct TokenIdentifierGreen<'db>(pub GreenId<'db>);
25036impl<'db> TokenIdentifierGreen<'db> {
25037    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25038        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25039    }
25040}
25041impl<'db> TypedSyntaxNode<'db> for TokenIdentifier<'db> {
25042    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
25043    type StablePtr = TokenIdentifierPtr<'db>;
25044    type Green = TokenIdentifierGreen<'db>;
25045    fn missing(db: &'db dyn Database) -> Self::Green {
25046        TokenIdentifierGreen(
25047            GreenNode {
25048                kind: SyntaxKind::TokenMissing,
25049                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25050            }
25051            .intern(db),
25052        )
25053    }
25054    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25055        match node.green_node(db).details {
25056            GreenNodeDetails::Token(_) => Self { node },
25057            GreenNodeDetails::Node { .. } => {
25058                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
25059            }
25060        }
25061    }
25062    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25063        match node.green_node(db).details {
25064            GreenNodeDetails::Token(_) => Some(Self { node }),
25065            GreenNodeDetails::Node { .. } => None,
25066        }
25067    }
25068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25069        self.node
25070    }
25071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25072        TokenIdentifierPtr(self.node.stable_ptr(db))
25073    }
25074}
25075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25076pub struct TerminalIdentifier<'db> {
25077    node: SyntaxNode<'db>,
25078}
25079impl<'db> Terminal<'db> for TerminalIdentifier<'db> {
25080    const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
25081    type TokenType = TokenIdentifier<'db>;
25082    fn new_green(
25083        db: &'db dyn Database,
25084        leading_trivia: TriviaGreen<'db>,
25085        token: <<TerminalIdentifier<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25086        trailing_trivia: TriviaGreen<'db>,
25087    ) -> Self::Green {
25088        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25089        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25090        TerminalIdentifierGreen(
25091            GreenNode {
25092                kind: SyntaxKind::TerminalIdentifier,
25093                details: GreenNodeDetails::Node { children: children.into(), width },
25094            }
25095            .intern(db),
25096        )
25097    }
25098    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25099        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25100            unreachable!("Expected a node, not a token");
25101        };
25102        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25103    }
25104}
25105impl<'db> TerminalIdentifier<'db> {
25106    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25107        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25108    }
25109    pub fn token(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25110        TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
25111    }
25112    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25113        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25114    }
25115}
25116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25117pub struct TerminalIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25118impl<'db> TerminalIdentifierPtr<'db> {}
25119impl<'db> TypedStablePtr<'db> for TerminalIdentifierPtr<'db> {
25120    type SyntaxNode = TerminalIdentifier<'db>;
25121    fn untyped(self) -> SyntaxStablePtrId<'db> {
25122        self.0
25123    }
25124    fn lookup(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
25125        TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
25126    }
25127}
25128impl<'db> From<TerminalIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25129    fn from(ptr: TerminalIdentifierPtr<'db>) -> Self {
25130        ptr.untyped()
25131    }
25132}
25133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25134pub struct TerminalIdentifierGreen<'db>(pub GreenId<'db>);
25135impl<'db> TypedSyntaxNode<'db> for TerminalIdentifier<'db> {
25136    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
25137    type StablePtr = TerminalIdentifierPtr<'db>;
25138    type Green = TerminalIdentifierGreen<'db>;
25139    fn missing(db: &'db dyn Database) -> Self::Green {
25140        TerminalIdentifierGreen(
25141            GreenNode {
25142                kind: SyntaxKind::TerminalIdentifier,
25143                details: GreenNodeDetails::Node {
25144                    children: [
25145                        Trivia::missing(db).0,
25146                        TokenIdentifier::missing(db).0,
25147                        Trivia::missing(db).0,
25148                    ]
25149                    .into(),
25150                    width: TextWidth::default(),
25151                },
25152            }
25153            .intern(db),
25154        )
25155    }
25156    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25157        let kind = node.kind(db);
25158        assert_eq!(
25159            kind,
25160            SyntaxKind::TerminalIdentifier,
25161            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25162            kind,
25163            SyntaxKind::TerminalIdentifier
25164        );
25165        Self { node }
25166    }
25167    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25168        let kind = node.kind(db);
25169        if kind == SyntaxKind::TerminalIdentifier {
25170            Some(Self::from_syntax_node(db, node))
25171        } else {
25172            None
25173        }
25174    }
25175    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25176        self.node
25177    }
25178    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25179        TerminalIdentifierPtr(self.node.stable_ptr(db))
25180    }
25181}
25182#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25183pub struct TokenLiteralNumber<'db> {
25184    node: SyntaxNode<'db>,
25185}
25186impl<'db> Token<'db> for TokenLiteralNumber<'db> {
25187    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25188        TokenLiteralNumberGreen(
25189            GreenNode {
25190                kind: SyntaxKind::TokenLiteralNumber,
25191                details: GreenNodeDetails::Token(text),
25192            }
25193            .intern(db),
25194        )
25195    }
25196    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25197        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25198    }
25199}
25200#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25201pub struct TokenLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25202impl<'db> TypedStablePtr<'db> for TokenLiteralNumberPtr<'db> {
25203    type SyntaxNode = TokenLiteralNumber<'db>;
25204    fn untyped(self) -> SyntaxStablePtrId<'db> {
25205        self.0
25206    }
25207    fn lookup(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25208        TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25209    }
25210}
25211impl<'db> From<TokenLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25212    fn from(ptr: TokenLiteralNumberPtr<'db>) -> Self {
25213        ptr.untyped()
25214    }
25215}
25216#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25217pub struct TokenLiteralNumberGreen<'db>(pub GreenId<'db>);
25218impl<'db> TokenLiteralNumberGreen<'db> {
25219    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25220        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25221    }
25222}
25223impl<'db> TypedSyntaxNode<'db> for TokenLiteralNumber<'db> {
25224    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
25225    type StablePtr = TokenLiteralNumberPtr<'db>;
25226    type Green = TokenLiteralNumberGreen<'db>;
25227    fn missing(db: &'db dyn Database) -> Self::Green {
25228        TokenLiteralNumberGreen(
25229            GreenNode {
25230                kind: SyntaxKind::TokenMissing,
25231                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25232            }
25233            .intern(db),
25234        )
25235    }
25236    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25237        match node.green_node(db).details {
25238            GreenNodeDetails::Token(_) => Self { node },
25239            GreenNodeDetails::Node { .. } => panic!(
25240                "Expected a token {:?}, not an internal node",
25241                SyntaxKind::TokenLiteralNumber
25242            ),
25243        }
25244    }
25245    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25246        match node.green_node(db).details {
25247            GreenNodeDetails::Token(_) => Some(Self { node }),
25248            GreenNodeDetails::Node { .. } => None,
25249        }
25250    }
25251    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25252        self.node
25253    }
25254    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25255        TokenLiteralNumberPtr(self.node.stable_ptr(db))
25256    }
25257}
25258#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25259pub struct TerminalLiteralNumber<'db> {
25260    node: SyntaxNode<'db>,
25261}
25262impl<'db> Terminal<'db> for TerminalLiteralNumber<'db> {
25263    const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25264    type TokenType = TokenLiteralNumber<'db>;
25265    fn new_green(
25266        db: &'db dyn Database,
25267        leading_trivia: TriviaGreen<'db>,
25268        token: <<TerminalLiteralNumber<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25269        trailing_trivia: TriviaGreen<'db>,
25270    ) -> Self::Green {
25271        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25272        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25273        TerminalLiteralNumberGreen(
25274            GreenNode {
25275                kind: SyntaxKind::TerminalLiteralNumber,
25276                details: GreenNodeDetails::Node { children: children.into(), width },
25277            }
25278            .intern(db),
25279        )
25280    }
25281    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25282        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25283            unreachable!("Expected a node, not a token");
25284        };
25285        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25286    }
25287}
25288impl<'db> TerminalLiteralNumber<'db> {
25289    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25290        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25291    }
25292    pub fn token(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25293        TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25294    }
25295    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25296        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25297    }
25298}
25299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25300pub struct TerminalLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25301impl<'db> TerminalLiteralNumberPtr<'db> {}
25302impl<'db> TypedStablePtr<'db> for TerminalLiteralNumberPtr<'db> {
25303    type SyntaxNode = TerminalLiteralNumber<'db>;
25304    fn untyped(self) -> SyntaxStablePtrId<'db> {
25305        self.0
25306    }
25307    fn lookup(&self, db: &'db dyn Database) -> TerminalLiteralNumber<'db> {
25308        TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25309    }
25310}
25311impl<'db> From<TerminalLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25312    fn from(ptr: TerminalLiteralNumberPtr<'db>) -> Self {
25313        ptr.untyped()
25314    }
25315}
25316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25317pub struct TerminalLiteralNumberGreen<'db>(pub GreenId<'db>);
25318impl<'db> TypedSyntaxNode<'db> for TerminalLiteralNumber<'db> {
25319    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25320    type StablePtr = TerminalLiteralNumberPtr<'db>;
25321    type Green = TerminalLiteralNumberGreen<'db>;
25322    fn missing(db: &'db dyn Database) -> Self::Green {
25323        TerminalLiteralNumberGreen(
25324            GreenNode {
25325                kind: SyntaxKind::TerminalLiteralNumber,
25326                details: GreenNodeDetails::Node {
25327                    children: [
25328                        Trivia::missing(db).0,
25329                        TokenLiteralNumber::missing(db).0,
25330                        Trivia::missing(db).0,
25331                    ]
25332                    .into(),
25333                    width: TextWidth::default(),
25334                },
25335            }
25336            .intern(db),
25337        )
25338    }
25339    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25340        let kind = node.kind(db);
25341        assert_eq!(
25342            kind,
25343            SyntaxKind::TerminalLiteralNumber,
25344            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25345            kind,
25346            SyntaxKind::TerminalLiteralNumber
25347        );
25348        Self { node }
25349    }
25350    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25351        let kind = node.kind(db);
25352        if kind == SyntaxKind::TerminalLiteralNumber {
25353            Some(Self::from_syntax_node(db, node))
25354        } else {
25355            None
25356        }
25357    }
25358    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25359        self.node
25360    }
25361    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25362        TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25363    }
25364}
25365#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25366pub struct TokenShortString<'db> {
25367    node: SyntaxNode<'db>,
25368}
25369impl<'db> Token<'db> for TokenShortString<'db> {
25370    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25371        TokenShortStringGreen(
25372            GreenNode {
25373                kind: SyntaxKind::TokenShortString,
25374                details: GreenNodeDetails::Token(text),
25375            }
25376            .intern(db),
25377        )
25378    }
25379    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25380        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25381    }
25382}
25383#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25384pub struct TokenShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25385impl<'db> TypedStablePtr<'db> for TokenShortStringPtr<'db> {
25386    type SyntaxNode = TokenShortString<'db>;
25387    fn untyped(self) -> SyntaxStablePtrId<'db> {
25388        self.0
25389    }
25390    fn lookup(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25391        TokenShortString::from_syntax_node(db, self.0.lookup(db))
25392    }
25393}
25394impl<'db> From<TokenShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25395    fn from(ptr: TokenShortStringPtr<'db>) -> Self {
25396        ptr.untyped()
25397    }
25398}
25399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25400pub struct TokenShortStringGreen<'db>(pub GreenId<'db>);
25401impl<'db> TokenShortStringGreen<'db> {
25402    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25403        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25404    }
25405}
25406impl<'db> TypedSyntaxNode<'db> for TokenShortString<'db> {
25407    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25408    type StablePtr = TokenShortStringPtr<'db>;
25409    type Green = TokenShortStringGreen<'db>;
25410    fn missing(db: &'db dyn Database) -> Self::Green {
25411        TokenShortStringGreen(
25412            GreenNode {
25413                kind: SyntaxKind::TokenMissing,
25414                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25415            }
25416            .intern(db),
25417        )
25418    }
25419    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25420        match node.green_node(db).details {
25421            GreenNodeDetails::Token(_) => Self { node },
25422            GreenNodeDetails::Node { .. } => {
25423                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25424            }
25425        }
25426    }
25427    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25428        match node.green_node(db).details {
25429            GreenNodeDetails::Token(_) => Some(Self { node }),
25430            GreenNodeDetails::Node { .. } => None,
25431        }
25432    }
25433    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25434        self.node
25435    }
25436    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25437        TokenShortStringPtr(self.node.stable_ptr(db))
25438    }
25439}
25440#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25441pub struct TerminalShortString<'db> {
25442    node: SyntaxNode<'db>,
25443}
25444impl<'db> Terminal<'db> for TerminalShortString<'db> {
25445    const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25446    type TokenType = TokenShortString<'db>;
25447    fn new_green(
25448        db: &'db dyn Database,
25449        leading_trivia: TriviaGreen<'db>,
25450        token: <<TerminalShortString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25451        trailing_trivia: TriviaGreen<'db>,
25452    ) -> Self::Green {
25453        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25454        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25455        TerminalShortStringGreen(
25456            GreenNode {
25457                kind: SyntaxKind::TerminalShortString,
25458                details: GreenNodeDetails::Node { children: children.into(), width },
25459            }
25460            .intern(db),
25461        )
25462    }
25463    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25464        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25465            unreachable!("Expected a node, not a token");
25466        };
25467        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25468    }
25469}
25470impl<'db> TerminalShortString<'db> {
25471    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25472        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25473    }
25474    pub fn token(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25475        TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25476    }
25477    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25478        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25479    }
25480}
25481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25482pub struct TerminalShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25483impl<'db> TerminalShortStringPtr<'db> {}
25484impl<'db> TypedStablePtr<'db> for TerminalShortStringPtr<'db> {
25485    type SyntaxNode = TerminalShortString<'db>;
25486    fn untyped(self) -> SyntaxStablePtrId<'db> {
25487        self.0
25488    }
25489    fn lookup(&self, db: &'db dyn Database) -> TerminalShortString<'db> {
25490        TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25491    }
25492}
25493impl<'db> From<TerminalShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25494    fn from(ptr: TerminalShortStringPtr<'db>) -> Self {
25495        ptr.untyped()
25496    }
25497}
25498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25499pub struct TerminalShortStringGreen<'db>(pub GreenId<'db>);
25500impl<'db> TypedSyntaxNode<'db> for TerminalShortString<'db> {
25501    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25502    type StablePtr = TerminalShortStringPtr<'db>;
25503    type Green = TerminalShortStringGreen<'db>;
25504    fn missing(db: &'db dyn Database) -> Self::Green {
25505        TerminalShortStringGreen(
25506            GreenNode {
25507                kind: SyntaxKind::TerminalShortString,
25508                details: GreenNodeDetails::Node {
25509                    children: [
25510                        Trivia::missing(db).0,
25511                        TokenShortString::missing(db).0,
25512                        Trivia::missing(db).0,
25513                    ]
25514                    .into(),
25515                    width: TextWidth::default(),
25516                },
25517            }
25518            .intern(db),
25519        )
25520    }
25521    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25522        let kind = node.kind(db);
25523        assert_eq!(
25524            kind,
25525            SyntaxKind::TerminalShortString,
25526            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25527            kind,
25528            SyntaxKind::TerminalShortString
25529        );
25530        Self { node }
25531    }
25532    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25533        let kind = node.kind(db);
25534        if kind == SyntaxKind::TerminalShortString {
25535            Some(Self::from_syntax_node(db, node))
25536        } else {
25537            None
25538        }
25539    }
25540    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25541        self.node
25542    }
25543    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25544        TerminalShortStringPtr(self.node.stable_ptr(db))
25545    }
25546}
25547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25548pub struct TokenString<'db> {
25549    node: SyntaxNode<'db>,
25550}
25551impl<'db> Token<'db> for TokenString<'db> {
25552    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25553        TokenStringGreen(
25554            GreenNode { kind: SyntaxKind::TokenString, details: GreenNodeDetails::Token(text) }
25555                .intern(db),
25556        )
25557    }
25558    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25559        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25560    }
25561}
25562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25563pub struct TokenStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25564impl<'db> TypedStablePtr<'db> for TokenStringPtr<'db> {
25565    type SyntaxNode = TokenString<'db>;
25566    fn untyped(self) -> SyntaxStablePtrId<'db> {
25567        self.0
25568    }
25569    fn lookup(&self, db: &'db dyn Database) -> TokenString<'db> {
25570        TokenString::from_syntax_node(db, self.0.lookup(db))
25571    }
25572}
25573impl<'db> From<TokenStringPtr<'db>> for SyntaxStablePtrId<'db> {
25574    fn from(ptr: TokenStringPtr<'db>) -> Self {
25575        ptr.untyped()
25576    }
25577}
25578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25579pub struct TokenStringGreen<'db>(pub GreenId<'db>);
25580impl<'db> TokenStringGreen<'db> {
25581    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25582        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25583    }
25584}
25585impl<'db> TypedSyntaxNode<'db> for TokenString<'db> {
25586    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25587    type StablePtr = TokenStringPtr<'db>;
25588    type Green = TokenStringGreen<'db>;
25589    fn missing(db: &'db dyn Database) -> Self::Green {
25590        TokenStringGreen(
25591            GreenNode {
25592                kind: SyntaxKind::TokenMissing,
25593                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25594            }
25595            .intern(db),
25596        )
25597    }
25598    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25599        match node.green_node(db).details {
25600            GreenNodeDetails::Token(_) => Self { node },
25601            GreenNodeDetails::Node { .. } => {
25602                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25603            }
25604        }
25605    }
25606    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25607        match node.green_node(db).details {
25608            GreenNodeDetails::Token(_) => Some(Self { node }),
25609            GreenNodeDetails::Node { .. } => None,
25610        }
25611    }
25612    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25613        self.node
25614    }
25615    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25616        TokenStringPtr(self.node.stable_ptr(db))
25617    }
25618}
25619#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25620pub struct TerminalString<'db> {
25621    node: SyntaxNode<'db>,
25622}
25623impl<'db> Terminal<'db> for TerminalString<'db> {
25624    const KIND: SyntaxKind = SyntaxKind::TerminalString;
25625    type TokenType = TokenString<'db>;
25626    fn new_green(
25627        db: &'db dyn Database,
25628        leading_trivia: TriviaGreen<'db>,
25629        token: <<TerminalString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25630        trailing_trivia: TriviaGreen<'db>,
25631    ) -> Self::Green {
25632        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25633        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25634        TerminalStringGreen(
25635            GreenNode {
25636                kind: SyntaxKind::TerminalString,
25637                details: GreenNodeDetails::Node { children: children.into(), width },
25638            }
25639            .intern(db),
25640        )
25641    }
25642    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25643        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25644            unreachable!("Expected a node, not a token");
25645        };
25646        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25647    }
25648}
25649impl<'db> TerminalString<'db> {
25650    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25651        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25652    }
25653    pub fn token(&self, db: &'db dyn Database) -> TokenString<'db> {
25654        TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25655    }
25656    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25657        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25658    }
25659}
25660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25661pub struct TerminalStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25662impl<'db> TerminalStringPtr<'db> {}
25663impl<'db> TypedStablePtr<'db> for TerminalStringPtr<'db> {
25664    type SyntaxNode = TerminalString<'db>;
25665    fn untyped(self) -> SyntaxStablePtrId<'db> {
25666        self.0
25667    }
25668    fn lookup(&self, db: &'db dyn Database) -> TerminalString<'db> {
25669        TerminalString::from_syntax_node(db, self.0.lookup(db))
25670    }
25671}
25672impl<'db> From<TerminalStringPtr<'db>> for SyntaxStablePtrId<'db> {
25673    fn from(ptr: TerminalStringPtr<'db>) -> Self {
25674        ptr.untyped()
25675    }
25676}
25677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25678pub struct TerminalStringGreen<'db>(pub GreenId<'db>);
25679impl<'db> TypedSyntaxNode<'db> for TerminalString<'db> {
25680    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25681    type StablePtr = TerminalStringPtr<'db>;
25682    type Green = TerminalStringGreen<'db>;
25683    fn missing(db: &'db dyn Database) -> Self::Green {
25684        TerminalStringGreen(
25685            GreenNode {
25686                kind: SyntaxKind::TerminalString,
25687                details: GreenNodeDetails::Node {
25688                    children: [
25689                        Trivia::missing(db).0,
25690                        TokenString::missing(db).0,
25691                        Trivia::missing(db).0,
25692                    ]
25693                    .into(),
25694                    width: TextWidth::default(),
25695                },
25696            }
25697            .intern(db),
25698        )
25699    }
25700    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25701        let kind = node.kind(db);
25702        assert_eq!(
25703            kind,
25704            SyntaxKind::TerminalString,
25705            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25706            kind,
25707            SyntaxKind::TerminalString
25708        );
25709        Self { node }
25710    }
25711    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25712        let kind = node.kind(db);
25713        if kind == SyntaxKind::TerminalString {
25714            Some(Self::from_syntax_node(db, node))
25715        } else {
25716            None
25717        }
25718    }
25719    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25720        self.node
25721    }
25722    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25723        TerminalStringPtr(self.node.stable_ptr(db))
25724    }
25725}
25726#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25727pub struct TokenAs<'db> {
25728    node: SyntaxNode<'db>,
25729}
25730impl<'db> Token<'db> for TokenAs<'db> {
25731    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25732        TokenAsGreen(
25733            GreenNode { kind: SyntaxKind::TokenAs, details: GreenNodeDetails::Token(text) }
25734                .intern(db),
25735        )
25736    }
25737    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25738        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25739    }
25740}
25741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25742pub struct TokenAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25743impl<'db> TypedStablePtr<'db> for TokenAsPtr<'db> {
25744    type SyntaxNode = TokenAs<'db>;
25745    fn untyped(self) -> SyntaxStablePtrId<'db> {
25746        self.0
25747    }
25748    fn lookup(&self, db: &'db dyn Database) -> TokenAs<'db> {
25749        TokenAs::from_syntax_node(db, self.0.lookup(db))
25750    }
25751}
25752impl<'db> From<TokenAsPtr<'db>> for SyntaxStablePtrId<'db> {
25753    fn from(ptr: TokenAsPtr<'db>) -> Self {
25754        ptr.untyped()
25755    }
25756}
25757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25758pub struct TokenAsGreen<'db>(pub GreenId<'db>);
25759impl<'db> TokenAsGreen<'db> {
25760    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25761        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25762    }
25763}
25764impl<'db> TypedSyntaxNode<'db> for TokenAs<'db> {
25765    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25766    type StablePtr = TokenAsPtr<'db>;
25767    type Green = TokenAsGreen<'db>;
25768    fn missing(db: &'db dyn Database) -> Self::Green {
25769        TokenAsGreen(
25770            GreenNode {
25771                kind: SyntaxKind::TokenMissing,
25772                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25773            }
25774            .intern(db),
25775        )
25776    }
25777    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25778        match node.green_node(db).details {
25779            GreenNodeDetails::Token(_) => Self { node },
25780            GreenNodeDetails::Node { .. } => {
25781                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25782            }
25783        }
25784    }
25785    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25786        match node.green_node(db).details {
25787            GreenNodeDetails::Token(_) => Some(Self { node }),
25788            GreenNodeDetails::Node { .. } => None,
25789        }
25790    }
25791    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25792        self.node
25793    }
25794    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25795        TokenAsPtr(self.node.stable_ptr(db))
25796    }
25797}
25798#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25799pub struct TerminalAs<'db> {
25800    node: SyntaxNode<'db>,
25801}
25802impl<'db> Terminal<'db> for TerminalAs<'db> {
25803    const KIND: SyntaxKind = SyntaxKind::TerminalAs;
25804    type TokenType = TokenAs<'db>;
25805    fn new_green(
25806        db: &'db dyn Database,
25807        leading_trivia: TriviaGreen<'db>,
25808        token: <<TerminalAs<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25809        trailing_trivia: TriviaGreen<'db>,
25810    ) -> Self::Green {
25811        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25812        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25813        TerminalAsGreen(
25814            GreenNode {
25815                kind: SyntaxKind::TerminalAs,
25816                details: GreenNodeDetails::Node { children: children.into(), width },
25817            }
25818            .intern(db),
25819        )
25820    }
25821    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25822        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25823            unreachable!("Expected a node, not a token");
25824        };
25825        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25826    }
25827}
25828impl<'db> TerminalAs<'db> {
25829    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25830        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25831    }
25832    pub fn token(&self, db: &'db dyn Database) -> TokenAs<'db> {
25833        TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
25834    }
25835    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25836        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25837    }
25838}
25839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25840pub struct TerminalAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25841impl<'db> TerminalAsPtr<'db> {}
25842impl<'db> TypedStablePtr<'db> for TerminalAsPtr<'db> {
25843    type SyntaxNode = TerminalAs<'db>;
25844    fn untyped(self) -> SyntaxStablePtrId<'db> {
25845        self.0
25846    }
25847    fn lookup(&self, db: &'db dyn Database) -> TerminalAs<'db> {
25848        TerminalAs::from_syntax_node(db, self.0.lookup(db))
25849    }
25850}
25851impl<'db> From<TerminalAsPtr<'db>> for SyntaxStablePtrId<'db> {
25852    fn from(ptr: TerminalAsPtr<'db>) -> Self {
25853        ptr.untyped()
25854    }
25855}
25856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25857pub struct TerminalAsGreen<'db>(pub GreenId<'db>);
25858impl<'db> TypedSyntaxNode<'db> for TerminalAs<'db> {
25859    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
25860    type StablePtr = TerminalAsPtr<'db>;
25861    type Green = TerminalAsGreen<'db>;
25862    fn missing(db: &'db dyn Database) -> Self::Green {
25863        TerminalAsGreen(
25864            GreenNode {
25865                kind: SyntaxKind::TerminalAs,
25866                details: GreenNodeDetails::Node {
25867                    children: [
25868                        Trivia::missing(db).0,
25869                        TokenAs::missing(db).0,
25870                        Trivia::missing(db).0,
25871                    ]
25872                    .into(),
25873                    width: TextWidth::default(),
25874                },
25875            }
25876            .intern(db),
25877        )
25878    }
25879    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25880        let kind = node.kind(db);
25881        assert_eq!(
25882            kind,
25883            SyntaxKind::TerminalAs,
25884            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25885            kind,
25886            SyntaxKind::TerminalAs
25887        );
25888        Self { node }
25889    }
25890    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25891        let kind = node.kind(db);
25892        if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
25893    }
25894    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25895        self.node
25896    }
25897    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25898        TerminalAsPtr(self.node.stable_ptr(db))
25899    }
25900}
25901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25902pub struct TokenConst<'db> {
25903    node: SyntaxNode<'db>,
25904}
25905impl<'db> Token<'db> for TokenConst<'db> {
25906    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25907        TokenConstGreen(
25908            GreenNode { kind: SyntaxKind::TokenConst, details: GreenNodeDetails::Token(text) }
25909                .intern(db),
25910        )
25911    }
25912    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25913        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25914    }
25915}
25916#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25917pub struct TokenConstPtr<'db>(pub SyntaxStablePtrId<'db>);
25918impl<'db> TypedStablePtr<'db> for TokenConstPtr<'db> {
25919    type SyntaxNode = TokenConst<'db>;
25920    fn untyped(self) -> SyntaxStablePtrId<'db> {
25921        self.0
25922    }
25923    fn lookup(&self, db: &'db dyn Database) -> TokenConst<'db> {
25924        TokenConst::from_syntax_node(db, self.0.lookup(db))
25925    }
25926}
25927impl<'db> From<TokenConstPtr<'db>> for SyntaxStablePtrId<'db> {
25928    fn from(ptr: TokenConstPtr<'db>) -> Self {
25929        ptr.untyped()
25930    }
25931}
25932#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25933pub struct TokenConstGreen<'db>(pub GreenId<'db>);
25934impl<'db> TokenConstGreen<'db> {
25935    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25936        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25937    }
25938}
25939impl<'db> TypedSyntaxNode<'db> for TokenConst<'db> {
25940    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
25941    type StablePtr = TokenConstPtr<'db>;
25942    type Green = TokenConstGreen<'db>;
25943    fn missing(db: &'db dyn Database) -> Self::Green {
25944        TokenConstGreen(
25945            GreenNode {
25946                kind: SyntaxKind::TokenMissing,
25947                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25948            }
25949            .intern(db),
25950        )
25951    }
25952    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25953        match node.green_node(db).details {
25954            GreenNodeDetails::Token(_) => Self { node },
25955            GreenNodeDetails::Node { .. } => {
25956                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
25957            }
25958        }
25959    }
25960    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25961        match node.green_node(db).details {
25962            GreenNodeDetails::Token(_) => Some(Self { node }),
25963            GreenNodeDetails::Node { .. } => None,
25964        }
25965    }
25966    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25967        self.node
25968    }
25969    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25970        TokenConstPtr(self.node.stable_ptr(db))
25971    }
25972}
25973#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25974pub struct TerminalConst<'db> {
25975    node: SyntaxNode<'db>,
25976}
25977impl<'db> Terminal<'db> for TerminalConst<'db> {
25978    const KIND: SyntaxKind = SyntaxKind::TerminalConst;
25979    type TokenType = TokenConst<'db>;
25980    fn new_green(
25981        db: &'db dyn Database,
25982        leading_trivia: TriviaGreen<'db>,
25983        token: <<TerminalConst<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25984        trailing_trivia: TriviaGreen<'db>,
25985    ) -> Self::Green {
25986        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25987        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25988        TerminalConstGreen(
25989            GreenNode {
25990                kind: SyntaxKind::TerminalConst,
25991                details: GreenNodeDetails::Node { children: children.into(), width },
25992            }
25993            .intern(db),
25994        )
25995    }
25996    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25997        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25998            unreachable!("Expected a node, not a token");
25999        };
26000        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26001    }
26002}
26003impl<'db> TerminalConst<'db> {
26004    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26005        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26006    }
26007    pub fn token(&self, db: &'db dyn Database) -> TokenConst<'db> {
26008        TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
26009    }
26010    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26011        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26012    }
26013}
26014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26015pub struct TerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
26016impl<'db> TerminalConstPtr<'db> {}
26017impl<'db> TypedStablePtr<'db> for TerminalConstPtr<'db> {
26018    type SyntaxNode = TerminalConst<'db>;
26019    fn untyped(self) -> SyntaxStablePtrId<'db> {
26020        self.0
26021    }
26022    fn lookup(&self, db: &'db dyn Database) -> TerminalConst<'db> {
26023        TerminalConst::from_syntax_node(db, self.0.lookup(db))
26024    }
26025}
26026impl<'db> From<TerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
26027    fn from(ptr: TerminalConstPtr<'db>) -> Self {
26028        ptr.untyped()
26029    }
26030}
26031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26032pub struct TerminalConstGreen<'db>(pub GreenId<'db>);
26033impl<'db> TypedSyntaxNode<'db> for TerminalConst<'db> {
26034    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
26035    type StablePtr = TerminalConstPtr<'db>;
26036    type Green = TerminalConstGreen<'db>;
26037    fn missing(db: &'db dyn Database) -> Self::Green {
26038        TerminalConstGreen(
26039            GreenNode {
26040                kind: SyntaxKind::TerminalConst,
26041                details: GreenNodeDetails::Node {
26042                    children: [
26043                        Trivia::missing(db).0,
26044                        TokenConst::missing(db).0,
26045                        Trivia::missing(db).0,
26046                    ]
26047                    .into(),
26048                    width: TextWidth::default(),
26049                },
26050            }
26051            .intern(db),
26052        )
26053    }
26054    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26055        let kind = node.kind(db);
26056        assert_eq!(
26057            kind,
26058            SyntaxKind::TerminalConst,
26059            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26060            kind,
26061            SyntaxKind::TerminalConst
26062        );
26063        Self { node }
26064    }
26065    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26066        let kind = node.kind(db);
26067        if kind == SyntaxKind::TerminalConst {
26068            Some(Self::from_syntax_node(db, node))
26069        } else {
26070            None
26071        }
26072    }
26073    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26074        self.node
26075    }
26076    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26077        TerminalConstPtr(self.node.stable_ptr(db))
26078    }
26079}
26080#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26081pub struct TokenElse<'db> {
26082    node: SyntaxNode<'db>,
26083}
26084impl<'db> Token<'db> for TokenElse<'db> {
26085    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26086        TokenElseGreen(
26087            GreenNode { kind: SyntaxKind::TokenElse, details: GreenNodeDetails::Token(text) }
26088                .intern(db),
26089        )
26090    }
26091    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26092        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26093    }
26094}
26095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26096pub struct TokenElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26097impl<'db> TypedStablePtr<'db> for TokenElsePtr<'db> {
26098    type SyntaxNode = TokenElse<'db>;
26099    fn untyped(self) -> SyntaxStablePtrId<'db> {
26100        self.0
26101    }
26102    fn lookup(&self, db: &'db dyn Database) -> TokenElse<'db> {
26103        TokenElse::from_syntax_node(db, self.0.lookup(db))
26104    }
26105}
26106impl<'db> From<TokenElsePtr<'db>> for SyntaxStablePtrId<'db> {
26107    fn from(ptr: TokenElsePtr<'db>) -> Self {
26108        ptr.untyped()
26109    }
26110}
26111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26112pub struct TokenElseGreen<'db>(pub GreenId<'db>);
26113impl<'db> TokenElseGreen<'db> {
26114    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26115        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26116    }
26117}
26118impl<'db> TypedSyntaxNode<'db> for TokenElse<'db> {
26119    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
26120    type StablePtr = TokenElsePtr<'db>;
26121    type Green = TokenElseGreen<'db>;
26122    fn missing(db: &'db dyn Database) -> Self::Green {
26123        TokenElseGreen(
26124            GreenNode {
26125                kind: SyntaxKind::TokenMissing,
26126                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26127            }
26128            .intern(db),
26129        )
26130    }
26131    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26132        match node.green_node(db).details {
26133            GreenNodeDetails::Token(_) => Self { node },
26134            GreenNodeDetails::Node { .. } => {
26135                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
26136            }
26137        }
26138    }
26139    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26140        match node.green_node(db).details {
26141            GreenNodeDetails::Token(_) => Some(Self { node }),
26142            GreenNodeDetails::Node { .. } => None,
26143        }
26144    }
26145    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26146        self.node
26147    }
26148    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26149        TokenElsePtr(self.node.stable_ptr(db))
26150    }
26151}
26152#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26153pub struct TerminalElse<'db> {
26154    node: SyntaxNode<'db>,
26155}
26156impl<'db> Terminal<'db> for TerminalElse<'db> {
26157    const KIND: SyntaxKind = SyntaxKind::TerminalElse;
26158    type TokenType = TokenElse<'db>;
26159    fn new_green(
26160        db: &'db dyn Database,
26161        leading_trivia: TriviaGreen<'db>,
26162        token: <<TerminalElse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26163        trailing_trivia: TriviaGreen<'db>,
26164    ) -> Self::Green {
26165        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26166        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26167        TerminalElseGreen(
26168            GreenNode {
26169                kind: SyntaxKind::TerminalElse,
26170                details: GreenNodeDetails::Node { children: children.into(), width },
26171            }
26172            .intern(db),
26173        )
26174    }
26175    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26176        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26177            unreachable!("Expected a node, not a token");
26178        };
26179        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26180    }
26181}
26182impl<'db> TerminalElse<'db> {
26183    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26184        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26185    }
26186    pub fn token(&self, db: &'db dyn Database) -> TokenElse<'db> {
26187        TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
26188    }
26189    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26190        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26191    }
26192}
26193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26194pub struct TerminalElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26195impl<'db> TerminalElsePtr<'db> {}
26196impl<'db> TypedStablePtr<'db> for TerminalElsePtr<'db> {
26197    type SyntaxNode = TerminalElse<'db>;
26198    fn untyped(self) -> SyntaxStablePtrId<'db> {
26199        self.0
26200    }
26201    fn lookup(&self, db: &'db dyn Database) -> TerminalElse<'db> {
26202        TerminalElse::from_syntax_node(db, self.0.lookup(db))
26203    }
26204}
26205impl<'db> From<TerminalElsePtr<'db>> for SyntaxStablePtrId<'db> {
26206    fn from(ptr: TerminalElsePtr<'db>) -> Self {
26207        ptr.untyped()
26208    }
26209}
26210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26211pub struct TerminalElseGreen<'db>(pub GreenId<'db>);
26212impl<'db> TypedSyntaxNode<'db> for TerminalElse<'db> {
26213    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
26214    type StablePtr = TerminalElsePtr<'db>;
26215    type Green = TerminalElseGreen<'db>;
26216    fn missing(db: &'db dyn Database) -> Self::Green {
26217        TerminalElseGreen(
26218            GreenNode {
26219                kind: SyntaxKind::TerminalElse,
26220                details: GreenNodeDetails::Node {
26221                    children: [
26222                        Trivia::missing(db).0,
26223                        TokenElse::missing(db).0,
26224                        Trivia::missing(db).0,
26225                    ]
26226                    .into(),
26227                    width: TextWidth::default(),
26228                },
26229            }
26230            .intern(db),
26231        )
26232    }
26233    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26234        let kind = node.kind(db);
26235        assert_eq!(
26236            kind,
26237            SyntaxKind::TerminalElse,
26238            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26239            kind,
26240            SyntaxKind::TerminalElse
26241        );
26242        Self { node }
26243    }
26244    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26245        let kind = node.kind(db);
26246        if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
26247    }
26248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26249        self.node
26250    }
26251    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26252        TerminalElsePtr(self.node.stable_ptr(db))
26253    }
26254}
26255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26256pub struct TokenEnum<'db> {
26257    node: SyntaxNode<'db>,
26258}
26259impl<'db> Token<'db> for TokenEnum<'db> {
26260    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26261        TokenEnumGreen(
26262            GreenNode { kind: SyntaxKind::TokenEnum, details: GreenNodeDetails::Token(text) }
26263                .intern(db),
26264        )
26265    }
26266    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26267        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26268    }
26269}
26270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26271pub struct TokenEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26272impl<'db> TypedStablePtr<'db> for TokenEnumPtr<'db> {
26273    type SyntaxNode = TokenEnum<'db>;
26274    fn untyped(self) -> SyntaxStablePtrId<'db> {
26275        self.0
26276    }
26277    fn lookup(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26278        TokenEnum::from_syntax_node(db, self.0.lookup(db))
26279    }
26280}
26281impl<'db> From<TokenEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26282    fn from(ptr: TokenEnumPtr<'db>) -> Self {
26283        ptr.untyped()
26284    }
26285}
26286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26287pub struct TokenEnumGreen<'db>(pub GreenId<'db>);
26288impl<'db> TokenEnumGreen<'db> {
26289    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26290        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26291    }
26292}
26293impl<'db> TypedSyntaxNode<'db> for TokenEnum<'db> {
26294    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26295    type StablePtr = TokenEnumPtr<'db>;
26296    type Green = TokenEnumGreen<'db>;
26297    fn missing(db: &'db dyn Database) -> Self::Green {
26298        TokenEnumGreen(
26299            GreenNode {
26300                kind: SyntaxKind::TokenMissing,
26301                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26302            }
26303            .intern(db),
26304        )
26305    }
26306    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26307        match node.green_node(db).details {
26308            GreenNodeDetails::Token(_) => Self { node },
26309            GreenNodeDetails::Node { .. } => {
26310                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26311            }
26312        }
26313    }
26314    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26315        match node.green_node(db).details {
26316            GreenNodeDetails::Token(_) => Some(Self { node }),
26317            GreenNodeDetails::Node { .. } => None,
26318        }
26319    }
26320    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26321        self.node
26322    }
26323    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26324        TokenEnumPtr(self.node.stable_ptr(db))
26325    }
26326}
26327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26328pub struct TerminalEnum<'db> {
26329    node: SyntaxNode<'db>,
26330}
26331impl<'db> Terminal<'db> for TerminalEnum<'db> {
26332    const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26333    type TokenType = TokenEnum<'db>;
26334    fn new_green(
26335        db: &'db dyn Database,
26336        leading_trivia: TriviaGreen<'db>,
26337        token: <<TerminalEnum<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26338        trailing_trivia: TriviaGreen<'db>,
26339    ) -> Self::Green {
26340        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26341        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26342        TerminalEnumGreen(
26343            GreenNode {
26344                kind: SyntaxKind::TerminalEnum,
26345                details: GreenNodeDetails::Node { children: children.into(), width },
26346            }
26347            .intern(db),
26348        )
26349    }
26350    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26351        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26352            unreachable!("Expected a node, not a token");
26353        };
26354        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26355    }
26356}
26357impl<'db> TerminalEnum<'db> {
26358    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26359        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26360    }
26361    pub fn token(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26362        TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26363    }
26364    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26365        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26366    }
26367}
26368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26369pub struct TerminalEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26370impl<'db> TerminalEnumPtr<'db> {}
26371impl<'db> TypedStablePtr<'db> for TerminalEnumPtr<'db> {
26372    type SyntaxNode = TerminalEnum<'db>;
26373    fn untyped(self) -> SyntaxStablePtrId<'db> {
26374        self.0
26375    }
26376    fn lookup(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
26377        TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26378    }
26379}
26380impl<'db> From<TerminalEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26381    fn from(ptr: TerminalEnumPtr<'db>) -> Self {
26382        ptr.untyped()
26383    }
26384}
26385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26386pub struct TerminalEnumGreen<'db>(pub GreenId<'db>);
26387impl<'db> TypedSyntaxNode<'db> for TerminalEnum<'db> {
26388    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26389    type StablePtr = TerminalEnumPtr<'db>;
26390    type Green = TerminalEnumGreen<'db>;
26391    fn missing(db: &'db dyn Database) -> Self::Green {
26392        TerminalEnumGreen(
26393            GreenNode {
26394                kind: SyntaxKind::TerminalEnum,
26395                details: GreenNodeDetails::Node {
26396                    children: [
26397                        Trivia::missing(db).0,
26398                        TokenEnum::missing(db).0,
26399                        Trivia::missing(db).0,
26400                    ]
26401                    .into(),
26402                    width: TextWidth::default(),
26403                },
26404            }
26405            .intern(db),
26406        )
26407    }
26408    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26409        let kind = node.kind(db);
26410        assert_eq!(
26411            kind,
26412            SyntaxKind::TerminalEnum,
26413            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26414            kind,
26415            SyntaxKind::TerminalEnum
26416        );
26417        Self { node }
26418    }
26419    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26420        let kind = node.kind(db);
26421        if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26422    }
26423    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26424        self.node
26425    }
26426    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26427        TerminalEnumPtr(self.node.stable_ptr(db))
26428    }
26429}
26430#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26431pub struct TokenExtern<'db> {
26432    node: SyntaxNode<'db>,
26433}
26434impl<'db> Token<'db> for TokenExtern<'db> {
26435    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26436        TokenExternGreen(
26437            GreenNode { kind: SyntaxKind::TokenExtern, details: GreenNodeDetails::Token(text) }
26438                .intern(db),
26439        )
26440    }
26441    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26442        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26443    }
26444}
26445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26446pub struct TokenExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26447impl<'db> TypedStablePtr<'db> for TokenExternPtr<'db> {
26448    type SyntaxNode = TokenExtern<'db>;
26449    fn untyped(self) -> SyntaxStablePtrId<'db> {
26450        self.0
26451    }
26452    fn lookup(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26453        TokenExtern::from_syntax_node(db, self.0.lookup(db))
26454    }
26455}
26456impl<'db> From<TokenExternPtr<'db>> for SyntaxStablePtrId<'db> {
26457    fn from(ptr: TokenExternPtr<'db>) -> Self {
26458        ptr.untyped()
26459    }
26460}
26461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26462pub struct TokenExternGreen<'db>(pub GreenId<'db>);
26463impl<'db> TokenExternGreen<'db> {
26464    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26465        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26466    }
26467}
26468impl<'db> TypedSyntaxNode<'db> for TokenExtern<'db> {
26469    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26470    type StablePtr = TokenExternPtr<'db>;
26471    type Green = TokenExternGreen<'db>;
26472    fn missing(db: &'db dyn Database) -> Self::Green {
26473        TokenExternGreen(
26474            GreenNode {
26475                kind: SyntaxKind::TokenMissing,
26476                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26477            }
26478            .intern(db),
26479        )
26480    }
26481    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26482        match node.green_node(db).details {
26483            GreenNodeDetails::Token(_) => Self { node },
26484            GreenNodeDetails::Node { .. } => {
26485                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26486            }
26487        }
26488    }
26489    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26490        match node.green_node(db).details {
26491            GreenNodeDetails::Token(_) => Some(Self { node }),
26492            GreenNodeDetails::Node { .. } => None,
26493        }
26494    }
26495    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26496        self.node
26497    }
26498    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26499        TokenExternPtr(self.node.stable_ptr(db))
26500    }
26501}
26502#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26503pub struct TerminalExtern<'db> {
26504    node: SyntaxNode<'db>,
26505}
26506impl<'db> Terminal<'db> for TerminalExtern<'db> {
26507    const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26508    type TokenType = TokenExtern<'db>;
26509    fn new_green(
26510        db: &'db dyn Database,
26511        leading_trivia: TriviaGreen<'db>,
26512        token: <<TerminalExtern<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26513        trailing_trivia: TriviaGreen<'db>,
26514    ) -> Self::Green {
26515        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26516        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26517        TerminalExternGreen(
26518            GreenNode {
26519                kind: SyntaxKind::TerminalExtern,
26520                details: GreenNodeDetails::Node { children: children.into(), width },
26521            }
26522            .intern(db),
26523        )
26524    }
26525    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26526        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26527            unreachable!("Expected a node, not a token");
26528        };
26529        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26530    }
26531}
26532impl<'db> TerminalExtern<'db> {
26533    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26534        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26535    }
26536    pub fn token(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26537        TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26538    }
26539    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26540        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26541    }
26542}
26543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26544pub struct TerminalExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26545impl<'db> TerminalExternPtr<'db> {}
26546impl<'db> TypedStablePtr<'db> for TerminalExternPtr<'db> {
26547    type SyntaxNode = TerminalExtern<'db>;
26548    fn untyped(self) -> SyntaxStablePtrId<'db> {
26549        self.0
26550    }
26551    fn lookup(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
26552        TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26553    }
26554}
26555impl<'db> From<TerminalExternPtr<'db>> for SyntaxStablePtrId<'db> {
26556    fn from(ptr: TerminalExternPtr<'db>) -> Self {
26557        ptr.untyped()
26558    }
26559}
26560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26561pub struct TerminalExternGreen<'db>(pub GreenId<'db>);
26562impl<'db> TypedSyntaxNode<'db> for TerminalExtern<'db> {
26563    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26564    type StablePtr = TerminalExternPtr<'db>;
26565    type Green = TerminalExternGreen<'db>;
26566    fn missing(db: &'db dyn Database) -> Self::Green {
26567        TerminalExternGreen(
26568            GreenNode {
26569                kind: SyntaxKind::TerminalExtern,
26570                details: GreenNodeDetails::Node {
26571                    children: [
26572                        Trivia::missing(db).0,
26573                        TokenExtern::missing(db).0,
26574                        Trivia::missing(db).0,
26575                    ]
26576                    .into(),
26577                    width: TextWidth::default(),
26578                },
26579            }
26580            .intern(db),
26581        )
26582    }
26583    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26584        let kind = node.kind(db);
26585        assert_eq!(
26586            kind,
26587            SyntaxKind::TerminalExtern,
26588            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26589            kind,
26590            SyntaxKind::TerminalExtern
26591        );
26592        Self { node }
26593    }
26594    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26595        let kind = node.kind(db);
26596        if kind == SyntaxKind::TerminalExtern {
26597            Some(Self::from_syntax_node(db, node))
26598        } else {
26599            None
26600        }
26601    }
26602    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26603        self.node
26604    }
26605    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26606        TerminalExternPtr(self.node.stable_ptr(db))
26607    }
26608}
26609#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26610pub struct TokenFalse<'db> {
26611    node: SyntaxNode<'db>,
26612}
26613impl<'db> Token<'db> for TokenFalse<'db> {
26614    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26615        TokenFalseGreen(
26616            GreenNode { kind: SyntaxKind::TokenFalse, details: GreenNodeDetails::Token(text) }
26617                .intern(db),
26618        )
26619    }
26620    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26621        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26622    }
26623}
26624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26625pub struct TokenFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26626impl<'db> TypedStablePtr<'db> for TokenFalsePtr<'db> {
26627    type SyntaxNode = TokenFalse<'db>;
26628    fn untyped(self) -> SyntaxStablePtrId<'db> {
26629        self.0
26630    }
26631    fn lookup(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26632        TokenFalse::from_syntax_node(db, self.0.lookup(db))
26633    }
26634}
26635impl<'db> From<TokenFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26636    fn from(ptr: TokenFalsePtr<'db>) -> Self {
26637        ptr.untyped()
26638    }
26639}
26640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26641pub struct TokenFalseGreen<'db>(pub GreenId<'db>);
26642impl<'db> TokenFalseGreen<'db> {
26643    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26644        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26645    }
26646}
26647impl<'db> TypedSyntaxNode<'db> for TokenFalse<'db> {
26648    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26649    type StablePtr = TokenFalsePtr<'db>;
26650    type Green = TokenFalseGreen<'db>;
26651    fn missing(db: &'db dyn Database) -> Self::Green {
26652        TokenFalseGreen(
26653            GreenNode {
26654                kind: SyntaxKind::TokenMissing,
26655                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26656            }
26657            .intern(db),
26658        )
26659    }
26660    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26661        match node.green_node(db).details {
26662            GreenNodeDetails::Token(_) => Self { node },
26663            GreenNodeDetails::Node { .. } => {
26664                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26665            }
26666        }
26667    }
26668    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26669        match node.green_node(db).details {
26670            GreenNodeDetails::Token(_) => Some(Self { node }),
26671            GreenNodeDetails::Node { .. } => None,
26672        }
26673    }
26674    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26675        self.node
26676    }
26677    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26678        TokenFalsePtr(self.node.stable_ptr(db))
26679    }
26680}
26681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26682pub struct TerminalFalse<'db> {
26683    node: SyntaxNode<'db>,
26684}
26685impl<'db> Terminal<'db> for TerminalFalse<'db> {
26686    const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26687    type TokenType = TokenFalse<'db>;
26688    fn new_green(
26689        db: &'db dyn Database,
26690        leading_trivia: TriviaGreen<'db>,
26691        token: <<TerminalFalse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26692        trailing_trivia: TriviaGreen<'db>,
26693    ) -> Self::Green {
26694        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26695        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26696        TerminalFalseGreen(
26697            GreenNode {
26698                kind: SyntaxKind::TerminalFalse,
26699                details: GreenNodeDetails::Node { children: children.into(), width },
26700            }
26701            .intern(db),
26702        )
26703    }
26704    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26705        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26706            unreachable!("Expected a node, not a token");
26707        };
26708        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26709    }
26710}
26711impl<'db> TerminalFalse<'db> {
26712    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26713        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26714    }
26715    pub fn token(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26716        TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26717    }
26718    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26719        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26720    }
26721}
26722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26723pub struct TerminalFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26724impl<'db> TerminalFalsePtr<'db> {}
26725impl<'db> TypedStablePtr<'db> for TerminalFalsePtr<'db> {
26726    type SyntaxNode = TerminalFalse<'db>;
26727    fn untyped(self) -> SyntaxStablePtrId<'db> {
26728        self.0
26729    }
26730    fn lookup(&self, db: &'db dyn Database) -> TerminalFalse<'db> {
26731        TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26732    }
26733}
26734impl<'db> From<TerminalFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26735    fn from(ptr: TerminalFalsePtr<'db>) -> Self {
26736        ptr.untyped()
26737    }
26738}
26739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26740pub struct TerminalFalseGreen<'db>(pub GreenId<'db>);
26741impl<'db> TypedSyntaxNode<'db> for TerminalFalse<'db> {
26742    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26743    type StablePtr = TerminalFalsePtr<'db>;
26744    type Green = TerminalFalseGreen<'db>;
26745    fn missing(db: &'db dyn Database) -> Self::Green {
26746        TerminalFalseGreen(
26747            GreenNode {
26748                kind: SyntaxKind::TerminalFalse,
26749                details: GreenNodeDetails::Node {
26750                    children: [
26751                        Trivia::missing(db).0,
26752                        TokenFalse::missing(db).0,
26753                        Trivia::missing(db).0,
26754                    ]
26755                    .into(),
26756                    width: TextWidth::default(),
26757                },
26758            }
26759            .intern(db),
26760        )
26761    }
26762    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26763        let kind = node.kind(db);
26764        assert_eq!(
26765            kind,
26766            SyntaxKind::TerminalFalse,
26767            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26768            kind,
26769            SyntaxKind::TerminalFalse
26770        );
26771        Self { node }
26772    }
26773    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26774        let kind = node.kind(db);
26775        if kind == SyntaxKind::TerminalFalse {
26776            Some(Self::from_syntax_node(db, node))
26777        } else {
26778            None
26779        }
26780    }
26781    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26782        self.node
26783    }
26784    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26785        TerminalFalsePtr(self.node.stable_ptr(db))
26786    }
26787}
26788#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26789pub struct TokenFunction<'db> {
26790    node: SyntaxNode<'db>,
26791}
26792impl<'db> Token<'db> for TokenFunction<'db> {
26793    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26794        TokenFunctionGreen(
26795            GreenNode { kind: SyntaxKind::TokenFunction, details: GreenNodeDetails::Token(text) }
26796                .intern(db),
26797        )
26798    }
26799    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26800        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26801    }
26802}
26803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26804pub struct TokenFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26805impl<'db> TypedStablePtr<'db> for TokenFunctionPtr<'db> {
26806    type SyntaxNode = TokenFunction<'db>;
26807    fn untyped(self) -> SyntaxStablePtrId<'db> {
26808        self.0
26809    }
26810    fn lookup(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26811        TokenFunction::from_syntax_node(db, self.0.lookup(db))
26812    }
26813}
26814impl<'db> From<TokenFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26815    fn from(ptr: TokenFunctionPtr<'db>) -> Self {
26816        ptr.untyped()
26817    }
26818}
26819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26820pub struct TokenFunctionGreen<'db>(pub GreenId<'db>);
26821impl<'db> TokenFunctionGreen<'db> {
26822    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26823        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26824    }
26825}
26826impl<'db> TypedSyntaxNode<'db> for TokenFunction<'db> {
26827    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
26828    type StablePtr = TokenFunctionPtr<'db>;
26829    type Green = TokenFunctionGreen<'db>;
26830    fn missing(db: &'db dyn Database) -> Self::Green {
26831        TokenFunctionGreen(
26832            GreenNode {
26833                kind: SyntaxKind::TokenMissing,
26834                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26835            }
26836            .intern(db),
26837        )
26838    }
26839    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26840        match node.green_node(db).details {
26841            GreenNodeDetails::Token(_) => Self { node },
26842            GreenNodeDetails::Node { .. } => {
26843                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
26844            }
26845        }
26846    }
26847    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26848        match node.green_node(db).details {
26849            GreenNodeDetails::Token(_) => Some(Self { node }),
26850            GreenNodeDetails::Node { .. } => None,
26851        }
26852    }
26853    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26854        self.node
26855    }
26856    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26857        TokenFunctionPtr(self.node.stable_ptr(db))
26858    }
26859}
26860#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26861pub struct TerminalFunction<'db> {
26862    node: SyntaxNode<'db>,
26863}
26864impl<'db> Terminal<'db> for TerminalFunction<'db> {
26865    const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
26866    type TokenType = TokenFunction<'db>;
26867    fn new_green(
26868        db: &'db dyn Database,
26869        leading_trivia: TriviaGreen<'db>,
26870        token: <<TerminalFunction<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26871        trailing_trivia: TriviaGreen<'db>,
26872    ) -> Self::Green {
26873        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26874        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26875        TerminalFunctionGreen(
26876            GreenNode {
26877                kind: SyntaxKind::TerminalFunction,
26878                details: GreenNodeDetails::Node { children: children.into(), width },
26879            }
26880            .intern(db),
26881        )
26882    }
26883    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26884        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26885            unreachable!("Expected a node, not a token");
26886        };
26887        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26888    }
26889}
26890impl<'db> TerminalFunction<'db> {
26891    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26892        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26893    }
26894    pub fn token(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26895        TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
26896    }
26897    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26898        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26899    }
26900}
26901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26902pub struct TerminalFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26903impl<'db> TerminalFunctionPtr<'db> {}
26904impl<'db> TypedStablePtr<'db> for TerminalFunctionPtr<'db> {
26905    type SyntaxNode = TerminalFunction<'db>;
26906    fn untyped(self) -> SyntaxStablePtrId<'db> {
26907        self.0
26908    }
26909    fn lookup(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
26910        TerminalFunction::from_syntax_node(db, self.0.lookup(db))
26911    }
26912}
26913impl<'db> From<TerminalFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26914    fn from(ptr: TerminalFunctionPtr<'db>) -> Self {
26915        ptr.untyped()
26916    }
26917}
26918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26919pub struct TerminalFunctionGreen<'db>(pub GreenId<'db>);
26920impl<'db> TypedSyntaxNode<'db> for TerminalFunction<'db> {
26921    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
26922    type StablePtr = TerminalFunctionPtr<'db>;
26923    type Green = TerminalFunctionGreen<'db>;
26924    fn missing(db: &'db dyn Database) -> Self::Green {
26925        TerminalFunctionGreen(
26926            GreenNode {
26927                kind: SyntaxKind::TerminalFunction,
26928                details: GreenNodeDetails::Node {
26929                    children: [
26930                        Trivia::missing(db).0,
26931                        TokenFunction::missing(db).0,
26932                        Trivia::missing(db).0,
26933                    ]
26934                    .into(),
26935                    width: TextWidth::default(),
26936                },
26937            }
26938            .intern(db),
26939        )
26940    }
26941    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26942        let kind = node.kind(db);
26943        assert_eq!(
26944            kind,
26945            SyntaxKind::TerminalFunction,
26946            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26947            kind,
26948            SyntaxKind::TerminalFunction
26949        );
26950        Self { node }
26951    }
26952    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26953        let kind = node.kind(db);
26954        if kind == SyntaxKind::TerminalFunction {
26955            Some(Self::from_syntax_node(db, node))
26956        } else {
26957            None
26958        }
26959    }
26960    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26961        self.node
26962    }
26963    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26964        TerminalFunctionPtr(self.node.stable_ptr(db))
26965    }
26966}
26967#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26968pub struct TokenIf<'db> {
26969    node: SyntaxNode<'db>,
26970}
26971impl<'db> Token<'db> for TokenIf<'db> {
26972    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26973        TokenIfGreen(
26974            GreenNode { kind: SyntaxKind::TokenIf, details: GreenNodeDetails::Token(text) }
26975                .intern(db),
26976        )
26977    }
26978    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26979        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26980    }
26981}
26982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26983pub struct TokenIfPtr<'db>(pub SyntaxStablePtrId<'db>);
26984impl<'db> TypedStablePtr<'db> for TokenIfPtr<'db> {
26985    type SyntaxNode = TokenIf<'db>;
26986    fn untyped(self) -> SyntaxStablePtrId<'db> {
26987        self.0
26988    }
26989    fn lookup(&self, db: &'db dyn Database) -> TokenIf<'db> {
26990        TokenIf::from_syntax_node(db, self.0.lookup(db))
26991    }
26992}
26993impl<'db> From<TokenIfPtr<'db>> for SyntaxStablePtrId<'db> {
26994    fn from(ptr: TokenIfPtr<'db>) -> Self {
26995        ptr.untyped()
26996    }
26997}
26998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26999pub struct TokenIfGreen<'db>(pub GreenId<'db>);
27000impl<'db> TokenIfGreen<'db> {
27001    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27002        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27003    }
27004}
27005impl<'db> TypedSyntaxNode<'db> for TokenIf<'db> {
27006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
27007    type StablePtr = TokenIfPtr<'db>;
27008    type Green = TokenIfGreen<'db>;
27009    fn missing(db: &'db dyn Database) -> Self::Green {
27010        TokenIfGreen(
27011            GreenNode {
27012                kind: SyntaxKind::TokenMissing,
27013                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27014            }
27015            .intern(db),
27016        )
27017    }
27018    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27019        match node.green_node(db).details {
27020            GreenNodeDetails::Token(_) => Self { node },
27021            GreenNodeDetails::Node { .. } => {
27022                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
27023            }
27024        }
27025    }
27026    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27027        match node.green_node(db).details {
27028            GreenNodeDetails::Token(_) => Some(Self { node }),
27029            GreenNodeDetails::Node { .. } => None,
27030        }
27031    }
27032    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27033        self.node
27034    }
27035    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27036        TokenIfPtr(self.node.stable_ptr(db))
27037    }
27038}
27039#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27040pub struct TerminalIf<'db> {
27041    node: SyntaxNode<'db>,
27042}
27043impl<'db> Terminal<'db> for TerminalIf<'db> {
27044    const KIND: SyntaxKind = SyntaxKind::TerminalIf;
27045    type TokenType = TokenIf<'db>;
27046    fn new_green(
27047        db: &'db dyn Database,
27048        leading_trivia: TriviaGreen<'db>,
27049        token: <<TerminalIf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27050        trailing_trivia: TriviaGreen<'db>,
27051    ) -> Self::Green {
27052        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27053        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27054        TerminalIfGreen(
27055            GreenNode {
27056                kind: SyntaxKind::TerminalIf,
27057                details: GreenNodeDetails::Node { children: children.into(), width },
27058            }
27059            .intern(db),
27060        )
27061    }
27062    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27063        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27064            unreachable!("Expected a node, not a token");
27065        };
27066        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27067    }
27068}
27069impl<'db> TerminalIf<'db> {
27070    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27071        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27072    }
27073    pub fn token(&self, db: &'db dyn Database) -> TokenIf<'db> {
27074        TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
27075    }
27076    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27077        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27078    }
27079}
27080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27081pub struct TerminalIfPtr<'db>(pub SyntaxStablePtrId<'db>);
27082impl<'db> TerminalIfPtr<'db> {}
27083impl<'db> TypedStablePtr<'db> for TerminalIfPtr<'db> {
27084    type SyntaxNode = TerminalIf<'db>;
27085    fn untyped(self) -> SyntaxStablePtrId<'db> {
27086        self.0
27087    }
27088    fn lookup(&self, db: &'db dyn Database) -> TerminalIf<'db> {
27089        TerminalIf::from_syntax_node(db, self.0.lookup(db))
27090    }
27091}
27092impl<'db> From<TerminalIfPtr<'db>> for SyntaxStablePtrId<'db> {
27093    fn from(ptr: TerminalIfPtr<'db>) -> Self {
27094        ptr.untyped()
27095    }
27096}
27097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27098pub struct TerminalIfGreen<'db>(pub GreenId<'db>);
27099impl<'db> TypedSyntaxNode<'db> for TerminalIf<'db> {
27100    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
27101    type StablePtr = TerminalIfPtr<'db>;
27102    type Green = TerminalIfGreen<'db>;
27103    fn missing(db: &'db dyn Database) -> Self::Green {
27104        TerminalIfGreen(
27105            GreenNode {
27106                kind: SyntaxKind::TerminalIf,
27107                details: GreenNodeDetails::Node {
27108                    children: [
27109                        Trivia::missing(db).0,
27110                        TokenIf::missing(db).0,
27111                        Trivia::missing(db).0,
27112                    ]
27113                    .into(),
27114                    width: TextWidth::default(),
27115                },
27116            }
27117            .intern(db),
27118        )
27119    }
27120    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27121        let kind = node.kind(db);
27122        assert_eq!(
27123            kind,
27124            SyntaxKind::TerminalIf,
27125            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27126            kind,
27127            SyntaxKind::TerminalIf
27128        );
27129        Self { node }
27130    }
27131    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27132        let kind = node.kind(db);
27133        if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
27134    }
27135    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27136        self.node
27137    }
27138    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27139        TerminalIfPtr(self.node.stable_ptr(db))
27140    }
27141}
27142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27143pub struct TokenWhile<'db> {
27144    node: SyntaxNode<'db>,
27145}
27146impl<'db> Token<'db> for TokenWhile<'db> {
27147    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27148        TokenWhileGreen(
27149            GreenNode { kind: SyntaxKind::TokenWhile, details: GreenNodeDetails::Token(text) }
27150                .intern(db),
27151        )
27152    }
27153    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27154        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27155    }
27156}
27157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27158pub struct TokenWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27159impl<'db> TypedStablePtr<'db> for TokenWhilePtr<'db> {
27160    type SyntaxNode = TokenWhile<'db>;
27161    fn untyped(self) -> SyntaxStablePtrId<'db> {
27162        self.0
27163    }
27164    fn lookup(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27165        TokenWhile::from_syntax_node(db, self.0.lookup(db))
27166    }
27167}
27168impl<'db> From<TokenWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27169    fn from(ptr: TokenWhilePtr<'db>) -> Self {
27170        ptr.untyped()
27171    }
27172}
27173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27174pub struct TokenWhileGreen<'db>(pub GreenId<'db>);
27175impl<'db> TokenWhileGreen<'db> {
27176    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27177        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27178    }
27179}
27180impl<'db> TypedSyntaxNode<'db> for TokenWhile<'db> {
27181    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
27182    type StablePtr = TokenWhilePtr<'db>;
27183    type Green = TokenWhileGreen<'db>;
27184    fn missing(db: &'db dyn Database) -> Self::Green {
27185        TokenWhileGreen(
27186            GreenNode {
27187                kind: SyntaxKind::TokenMissing,
27188                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27189            }
27190            .intern(db),
27191        )
27192    }
27193    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27194        match node.green_node(db).details {
27195            GreenNodeDetails::Token(_) => Self { node },
27196            GreenNodeDetails::Node { .. } => {
27197                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
27198            }
27199        }
27200    }
27201    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27202        match node.green_node(db).details {
27203            GreenNodeDetails::Token(_) => Some(Self { node }),
27204            GreenNodeDetails::Node { .. } => None,
27205        }
27206    }
27207    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27208        self.node
27209    }
27210    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27211        TokenWhilePtr(self.node.stable_ptr(db))
27212    }
27213}
27214#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27215pub struct TerminalWhile<'db> {
27216    node: SyntaxNode<'db>,
27217}
27218impl<'db> Terminal<'db> for TerminalWhile<'db> {
27219    const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
27220    type TokenType = TokenWhile<'db>;
27221    fn new_green(
27222        db: &'db dyn Database,
27223        leading_trivia: TriviaGreen<'db>,
27224        token: <<TerminalWhile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27225        trailing_trivia: TriviaGreen<'db>,
27226    ) -> Self::Green {
27227        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27228        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27229        TerminalWhileGreen(
27230            GreenNode {
27231                kind: SyntaxKind::TerminalWhile,
27232                details: GreenNodeDetails::Node { children: children.into(), width },
27233            }
27234            .intern(db),
27235        )
27236    }
27237    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27238        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27239            unreachable!("Expected a node, not a token");
27240        };
27241        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27242    }
27243}
27244impl<'db> TerminalWhile<'db> {
27245    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27246        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27247    }
27248    pub fn token(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27249        TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
27250    }
27251    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27252        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27253    }
27254}
27255#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27256pub struct TerminalWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27257impl<'db> TerminalWhilePtr<'db> {}
27258impl<'db> TypedStablePtr<'db> for TerminalWhilePtr<'db> {
27259    type SyntaxNode = TerminalWhile<'db>;
27260    fn untyped(self) -> SyntaxStablePtrId<'db> {
27261        self.0
27262    }
27263    fn lookup(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
27264        TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27265    }
27266}
27267impl<'db> From<TerminalWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27268    fn from(ptr: TerminalWhilePtr<'db>) -> Self {
27269        ptr.untyped()
27270    }
27271}
27272#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27273pub struct TerminalWhileGreen<'db>(pub GreenId<'db>);
27274impl<'db> TypedSyntaxNode<'db> for TerminalWhile<'db> {
27275    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27276    type StablePtr = TerminalWhilePtr<'db>;
27277    type Green = TerminalWhileGreen<'db>;
27278    fn missing(db: &'db dyn Database) -> Self::Green {
27279        TerminalWhileGreen(
27280            GreenNode {
27281                kind: SyntaxKind::TerminalWhile,
27282                details: GreenNodeDetails::Node {
27283                    children: [
27284                        Trivia::missing(db).0,
27285                        TokenWhile::missing(db).0,
27286                        Trivia::missing(db).0,
27287                    ]
27288                    .into(),
27289                    width: TextWidth::default(),
27290                },
27291            }
27292            .intern(db),
27293        )
27294    }
27295    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27296        let kind = node.kind(db);
27297        assert_eq!(
27298            kind,
27299            SyntaxKind::TerminalWhile,
27300            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27301            kind,
27302            SyntaxKind::TerminalWhile
27303        );
27304        Self { node }
27305    }
27306    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27307        let kind = node.kind(db);
27308        if kind == SyntaxKind::TerminalWhile {
27309            Some(Self::from_syntax_node(db, node))
27310        } else {
27311            None
27312        }
27313    }
27314    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27315        self.node
27316    }
27317    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27318        TerminalWhilePtr(self.node.stable_ptr(db))
27319    }
27320}
27321#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27322pub struct TokenFor<'db> {
27323    node: SyntaxNode<'db>,
27324}
27325impl<'db> Token<'db> for TokenFor<'db> {
27326    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27327        TokenForGreen(
27328            GreenNode { kind: SyntaxKind::TokenFor, details: GreenNodeDetails::Token(text) }
27329                .intern(db),
27330        )
27331    }
27332    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27333        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27334    }
27335}
27336#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27337pub struct TokenForPtr<'db>(pub SyntaxStablePtrId<'db>);
27338impl<'db> TypedStablePtr<'db> for TokenForPtr<'db> {
27339    type SyntaxNode = TokenFor<'db>;
27340    fn untyped(self) -> SyntaxStablePtrId<'db> {
27341        self.0
27342    }
27343    fn lookup(&self, db: &'db dyn Database) -> TokenFor<'db> {
27344        TokenFor::from_syntax_node(db, self.0.lookup(db))
27345    }
27346}
27347impl<'db> From<TokenForPtr<'db>> for SyntaxStablePtrId<'db> {
27348    fn from(ptr: TokenForPtr<'db>) -> Self {
27349        ptr.untyped()
27350    }
27351}
27352#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27353pub struct TokenForGreen<'db>(pub GreenId<'db>);
27354impl<'db> TokenForGreen<'db> {
27355    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27356        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27357    }
27358}
27359impl<'db> TypedSyntaxNode<'db> for TokenFor<'db> {
27360    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27361    type StablePtr = TokenForPtr<'db>;
27362    type Green = TokenForGreen<'db>;
27363    fn missing(db: &'db dyn Database) -> Self::Green {
27364        TokenForGreen(
27365            GreenNode {
27366                kind: SyntaxKind::TokenMissing,
27367                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27368            }
27369            .intern(db),
27370        )
27371    }
27372    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27373        match node.green_node(db).details {
27374            GreenNodeDetails::Token(_) => Self { node },
27375            GreenNodeDetails::Node { .. } => {
27376                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27377            }
27378        }
27379    }
27380    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27381        match node.green_node(db).details {
27382            GreenNodeDetails::Token(_) => Some(Self { node }),
27383            GreenNodeDetails::Node { .. } => None,
27384        }
27385    }
27386    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27387        self.node
27388    }
27389    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27390        TokenForPtr(self.node.stable_ptr(db))
27391    }
27392}
27393#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27394pub struct TerminalFor<'db> {
27395    node: SyntaxNode<'db>,
27396}
27397impl<'db> Terminal<'db> for TerminalFor<'db> {
27398    const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27399    type TokenType = TokenFor<'db>;
27400    fn new_green(
27401        db: &'db dyn Database,
27402        leading_trivia: TriviaGreen<'db>,
27403        token: <<TerminalFor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27404        trailing_trivia: TriviaGreen<'db>,
27405    ) -> Self::Green {
27406        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27407        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27408        TerminalForGreen(
27409            GreenNode {
27410                kind: SyntaxKind::TerminalFor,
27411                details: GreenNodeDetails::Node { children: children.into(), width },
27412            }
27413            .intern(db),
27414        )
27415    }
27416    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27417        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27418            unreachable!("Expected a node, not a token");
27419        };
27420        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27421    }
27422}
27423impl<'db> TerminalFor<'db> {
27424    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27425        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27426    }
27427    pub fn token(&self, db: &'db dyn Database) -> TokenFor<'db> {
27428        TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27429    }
27430    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27431        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27432    }
27433}
27434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27435pub struct TerminalForPtr<'db>(pub SyntaxStablePtrId<'db>);
27436impl<'db> TerminalForPtr<'db> {}
27437impl<'db> TypedStablePtr<'db> for TerminalForPtr<'db> {
27438    type SyntaxNode = TerminalFor<'db>;
27439    fn untyped(self) -> SyntaxStablePtrId<'db> {
27440        self.0
27441    }
27442    fn lookup(&self, db: &'db dyn Database) -> TerminalFor<'db> {
27443        TerminalFor::from_syntax_node(db, self.0.lookup(db))
27444    }
27445}
27446impl<'db> From<TerminalForPtr<'db>> for SyntaxStablePtrId<'db> {
27447    fn from(ptr: TerminalForPtr<'db>) -> Self {
27448        ptr.untyped()
27449    }
27450}
27451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27452pub struct TerminalForGreen<'db>(pub GreenId<'db>);
27453impl<'db> TypedSyntaxNode<'db> for TerminalFor<'db> {
27454    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27455    type StablePtr = TerminalForPtr<'db>;
27456    type Green = TerminalForGreen<'db>;
27457    fn missing(db: &'db dyn Database) -> Self::Green {
27458        TerminalForGreen(
27459            GreenNode {
27460                kind: SyntaxKind::TerminalFor,
27461                details: GreenNodeDetails::Node {
27462                    children: [
27463                        Trivia::missing(db).0,
27464                        TokenFor::missing(db).0,
27465                        Trivia::missing(db).0,
27466                    ]
27467                    .into(),
27468                    width: TextWidth::default(),
27469                },
27470            }
27471            .intern(db),
27472        )
27473    }
27474    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27475        let kind = node.kind(db);
27476        assert_eq!(
27477            kind,
27478            SyntaxKind::TerminalFor,
27479            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27480            kind,
27481            SyntaxKind::TerminalFor
27482        );
27483        Self { node }
27484    }
27485    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27486        let kind = node.kind(db);
27487        if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27488    }
27489    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27490        self.node
27491    }
27492    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27493        TerminalForPtr(self.node.stable_ptr(db))
27494    }
27495}
27496#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27497pub struct TokenLoop<'db> {
27498    node: SyntaxNode<'db>,
27499}
27500impl<'db> Token<'db> for TokenLoop<'db> {
27501    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27502        TokenLoopGreen(
27503            GreenNode { kind: SyntaxKind::TokenLoop, details: GreenNodeDetails::Token(text) }
27504                .intern(db),
27505        )
27506    }
27507    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27508        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27509    }
27510}
27511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27512pub struct TokenLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27513impl<'db> TypedStablePtr<'db> for TokenLoopPtr<'db> {
27514    type SyntaxNode = TokenLoop<'db>;
27515    fn untyped(self) -> SyntaxStablePtrId<'db> {
27516        self.0
27517    }
27518    fn lookup(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27519        TokenLoop::from_syntax_node(db, self.0.lookup(db))
27520    }
27521}
27522impl<'db> From<TokenLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27523    fn from(ptr: TokenLoopPtr<'db>) -> Self {
27524        ptr.untyped()
27525    }
27526}
27527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27528pub struct TokenLoopGreen<'db>(pub GreenId<'db>);
27529impl<'db> TokenLoopGreen<'db> {
27530    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27531        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27532    }
27533}
27534impl<'db> TypedSyntaxNode<'db> for TokenLoop<'db> {
27535    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27536    type StablePtr = TokenLoopPtr<'db>;
27537    type Green = TokenLoopGreen<'db>;
27538    fn missing(db: &'db dyn Database) -> Self::Green {
27539        TokenLoopGreen(
27540            GreenNode {
27541                kind: SyntaxKind::TokenMissing,
27542                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27543            }
27544            .intern(db),
27545        )
27546    }
27547    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27548        match node.green_node(db).details {
27549            GreenNodeDetails::Token(_) => Self { node },
27550            GreenNodeDetails::Node { .. } => {
27551                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27552            }
27553        }
27554    }
27555    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27556        match node.green_node(db).details {
27557            GreenNodeDetails::Token(_) => Some(Self { node }),
27558            GreenNodeDetails::Node { .. } => None,
27559        }
27560    }
27561    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27562        self.node
27563    }
27564    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27565        TokenLoopPtr(self.node.stable_ptr(db))
27566    }
27567}
27568#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27569pub struct TerminalLoop<'db> {
27570    node: SyntaxNode<'db>,
27571}
27572impl<'db> Terminal<'db> for TerminalLoop<'db> {
27573    const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27574    type TokenType = TokenLoop<'db>;
27575    fn new_green(
27576        db: &'db dyn Database,
27577        leading_trivia: TriviaGreen<'db>,
27578        token: <<TerminalLoop<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27579        trailing_trivia: TriviaGreen<'db>,
27580    ) -> Self::Green {
27581        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27582        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27583        TerminalLoopGreen(
27584            GreenNode {
27585                kind: SyntaxKind::TerminalLoop,
27586                details: GreenNodeDetails::Node { children: children.into(), width },
27587            }
27588            .intern(db),
27589        )
27590    }
27591    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27592        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27593            unreachable!("Expected a node, not a token");
27594        };
27595        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27596    }
27597}
27598impl<'db> TerminalLoop<'db> {
27599    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27600        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27601    }
27602    pub fn token(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27603        TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27604    }
27605    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27606        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27607    }
27608}
27609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27610pub struct TerminalLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27611impl<'db> TerminalLoopPtr<'db> {}
27612impl<'db> TypedStablePtr<'db> for TerminalLoopPtr<'db> {
27613    type SyntaxNode = TerminalLoop<'db>;
27614    fn untyped(self) -> SyntaxStablePtrId<'db> {
27615        self.0
27616    }
27617    fn lookup(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
27618        TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27619    }
27620}
27621impl<'db> From<TerminalLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27622    fn from(ptr: TerminalLoopPtr<'db>) -> Self {
27623        ptr.untyped()
27624    }
27625}
27626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27627pub struct TerminalLoopGreen<'db>(pub GreenId<'db>);
27628impl<'db> TypedSyntaxNode<'db> for TerminalLoop<'db> {
27629    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27630    type StablePtr = TerminalLoopPtr<'db>;
27631    type Green = TerminalLoopGreen<'db>;
27632    fn missing(db: &'db dyn Database) -> Self::Green {
27633        TerminalLoopGreen(
27634            GreenNode {
27635                kind: SyntaxKind::TerminalLoop,
27636                details: GreenNodeDetails::Node {
27637                    children: [
27638                        Trivia::missing(db).0,
27639                        TokenLoop::missing(db).0,
27640                        Trivia::missing(db).0,
27641                    ]
27642                    .into(),
27643                    width: TextWidth::default(),
27644                },
27645            }
27646            .intern(db),
27647        )
27648    }
27649    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27650        let kind = node.kind(db);
27651        assert_eq!(
27652            kind,
27653            SyntaxKind::TerminalLoop,
27654            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27655            kind,
27656            SyntaxKind::TerminalLoop
27657        );
27658        Self { node }
27659    }
27660    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27661        let kind = node.kind(db);
27662        if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27663    }
27664    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27665        self.node
27666    }
27667    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27668        TerminalLoopPtr(self.node.stable_ptr(db))
27669    }
27670}
27671#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27672pub struct TokenImpl<'db> {
27673    node: SyntaxNode<'db>,
27674}
27675impl<'db> Token<'db> for TokenImpl<'db> {
27676    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27677        TokenImplGreen(
27678            GreenNode { kind: SyntaxKind::TokenImpl, details: GreenNodeDetails::Token(text) }
27679                .intern(db),
27680        )
27681    }
27682    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27683        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27684    }
27685}
27686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27687pub struct TokenImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27688impl<'db> TypedStablePtr<'db> for TokenImplPtr<'db> {
27689    type SyntaxNode = TokenImpl<'db>;
27690    fn untyped(self) -> SyntaxStablePtrId<'db> {
27691        self.0
27692    }
27693    fn lookup(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27694        TokenImpl::from_syntax_node(db, self.0.lookup(db))
27695    }
27696}
27697impl<'db> From<TokenImplPtr<'db>> for SyntaxStablePtrId<'db> {
27698    fn from(ptr: TokenImplPtr<'db>) -> Self {
27699        ptr.untyped()
27700    }
27701}
27702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27703pub struct TokenImplGreen<'db>(pub GreenId<'db>);
27704impl<'db> TokenImplGreen<'db> {
27705    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27706        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27707    }
27708}
27709impl<'db> TypedSyntaxNode<'db> for TokenImpl<'db> {
27710    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
27711    type StablePtr = TokenImplPtr<'db>;
27712    type Green = TokenImplGreen<'db>;
27713    fn missing(db: &'db dyn Database) -> Self::Green {
27714        TokenImplGreen(
27715            GreenNode {
27716                kind: SyntaxKind::TokenMissing,
27717                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27718            }
27719            .intern(db),
27720        )
27721    }
27722    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27723        match node.green_node(db).details {
27724            GreenNodeDetails::Token(_) => Self { node },
27725            GreenNodeDetails::Node { .. } => {
27726                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
27727            }
27728        }
27729    }
27730    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27731        match node.green_node(db).details {
27732            GreenNodeDetails::Token(_) => Some(Self { node }),
27733            GreenNodeDetails::Node { .. } => None,
27734        }
27735    }
27736    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27737        self.node
27738    }
27739    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27740        TokenImplPtr(self.node.stable_ptr(db))
27741    }
27742}
27743#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27744pub struct TerminalImpl<'db> {
27745    node: SyntaxNode<'db>,
27746}
27747impl<'db> Terminal<'db> for TerminalImpl<'db> {
27748    const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
27749    type TokenType = TokenImpl<'db>;
27750    fn new_green(
27751        db: &'db dyn Database,
27752        leading_trivia: TriviaGreen<'db>,
27753        token: <<TerminalImpl<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27754        trailing_trivia: TriviaGreen<'db>,
27755    ) -> Self::Green {
27756        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27757        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27758        TerminalImplGreen(
27759            GreenNode {
27760                kind: SyntaxKind::TerminalImpl,
27761                details: GreenNodeDetails::Node { children: children.into(), width },
27762            }
27763            .intern(db),
27764        )
27765    }
27766    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27767        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27768            unreachable!("Expected a node, not a token");
27769        };
27770        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27771    }
27772}
27773impl<'db> TerminalImpl<'db> {
27774    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27775        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27776    }
27777    pub fn token(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27778        TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
27779    }
27780    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27781        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27782    }
27783}
27784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27785pub struct TerminalImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27786impl<'db> TerminalImplPtr<'db> {}
27787impl<'db> TypedStablePtr<'db> for TerminalImplPtr<'db> {
27788    type SyntaxNode = TerminalImpl<'db>;
27789    fn untyped(self) -> SyntaxStablePtrId<'db> {
27790        self.0
27791    }
27792    fn lookup(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
27793        TerminalImpl::from_syntax_node(db, self.0.lookup(db))
27794    }
27795}
27796impl<'db> From<TerminalImplPtr<'db>> for SyntaxStablePtrId<'db> {
27797    fn from(ptr: TerminalImplPtr<'db>) -> Self {
27798        ptr.untyped()
27799    }
27800}
27801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27802pub struct TerminalImplGreen<'db>(pub GreenId<'db>);
27803impl<'db> TypedSyntaxNode<'db> for TerminalImpl<'db> {
27804    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
27805    type StablePtr = TerminalImplPtr<'db>;
27806    type Green = TerminalImplGreen<'db>;
27807    fn missing(db: &'db dyn Database) -> Self::Green {
27808        TerminalImplGreen(
27809            GreenNode {
27810                kind: SyntaxKind::TerminalImpl,
27811                details: GreenNodeDetails::Node {
27812                    children: [
27813                        Trivia::missing(db).0,
27814                        TokenImpl::missing(db).0,
27815                        Trivia::missing(db).0,
27816                    ]
27817                    .into(),
27818                    width: TextWidth::default(),
27819                },
27820            }
27821            .intern(db),
27822        )
27823    }
27824    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27825        let kind = node.kind(db);
27826        assert_eq!(
27827            kind,
27828            SyntaxKind::TerminalImpl,
27829            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27830            kind,
27831            SyntaxKind::TerminalImpl
27832        );
27833        Self { node }
27834    }
27835    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27836        let kind = node.kind(db);
27837        if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
27838    }
27839    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27840        self.node
27841    }
27842    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27843        TerminalImplPtr(self.node.stable_ptr(db))
27844    }
27845}
27846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27847pub struct TokenImplicits<'db> {
27848    node: SyntaxNode<'db>,
27849}
27850impl<'db> Token<'db> for TokenImplicits<'db> {
27851    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27852        TokenImplicitsGreen(
27853            GreenNode { kind: SyntaxKind::TokenImplicits, details: GreenNodeDetails::Token(text) }
27854                .intern(db),
27855        )
27856    }
27857    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27858        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27859    }
27860}
27861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27862pub struct TokenImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27863impl<'db> TypedStablePtr<'db> for TokenImplicitsPtr<'db> {
27864    type SyntaxNode = TokenImplicits<'db>;
27865    fn untyped(self) -> SyntaxStablePtrId<'db> {
27866        self.0
27867    }
27868    fn lookup(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27869        TokenImplicits::from_syntax_node(db, self.0.lookup(db))
27870    }
27871}
27872impl<'db> From<TokenImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27873    fn from(ptr: TokenImplicitsPtr<'db>) -> Self {
27874        ptr.untyped()
27875    }
27876}
27877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27878pub struct TokenImplicitsGreen<'db>(pub GreenId<'db>);
27879impl<'db> TokenImplicitsGreen<'db> {
27880    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27881        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27882    }
27883}
27884impl<'db> TypedSyntaxNode<'db> for TokenImplicits<'db> {
27885    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
27886    type StablePtr = TokenImplicitsPtr<'db>;
27887    type Green = TokenImplicitsGreen<'db>;
27888    fn missing(db: &'db dyn Database) -> Self::Green {
27889        TokenImplicitsGreen(
27890            GreenNode {
27891                kind: SyntaxKind::TokenMissing,
27892                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27893            }
27894            .intern(db),
27895        )
27896    }
27897    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27898        match node.green_node(db).details {
27899            GreenNodeDetails::Token(_) => Self { node },
27900            GreenNodeDetails::Node { .. } => {
27901                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
27902            }
27903        }
27904    }
27905    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27906        match node.green_node(db).details {
27907            GreenNodeDetails::Token(_) => Some(Self { node }),
27908            GreenNodeDetails::Node { .. } => None,
27909        }
27910    }
27911    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27912        self.node
27913    }
27914    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27915        TokenImplicitsPtr(self.node.stable_ptr(db))
27916    }
27917}
27918#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27919pub struct TerminalImplicits<'db> {
27920    node: SyntaxNode<'db>,
27921}
27922impl<'db> Terminal<'db> for TerminalImplicits<'db> {
27923    const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
27924    type TokenType = TokenImplicits<'db>;
27925    fn new_green(
27926        db: &'db dyn Database,
27927        leading_trivia: TriviaGreen<'db>,
27928        token: <<TerminalImplicits<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27929        trailing_trivia: TriviaGreen<'db>,
27930    ) -> Self::Green {
27931        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27932        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27933        TerminalImplicitsGreen(
27934            GreenNode {
27935                kind: SyntaxKind::TerminalImplicits,
27936                details: GreenNodeDetails::Node { children: children.into(), width },
27937            }
27938            .intern(db),
27939        )
27940    }
27941    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27942        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27943            unreachable!("Expected a node, not a token");
27944        };
27945        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27946    }
27947}
27948impl<'db> TerminalImplicits<'db> {
27949    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27950        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27951    }
27952    pub fn token(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27953        TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
27954    }
27955    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27956        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27957    }
27958}
27959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27960pub struct TerminalImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27961impl<'db> TerminalImplicitsPtr<'db> {}
27962impl<'db> TypedStablePtr<'db> for TerminalImplicitsPtr<'db> {
27963    type SyntaxNode = TerminalImplicits<'db>;
27964    fn untyped(self) -> SyntaxStablePtrId<'db> {
27965        self.0
27966    }
27967    fn lookup(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
27968        TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
27969    }
27970}
27971impl<'db> From<TerminalImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27972    fn from(ptr: TerminalImplicitsPtr<'db>) -> Self {
27973        ptr.untyped()
27974    }
27975}
27976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27977pub struct TerminalImplicitsGreen<'db>(pub GreenId<'db>);
27978impl<'db> TypedSyntaxNode<'db> for TerminalImplicits<'db> {
27979    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
27980    type StablePtr = TerminalImplicitsPtr<'db>;
27981    type Green = TerminalImplicitsGreen<'db>;
27982    fn missing(db: &'db dyn Database) -> Self::Green {
27983        TerminalImplicitsGreen(
27984            GreenNode {
27985                kind: SyntaxKind::TerminalImplicits,
27986                details: GreenNodeDetails::Node {
27987                    children: [
27988                        Trivia::missing(db).0,
27989                        TokenImplicits::missing(db).0,
27990                        Trivia::missing(db).0,
27991                    ]
27992                    .into(),
27993                    width: TextWidth::default(),
27994                },
27995            }
27996            .intern(db),
27997        )
27998    }
27999    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28000        let kind = node.kind(db);
28001        assert_eq!(
28002            kind,
28003            SyntaxKind::TerminalImplicits,
28004            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28005            kind,
28006            SyntaxKind::TerminalImplicits
28007        );
28008        Self { node }
28009    }
28010    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28011        let kind = node.kind(db);
28012        if kind == SyntaxKind::TerminalImplicits {
28013            Some(Self::from_syntax_node(db, node))
28014        } else {
28015            None
28016        }
28017    }
28018    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28019        self.node
28020    }
28021    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28022        TerminalImplicitsPtr(self.node.stable_ptr(db))
28023    }
28024}
28025#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28026pub struct TokenLet<'db> {
28027    node: SyntaxNode<'db>,
28028}
28029impl<'db> Token<'db> for TokenLet<'db> {
28030    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28031        TokenLetGreen(
28032            GreenNode { kind: SyntaxKind::TokenLet, details: GreenNodeDetails::Token(text) }
28033                .intern(db),
28034        )
28035    }
28036    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28037        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28038    }
28039}
28040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28041pub struct TokenLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28042impl<'db> TypedStablePtr<'db> for TokenLetPtr<'db> {
28043    type SyntaxNode = TokenLet<'db>;
28044    fn untyped(self) -> SyntaxStablePtrId<'db> {
28045        self.0
28046    }
28047    fn lookup(&self, db: &'db dyn Database) -> TokenLet<'db> {
28048        TokenLet::from_syntax_node(db, self.0.lookup(db))
28049    }
28050}
28051impl<'db> From<TokenLetPtr<'db>> for SyntaxStablePtrId<'db> {
28052    fn from(ptr: TokenLetPtr<'db>) -> Self {
28053        ptr.untyped()
28054    }
28055}
28056#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28057pub struct TokenLetGreen<'db>(pub GreenId<'db>);
28058impl<'db> TokenLetGreen<'db> {
28059    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28060        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28061    }
28062}
28063impl<'db> TypedSyntaxNode<'db> for TokenLet<'db> {
28064    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
28065    type StablePtr = TokenLetPtr<'db>;
28066    type Green = TokenLetGreen<'db>;
28067    fn missing(db: &'db dyn Database) -> Self::Green {
28068        TokenLetGreen(
28069            GreenNode {
28070                kind: SyntaxKind::TokenMissing,
28071                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28072            }
28073            .intern(db),
28074        )
28075    }
28076    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28077        match node.green_node(db).details {
28078            GreenNodeDetails::Token(_) => Self { node },
28079            GreenNodeDetails::Node { .. } => {
28080                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
28081            }
28082        }
28083    }
28084    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28085        match node.green_node(db).details {
28086            GreenNodeDetails::Token(_) => Some(Self { node }),
28087            GreenNodeDetails::Node { .. } => None,
28088        }
28089    }
28090    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28091        self.node
28092    }
28093    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28094        TokenLetPtr(self.node.stable_ptr(db))
28095    }
28096}
28097#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28098pub struct TerminalLet<'db> {
28099    node: SyntaxNode<'db>,
28100}
28101impl<'db> Terminal<'db> for TerminalLet<'db> {
28102    const KIND: SyntaxKind = SyntaxKind::TerminalLet;
28103    type TokenType = TokenLet<'db>;
28104    fn new_green(
28105        db: &'db dyn Database,
28106        leading_trivia: TriviaGreen<'db>,
28107        token: <<TerminalLet<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28108        trailing_trivia: TriviaGreen<'db>,
28109    ) -> Self::Green {
28110        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28111        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28112        TerminalLetGreen(
28113            GreenNode {
28114                kind: SyntaxKind::TerminalLet,
28115                details: GreenNodeDetails::Node { children: children.into(), width },
28116            }
28117            .intern(db),
28118        )
28119    }
28120    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28121        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28122            unreachable!("Expected a node, not a token");
28123        };
28124        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28125    }
28126}
28127impl<'db> TerminalLet<'db> {
28128    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28129        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28130    }
28131    pub fn token(&self, db: &'db dyn Database) -> TokenLet<'db> {
28132        TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
28133    }
28134    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28135        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28136    }
28137}
28138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28139pub struct TerminalLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28140impl<'db> TerminalLetPtr<'db> {}
28141impl<'db> TypedStablePtr<'db> for TerminalLetPtr<'db> {
28142    type SyntaxNode = TerminalLet<'db>;
28143    fn untyped(self) -> SyntaxStablePtrId<'db> {
28144        self.0
28145    }
28146    fn lookup(&self, db: &'db dyn Database) -> TerminalLet<'db> {
28147        TerminalLet::from_syntax_node(db, self.0.lookup(db))
28148    }
28149}
28150impl<'db> From<TerminalLetPtr<'db>> for SyntaxStablePtrId<'db> {
28151    fn from(ptr: TerminalLetPtr<'db>) -> Self {
28152        ptr.untyped()
28153    }
28154}
28155#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28156pub struct TerminalLetGreen<'db>(pub GreenId<'db>);
28157impl<'db> TypedSyntaxNode<'db> for TerminalLet<'db> {
28158    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
28159    type StablePtr = TerminalLetPtr<'db>;
28160    type Green = TerminalLetGreen<'db>;
28161    fn missing(db: &'db dyn Database) -> Self::Green {
28162        TerminalLetGreen(
28163            GreenNode {
28164                kind: SyntaxKind::TerminalLet,
28165                details: GreenNodeDetails::Node {
28166                    children: [
28167                        Trivia::missing(db).0,
28168                        TokenLet::missing(db).0,
28169                        Trivia::missing(db).0,
28170                    ]
28171                    .into(),
28172                    width: TextWidth::default(),
28173                },
28174            }
28175            .intern(db),
28176        )
28177    }
28178    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28179        let kind = node.kind(db);
28180        assert_eq!(
28181            kind,
28182            SyntaxKind::TerminalLet,
28183            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28184            kind,
28185            SyntaxKind::TerminalLet
28186        );
28187        Self { node }
28188    }
28189    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28190        let kind = node.kind(db);
28191        if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
28192    }
28193    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28194        self.node
28195    }
28196    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28197        TerminalLetPtr(self.node.stable_ptr(db))
28198    }
28199}
28200#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28201pub struct TokenMacro<'db> {
28202    node: SyntaxNode<'db>,
28203}
28204impl<'db> Token<'db> for TokenMacro<'db> {
28205    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28206        TokenMacroGreen(
28207            GreenNode { kind: SyntaxKind::TokenMacro, details: GreenNodeDetails::Token(text) }
28208                .intern(db),
28209        )
28210    }
28211    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28212        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28213    }
28214}
28215#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28216pub struct TokenMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28217impl<'db> TypedStablePtr<'db> for TokenMacroPtr<'db> {
28218    type SyntaxNode = TokenMacro<'db>;
28219    fn untyped(self) -> SyntaxStablePtrId<'db> {
28220        self.0
28221    }
28222    fn lookup(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28223        TokenMacro::from_syntax_node(db, self.0.lookup(db))
28224    }
28225}
28226impl<'db> From<TokenMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28227    fn from(ptr: TokenMacroPtr<'db>) -> Self {
28228        ptr.untyped()
28229    }
28230}
28231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28232pub struct TokenMacroGreen<'db>(pub GreenId<'db>);
28233impl<'db> TokenMacroGreen<'db> {
28234    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28235        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28236    }
28237}
28238impl<'db> TypedSyntaxNode<'db> for TokenMacro<'db> {
28239    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
28240    type StablePtr = TokenMacroPtr<'db>;
28241    type Green = TokenMacroGreen<'db>;
28242    fn missing(db: &'db dyn Database) -> Self::Green {
28243        TokenMacroGreen(
28244            GreenNode {
28245                kind: SyntaxKind::TokenMissing,
28246                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28247            }
28248            .intern(db),
28249        )
28250    }
28251    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28252        match node.green_node(db).details {
28253            GreenNodeDetails::Token(_) => Self { node },
28254            GreenNodeDetails::Node { .. } => {
28255                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28256            }
28257        }
28258    }
28259    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28260        match node.green_node(db).details {
28261            GreenNodeDetails::Token(_) => Some(Self { node }),
28262            GreenNodeDetails::Node { .. } => None,
28263        }
28264    }
28265    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28266        self.node
28267    }
28268    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28269        TokenMacroPtr(self.node.stable_ptr(db))
28270    }
28271}
28272#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28273pub struct TerminalMacro<'db> {
28274    node: SyntaxNode<'db>,
28275}
28276impl<'db> Terminal<'db> for TerminalMacro<'db> {
28277    const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28278    type TokenType = TokenMacro<'db>;
28279    fn new_green(
28280        db: &'db dyn Database,
28281        leading_trivia: TriviaGreen<'db>,
28282        token: <<TerminalMacro<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28283        trailing_trivia: TriviaGreen<'db>,
28284    ) -> Self::Green {
28285        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28286        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28287        TerminalMacroGreen(
28288            GreenNode {
28289                kind: SyntaxKind::TerminalMacro,
28290                details: GreenNodeDetails::Node { children: children.into(), width },
28291            }
28292            .intern(db),
28293        )
28294    }
28295    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28296        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28297            unreachable!("Expected a node, not a token");
28298        };
28299        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28300    }
28301}
28302impl<'db> TerminalMacro<'db> {
28303    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28304        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28305    }
28306    pub fn token(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28307        TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28308    }
28309    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28310        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28311    }
28312}
28313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28314pub struct TerminalMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28315impl<'db> TerminalMacroPtr<'db> {}
28316impl<'db> TypedStablePtr<'db> for TerminalMacroPtr<'db> {
28317    type SyntaxNode = TerminalMacro<'db>;
28318    fn untyped(self) -> SyntaxStablePtrId<'db> {
28319        self.0
28320    }
28321    fn lookup(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
28322        TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28323    }
28324}
28325impl<'db> From<TerminalMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28326    fn from(ptr: TerminalMacroPtr<'db>) -> Self {
28327        ptr.untyped()
28328    }
28329}
28330#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28331pub struct TerminalMacroGreen<'db>(pub GreenId<'db>);
28332impl<'db> TypedSyntaxNode<'db> for TerminalMacro<'db> {
28333    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28334    type StablePtr = TerminalMacroPtr<'db>;
28335    type Green = TerminalMacroGreen<'db>;
28336    fn missing(db: &'db dyn Database) -> Self::Green {
28337        TerminalMacroGreen(
28338            GreenNode {
28339                kind: SyntaxKind::TerminalMacro,
28340                details: GreenNodeDetails::Node {
28341                    children: [
28342                        Trivia::missing(db).0,
28343                        TokenMacro::missing(db).0,
28344                        Trivia::missing(db).0,
28345                    ]
28346                    .into(),
28347                    width: TextWidth::default(),
28348                },
28349            }
28350            .intern(db),
28351        )
28352    }
28353    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28354        let kind = node.kind(db);
28355        assert_eq!(
28356            kind,
28357            SyntaxKind::TerminalMacro,
28358            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28359            kind,
28360            SyntaxKind::TerminalMacro
28361        );
28362        Self { node }
28363    }
28364    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28365        let kind = node.kind(db);
28366        if kind == SyntaxKind::TerminalMacro {
28367            Some(Self::from_syntax_node(db, node))
28368        } else {
28369            None
28370        }
28371    }
28372    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28373        self.node
28374    }
28375    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28376        TerminalMacroPtr(self.node.stable_ptr(db))
28377    }
28378}
28379#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28380pub struct TokenMatch<'db> {
28381    node: SyntaxNode<'db>,
28382}
28383impl<'db> Token<'db> for TokenMatch<'db> {
28384    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28385        TokenMatchGreen(
28386            GreenNode { kind: SyntaxKind::TokenMatch, details: GreenNodeDetails::Token(text) }
28387                .intern(db),
28388        )
28389    }
28390    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28391        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28392    }
28393}
28394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28395pub struct TokenMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28396impl<'db> TypedStablePtr<'db> for TokenMatchPtr<'db> {
28397    type SyntaxNode = TokenMatch<'db>;
28398    fn untyped(self) -> SyntaxStablePtrId<'db> {
28399        self.0
28400    }
28401    fn lookup(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28402        TokenMatch::from_syntax_node(db, self.0.lookup(db))
28403    }
28404}
28405impl<'db> From<TokenMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28406    fn from(ptr: TokenMatchPtr<'db>) -> Self {
28407        ptr.untyped()
28408    }
28409}
28410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28411pub struct TokenMatchGreen<'db>(pub GreenId<'db>);
28412impl<'db> TokenMatchGreen<'db> {
28413    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28414        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28415    }
28416}
28417impl<'db> TypedSyntaxNode<'db> for TokenMatch<'db> {
28418    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28419    type StablePtr = TokenMatchPtr<'db>;
28420    type Green = TokenMatchGreen<'db>;
28421    fn missing(db: &'db dyn Database) -> Self::Green {
28422        TokenMatchGreen(
28423            GreenNode {
28424                kind: SyntaxKind::TokenMissing,
28425                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28426            }
28427            .intern(db),
28428        )
28429    }
28430    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28431        match node.green_node(db).details {
28432            GreenNodeDetails::Token(_) => Self { node },
28433            GreenNodeDetails::Node { .. } => {
28434                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28435            }
28436        }
28437    }
28438    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28439        match node.green_node(db).details {
28440            GreenNodeDetails::Token(_) => Some(Self { node }),
28441            GreenNodeDetails::Node { .. } => None,
28442        }
28443    }
28444    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28445        self.node
28446    }
28447    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28448        TokenMatchPtr(self.node.stable_ptr(db))
28449    }
28450}
28451#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28452pub struct TerminalMatch<'db> {
28453    node: SyntaxNode<'db>,
28454}
28455impl<'db> Terminal<'db> for TerminalMatch<'db> {
28456    const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28457    type TokenType = TokenMatch<'db>;
28458    fn new_green(
28459        db: &'db dyn Database,
28460        leading_trivia: TriviaGreen<'db>,
28461        token: <<TerminalMatch<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28462        trailing_trivia: TriviaGreen<'db>,
28463    ) -> Self::Green {
28464        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28465        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28466        TerminalMatchGreen(
28467            GreenNode {
28468                kind: SyntaxKind::TerminalMatch,
28469                details: GreenNodeDetails::Node { children: children.into(), width },
28470            }
28471            .intern(db),
28472        )
28473    }
28474    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28475        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28476            unreachable!("Expected a node, not a token");
28477        };
28478        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28479    }
28480}
28481impl<'db> TerminalMatch<'db> {
28482    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28483        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28484    }
28485    pub fn token(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28486        TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28487    }
28488    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28489        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28490    }
28491}
28492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28493pub struct TerminalMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28494impl<'db> TerminalMatchPtr<'db> {}
28495impl<'db> TypedStablePtr<'db> for TerminalMatchPtr<'db> {
28496    type SyntaxNode = TerminalMatch<'db>;
28497    fn untyped(self) -> SyntaxStablePtrId<'db> {
28498        self.0
28499    }
28500    fn lookup(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
28501        TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28502    }
28503}
28504impl<'db> From<TerminalMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28505    fn from(ptr: TerminalMatchPtr<'db>) -> Self {
28506        ptr.untyped()
28507    }
28508}
28509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28510pub struct TerminalMatchGreen<'db>(pub GreenId<'db>);
28511impl<'db> TypedSyntaxNode<'db> for TerminalMatch<'db> {
28512    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28513    type StablePtr = TerminalMatchPtr<'db>;
28514    type Green = TerminalMatchGreen<'db>;
28515    fn missing(db: &'db dyn Database) -> Self::Green {
28516        TerminalMatchGreen(
28517            GreenNode {
28518                kind: SyntaxKind::TerminalMatch,
28519                details: GreenNodeDetails::Node {
28520                    children: [
28521                        Trivia::missing(db).0,
28522                        TokenMatch::missing(db).0,
28523                        Trivia::missing(db).0,
28524                    ]
28525                    .into(),
28526                    width: TextWidth::default(),
28527                },
28528            }
28529            .intern(db),
28530        )
28531    }
28532    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28533        let kind = node.kind(db);
28534        assert_eq!(
28535            kind,
28536            SyntaxKind::TerminalMatch,
28537            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28538            kind,
28539            SyntaxKind::TerminalMatch
28540        );
28541        Self { node }
28542    }
28543    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28544        let kind = node.kind(db);
28545        if kind == SyntaxKind::TerminalMatch {
28546            Some(Self::from_syntax_node(db, node))
28547        } else {
28548            None
28549        }
28550    }
28551    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28552        self.node
28553    }
28554    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28555        TerminalMatchPtr(self.node.stable_ptr(db))
28556    }
28557}
28558#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28559pub struct TokenModule<'db> {
28560    node: SyntaxNode<'db>,
28561}
28562impl<'db> Token<'db> for TokenModule<'db> {
28563    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28564        TokenModuleGreen(
28565            GreenNode { kind: SyntaxKind::TokenModule, details: GreenNodeDetails::Token(text) }
28566                .intern(db),
28567        )
28568    }
28569    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28570        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28571    }
28572}
28573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28574pub struct TokenModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28575impl<'db> TypedStablePtr<'db> for TokenModulePtr<'db> {
28576    type SyntaxNode = TokenModule<'db>;
28577    fn untyped(self) -> SyntaxStablePtrId<'db> {
28578        self.0
28579    }
28580    fn lookup(&self, db: &'db dyn Database) -> TokenModule<'db> {
28581        TokenModule::from_syntax_node(db, self.0.lookup(db))
28582    }
28583}
28584impl<'db> From<TokenModulePtr<'db>> for SyntaxStablePtrId<'db> {
28585    fn from(ptr: TokenModulePtr<'db>) -> Self {
28586        ptr.untyped()
28587    }
28588}
28589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28590pub struct TokenModuleGreen<'db>(pub GreenId<'db>);
28591impl<'db> TokenModuleGreen<'db> {
28592    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28593        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28594    }
28595}
28596impl<'db> TypedSyntaxNode<'db> for TokenModule<'db> {
28597    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28598    type StablePtr = TokenModulePtr<'db>;
28599    type Green = TokenModuleGreen<'db>;
28600    fn missing(db: &'db dyn Database) -> Self::Green {
28601        TokenModuleGreen(
28602            GreenNode {
28603                kind: SyntaxKind::TokenMissing,
28604                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28605            }
28606            .intern(db),
28607        )
28608    }
28609    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28610        match node.green_node(db).details {
28611            GreenNodeDetails::Token(_) => Self { node },
28612            GreenNodeDetails::Node { .. } => {
28613                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28614            }
28615        }
28616    }
28617    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28618        match node.green_node(db).details {
28619            GreenNodeDetails::Token(_) => Some(Self { node }),
28620            GreenNodeDetails::Node { .. } => None,
28621        }
28622    }
28623    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28624        self.node
28625    }
28626    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28627        TokenModulePtr(self.node.stable_ptr(db))
28628    }
28629}
28630#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28631pub struct TerminalModule<'db> {
28632    node: SyntaxNode<'db>,
28633}
28634impl<'db> Terminal<'db> for TerminalModule<'db> {
28635    const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28636    type TokenType = TokenModule<'db>;
28637    fn new_green(
28638        db: &'db dyn Database,
28639        leading_trivia: TriviaGreen<'db>,
28640        token: <<TerminalModule<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28641        trailing_trivia: TriviaGreen<'db>,
28642    ) -> Self::Green {
28643        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28644        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28645        TerminalModuleGreen(
28646            GreenNode {
28647                kind: SyntaxKind::TerminalModule,
28648                details: GreenNodeDetails::Node { children: children.into(), width },
28649            }
28650            .intern(db),
28651        )
28652    }
28653    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28654        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28655            unreachable!("Expected a node, not a token");
28656        };
28657        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28658    }
28659}
28660impl<'db> TerminalModule<'db> {
28661    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28662        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28663    }
28664    pub fn token(&self, db: &'db dyn Database) -> TokenModule<'db> {
28665        TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
28666    }
28667    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28668        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28669    }
28670}
28671#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28672pub struct TerminalModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28673impl<'db> TerminalModulePtr<'db> {}
28674impl<'db> TypedStablePtr<'db> for TerminalModulePtr<'db> {
28675    type SyntaxNode = TerminalModule<'db>;
28676    fn untyped(self) -> SyntaxStablePtrId<'db> {
28677        self.0
28678    }
28679    fn lookup(&self, db: &'db dyn Database) -> TerminalModule<'db> {
28680        TerminalModule::from_syntax_node(db, self.0.lookup(db))
28681    }
28682}
28683impl<'db> From<TerminalModulePtr<'db>> for SyntaxStablePtrId<'db> {
28684    fn from(ptr: TerminalModulePtr<'db>) -> Self {
28685        ptr.untyped()
28686    }
28687}
28688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28689pub struct TerminalModuleGreen<'db>(pub GreenId<'db>);
28690impl<'db> TypedSyntaxNode<'db> for TerminalModule<'db> {
28691    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
28692    type StablePtr = TerminalModulePtr<'db>;
28693    type Green = TerminalModuleGreen<'db>;
28694    fn missing(db: &'db dyn Database) -> Self::Green {
28695        TerminalModuleGreen(
28696            GreenNode {
28697                kind: SyntaxKind::TerminalModule,
28698                details: GreenNodeDetails::Node {
28699                    children: [
28700                        Trivia::missing(db).0,
28701                        TokenModule::missing(db).0,
28702                        Trivia::missing(db).0,
28703                    ]
28704                    .into(),
28705                    width: TextWidth::default(),
28706                },
28707            }
28708            .intern(db),
28709        )
28710    }
28711    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28712        let kind = node.kind(db);
28713        assert_eq!(
28714            kind,
28715            SyntaxKind::TerminalModule,
28716            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28717            kind,
28718            SyntaxKind::TerminalModule
28719        );
28720        Self { node }
28721    }
28722    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28723        let kind = node.kind(db);
28724        if kind == SyntaxKind::TerminalModule {
28725            Some(Self::from_syntax_node(db, node))
28726        } else {
28727            None
28728        }
28729    }
28730    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28731        self.node
28732    }
28733    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28734        TerminalModulePtr(self.node.stable_ptr(db))
28735    }
28736}
28737#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28738pub struct TokenMut<'db> {
28739    node: SyntaxNode<'db>,
28740}
28741impl<'db> Token<'db> for TokenMut<'db> {
28742    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28743        TokenMutGreen(
28744            GreenNode { kind: SyntaxKind::TokenMut, details: GreenNodeDetails::Token(text) }
28745                .intern(db),
28746        )
28747    }
28748    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28749        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28750    }
28751}
28752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28753pub struct TokenMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28754impl<'db> TypedStablePtr<'db> for TokenMutPtr<'db> {
28755    type SyntaxNode = TokenMut<'db>;
28756    fn untyped(self) -> SyntaxStablePtrId<'db> {
28757        self.0
28758    }
28759    fn lookup(&self, db: &'db dyn Database) -> TokenMut<'db> {
28760        TokenMut::from_syntax_node(db, self.0.lookup(db))
28761    }
28762}
28763impl<'db> From<TokenMutPtr<'db>> for SyntaxStablePtrId<'db> {
28764    fn from(ptr: TokenMutPtr<'db>) -> Self {
28765        ptr.untyped()
28766    }
28767}
28768#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28769pub struct TokenMutGreen<'db>(pub GreenId<'db>);
28770impl<'db> TokenMutGreen<'db> {
28771    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28772        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28773    }
28774}
28775impl<'db> TypedSyntaxNode<'db> for TokenMut<'db> {
28776    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
28777    type StablePtr = TokenMutPtr<'db>;
28778    type Green = TokenMutGreen<'db>;
28779    fn missing(db: &'db dyn Database) -> Self::Green {
28780        TokenMutGreen(
28781            GreenNode {
28782                kind: SyntaxKind::TokenMissing,
28783                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28784            }
28785            .intern(db),
28786        )
28787    }
28788    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28789        match node.green_node(db).details {
28790            GreenNodeDetails::Token(_) => Self { node },
28791            GreenNodeDetails::Node { .. } => {
28792                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
28793            }
28794        }
28795    }
28796    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28797        match node.green_node(db).details {
28798            GreenNodeDetails::Token(_) => Some(Self { node }),
28799            GreenNodeDetails::Node { .. } => None,
28800        }
28801    }
28802    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28803        self.node
28804    }
28805    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28806        TokenMutPtr(self.node.stable_ptr(db))
28807    }
28808}
28809#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28810pub struct TerminalMut<'db> {
28811    node: SyntaxNode<'db>,
28812}
28813impl<'db> Terminal<'db> for TerminalMut<'db> {
28814    const KIND: SyntaxKind = SyntaxKind::TerminalMut;
28815    type TokenType = TokenMut<'db>;
28816    fn new_green(
28817        db: &'db dyn Database,
28818        leading_trivia: TriviaGreen<'db>,
28819        token: <<TerminalMut<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28820        trailing_trivia: TriviaGreen<'db>,
28821    ) -> Self::Green {
28822        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28823        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28824        TerminalMutGreen(
28825            GreenNode {
28826                kind: SyntaxKind::TerminalMut,
28827                details: GreenNodeDetails::Node { children: children.into(), width },
28828            }
28829            .intern(db),
28830        )
28831    }
28832    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28833        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28834            unreachable!("Expected a node, not a token");
28835        };
28836        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28837    }
28838}
28839impl<'db> TerminalMut<'db> {
28840    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28841        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28842    }
28843    pub fn token(&self, db: &'db dyn Database) -> TokenMut<'db> {
28844        TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
28845    }
28846    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28847        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28848    }
28849}
28850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28851pub struct TerminalMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28852impl<'db> TerminalMutPtr<'db> {}
28853impl<'db> TypedStablePtr<'db> for TerminalMutPtr<'db> {
28854    type SyntaxNode = TerminalMut<'db>;
28855    fn untyped(self) -> SyntaxStablePtrId<'db> {
28856        self.0
28857    }
28858    fn lookup(&self, db: &'db dyn Database) -> TerminalMut<'db> {
28859        TerminalMut::from_syntax_node(db, self.0.lookup(db))
28860    }
28861}
28862impl<'db> From<TerminalMutPtr<'db>> for SyntaxStablePtrId<'db> {
28863    fn from(ptr: TerminalMutPtr<'db>) -> Self {
28864        ptr.untyped()
28865    }
28866}
28867#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28868pub struct TerminalMutGreen<'db>(pub GreenId<'db>);
28869impl<'db> TypedSyntaxNode<'db> for TerminalMut<'db> {
28870    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
28871    type StablePtr = TerminalMutPtr<'db>;
28872    type Green = TerminalMutGreen<'db>;
28873    fn missing(db: &'db dyn Database) -> Self::Green {
28874        TerminalMutGreen(
28875            GreenNode {
28876                kind: SyntaxKind::TerminalMut,
28877                details: GreenNodeDetails::Node {
28878                    children: [
28879                        Trivia::missing(db).0,
28880                        TokenMut::missing(db).0,
28881                        Trivia::missing(db).0,
28882                    ]
28883                    .into(),
28884                    width: TextWidth::default(),
28885                },
28886            }
28887            .intern(db),
28888        )
28889    }
28890    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28891        let kind = node.kind(db);
28892        assert_eq!(
28893            kind,
28894            SyntaxKind::TerminalMut,
28895            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28896            kind,
28897            SyntaxKind::TerminalMut
28898        );
28899        Self { node }
28900    }
28901    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28902        let kind = node.kind(db);
28903        if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
28904    }
28905    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28906        self.node
28907    }
28908    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28909        TerminalMutPtr(self.node.stable_ptr(db))
28910    }
28911}
28912#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28913pub struct TokenNoPanic<'db> {
28914    node: SyntaxNode<'db>,
28915}
28916impl<'db> Token<'db> for TokenNoPanic<'db> {
28917    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28918        TokenNoPanicGreen(
28919            GreenNode { kind: SyntaxKind::TokenNoPanic, details: GreenNodeDetails::Token(text) }
28920                .intern(db),
28921        )
28922    }
28923    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28924        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28925    }
28926}
28927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28928pub struct TokenNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
28929impl<'db> TypedStablePtr<'db> for TokenNoPanicPtr<'db> {
28930    type SyntaxNode = TokenNoPanic<'db>;
28931    fn untyped(self) -> SyntaxStablePtrId<'db> {
28932        self.0
28933    }
28934    fn lookup(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
28935        TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
28936    }
28937}
28938impl<'db> From<TokenNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
28939    fn from(ptr: TokenNoPanicPtr<'db>) -> Self {
28940        ptr.untyped()
28941    }
28942}
28943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28944pub struct TokenNoPanicGreen<'db>(pub GreenId<'db>);
28945impl<'db> TokenNoPanicGreen<'db> {
28946    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28947        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28948    }
28949}
28950impl<'db> TypedSyntaxNode<'db> for TokenNoPanic<'db> {
28951    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
28952    type StablePtr = TokenNoPanicPtr<'db>;
28953    type Green = TokenNoPanicGreen<'db>;
28954    fn missing(db: &'db dyn Database) -> Self::Green {
28955        TokenNoPanicGreen(
28956            GreenNode {
28957                kind: SyntaxKind::TokenMissing,
28958                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28959            }
28960            .intern(db),
28961        )
28962    }
28963    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28964        match node.green_node(db).details {
28965            GreenNodeDetails::Token(_) => Self { node },
28966            GreenNodeDetails::Node { .. } => {
28967                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
28968            }
28969        }
28970    }
28971    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28972        match node.green_node(db).details {
28973            GreenNodeDetails::Token(_) => Some(Self { node }),
28974            GreenNodeDetails::Node { .. } => None,
28975        }
28976    }
28977    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28978        self.node
28979    }
28980    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28981        TokenNoPanicPtr(self.node.stable_ptr(db))
28982    }
28983}
28984#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28985pub struct TerminalNoPanic<'db> {
28986    node: SyntaxNode<'db>,
28987}
28988impl<'db> Terminal<'db> for TerminalNoPanic<'db> {
28989    const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
28990    type TokenType = TokenNoPanic<'db>;
28991    fn new_green(
28992        db: &'db dyn Database,
28993        leading_trivia: TriviaGreen<'db>,
28994        token: <<TerminalNoPanic<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28995        trailing_trivia: TriviaGreen<'db>,
28996    ) -> Self::Green {
28997        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28998        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28999        TerminalNoPanicGreen(
29000            GreenNode {
29001                kind: SyntaxKind::TerminalNoPanic,
29002                details: GreenNodeDetails::Node { children: children.into(), width },
29003            }
29004            .intern(db),
29005        )
29006    }
29007    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29008        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29009            unreachable!("Expected a node, not a token");
29010        };
29011        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29012    }
29013}
29014impl<'db> TerminalNoPanic<'db> {
29015    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29016        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29017    }
29018    pub fn token(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
29019        TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
29020    }
29021    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29022        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29023    }
29024}
29025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29026pub struct TerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
29027impl<'db> TerminalNoPanicPtr<'db> {}
29028impl<'db> TypedStablePtr<'db> for TerminalNoPanicPtr<'db> {
29029    type SyntaxNode = TerminalNoPanic<'db>;
29030    fn untyped(self) -> SyntaxStablePtrId<'db> {
29031        self.0
29032    }
29033    fn lookup(&self, db: &'db dyn Database) -> TerminalNoPanic<'db> {
29034        TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
29035    }
29036}
29037impl<'db> From<TerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
29038    fn from(ptr: TerminalNoPanicPtr<'db>) -> Self {
29039        ptr.untyped()
29040    }
29041}
29042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29043pub struct TerminalNoPanicGreen<'db>(pub GreenId<'db>);
29044impl<'db> TypedSyntaxNode<'db> for TerminalNoPanic<'db> {
29045    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
29046    type StablePtr = TerminalNoPanicPtr<'db>;
29047    type Green = TerminalNoPanicGreen<'db>;
29048    fn missing(db: &'db dyn Database) -> Self::Green {
29049        TerminalNoPanicGreen(
29050            GreenNode {
29051                kind: SyntaxKind::TerminalNoPanic,
29052                details: GreenNodeDetails::Node {
29053                    children: [
29054                        Trivia::missing(db).0,
29055                        TokenNoPanic::missing(db).0,
29056                        Trivia::missing(db).0,
29057                    ]
29058                    .into(),
29059                    width: TextWidth::default(),
29060                },
29061            }
29062            .intern(db),
29063        )
29064    }
29065    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29066        let kind = node.kind(db);
29067        assert_eq!(
29068            kind,
29069            SyntaxKind::TerminalNoPanic,
29070            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29071            kind,
29072            SyntaxKind::TerminalNoPanic
29073        );
29074        Self { node }
29075    }
29076    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29077        let kind = node.kind(db);
29078        if kind == SyntaxKind::TerminalNoPanic {
29079            Some(Self::from_syntax_node(db, node))
29080        } else {
29081            None
29082        }
29083    }
29084    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29085        self.node
29086    }
29087    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29088        TerminalNoPanicPtr(self.node.stable_ptr(db))
29089    }
29090}
29091#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29092pub struct TokenOf<'db> {
29093    node: SyntaxNode<'db>,
29094}
29095impl<'db> Token<'db> for TokenOf<'db> {
29096    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29097        TokenOfGreen(
29098            GreenNode { kind: SyntaxKind::TokenOf, details: GreenNodeDetails::Token(text) }
29099                .intern(db),
29100        )
29101    }
29102    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29103        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29104    }
29105}
29106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29107pub struct TokenOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29108impl<'db> TypedStablePtr<'db> for TokenOfPtr<'db> {
29109    type SyntaxNode = TokenOf<'db>;
29110    fn untyped(self) -> SyntaxStablePtrId<'db> {
29111        self.0
29112    }
29113    fn lookup(&self, db: &'db dyn Database) -> TokenOf<'db> {
29114        TokenOf::from_syntax_node(db, self.0.lookup(db))
29115    }
29116}
29117impl<'db> From<TokenOfPtr<'db>> for SyntaxStablePtrId<'db> {
29118    fn from(ptr: TokenOfPtr<'db>) -> Self {
29119        ptr.untyped()
29120    }
29121}
29122#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29123pub struct TokenOfGreen<'db>(pub GreenId<'db>);
29124impl<'db> TokenOfGreen<'db> {
29125    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29126        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29127    }
29128}
29129impl<'db> TypedSyntaxNode<'db> for TokenOf<'db> {
29130    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
29131    type StablePtr = TokenOfPtr<'db>;
29132    type Green = TokenOfGreen<'db>;
29133    fn missing(db: &'db dyn Database) -> Self::Green {
29134        TokenOfGreen(
29135            GreenNode {
29136                kind: SyntaxKind::TokenMissing,
29137                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29138            }
29139            .intern(db),
29140        )
29141    }
29142    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29143        match node.green_node(db).details {
29144            GreenNodeDetails::Token(_) => Self { node },
29145            GreenNodeDetails::Node { .. } => {
29146                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
29147            }
29148        }
29149    }
29150    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29151        match node.green_node(db).details {
29152            GreenNodeDetails::Token(_) => Some(Self { node }),
29153            GreenNodeDetails::Node { .. } => None,
29154        }
29155    }
29156    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29157        self.node
29158    }
29159    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29160        TokenOfPtr(self.node.stable_ptr(db))
29161    }
29162}
29163#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29164pub struct TerminalOf<'db> {
29165    node: SyntaxNode<'db>,
29166}
29167impl<'db> Terminal<'db> for TerminalOf<'db> {
29168    const KIND: SyntaxKind = SyntaxKind::TerminalOf;
29169    type TokenType = TokenOf<'db>;
29170    fn new_green(
29171        db: &'db dyn Database,
29172        leading_trivia: TriviaGreen<'db>,
29173        token: <<TerminalOf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29174        trailing_trivia: TriviaGreen<'db>,
29175    ) -> Self::Green {
29176        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29177        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29178        TerminalOfGreen(
29179            GreenNode {
29180                kind: SyntaxKind::TerminalOf,
29181                details: GreenNodeDetails::Node { children: children.into(), width },
29182            }
29183            .intern(db),
29184        )
29185    }
29186    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29187        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29188            unreachable!("Expected a node, not a token");
29189        };
29190        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29191    }
29192}
29193impl<'db> TerminalOf<'db> {
29194    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29195        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29196    }
29197    pub fn token(&self, db: &'db dyn Database) -> TokenOf<'db> {
29198        TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
29199    }
29200    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29201        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29202    }
29203}
29204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29205pub struct TerminalOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29206impl<'db> TerminalOfPtr<'db> {}
29207impl<'db> TypedStablePtr<'db> for TerminalOfPtr<'db> {
29208    type SyntaxNode = TerminalOf<'db>;
29209    fn untyped(self) -> SyntaxStablePtrId<'db> {
29210        self.0
29211    }
29212    fn lookup(&self, db: &'db dyn Database) -> TerminalOf<'db> {
29213        TerminalOf::from_syntax_node(db, self.0.lookup(db))
29214    }
29215}
29216impl<'db> From<TerminalOfPtr<'db>> for SyntaxStablePtrId<'db> {
29217    fn from(ptr: TerminalOfPtr<'db>) -> Self {
29218        ptr.untyped()
29219    }
29220}
29221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29222pub struct TerminalOfGreen<'db>(pub GreenId<'db>);
29223impl<'db> TypedSyntaxNode<'db> for TerminalOf<'db> {
29224    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
29225    type StablePtr = TerminalOfPtr<'db>;
29226    type Green = TerminalOfGreen<'db>;
29227    fn missing(db: &'db dyn Database) -> Self::Green {
29228        TerminalOfGreen(
29229            GreenNode {
29230                kind: SyntaxKind::TerminalOf,
29231                details: GreenNodeDetails::Node {
29232                    children: [
29233                        Trivia::missing(db).0,
29234                        TokenOf::missing(db).0,
29235                        Trivia::missing(db).0,
29236                    ]
29237                    .into(),
29238                    width: TextWidth::default(),
29239                },
29240            }
29241            .intern(db),
29242        )
29243    }
29244    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29245        let kind = node.kind(db);
29246        assert_eq!(
29247            kind,
29248            SyntaxKind::TerminalOf,
29249            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29250            kind,
29251            SyntaxKind::TerminalOf
29252        );
29253        Self { node }
29254    }
29255    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29256        let kind = node.kind(db);
29257        if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29258    }
29259    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29260        self.node
29261    }
29262    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29263        TerminalOfPtr(self.node.stable_ptr(db))
29264    }
29265}
29266#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29267pub struct TokenRef<'db> {
29268    node: SyntaxNode<'db>,
29269}
29270impl<'db> Token<'db> for TokenRef<'db> {
29271    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29272        TokenRefGreen(
29273            GreenNode { kind: SyntaxKind::TokenRef, details: GreenNodeDetails::Token(text) }
29274                .intern(db),
29275        )
29276    }
29277    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29278        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29279    }
29280}
29281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29282pub struct TokenRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29283impl<'db> TypedStablePtr<'db> for TokenRefPtr<'db> {
29284    type SyntaxNode = TokenRef<'db>;
29285    fn untyped(self) -> SyntaxStablePtrId<'db> {
29286        self.0
29287    }
29288    fn lookup(&self, db: &'db dyn Database) -> TokenRef<'db> {
29289        TokenRef::from_syntax_node(db, self.0.lookup(db))
29290    }
29291}
29292impl<'db> From<TokenRefPtr<'db>> for SyntaxStablePtrId<'db> {
29293    fn from(ptr: TokenRefPtr<'db>) -> Self {
29294        ptr.untyped()
29295    }
29296}
29297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29298pub struct TokenRefGreen<'db>(pub GreenId<'db>);
29299impl<'db> TokenRefGreen<'db> {
29300    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29301        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29302    }
29303}
29304impl<'db> TypedSyntaxNode<'db> for TokenRef<'db> {
29305    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29306    type StablePtr = TokenRefPtr<'db>;
29307    type Green = TokenRefGreen<'db>;
29308    fn missing(db: &'db dyn Database) -> Self::Green {
29309        TokenRefGreen(
29310            GreenNode {
29311                kind: SyntaxKind::TokenMissing,
29312                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29313            }
29314            .intern(db),
29315        )
29316    }
29317    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29318        match node.green_node(db).details {
29319            GreenNodeDetails::Token(_) => Self { node },
29320            GreenNodeDetails::Node { .. } => {
29321                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29322            }
29323        }
29324    }
29325    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29326        match node.green_node(db).details {
29327            GreenNodeDetails::Token(_) => Some(Self { node }),
29328            GreenNodeDetails::Node { .. } => None,
29329        }
29330    }
29331    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29332        self.node
29333    }
29334    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29335        TokenRefPtr(self.node.stable_ptr(db))
29336    }
29337}
29338#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29339pub struct TerminalRef<'db> {
29340    node: SyntaxNode<'db>,
29341}
29342impl<'db> Terminal<'db> for TerminalRef<'db> {
29343    const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29344    type TokenType = TokenRef<'db>;
29345    fn new_green(
29346        db: &'db dyn Database,
29347        leading_trivia: TriviaGreen<'db>,
29348        token: <<TerminalRef<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29349        trailing_trivia: TriviaGreen<'db>,
29350    ) -> Self::Green {
29351        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29352        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29353        TerminalRefGreen(
29354            GreenNode {
29355                kind: SyntaxKind::TerminalRef,
29356                details: GreenNodeDetails::Node { children: children.into(), width },
29357            }
29358            .intern(db),
29359        )
29360    }
29361    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29362        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29363            unreachable!("Expected a node, not a token");
29364        };
29365        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29366    }
29367}
29368impl<'db> TerminalRef<'db> {
29369    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29370        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29371    }
29372    pub fn token(&self, db: &'db dyn Database) -> TokenRef<'db> {
29373        TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29374    }
29375    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29376        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29377    }
29378}
29379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29380pub struct TerminalRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29381impl<'db> TerminalRefPtr<'db> {}
29382impl<'db> TypedStablePtr<'db> for TerminalRefPtr<'db> {
29383    type SyntaxNode = TerminalRef<'db>;
29384    fn untyped(self) -> SyntaxStablePtrId<'db> {
29385        self.0
29386    }
29387    fn lookup(&self, db: &'db dyn Database) -> TerminalRef<'db> {
29388        TerminalRef::from_syntax_node(db, self.0.lookup(db))
29389    }
29390}
29391impl<'db> From<TerminalRefPtr<'db>> for SyntaxStablePtrId<'db> {
29392    fn from(ptr: TerminalRefPtr<'db>) -> Self {
29393        ptr.untyped()
29394    }
29395}
29396#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29397pub struct TerminalRefGreen<'db>(pub GreenId<'db>);
29398impl<'db> TypedSyntaxNode<'db> for TerminalRef<'db> {
29399    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29400    type StablePtr = TerminalRefPtr<'db>;
29401    type Green = TerminalRefGreen<'db>;
29402    fn missing(db: &'db dyn Database) -> Self::Green {
29403        TerminalRefGreen(
29404            GreenNode {
29405                kind: SyntaxKind::TerminalRef,
29406                details: GreenNodeDetails::Node {
29407                    children: [
29408                        Trivia::missing(db).0,
29409                        TokenRef::missing(db).0,
29410                        Trivia::missing(db).0,
29411                    ]
29412                    .into(),
29413                    width: TextWidth::default(),
29414                },
29415            }
29416            .intern(db),
29417        )
29418    }
29419    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29420        let kind = node.kind(db);
29421        assert_eq!(
29422            kind,
29423            SyntaxKind::TerminalRef,
29424            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29425            kind,
29426            SyntaxKind::TerminalRef
29427        );
29428        Self { node }
29429    }
29430    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29431        let kind = node.kind(db);
29432        if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29433    }
29434    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29435        self.node
29436    }
29437    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29438        TerminalRefPtr(self.node.stable_ptr(db))
29439    }
29440}
29441#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29442pub struct TokenContinue<'db> {
29443    node: SyntaxNode<'db>,
29444}
29445impl<'db> Token<'db> for TokenContinue<'db> {
29446    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29447        TokenContinueGreen(
29448            GreenNode { kind: SyntaxKind::TokenContinue, details: GreenNodeDetails::Token(text) }
29449                .intern(db),
29450        )
29451    }
29452    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29453        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29454    }
29455}
29456#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29457pub struct TokenContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29458impl<'db> TypedStablePtr<'db> for TokenContinuePtr<'db> {
29459    type SyntaxNode = TokenContinue<'db>;
29460    fn untyped(self) -> SyntaxStablePtrId<'db> {
29461        self.0
29462    }
29463    fn lookup(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29464        TokenContinue::from_syntax_node(db, self.0.lookup(db))
29465    }
29466}
29467impl<'db> From<TokenContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29468    fn from(ptr: TokenContinuePtr<'db>) -> Self {
29469        ptr.untyped()
29470    }
29471}
29472#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29473pub struct TokenContinueGreen<'db>(pub GreenId<'db>);
29474impl<'db> TokenContinueGreen<'db> {
29475    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29476        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29477    }
29478}
29479impl<'db> TypedSyntaxNode<'db> for TokenContinue<'db> {
29480    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29481    type StablePtr = TokenContinuePtr<'db>;
29482    type Green = TokenContinueGreen<'db>;
29483    fn missing(db: &'db dyn Database) -> Self::Green {
29484        TokenContinueGreen(
29485            GreenNode {
29486                kind: SyntaxKind::TokenMissing,
29487                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29488            }
29489            .intern(db),
29490        )
29491    }
29492    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29493        match node.green_node(db).details {
29494            GreenNodeDetails::Token(_) => Self { node },
29495            GreenNodeDetails::Node { .. } => {
29496                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29497            }
29498        }
29499    }
29500    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29501        match node.green_node(db).details {
29502            GreenNodeDetails::Token(_) => Some(Self { node }),
29503            GreenNodeDetails::Node { .. } => None,
29504        }
29505    }
29506    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29507        self.node
29508    }
29509    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29510        TokenContinuePtr(self.node.stable_ptr(db))
29511    }
29512}
29513#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29514pub struct TerminalContinue<'db> {
29515    node: SyntaxNode<'db>,
29516}
29517impl<'db> Terminal<'db> for TerminalContinue<'db> {
29518    const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29519    type TokenType = TokenContinue<'db>;
29520    fn new_green(
29521        db: &'db dyn Database,
29522        leading_trivia: TriviaGreen<'db>,
29523        token: <<TerminalContinue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29524        trailing_trivia: TriviaGreen<'db>,
29525    ) -> Self::Green {
29526        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29527        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29528        TerminalContinueGreen(
29529            GreenNode {
29530                kind: SyntaxKind::TerminalContinue,
29531                details: GreenNodeDetails::Node { children: children.into(), width },
29532            }
29533            .intern(db),
29534        )
29535    }
29536    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29537        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29538            unreachable!("Expected a node, not a token");
29539        };
29540        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29541    }
29542}
29543impl<'db> TerminalContinue<'db> {
29544    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29545        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29546    }
29547    pub fn token(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29548        TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29549    }
29550    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29551        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29552    }
29553}
29554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29555pub struct TerminalContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29556impl<'db> TerminalContinuePtr<'db> {}
29557impl<'db> TypedStablePtr<'db> for TerminalContinuePtr<'db> {
29558    type SyntaxNode = TerminalContinue<'db>;
29559    fn untyped(self) -> SyntaxStablePtrId<'db> {
29560        self.0
29561    }
29562    fn lookup(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
29563        TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29564    }
29565}
29566impl<'db> From<TerminalContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29567    fn from(ptr: TerminalContinuePtr<'db>) -> Self {
29568        ptr.untyped()
29569    }
29570}
29571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29572pub struct TerminalContinueGreen<'db>(pub GreenId<'db>);
29573impl<'db> TypedSyntaxNode<'db> for TerminalContinue<'db> {
29574    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29575    type StablePtr = TerminalContinuePtr<'db>;
29576    type Green = TerminalContinueGreen<'db>;
29577    fn missing(db: &'db dyn Database) -> Self::Green {
29578        TerminalContinueGreen(
29579            GreenNode {
29580                kind: SyntaxKind::TerminalContinue,
29581                details: GreenNodeDetails::Node {
29582                    children: [
29583                        Trivia::missing(db).0,
29584                        TokenContinue::missing(db).0,
29585                        Trivia::missing(db).0,
29586                    ]
29587                    .into(),
29588                    width: TextWidth::default(),
29589                },
29590            }
29591            .intern(db),
29592        )
29593    }
29594    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29595        let kind = node.kind(db);
29596        assert_eq!(
29597            kind,
29598            SyntaxKind::TerminalContinue,
29599            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29600            kind,
29601            SyntaxKind::TerminalContinue
29602        );
29603        Self { node }
29604    }
29605    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29606        let kind = node.kind(db);
29607        if kind == SyntaxKind::TerminalContinue {
29608            Some(Self::from_syntax_node(db, node))
29609        } else {
29610            None
29611        }
29612    }
29613    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29614        self.node
29615    }
29616    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29617        TerminalContinuePtr(self.node.stable_ptr(db))
29618    }
29619}
29620#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29621pub struct TokenReturn<'db> {
29622    node: SyntaxNode<'db>,
29623}
29624impl<'db> Token<'db> for TokenReturn<'db> {
29625    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29626        TokenReturnGreen(
29627            GreenNode { kind: SyntaxKind::TokenReturn, details: GreenNodeDetails::Token(text) }
29628                .intern(db),
29629        )
29630    }
29631    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29632        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29633    }
29634}
29635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29636pub struct TokenReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29637impl<'db> TypedStablePtr<'db> for TokenReturnPtr<'db> {
29638    type SyntaxNode = TokenReturn<'db>;
29639    fn untyped(self) -> SyntaxStablePtrId<'db> {
29640        self.0
29641    }
29642    fn lookup(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29643        TokenReturn::from_syntax_node(db, self.0.lookup(db))
29644    }
29645}
29646impl<'db> From<TokenReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29647    fn from(ptr: TokenReturnPtr<'db>) -> Self {
29648        ptr.untyped()
29649    }
29650}
29651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29652pub struct TokenReturnGreen<'db>(pub GreenId<'db>);
29653impl<'db> TokenReturnGreen<'db> {
29654    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29655        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29656    }
29657}
29658impl<'db> TypedSyntaxNode<'db> for TokenReturn<'db> {
29659    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
29660    type StablePtr = TokenReturnPtr<'db>;
29661    type Green = TokenReturnGreen<'db>;
29662    fn missing(db: &'db dyn Database) -> Self::Green {
29663        TokenReturnGreen(
29664            GreenNode {
29665                kind: SyntaxKind::TokenMissing,
29666                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29667            }
29668            .intern(db),
29669        )
29670    }
29671    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29672        match node.green_node(db).details {
29673            GreenNodeDetails::Token(_) => Self { node },
29674            GreenNodeDetails::Node { .. } => {
29675                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
29676            }
29677        }
29678    }
29679    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29680        match node.green_node(db).details {
29681            GreenNodeDetails::Token(_) => Some(Self { node }),
29682            GreenNodeDetails::Node { .. } => None,
29683        }
29684    }
29685    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29686        self.node
29687    }
29688    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29689        TokenReturnPtr(self.node.stable_ptr(db))
29690    }
29691}
29692#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29693pub struct TerminalReturn<'db> {
29694    node: SyntaxNode<'db>,
29695}
29696impl<'db> Terminal<'db> for TerminalReturn<'db> {
29697    const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
29698    type TokenType = TokenReturn<'db>;
29699    fn new_green(
29700        db: &'db dyn Database,
29701        leading_trivia: TriviaGreen<'db>,
29702        token: <<TerminalReturn<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29703        trailing_trivia: TriviaGreen<'db>,
29704    ) -> Self::Green {
29705        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29706        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29707        TerminalReturnGreen(
29708            GreenNode {
29709                kind: SyntaxKind::TerminalReturn,
29710                details: GreenNodeDetails::Node { children: children.into(), width },
29711            }
29712            .intern(db),
29713        )
29714    }
29715    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29716        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29717            unreachable!("Expected a node, not a token");
29718        };
29719        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29720    }
29721}
29722impl<'db> TerminalReturn<'db> {
29723    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29724        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29725    }
29726    pub fn token(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29727        TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
29728    }
29729    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29730        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29731    }
29732}
29733#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29734pub struct TerminalReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29735impl<'db> TerminalReturnPtr<'db> {}
29736impl<'db> TypedStablePtr<'db> for TerminalReturnPtr<'db> {
29737    type SyntaxNode = TerminalReturn<'db>;
29738    fn untyped(self) -> SyntaxStablePtrId<'db> {
29739        self.0
29740    }
29741    fn lookup(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
29742        TerminalReturn::from_syntax_node(db, self.0.lookup(db))
29743    }
29744}
29745impl<'db> From<TerminalReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29746    fn from(ptr: TerminalReturnPtr<'db>) -> Self {
29747        ptr.untyped()
29748    }
29749}
29750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29751pub struct TerminalReturnGreen<'db>(pub GreenId<'db>);
29752impl<'db> TypedSyntaxNode<'db> for TerminalReturn<'db> {
29753    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
29754    type StablePtr = TerminalReturnPtr<'db>;
29755    type Green = TerminalReturnGreen<'db>;
29756    fn missing(db: &'db dyn Database) -> Self::Green {
29757        TerminalReturnGreen(
29758            GreenNode {
29759                kind: SyntaxKind::TerminalReturn,
29760                details: GreenNodeDetails::Node {
29761                    children: [
29762                        Trivia::missing(db).0,
29763                        TokenReturn::missing(db).0,
29764                        Trivia::missing(db).0,
29765                    ]
29766                    .into(),
29767                    width: TextWidth::default(),
29768                },
29769            }
29770            .intern(db),
29771        )
29772    }
29773    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29774        let kind = node.kind(db);
29775        assert_eq!(
29776            kind,
29777            SyntaxKind::TerminalReturn,
29778            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29779            kind,
29780            SyntaxKind::TerminalReturn
29781        );
29782        Self { node }
29783    }
29784    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29785        let kind = node.kind(db);
29786        if kind == SyntaxKind::TerminalReturn {
29787            Some(Self::from_syntax_node(db, node))
29788        } else {
29789            None
29790        }
29791    }
29792    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29793        self.node
29794    }
29795    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29796        TerminalReturnPtr(self.node.stable_ptr(db))
29797    }
29798}
29799#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29800pub struct TokenBreak<'db> {
29801    node: SyntaxNode<'db>,
29802}
29803impl<'db> Token<'db> for TokenBreak<'db> {
29804    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29805        TokenBreakGreen(
29806            GreenNode { kind: SyntaxKind::TokenBreak, details: GreenNodeDetails::Token(text) }
29807                .intern(db),
29808        )
29809    }
29810    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29811        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29812    }
29813}
29814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29815pub struct TokenBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29816impl<'db> TypedStablePtr<'db> for TokenBreakPtr<'db> {
29817    type SyntaxNode = TokenBreak<'db>;
29818    fn untyped(self) -> SyntaxStablePtrId<'db> {
29819        self.0
29820    }
29821    fn lookup(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29822        TokenBreak::from_syntax_node(db, self.0.lookup(db))
29823    }
29824}
29825impl<'db> From<TokenBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29826    fn from(ptr: TokenBreakPtr<'db>) -> Self {
29827        ptr.untyped()
29828    }
29829}
29830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29831pub struct TokenBreakGreen<'db>(pub GreenId<'db>);
29832impl<'db> TokenBreakGreen<'db> {
29833    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29834        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29835    }
29836}
29837impl<'db> TypedSyntaxNode<'db> for TokenBreak<'db> {
29838    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
29839    type StablePtr = TokenBreakPtr<'db>;
29840    type Green = TokenBreakGreen<'db>;
29841    fn missing(db: &'db dyn Database) -> Self::Green {
29842        TokenBreakGreen(
29843            GreenNode {
29844                kind: SyntaxKind::TokenMissing,
29845                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29846            }
29847            .intern(db),
29848        )
29849    }
29850    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29851        match node.green_node(db).details {
29852            GreenNodeDetails::Token(_) => Self { node },
29853            GreenNodeDetails::Node { .. } => {
29854                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
29855            }
29856        }
29857    }
29858    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29859        match node.green_node(db).details {
29860            GreenNodeDetails::Token(_) => Some(Self { node }),
29861            GreenNodeDetails::Node { .. } => None,
29862        }
29863    }
29864    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29865        self.node
29866    }
29867    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29868        TokenBreakPtr(self.node.stable_ptr(db))
29869    }
29870}
29871#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29872pub struct TerminalBreak<'db> {
29873    node: SyntaxNode<'db>,
29874}
29875impl<'db> Terminal<'db> for TerminalBreak<'db> {
29876    const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
29877    type TokenType = TokenBreak<'db>;
29878    fn new_green(
29879        db: &'db dyn Database,
29880        leading_trivia: TriviaGreen<'db>,
29881        token: <<TerminalBreak<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29882        trailing_trivia: TriviaGreen<'db>,
29883    ) -> Self::Green {
29884        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29885        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29886        TerminalBreakGreen(
29887            GreenNode {
29888                kind: SyntaxKind::TerminalBreak,
29889                details: GreenNodeDetails::Node { children: children.into(), width },
29890            }
29891            .intern(db),
29892        )
29893    }
29894    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29895        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29896            unreachable!("Expected a node, not a token");
29897        };
29898        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29899    }
29900}
29901impl<'db> TerminalBreak<'db> {
29902    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29903        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29904    }
29905    pub fn token(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29906        TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
29907    }
29908    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29909        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29910    }
29911}
29912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29913pub struct TerminalBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29914impl<'db> TerminalBreakPtr<'db> {}
29915impl<'db> TypedStablePtr<'db> for TerminalBreakPtr<'db> {
29916    type SyntaxNode = TerminalBreak<'db>;
29917    fn untyped(self) -> SyntaxStablePtrId<'db> {
29918        self.0
29919    }
29920    fn lookup(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
29921        TerminalBreak::from_syntax_node(db, self.0.lookup(db))
29922    }
29923}
29924impl<'db> From<TerminalBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29925    fn from(ptr: TerminalBreakPtr<'db>) -> Self {
29926        ptr.untyped()
29927    }
29928}
29929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29930pub struct TerminalBreakGreen<'db>(pub GreenId<'db>);
29931impl<'db> TypedSyntaxNode<'db> for TerminalBreak<'db> {
29932    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
29933    type StablePtr = TerminalBreakPtr<'db>;
29934    type Green = TerminalBreakGreen<'db>;
29935    fn missing(db: &'db dyn Database) -> Self::Green {
29936        TerminalBreakGreen(
29937            GreenNode {
29938                kind: SyntaxKind::TerminalBreak,
29939                details: GreenNodeDetails::Node {
29940                    children: [
29941                        Trivia::missing(db).0,
29942                        TokenBreak::missing(db).0,
29943                        Trivia::missing(db).0,
29944                    ]
29945                    .into(),
29946                    width: TextWidth::default(),
29947                },
29948            }
29949            .intern(db),
29950        )
29951    }
29952    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29953        let kind = node.kind(db);
29954        assert_eq!(
29955            kind,
29956            SyntaxKind::TerminalBreak,
29957            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29958            kind,
29959            SyntaxKind::TerminalBreak
29960        );
29961        Self { node }
29962    }
29963    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29964        let kind = node.kind(db);
29965        if kind == SyntaxKind::TerminalBreak {
29966            Some(Self::from_syntax_node(db, node))
29967        } else {
29968            None
29969        }
29970    }
29971    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29972        self.node
29973    }
29974    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29975        TerminalBreakPtr(self.node.stable_ptr(db))
29976    }
29977}
29978#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29979pub struct TokenStruct<'db> {
29980    node: SyntaxNode<'db>,
29981}
29982impl<'db> Token<'db> for TokenStruct<'db> {
29983    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29984        TokenStructGreen(
29985            GreenNode { kind: SyntaxKind::TokenStruct, details: GreenNodeDetails::Token(text) }
29986                .intern(db),
29987        )
29988    }
29989    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29990        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29991    }
29992}
29993#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29994pub struct TokenStructPtr<'db>(pub SyntaxStablePtrId<'db>);
29995impl<'db> TypedStablePtr<'db> for TokenStructPtr<'db> {
29996    type SyntaxNode = TokenStruct<'db>;
29997    fn untyped(self) -> SyntaxStablePtrId<'db> {
29998        self.0
29999    }
30000    fn lookup(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30001        TokenStruct::from_syntax_node(db, self.0.lookup(db))
30002    }
30003}
30004impl<'db> From<TokenStructPtr<'db>> for SyntaxStablePtrId<'db> {
30005    fn from(ptr: TokenStructPtr<'db>) -> Self {
30006        ptr.untyped()
30007    }
30008}
30009#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30010pub struct TokenStructGreen<'db>(pub GreenId<'db>);
30011impl<'db> TokenStructGreen<'db> {
30012    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30013        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30014    }
30015}
30016impl<'db> TypedSyntaxNode<'db> for TokenStruct<'db> {
30017    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
30018    type StablePtr = TokenStructPtr<'db>;
30019    type Green = TokenStructGreen<'db>;
30020    fn missing(db: &'db dyn Database) -> Self::Green {
30021        TokenStructGreen(
30022            GreenNode {
30023                kind: SyntaxKind::TokenMissing,
30024                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30025            }
30026            .intern(db),
30027        )
30028    }
30029    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30030        match node.green_node(db).details {
30031            GreenNodeDetails::Token(_) => Self { node },
30032            GreenNodeDetails::Node { .. } => {
30033                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
30034            }
30035        }
30036    }
30037    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30038        match node.green_node(db).details {
30039            GreenNodeDetails::Token(_) => Some(Self { node }),
30040            GreenNodeDetails::Node { .. } => None,
30041        }
30042    }
30043    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30044        self.node
30045    }
30046    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30047        TokenStructPtr(self.node.stable_ptr(db))
30048    }
30049}
30050#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30051pub struct TerminalStruct<'db> {
30052    node: SyntaxNode<'db>,
30053}
30054impl<'db> Terminal<'db> for TerminalStruct<'db> {
30055    const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
30056    type TokenType = TokenStruct<'db>;
30057    fn new_green(
30058        db: &'db dyn Database,
30059        leading_trivia: TriviaGreen<'db>,
30060        token: <<TerminalStruct<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30061        trailing_trivia: TriviaGreen<'db>,
30062    ) -> Self::Green {
30063        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30064        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30065        TerminalStructGreen(
30066            GreenNode {
30067                kind: SyntaxKind::TerminalStruct,
30068                details: GreenNodeDetails::Node { children: children.into(), width },
30069            }
30070            .intern(db),
30071        )
30072    }
30073    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30074        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30075            unreachable!("Expected a node, not a token");
30076        };
30077        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30078    }
30079}
30080impl<'db> TerminalStruct<'db> {
30081    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30082        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30083    }
30084    pub fn token(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30085        TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
30086    }
30087    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30088        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30089    }
30090}
30091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30092pub struct TerminalStructPtr<'db>(pub SyntaxStablePtrId<'db>);
30093impl<'db> TerminalStructPtr<'db> {}
30094impl<'db> TypedStablePtr<'db> for TerminalStructPtr<'db> {
30095    type SyntaxNode = TerminalStruct<'db>;
30096    fn untyped(self) -> SyntaxStablePtrId<'db> {
30097        self.0
30098    }
30099    fn lookup(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
30100        TerminalStruct::from_syntax_node(db, self.0.lookup(db))
30101    }
30102}
30103impl<'db> From<TerminalStructPtr<'db>> for SyntaxStablePtrId<'db> {
30104    fn from(ptr: TerminalStructPtr<'db>) -> Self {
30105        ptr.untyped()
30106    }
30107}
30108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30109pub struct TerminalStructGreen<'db>(pub GreenId<'db>);
30110impl<'db> TypedSyntaxNode<'db> for TerminalStruct<'db> {
30111    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
30112    type StablePtr = TerminalStructPtr<'db>;
30113    type Green = TerminalStructGreen<'db>;
30114    fn missing(db: &'db dyn Database) -> Self::Green {
30115        TerminalStructGreen(
30116            GreenNode {
30117                kind: SyntaxKind::TerminalStruct,
30118                details: GreenNodeDetails::Node {
30119                    children: [
30120                        Trivia::missing(db).0,
30121                        TokenStruct::missing(db).0,
30122                        Trivia::missing(db).0,
30123                    ]
30124                    .into(),
30125                    width: TextWidth::default(),
30126                },
30127            }
30128            .intern(db),
30129        )
30130    }
30131    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30132        let kind = node.kind(db);
30133        assert_eq!(
30134            kind,
30135            SyntaxKind::TerminalStruct,
30136            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30137            kind,
30138            SyntaxKind::TerminalStruct
30139        );
30140        Self { node }
30141    }
30142    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30143        let kind = node.kind(db);
30144        if kind == SyntaxKind::TerminalStruct {
30145            Some(Self::from_syntax_node(db, node))
30146        } else {
30147            None
30148        }
30149    }
30150    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30151        self.node
30152    }
30153    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30154        TerminalStructPtr(self.node.stable_ptr(db))
30155    }
30156}
30157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30158pub struct TokenTrait<'db> {
30159    node: SyntaxNode<'db>,
30160}
30161impl<'db> Token<'db> for TokenTrait<'db> {
30162    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30163        TokenTraitGreen(
30164            GreenNode { kind: SyntaxKind::TokenTrait, details: GreenNodeDetails::Token(text) }
30165                .intern(db),
30166        )
30167    }
30168    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30169        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30170    }
30171}
30172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30173pub struct TokenTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30174impl<'db> TypedStablePtr<'db> for TokenTraitPtr<'db> {
30175    type SyntaxNode = TokenTrait<'db>;
30176    fn untyped(self) -> SyntaxStablePtrId<'db> {
30177        self.0
30178    }
30179    fn lookup(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30180        TokenTrait::from_syntax_node(db, self.0.lookup(db))
30181    }
30182}
30183impl<'db> From<TokenTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30184    fn from(ptr: TokenTraitPtr<'db>) -> Self {
30185        ptr.untyped()
30186    }
30187}
30188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30189pub struct TokenTraitGreen<'db>(pub GreenId<'db>);
30190impl<'db> TokenTraitGreen<'db> {
30191    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30192        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30193    }
30194}
30195impl<'db> TypedSyntaxNode<'db> for TokenTrait<'db> {
30196    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
30197    type StablePtr = TokenTraitPtr<'db>;
30198    type Green = TokenTraitGreen<'db>;
30199    fn missing(db: &'db dyn Database) -> Self::Green {
30200        TokenTraitGreen(
30201            GreenNode {
30202                kind: SyntaxKind::TokenMissing,
30203                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30204            }
30205            .intern(db),
30206        )
30207    }
30208    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30209        match node.green_node(db).details {
30210            GreenNodeDetails::Token(_) => Self { node },
30211            GreenNodeDetails::Node { .. } => {
30212                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
30213            }
30214        }
30215    }
30216    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30217        match node.green_node(db).details {
30218            GreenNodeDetails::Token(_) => Some(Self { node }),
30219            GreenNodeDetails::Node { .. } => None,
30220        }
30221    }
30222    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30223        self.node
30224    }
30225    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30226        TokenTraitPtr(self.node.stable_ptr(db))
30227    }
30228}
30229#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30230pub struct TerminalTrait<'db> {
30231    node: SyntaxNode<'db>,
30232}
30233impl<'db> Terminal<'db> for TerminalTrait<'db> {
30234    const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
30235    type TokenType = TokenTrait<'db>;
30236    fn new_green(
30237        db: &'db dyn Database,
30238        leading_trivia: TriviaGreen<'db>,
30239        token: <<TerminalTrait<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30240        trailing_trivia: TriviaGreen<'db>,
30241    ) -> Self::Green {
30242        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30243        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30244        TerminalTraitGreen(
30245            GreenNode {
30246                kind: SyntaxKind::TerminalTrait,
30247                details: GreenNodeDetails::Node { children: children.into(), width },
30248            }
30249            .intern(db),
30250        )
30251    }
30252    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30253        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30254            unreachable!("Expected a node, not a token");
30255        };
30256        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30257    }
30258}
30259impl<'db> TerminalTrait<'db> {
30260    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30261        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30262    }
30263    pub fn token(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30264        TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30265    }
30266    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30267        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30268    }
30269}
30270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30271pub struct TerminalTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30272impl<'db> TerminalTraitPtr<'db> {}
30273impl<'db> TypedStablePtr<'db> for TerminalTraitPtr<'db> {
30274    type SyntaxNode = TerminalTrait<'db>;
30275    fn untyped(self) -> SyntaxStablePtrId<'db> {
30276        self.0
30277    }
30278    fn lookup(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
30279        TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30280    }
30281}
30282impl<'db> From<TerminalTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30283    fn from(ptr: TerminalTraitPtr<'db>) -> Self {
30284        ptr.untyped()
30285    }
30286}
30287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30288pub struct TerminalTraitGreen<'db>(pub GreenId<'db>);
30289impl<'db> TypedSyntaxNode<'db> for TerminalTrait<'db> {
30290    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30291    type StablePtr = TerminalTraitPtr<'db>;
30292    type Green = TerminalTraitGreen<'db>;
30293    fn missing(db: &'db dyn Database) -> Self::Green {
30294        TerminalTraitGreen(
30295            GreenNode {
30296                kind: SyntaxKind::TerminalTrait,
30297                details: GreenNodeDetails::Node {
30298                    children: [
30299                        Trivia::missing(db).0,
30300                        TokenTrait::missing(db).0,
30301                        Trivia::missing(db).0,
30302                    ]
30303                    .into(),
30304                    width: TextWidth::default(),
30305                },
30306            }
30307            .intern(db),
30308        )
30309    }
30310    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30311        let kind = node.kind(db);
30312        assert_eq!(
30313            kind,
30314            SyntaxKind::TerminalTrait,
30315            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30316            kind,
30317            SyntaxKind::TerminalTrait
30318        );
30319        Self { node }
30320    }
30321    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30322        let kind = node.kind(db);
30323        if kind == SyntaxKind::TerminalTrait {
30324            Some(Self::from_syntax_node(db, node))
30325        } else {
30326            None
30327        }
30328    }
30329    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30330        self.node
30331    }
30332    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30333        TerminalTraitPtr(self.node.stable_ptr(db))
30334    }
30335}
30336#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30337pub struct TokenTrue<'db> {
30338    node: SyntaxNode<'db>,
30339}
30340impl<'db> Token<'db> for TokenTrue<'db> {
30341    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30342        TokenTrueGreen(
30343            GreenNode { kind: SyntaxKind::TokenTrue, details: GreenNodeDetails::Token(text) }
30344                .intern(db),
30345        )
30346    }
30347    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30348        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30349    }
30350}
30351#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30352pub struct TokenTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30353impl<'db> TypedStablePtr<'db> for TokenTruePtr<'db> {
30354    type SyntaxNode = TokenTrue<'db>;
30355    fn untyped(self) -> SyntaxStablePtrId<'db> {
30356        self.0
30357    }
30358    fn lookup(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30359        TokenTrue::from_syntax_node(db, self.0.lookup(db))
30360    }
30361}
30362impl<'db> From<TokenTruePtr<'db>> for SyntaxStablePtrId<'db> {
30363    fn from(ptr: TokenTruePtr<'db>) -> Self {
30364        ptr.untyped()
30365    }
30366}
30367#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30368pub struct TokenTrueGreen<'db>(pub GreenId<'db>);
30369impl<'db> TokenTrueGreen<'db> {
30370    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30371        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30372    }
30373}
30374impl<'db> TypedSyntaxNode<'db> for TokenTrue<'db> {
30375    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30376    type StablePtr = TokenTruePtr<'db>;
30377    type Green = TokenTrueGreen<'db>;
30378    fn missing(db: &'db dyn Database) -> Self::Green {
30379        TokenTrueGreen(
30380            GreenNode {
30381                kind: SyntaxKind::TokenMissing,
30382                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30383            }
30384            .intern(db),
30385        )
30386    }
30387    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30388        match node.green_node(db).details {
30389            GreenNodeDetails::Token(_) => Self { node },
30390            GreenNodeDetails::Node { .. } => {
30391                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30392            }
30393        }
30394    }
30395    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30396        match node.green_node(db).details {
30397            GreenNodeDetails::Token(_) => Some(Self { node }),
30398            GreenNodeDetails::Node { .. } => None,
30399        }
30400    }
30401    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30402        self.node
30403    }
30404    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30405        TokenTruePtr(self.node.stable_ptr(db))
30406    }
30407}
30408#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30409pub struct TerminalTrue<'db> {
30410    node: SyntaxNode<'db>,
30411}
30412impl<'db> Terminal<'db> for TerminalTrue<'db> {
30413    const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30414    type TokenType = TokenTrue<'db>;
30415    fn new_green(
30416        db: &'db dyn Database,
30417        leading_trivia: TriviaGreen<'db>,
30418        token: <<TerminalTrue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30419        trailing_trivia: TriviaGreen<'db>,
30420    ) -> Self::Green {
30421        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30422        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30423        TerminalTrueGreen(
30424            GreenNode {
30425                kind: SyntaxKind::TerminalTrue,
30426                details: GreenNodeDetails::Node { children: children.into(), width },
30427            }
30428            .intern(db),
30429        )
30430    }
30431    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30432        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30433            unreachable!("Expected a node, not a token");
30434        };
30435        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30436    }
30437}
30438impl<'db> TerminalTrue<'db> {
30439    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30440        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30441    }
30442    pub fn token(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30443        TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30444    }
30445    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30446        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30447    }
30448}
30449#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30450pub struct TerminalTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30451impl<'db> TerminalTruePtr<'db> {}
30452impl<'db> TypedStablePtr<'db> for TerminalTruePtr<'db> {
30453    type SyntaxNode = TerminalTrue<'db>;
30454    fn untyped(self) -> SyntaxStablePtrId<'db> {
30455        self.0
30456    }
30457    fn lookup(&self, db: &'db dyn Database) -> TerminalTrue<'db> {
30458        TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30459    }
30460}
30461impl<'db> From<TerminalTruePtr<'db>> for SyntaxStablePtrId<'db> {
30462    fn from(ptr: TerminalTruePtr<'db>) -> Self {
30463        ptr.untyped()
30464    }
30465}
30466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30467pub struct TerminalTrueGreen<'db>(pub GreenId<'db>);
30468impl<'db> TypedSyntaxNode<'db> for TerminalTrue<'db> {
30469    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30470    type StablePtr = TerminalTruePtr<'db>;
30471    type Green = TerminalTrueGreen<'db>;
30472    fn missing(db: &'db dyn Database) -> Self::Green {
30473        TerminalTrueGreen(
30474            GreenNode {
30475                kind: SyntaxKind::TerminalTrue,
30476                details: GreenNodeDetails::Node {
30477                    children: [
30478                        Trivia::missing(db).0,
30479                        TokenTrue::missing(db).0,
30480                        Trivia::missing(db).0,
30481                    ]
30482                    .into(),
30483                    width: TextWidth::default(),
30484                },
30485            }
30486            .intern(db),
30487        )
30488    }
30489    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30490        let kind = node.kind(db);
30491        assert_eq!(
30492            kind,
30493            SyntaxKind::TerminalTrue,
30494            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30495            kind,
30496            SyntaxKind::TerminalTrue
30497        );
30498        Self { node }
30499    }
30500    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30501        let kind = node.kind(db);
30502        if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30503    }
30504    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30505        self.node
30506    }
30507    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30508        TerminalTruePtr(self.node.stable_ptr(db))
30509    }
30510}
30511#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30512pub struct TokenType<'db> {
30513    node: SyntaxNode<'db>,
30514}
30515impl<'db> Token<'db> for TokenType<'db> {
30516    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30517        TokenTypeGreen(
30518            GreenNode { kind: SyntaxKind::TokenType, details: GreenNodeDetails::Token(text) }
30519                .intern(db),
30520        )
30521    }
30522    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30523        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30524    }
30525}
30526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30527pub struct TokenTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30528impl<'db> TypedStablePtr<'db> for TokenTypePtr<'db> {
30529    type SyntaxNode = TokenType<'db>;
30530    fn untyped(self) -> SyntaxStablePtrId<'db> {
30531        self.0
30532    }
30533    fn lookup(&self, db: &'db dyn Database) -> TokenType<'db> {
30534        TokenType::from_syntax_node(db, self.0.lookup(db))
30535    }
30536}
30537impl<'db> From<TokenTypePtr<'db>> for SyntaxStablePtrId<'db> {
30538    fn from(ptr: TokenTypePtr<'db>) -> Self {
30539        ptr.untyped()
30540    }
30541}
30542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30543pub struct TokenTypeGreen<'db>(pub GreenId<'db>);
30544impl<'db> TokenTypeGreen<'db> {
30545    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30546        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30547    }
30548}
30549impl<'db> TypedSyntaxNode<'db> for TokenType<'db> {
30550    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
30551    type StablePtr = TokenTypePtr<'db>;
30552    type Green = TokenTypeGreen<'db>;
30553    fn missing(db: &'db dyn Database) -> Self::Green {
30554        TokenTypeGreen(
30555            GreenNode {
30556                kind: SyntaxKind::TokenMissing,
30557                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30558            }
30559            .intern(db),
30560        )
30561    }
30562    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30563        match node.green_node(db).details {
30564            GreenNodeDetails::Token(_) => Self { node },
30565            GreenNodeDetails::Node { .. } => {
30566                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
30567            }
30568        }
30569    }
30570    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30571        match node.green_node(db).details {
30572            GreenNodeDetails::Token(_) => Some(Self { node }),
30573            GreenNodeDetails::Node { .. } => None,
30574        }
30575    }
30576    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30577        self.node
30578    }
30579    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30580        TokenTypePtr(self.node.stable_ptr(db))
30581    }
30582}
30583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30584pub struct TerminalType<'db> {
30585    node: SyntaxNode<'db>,
30586}
30587impl<'db> Terminal<'db> for TerminalType<'db> {
30588    const KIND: SyntaxKind = SyntaxKind::TerminalType;
30589    type TokenType = TokenType<'db>;
30590    fn new_green(
30591        db: &'db dyn Database,
30592        leading_trivia: TriviaGreen<'db>,
30593        token: <<TerminalType<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30594        trailing_trivia: TriviaGreen<'db>,
30595    ) -> Self::Green {
30596        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30597        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30598        TerminalTypeGreen(
30599            GreenNode {
30600                kind: SyntaxKind::TerminalType,
30601                details: GreenNodeDetails::Node { children: children.into(), width },
30602            }
30603            .intern(db),
30604        )
30605    }
30606    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30607        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30608            unreachable!("Expected a node, not a token");
30609        };
30610        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30611    }
30612}
30613impl<'db> TerminalType<'db> {
30614    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30615        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30616    }
30617    pub fn token(&self, db: &'db dyn Database) -> TokenType<'db> {
30618        TokenType::from_syntax_node(db, self.node.get_children(db)[1])
30619    }
30620    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30621        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30622    }
30623}
30624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30625pub struct TerminalTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30626impl<'db> TerminalTypePtr<'db> {}
30627impl<'db> TypedStablePtr<'db> for TerminalTypePtr<'db> {
30628    type SyntaxNode = TerminalType<'db>;
30629    fn untyped(self) -> SyntaxStablePtrId<'db> {
30630        self.0
30631    }
30632    fn lookup(&self, db: &'db dyn Database) -> TerminalType<'db> {
30633        TerminalType::from_syntax_node(db, self.0.lookup(db))
30634    }
30635}
30636impl<'db> From<TerminalTypePtr<'db>> for SyntaxStablePtrId<'db> {
30637    fn from(ptr: TerminalTypePtr<'db>) -> Self {
30638        ptr.untyped()
30639    }
30640}
30641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30642pub struct TerminalTypeGreen<'db>(pub GreenId<'db>);
30643impl<'db> TypedSyntaxNode<'db> for TerminalType<'db> {
30644    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
30645    type StablePtr = TerminalTypePtr<'db>;
30646    type Green = TerminalTypeGreen<'db>;
30647    fn missing(db: &'db dyn Database) -> Self::Green {
30648        TerminalTypeGreen(
30649            GreenNode {
30650                kind: SyntaxKind::TerminalType,
30651                details: GreenNodeDetails::Node {
30652                    children: [
30653                        Trivia::missing(db).0,
30654                        TokenType::missing(db).0,
30655                        Trivia::missing(db).0,
30656                    ]
30657                    .into(),
30658                    width: TextWidth::default(),
30659                },
30660            }
30661            .intern(db),
30662        )
30663    }
30664    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30665        let kind = node.kind(db);
30666        assert_eq!(
30667            kind,
30668            SyntaxKind::TerminalType,
30669            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30670            kind,
30671            SyntaxKind::TerminalType
30672        );
30673        Self { node }
30674    }
30675    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30676        let kind = node.kind(db);
30677        if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
30678    }
30679    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30680        self.node
30681    }
30682    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30683        TerminalTypePtr(self.node.stable_ptr(db))
30684    }
30685}
30686#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30687pub struct TokenUse<'db> {
30688    node: SyntaxNode<'db>,
30689}
30690impl<'db> Token<'db> for TokenUse<'db> {
30691    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30692        TokenUseGreen(
30693            GreenNode { kind: SyntaxKind::TokenUse, details: GreenNodeDetails::Token(text) }
30694                .intern(db),
30695        )
30696    }
30697    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30698        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30699    }
30700}
30701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30702pub struct TokenUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30703impl<'db> TypedStablePtr<'db> for TokenUsePtr<'db> {
30704    type SyntaxNode = TokenUse<'db>;
30705    fn untyped(self) -> SyntaxStablePtrId<'db> {
30706        self.0
30707    }
30708    fn lookup(&self, db: &'db dyn Database) -> TokenUse<'db> {
30709        TokenUse::from_syntax_node(db, self.0.lookup(db))
30710    }
30711}
30712impl<'db> From<TokenUsePtr<'db>> for SyntaxStablePtrId<'db> {
30713    fn from(ptr: TokenUsePtr<'db>) -> Self {
30714        ptr.untyped()
30715    }
30716}
30717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30718pub struct TokenUseGreen<'db>(pub GreenId<'db>);
30719impl<'db> TokenUseGreen<'db> {
30720    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30721        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30722    }
30723}
30724impl<'db> TypedSyntaxNode<'db> for TokenUse<'db> {
30725    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
30726    type StablePtr = TokenUsePtr<'db>;
30727    type Green = TokenUseGreen<'db>;
30728    fn missing(db: &'db dyn Database) -> Self::Green {
30729        TokenUseGreen(
30730            GreenNode {
30731                kind: SyntaxKind::TokenMissing,
30732                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30733            }
30734            .intern(db),
30735        )
30736    }
30737    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30738        match node.green_node(db).details {
30739            GreenNodeDetails::Token(_) => Self { node },
30740            GreenNodeDetails::Node { .. } => {
30741                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
30742            }
30743        }
30744    }
30745    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30746        match node.green_node(db).details {
30747            GreenNodeDetails::Token(_) => Some(Self { node }),
30748            GreenNodeDetails::Node { .. } => None,
30749        }
30750    }
30751    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30752        self.node
30753    }
30754    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30755        TokenUsePtr(self.node.stable_ptr(db))
30756    }
30757}
30758#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30759pub struct TerminalUse<'db> {
30760    node: SyntaxNode<'db>,
30761}
30762impl<'db> Terminal<'db> for TerminalUse<'db> {
30763    const KIND: SyntaxKind = SyntaxKind::TerminalUse;
30764    type TokenType = TokenUse<'db>;
30765    fn new_green(
30766        db: &'db dyn Database,
30767        leading_trivia: TriviaGreen<'db>,
30768        token: <<TerminalUse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30769        trailing_trivia: TriviaGreen<'db>,
30770    ) -> Self::Green {
30771        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30772        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30773        TerminalUseGreen(
30774            GreenNode {
30775                kind: SyntaxKind::TerminalUse,
30776                details: GreenNodeDetails::Node { children: children.into(), width },
30777            }
30778            .intern(db),
30779        )
30780    }
30781    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30782        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30783            unreachable!("Expected a node, not a token");
30784        };
30785        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30786    }
30787}
30788impl<'db> TerminalUse<'db> {
30789    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30790        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30791    }
30792    pub fn token(&self, db: &'db dyn Database) -> TokenUse<'db> {
30793        TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
30794    }
30795    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30796        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30797    }
30798}
30799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30800pub struct TerminalUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30801impl<'db> TerminalUsePtr<'db> {}
30802impl<'db> TypedStablePtr<'db> for TerminalUsePtr<'db> {
30803    type SyntaxNode = TerminalUse<'db>;
30804    fn untyped(self) -> SyntaxStablePtrId<'db> {
30805        self.0
30806    }
30807    fn lookup(&self, db: &'db dyn Database) -> TerminalUse<'db> {
30808        TerminalUse::from_syntax_node(db, self.0.lookup(db))
30809    }
30810}
30811impl<'db> From<TerminalUsePtr<'db>> for SyntaxStablePtrId<'db> {
30812    fn from(ptr: TerminalUsePtr<'db>) -> Self {
30813        ptr.untyped()
30814    }
30815}
30816#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30817pub struct TerminalUseGreen<'db>(pub GreenId<'db>);
30818impl<'db> TypedSyntaxNode<'db> for TerminalUse<'db> {
30819    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
30820    type StablePtr = TerminalUsePtr<'db>;
30821    type Green = TerminalUseGreen<'db>;
30822    fn missing(db: &'db dyn Database) -> Self::Green {
30823        TerminalUseGreen(
30824            GreenNode {
30825                kind: SyntaxKind::TerminalUse,
30826                details: GreenNodeDetails::Node {
30827                    children: [
30828                        Trivia::missing(db).0,
30829                        TokenUse::missing(db).0,
30830                        Trivia::missing(db).0,
30831                    ]
30832                    .into(),
30833                    width: TextWidth::default(),
30834                },
30835            }
30836            .intern(db),
30837        )
30838    }
30839    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30840        let kind = node.kind(db);
30841        assert_eq!(
30842            kind,
30843            SyntaxKind::TerminalUse,
30844            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30845            kind,
30846            SyntaxKind::TerminalUse
30847        );
30848        Self { node }
30849    }
30850    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30851        let kind = node.kind(db);
30852        if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
30853    }
30854    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30855        self.node
30856    }
30857    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30858        TerminalUsePtr(self.node.stable_ptr(db))
30859    }
30860}
30861#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30862pub struct TokenPub<'db> {
30863    node: SyntaxNode<'db>,
30864}
30865impl<'db> Token<'db> for TokenPub<'db> {
30866    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30867        TokenPubGreen(
30868            GreenNode { kind: SyntaxKind::TokenPub, details: GreenNodeDetails::Token(text) }
30869                .intern(db),
30870        )
30871    }
30872    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30873        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30874    }
30875}
30876#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30877pub struct TokenPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30878impl<'db> TypedStablePtr<'db> for TokenPubPtr<'db> {
30879    type SyntaxNode = TokenPub<'db>;
30880    fn untyped(self) -> SyntaxStablePtrId<'db> {
30881        self.0
30882    }
30883    fn lookup(&self, db: &'db dyn Database) -> TokenPub<'db> {
30884        TokenPub::from_syntax_node(db, self.0.lookup(db))
30885    }
30886}
30887impl<'db> From<TokenPubPtr<'db>> for SyntaxStablePtrId<'db> {
30888    fn from(ptr: TokenPubPtr<'db>) -> Self {
30889        ptr.untyped()
30890    }
30891}
30892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30893pub struct TokenPubGreen<'db>(pub GreenId<'db>);
30894impl<'db> TokenPubGreen<'db> {
30895    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30896        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30897    }
30898}
30899impl<'db> TypedSyntaxNode<'db> for TokenPub<'db> {
30900    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
30901    type StablePtr = TokenPubPtr<'db>;
30902    type Green = TokenPubGreen<'db>;
30903    fn missing(db: &'db dyn Database) -> Self::Green {
30904        TokenPubGreen(
30905            GreenNode {
30906                kind: SyntaxKind::TokenMissing,
30907                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30908            }
30909            .intern(db),
30910        )
30911    }
30912    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30913        match node.green_node(db).details {
30914            GreenNodeDetails::Token(_) => Self { node },
30915            GreenNodeDetails::Node { .. } => {
30916                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
30917            }
30918        }
30919    }
30920    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30921        match node.green_node(db).details {
30922            GreenNodeDetails::Token(_) => Some(Self { node }),
30923            GreenNodeDetails::Node { .. } => None,
30924        }
30925    }
30926    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30927        self.node
30928    }
30929    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30930        TokenPubPtr(self.node.stable_ptr(db))
30931    }
30932}
30933#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30934pub struct TerminalPub<'db> {
30935    node: SyntaxNode<'db>,
30936}
30937impl<'db> Terminal<'db> for TerminalPub<'db> {
30938    const KIND: SyntaxKind = SyntaxKind::TerminalPub;
30939    type TokenType = TokenPub<'db>;
30940    fn new_green(
30941        db: &'db dyn Database,
30942        leading_trivia: TriviaGreen<'db>,
30943        token: <<TerminalPub<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30944        trailing_trivia: TriviaGreen<'db>,
30945    ) -> Self::Green {
30946        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30947        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30948        TerminalPubGreen(
30949            GreenNode {
30950                kind: SyntaxKind::TerminalPub,
30951                details: GreenNodeDetails::Node { children: children.into(), width },
30952            }
30953            .intern(db),
30954        )
30955    }
30956    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30957        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30958            unreachable!("Expected a node, not a token");
30959        };
30960        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30961    }
30962}
30963impl<'db> TerminalPub<'db> {
30964    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30965        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30966    }
30967    pub fn token(&self, db: &'db dyn Database) -> TokenPub<'db> {
30968        TokenPub::from_syntax_node(db, self.node.get_children(db)[1])
30969    }
30970    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30971        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30972    }
30973}
30974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30975pub struct TerminalPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30976impl<'db> TerminalPubPtr<'db> {}
30977impl<'db> TypedStablePtr<'db> for TerminalPubPtr<'db> {
30978    type SyntaxNode = TerminalPub<'db>;
30979    fn untyped(self) -> SyntaxStablePtrId<'db> {
30980        self.0
30981    }
30982    fn lookup(&self, db: &'db dyn Database) -> TerminalPub<'db> {
30983        TerminalPub::from_syntax_node(db, self.0.lookup(db))
30984    }
30985}
30986impl<'db> From<TerminalPubPtr<'db>> for SyntaxStablePtrId<'db> {
30987    fn from(ptr: TerminalPubPtr<'db>) -> Self {
30988        ptr.untyped()
30989    }
30990}
30991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30992pub struct TerminalPubGreen<'db>(pub GreenId<'db>);
30993impl<'db> TypedSyntaxNode<'db> for TerminalPub<'db> {
30994    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
30995    type StablePtr = TerminalPubPtr<'db>;
30996    type Green = TerminalPubGreen<'db>;
30997    fn missing(db: &'db dyn Database) -> Self::Green {
30998        TerminalPubGreen(
30999            GreenNode {
31000                kind: SyntaxKind::TerminalPub,
31001                details: GreenNodeDetails::Node {
31002                    children: [
31003                        Trivia::missing(db).0,
31004                        TokenPub::missing(db).0,
31005                        Trivia::missing(db).0,
31006                    ]
31007                    .into(),
31008                    width: TextWidth::default(),
31009                },
31010            }
31011            .intern(db),
31012        )
31013    }
31014    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31015        let kind = node.kind(db);
31016        assert_eq!(
31017            kind,
31018            SyntaxKind::TerminalPub,
31019            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31020            kind,
31021            SyntaxKind::TerminalPub
31022        );
31023        Self { node }
31024    }
31025    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31026        let kind = node.kind(db);
31027        if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
31028    }
31029    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31030        self.node
31031    }
31032    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31033        TerminalPubPtr(self.node.stable_ptr(db))
31034    }
31035}
31036#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31037pub struct TokenAnd<'db> {
31038    node: SyntaxNode<'db>,
31039}
31040impl<'db> Token<'db> for TokenAnd<'db> {
31041    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31042        TokenAndGreen(
31043            GreenNode { kind: SyntaxKind::TokenAnd, details: GreenNodeDetails::Token(text) }
31044                .intern(db),
31045        )
31046    }
31047    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31048        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31049    }
31050}
31051#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31052pub struct TokenAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31053impl<'db> TypedStablePtr<'db> for TokenAndPtr<'db> {
31054    type SyntaxNode = TokenAnd<'db>;
31055    fn untyped(self) -> SyntaxStablePtrId<'db> {
31056        self.0
31057    }
31058    fn lookup(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31059        TokenAnd::from_syntax_node(db, self.0.lookup(db))
31060    }
31061}
31062impl<'db> From<TokenAndPtr<'db>> for SyntaxStablePtrId<'db> {
31063    fn from(ptr: TokenAndPtr<'db>) -> Self {
31064        ptr.untyped()
31065    }
31066}
31067#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31068pub struct TokenAndGreen<'db>(pub GreenId<'db>);
31069impl<'db> TokenAndGreen<'db> {
31070    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31071        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31072    }
31073}
31074impl<'db> TypedSyntaxNode<'db> for TokenAnd<'db> {
31075    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
31076    type StablePtr = TokenAndPtr<'db>;
31077    type Green = TokenAndGreen<'db>;
31078    fn missing(db: &'db dyn Database) -> Self::Green {
31079        TokenAndGreen(
31080            GreenNode {
31081                kind: SyntaxKind::TokenMissing,
31082                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31083            }
31084            .intern(db),
31085        )
31086    }
31087    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31088        match node.green_node(db).details {
31089            GreenNodeDetails::Token(_) => Self { node },
31090            GreenNodeDetails::Node { .. } => {
31091                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
31092            }
31093        }
31094    }
31095    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31096        match node.green_node(db).details {
31097            GreenNodeDetails::Token(_) => Some(Self { node }),
31098            GreenNodeDetails::Node { .. } => None,
31099        }
31100    }
31101    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31102        self.node
31103    }
31104    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31105        TokenAndPtr(self.node.stable_ptr(db))
31106    }
31107}
31108#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31109pub struct TerminalAnd<'db> {
31110    node: SyntaxNode<'db>,
31111}
31112impl<'db> Terminal<'db> for TerminalAnd<'db> {
31113    const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
31114    type TokenType = TokenAnd<'db>;
31115    fn new_green(
31116        db: &'db dyn Database,
31117        leading_trivia: TriviaGreen<'db>,
31118        token: <<TerminalAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31119        trailing_trivia: TriviaGreen<'db>,
31120    ) -> Self::Green {
31121        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31122        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31123        TerminalAndGreen(
31124            GreenNode {
31125                kind: SyntaxKind::TerminalAnd,
31126                details: GreenNodeDetails::Node { children: children.into(), width },
31127            }
31128            .intern(db),
31129        )
31130    }
31131    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31132        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31133            unreachable!("Expected a node, not a token");
31134        };
31135        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31136    }
31137}
31138impl<'db> TerminalAnd<'db> {
31139    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31140        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31141    }
31142    pub fn token(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31143        TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
31144    }
31145    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31146        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31147    }
31148}
31149#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31150pub struct TerminalAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31151impl<'db> TerminalAndPtr<'db> {}
31152impl<'db> TypedStablePtr<'db> for TerminalAndPtr<'db> {
31153    type SyntaxNode = TerminalAnd<'db>;
31154    fn untyped(self) -> SyntaxStablePtrId<'db> {
31155        self.0
31156    }
31157    fn lookup(&self, db: &'db dyn Database) -> TerminalAnd<'db> {
31158        TerminalAnd::from_syntax_node(db, self.0.lookup(db))
31159    }
31160}
31161impl<'db> From<TerminalAndPtr<'db>> for SyntaxStablePtrId<'db> {
31162    fn from(ptr: TerminalAndPtr<'db>) -> Self {
31163        ptr.untyped()
31164    }
31165}
31166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31167pub struct TerminalAndGreen<'db>(pub GreenId<'db>);
31168impl<'db> TypedSyntaxNode<'db> for TerminalAnd<'db> {
31169    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
31170    type StablePtr = TerminalAndPtr<'db>;
31171    type Green = TerminalAndGreen<'db>;
31172    fn missing(db: &'db dyn Database) -> Self::Green {
31173        TerminalAndGreen(
31174            GreenNode {
31175                kind: SyntaxKind::TerminalAnd,
31176                details: GreenNodeDetails::Node {
31177                    children: [
31178                        Trivia::missing(db).0,
31179                        TokenAnd::missing(db).0,
31180                        Trivia::missing(db).0,
31181                    ]
31182                    .into(),
31183                    width: TextWidth::default(),
31184                },
31185            }
31186            .intern(db),
31187        )
31188    }
31189    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31190        let kind = node.kind(db);
31191        assert_eq!(
31192            kind,
31193            SyntaxKind::TerminalAnd,
31194            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31195            kind,
31196            SyntaxKind::TerminalAnd
31197        );
31198        Self { node }
31199    }
31200    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31201        let kind = node.kind(db);
31202        if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
31203    }
31204    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31205        self.node
31206    }
31207    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31208        TerminalAndPtr(self.node.stable_ptr(db))
31209    }
31210}
31211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31212pub struct TokenAndAnd<'db> {
31213    node: SyntaxNode<'db>,
31214}
31215impl<'db> Token<'db> for TokenAndAnd<'db> {
31216    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31217        TokenAndAndGreen(
31218            GreenNode { kind: SyntaxKind::TokenAndAnd, details: GreenNodeDetails::Token(text) }
31219                .intern(db),
31220        )
31221    }
31222    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31223        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31224    }
31225}
31226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31227pub struct TokenAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31228impl<'db> TypedStablePtr<'db> for TokenAndAndPtr<'db> {
31229    type SyntaxNode = TokenAndAnd<'db>;
31230    fn untyped(self) -> SyntaxStablePtrId<'db> {
31231        self.0
31232    }
31233    fn lookup(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31234        TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
31235    }
31236}
31237impl<'db> From<TokenAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31238    fn from(ptr: TokenAndAndPtr<'db>) -> Self {
31239        ptr.untyped()
31240    }
31241}
31242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31243pub struct TokenAndAndGreen<'db>(pub GreenId<'db>);
31244impl<'db> TokenAndAndGreen<'db> {
31245    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31246        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31247    }
31248}
31249impl<'db> TypedSyntaxNode<'db> for TokenAndAnd<'db> {
31250    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
31251    type StablePtr = TokenAndAndPtr<'db>;
31252    type Green = TokenAndAndGreen<'db>;
31253    fn missing(db: &'db dyn Database) -> Self::Green {
31254        TokenAndAndGreen(
31255            GreenNode {
31256                kind: SyntaxKind::TokenMissing,
31257                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31258            }
31259            .intern(db),
31260        )
31261    }
31262    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31263        match node.green_node(db).details {
31264            GreenNodeDetails::Token(_) => Self { node },
31265            GreenNodeDetails::Node { .. } => {
31266                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31267            }
31268        }
31269    }
31270    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31271        match node.green_node(db).details {
31272            GreenNodeDetails::Token(_) => Some(Self { node }),
31273            GreenNodeDetails::Node { .. } => None,
31274        }
31275    }
31276    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31277        self.node
31278    }
31279    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31280        TokenAndAndPtr(self.node.stable_ptr(db))
31281    }
31282}
31283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31284pub struct TerminalAndAnd<'db> {
31285    node: SyntaxNode<'db>,
31286}
31287impl<'db> Terminal<'db> for TerminalAndAnd<'db> {
31288    const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31289    type TokenType = TokenAndAnd<'db>;
31290    fn new_green(
31291        db: &'db dyn Database,
31292        leading_trivia: TriviaGreen<'db>,
31293        token: <<TerminalAndAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31294        trailing_trivia: TriviaGreen<'db>,
31295    ) -> Self::Green {
31296        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31297        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31298        TerminalAndAndGreen(
31299            GreenNode {
31300                kind: SyntaxKind::TerminalAndAnd,
31301                details: GreenNodeDetails::Node { children: children.into(), width },
31302            }
31303            .intern(db),
31304        )
31305    }
31306    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31307        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31308            unreachable!("Expected a node, not a token");
31309        };
31310        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31311    }
31312}
31313impl<'db> TerminalAndAnd<'db> {
31314    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31315        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31316    }
31317    pub fn token(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31318        TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31319    }
31320    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31321        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31322    }
31323}
31324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31325pub struct TerminalAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31326impl<'db> TerminalAndAndPtr<'db> {}
31327impl<'db> TypedStablePtr<'db> for TerminalAndAndPtr<'db> {
31328    type SyntaxNode = TerminalAndAnd<'db>;
31329    fn untyped(self) -> SyntaxStablePtrId<'db> {
31330        self.0
31331    }
31332    fn lookup(&self, db: &'db dyn Database) -> TerminalAndAnd<'db> {
31333        TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31334    }
31335}
31336impl<'db> From<TerminalAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31337    fn from(ptr: TerminalAndAndPtr<'db>) -> Self {
31338        ptr.untyped()
31339    }
31340}
31341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31342pub struct TerminalAndAndGreen<'db>(pub GreenId<'db>);
31343impl<'db> TypedSyntaxNode<'db> for TerminalAndAnd<'db> {
31344    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31345    type StablePtr = TerminalAndAndPtr<'db>;
31346    type Green = TerminalAndAndGreen<'db>;
31347    fn missing(db: &'db dyn Database) -> Self::Green {
31348        TerminalAndAndGreen(
31349            GreenNode {
31350                kind: SyntaxKind::TerminalAndAnd,
31351                details: GreenNodeDetails::Node {
31352                    children: [
31353                        Trivia::missing(db).0,
31354                        TokenAndAnd::missing(db).0,
31355                        Trivia::missing(db).0,
31356                    ]
31357                    .into(),
31358                    width: TextWidth::default(),
31359                },
31360            }
31361            .intern(db),
31362        )
31363    }
31364    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31365        let kind = node.kind(db);
31366        assert_eq!(
31367            kind,
31368            SyntaxKind::TerminalAndAnd,
31369            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31370            kind,
31371            SyntaxKind::TerminalAndAnd
31372        );
31373        Self { node }
31374    }
31375    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31376        let kind = node.kind(db);
31377        if kind == SyntaxKind::TerminalAndAnd {
31378            Some(Self::from_syntax_node(db, node))
31379        } else {
31380            None
31381        }
31382    }
31383    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31384        self.node
31385    }
31386    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31387        TerminalAndAndPtr(self.node.stable_ptr(db))
31388    }
31389}
31390#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31391pub struct TokenArrow<'db> {
31392    node: SyntaxNode<'db>,
31393}
31394impl<'db> Token<'db> for TokenArrow<'db> {
31395    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31396        TokenArrowGreen(
31397            GreenNode { kind: SyntaxKind::TokenArrow, details: GreenNodeDetails::Token(text) }
31398                .intern(db),
31399        )
31400    }
31401    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31402        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31403    }
31404}
31405#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31406pub struct TokenArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31407impl<'db> TypedStablePtr<'db> for TokenArrowPtr<'db> {
31408    type SyntaxNode = TokenArrow<'db>;
31409    fn untyped(self) -> SyntaxStablePtrId<'db> {
31410        self.0
31411    }
31412    fn lookup(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31413        TokenArrow::from_syntax_node(db, self.0.lookup(db))
31414    }
31415}
31416impl<'db> From<TokenArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31417    fn from(ptr: TokenArrowPtr<'db>) -> Self {
31418        ptr.untyped()
31419    }
31420}
31421#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31422pub struct TokenArrowGreen<'db>(pub GreenId<'db>);
31423impl<'db> TokenArrowGreen<'db> {
31424    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31425        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31426    }
31427}
31428impl<'db> TypedSyntaxNode<'db> for TokenArrow<'db> {
31429    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31430    type StablePtr = TokenArrowPtr<'db>;
31431    type Green = TokenArrowGreen<'db>;
31432    fn missing(db: &'db dyn Database) -> Self::Green {
31433        TokenArrowGreen(
31434            GreenNode {
31435                kind: SyntaxKind::TokenMissing,
31436                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31437            }
31438            .intern(db),
31439        )
31440    }
31441    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31442        match node.green_node(db).details {
31443            GreenNodeDetails::Token(_) => Self { node },
31444            GreenNodeDetails::Node { .. } => {
31445                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31446            }
31447        }
31448    }
31449    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31450        match node.green_node(db).details {
31451            GreenNodeDetails::Token(_) => Some(Self { node }),
31452            GreenNodeDetails::Node { .. } => None,
31453        }
31454    }
31455    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31456        self.node
31457    }
31458    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31459        TokenArrowPtr(self.node.stable_ptr(db))
31460    }
31461}
31462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31463pub struct TerminalArrow<'db> {
31464    node: SyntaxNode<'db>,
31465}
31466impl<'db> Terminal<'db> for TerminalArrow<'db> {
31467    const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31468    type TokenType = TokenArrow<'db>;
31469    fn new_green(
31470        db: &'db dyn Database,
31471        leading_trivia: TriviaGreen<'db>,
31472        token: <<TerminalArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31473        trailing_trivia: TriviaGreen<'db>,
31474    ) -> Self::Green {
31475        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31476        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31477        TerminalArrowGreen(
31478            GreenNode {
31479                kind: SyntaxKind::TerminalArrow,
31480                details: GreenNodeDetails::Node { children: children.into(), width },
31481            }
31482            .intern(db),
31483        )
31484    }
31485    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31486        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31487            unreachable!("Expected a node, not a token");
31488        };
31489        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31490    }
31491}
31492impl<'db> TerminalArrow<'db> {
31493    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31494        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31495    }
31496    pub fn token(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31497        TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31498    }
31499    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31500        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31501    }
31502}
31503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31504pub struct TerminalArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31505impl<'db> TerminalArrowPtr<'db> {}
31506impl<'db> TypedStablePtr<'db> for TerminalArrowPtr<'db> {
31507    type SyntaxNode = TerminalArrow<'db>;
31508    fn untyped(self) -> SyntaxStablePtrId<'db> {
31509        self.0
31510    }
31511    fn lookup(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
31512        TerminalArrow::from_syntax_node(db, self.0.lookup(db))
31513    }
31514}
31515impl<'db> From<TerminalArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31516    fn from(ptr: TerminalArrowPtr<'db>) -> Self {
31517        ptr.untyped()
31518    }
31519}
31520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31521pub struct TerminalArrowGreen<'db>(pub GreenId<'db>);
31522impl<'db> TypedSyntaxNode<'db> for TerminalArrow<'db> {
31523    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
31524    type StablePtr = TerminalArrowPtr<'db>;
31525    type Green = TerminalArrowGreen<'db>;
31526    fn missing(db: &'db dyn Database) -> Self::Green {
31527        TerminalArrowGreen(
31528            GreenNode {
31529                kind: SyntaxKind::TerminalArrow,
31530                details: GreenNodeDetails::Node {
31531                    children: [
31532                        Trivia::missing(db).0,
31533                        TokenArrow::missing(db).0,
31534                        Trivia::missing(db).0,
31535                    ]
31536                    .into(),
31537                    width: TextWidth::default(),
31538                },
31539            }
31540            .intern(db),
31541        )
31542    }
31543    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31544        let kind = node.kind(db);
31545        assert_eq!(
31546            kind,
31547            SyntaxKind::TerminalArrow,
31548            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31549            kind,
31550            SyntaxKind::TerminalArrow
31551        );
31552        Self { node }
31553    }
31554    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31555        let kind = node.kind(db);
31556        if kind == SyntaxKind::TerminalArrow {
31557            Some(Self::from_syntax_node(db, node))
31558        } else {
31559            None
31560        }
31561    }
31562    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31563        self.node
31564    }
31565    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31566        TerminalArrowPtr(self.node.stable_ptr(db))
31567    }
31568}
31569#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31570pub struct TokenAt<'db> {
31571    node: SyntaxNode<'db>,
31572}
31573impl<'db> Token<'db> for TokenAt<'db> {
31574    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31575        TokenAtGreen(
31576            GreenNode { kind: SyntaxKind::TokenAt, details: GreenNodeDetails::Token(text) }
31577                .intern(db),
31578        )
31579    }
31580    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31581        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31582    }
31583}
31584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31585pub struct TokenAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31586impl<'db> TypedStablePtr<'db> for TokenAtPtr<'db> {
31587    type SyntaxNode = TokenAt<'db>;
31588    fn untyped(self) -> SyntaxStablePtrId<'db> {
31589        self.0
31590    }
31591    fn lookup(&self, db: &'db dyn Database) -> TokenAt<'db> {
31592        TokenAt::from_syntax_node(db, self.0.lookup(db))
31593    }
31594}
31595impl<'db> From<TokenAtPtr<'db>> for SyntaxStablePtrId<'db> {
31596    fn from(ptr: TokenAtPtr<'db>) -> Self {
31597        ptr.untyped()
31598    }
31599}
31600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31601pub struct TokenAtGreen<'db>(pub GreenId<'db>);
31602impl<'db> TokenAtGreen<'db> {
31603    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31604        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31605    }
31606}
31607impl<'db> TypedSyntaxNode<'db> for TokenAt<'db> {
31608    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
31609    type StablePtr = TokenAtPtr<'db>;
31610    type Green = TokenAtGreen<'db>;
31611    fn missing(db: &'db dyn Database) -> Self::Green {
31612        TokenAtGreen(
31613            GreenNode {
31614                kind: SyntaxKind::TokenMissing,
31615                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31616            }
31617            .intern(db),
31618        )
31619    }
31620    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31621        match node.green_node(db).details {
31622            GreenNodeDetails::Token(_) => Self { node },
31623            GreenNodeDetails::Node { .. } => {
31624                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
31625            }
31626        }
31627    }
31628    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31629        match node.green_node(db).details {
31630            GreenNodeDetails::Token(_) => Some(Self { node }),
31631            GreenNodeDetails::Node { .. } => None,
31632        }
31633    }
31634    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31635        self.node
31636    }
31637    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31638        TokenAtPtr(self.node.stable_ptr(db))
31639    }
31640}
31641#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31642pub struct TerminalAt<'db> {
31643    node: SyntaxNode<'db>,
31644}
31645impl<'db> Terminal<'db> for TerminalAt<'db> {
31646    const KIND: SyntaxKind = SyntaxKind::TerminalAt;
31647    type TokenType = TokenAt<'db>;
31648    fn new_green(
31649        db: &'db dyn Database,
31650        leading_trivia: TriviaGreen<'db>,
31651        token: <<TerminalAt<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31652        trailing_trivia: TriviaGreen<'db>,
31653    ) -> Self::Green {
31654        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31655        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31656        TerminalAtGreen(
31657            GreenNode {
31658                kind: SyntaxKind::TerminalAt,
31659                details: GreenNodeDetails::Node { children: children.into(), width },
31660            }
31661            .intern(db),
31662        )
31663    }
31664    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31665        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31666            unreachable!("Expected a node, not a token");
31667        };
31668        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31669    }
31670}
31671impl<'db> TerminalAt<'db> {
31672    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31673        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31674    }
31675    pub fn token(&self, db: &'db dyn Database) -> TokenAt<'db> {
31676        TokenAt::from_syntax_node(db, self.node.get_children(db)[1])
31677    }
31678    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31679        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31680    }
31681}
31682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31683pub struct TerminalAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31684impl<'db> TerminalAtPtr<'db> {}
31685impl<'db> TypedStablePtr<'db> for TerminalAtPtr<'db> {
31686    type SyntaxNode = TerminalAt<'db>;
31687    fn untyped(self) -> SyntaxStablePtrId<'db> {
31688        self.0
31689    }
31690    fn lookup(&self, db: &'db dyn Database) -> TerminalAt<'db> {
31691        TerminalAt::from_syntax_node(db, self.0.lookup(db))
31692    }
31693}
31694impl<'db> From<TerminalAtPtr<'db>> for SyntaxStablePtrId<'db> {
31695    fn from(ptr: TerminalAtPtr<'db>) -> Self {
31696        ptr.untyped()
31697    }
31698}
31699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31700pub struct TerminalAtGreen<'db>(pub GreenId<'db>);
31701impl<'db> TypedSyntaxNode<'db> for TerminalAt<'db> {
31702    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
31703    type StablePtr = TerminalAtPtr<'db>;
31704    type Green = TerminalAtGreen<'db>;
31705    fn missing(db: &'db dyn Database) -> Self::Green {
31706        TerminalAtGreen(
31707            GreenNode {
31708                kind: SyntaxKind::TerminalAt,
31709                details: GreenNodeDetails::Node {
31710                    children: [
31711                        Trivia::missing(db).0,
31712                        TokenAt::missing(db).0,
31713                        Trivia::missing(db).0,
31714                    ]
31715                    .into(),
31716                    width: TextWidth::default(),
31717                },
31718            }
31719            .intern(db),
31720        )
31721    }
31722    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31723        let kind = node.kind(db);
31724        assert_eq!(
31725            kind,
31726            SyntaxKind::TerminalAt,
31727            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31728            kind,
31729            SyntaxKind::TerminalAt
31730        );
31731        Self { node }
31732    }
31733    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31734        let kind = node.kind(db);
31735        if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
31736    }
31737    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31738        self.node
31739    }
31740    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31741        TerminalAtPtr(self.node.stable_ptr(db))
31742    }
31743}
31744#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31745pub struct TokenBadCharacters<'db> {
31746    node: SyntaxNode<'db>,
31747}
31748impl<'db> Token<'db> for TokenBadCharacters<'db> {
31749    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31750        TokenBadCharactersGreen(
31751            GreenNode {
31752                kind: SyntaxKind::TokenBadCharacters,
31753                details: GreenNodeDetails::Token(text),
31754            }
31755            .intern(db),
31756        )
31757    }
31758    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31759        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31760    }
31761}
31762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31763pub struct TokenBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31764impl<'db> TypedStablePtr<'db> for TokenBadCharactersPtr<'db> {
31765    type SyntaxNode = TokenBadCharacters<'db>;
31766    fn untyped(self) -> SyntaxStablePtrId<'db> {
31767        self.0
31768    }
31769    fn lookup(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31770        TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
31771    }
31772}
31773impl<'db> From<TokenBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31774    fn from(ptr: TokenBadCharactersPtr<'db>) -> Self {
31775        ptr.untyped()
31776    }
31777}
31778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31779pub struct TokenBadCharactersGreen<'db>(pub GreenId<'db>);
31780impl<'db> TokenBadCharactersGreen<'db> {
31781    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31782        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31783    }
31784}
31785impl<'db> TypedSyntaxNode<'db> for TokenBadCharacters<'db> {
31786    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
31787    type StablePtr = TokenBadCharactersPtr<'db>;
31788    type Green = TokenBadCharactersGreen<'db>;
31789    fn missing(db: &'db dyn Database) -> Self::Green {
31790        TokenBadCharactersGreen(
31791            GreenNode {
31792                kind: SyntaxKind::TokenMissing,
31793                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31794            }
31795            .intern(db),
31796        )
31797    }
31798    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31799        match node.green_node(db).details {
31800            GreenNodeDetails::Token(_) => Self { node },
31801            GreenNodeDetails::Node { .. } => panic!(
31802                "Expected a token {:?}, not an internal node",
31803                SyntaxKind::TokenBadCharacters
31804            ),
31805        }
31806    }
31807    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31808        match node.green_node(db).details {
31809            GreenNodeDetails::Token(_) => Some(Self { node }),
31810            GreenNodeDetails::Node { .. } => None,
31811        }
31812    }
31813    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31814        self.node
31815    }
31816    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31817        TokenBadCharactersPtr(self.node.stable_ptr(db))
31818    }
31819}
31820#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31821pub struct TerminalBadCharacters<'db> {
31822    node: SyntaxNode<'db>,
31823}
31824impl<'db> Terminal<'db> for TerminalBadCharacters<'db> {
31825    const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
31826    type TokenType = TokenBadCharacters<'db>;
31827    fn new_green(
31828        db: &'db dyn Database,
31829        leading_trivia: TriviaGreen<'db>,
31830        token: <<TerminalBadCharacters<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31831        trailing_trivia: TriviaGreen<'db>,
31832    ) -> Self::Green {
31833        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31834        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31835        TerminalBadCharactersGreen(
31836            GreenNode {
31837                kind: SyntaxKind::TerminalBadCharacters,
31838                details: GreenNodeDetails::Node { children: children.into(), width },
31839            }
31840            .intern(db),
31841        )
31842    }
31843    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31844        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31845            unreachable!("Expected a node, not a token");
31846        };
31847        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31848    }
31849}
31850impl<'db> TerminalBadCharacters<'db> {
31851    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31852        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31853    }
31854    pub fn token(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31855        TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
31856    }
31857    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31858        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31859    }
31860}
31861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31862pub struct TerminalBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31863impl<'db> TerminalBadCharactersPtr<'db> {}
31864impl<'db> TypedStablePtr<'db> for TerminalBadCharactersPtr<'db> {
31865    type SyntaxNode = TerminalBadCharacters<'db>;
31866    fn untyped(self) -> SyntaxStablePtrId<'db> {
31867        self.0
31868    }
31869    fn lookup(&self, db: &'db dyn Database) -> TerminalBadCharacters<'db> {
31870        TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
31871    }
31872}
31873impl<'db> From<TerminalBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31874    fn from(ptr: TerminalBadCharactersPtr<'db>) -> Self {
31875        ptr.untyped()
31876    }
31877}
31878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31879pub struct TerminalBadCharactersGreen<'db>(pub GreenId<'db>);
31880impl<'db> TypedSyntaxNode<'db> for TerminalBadCharacters<'db> {
31881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
31882    type StablePtr = TerminalBadCharactersPtr<'db>;
31883    type Green = TerminalBadCharactersGreen<'db>;
31884    fn missing(db: &'db dyn Database) -> Self::Green {
31885        TerminalBadCharactersGreen(
31886            GreenNode {
31887                kind: SyntaxKind::TerminalBadCharacters,
31888                details: GreenNodeDetails::Node {
31889                    children: [
31890                        Trivia::missing(db).0,
31891                        TokenBadCharacters::missing(db).0,
31892                        Trivia::missing(db).0,
31893                    ]
31894                    .into(),
31895                    width: TextWidth::default(),
31896                },
31897            }
31898            .intern(db),
31899        )
31900    }
31901    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31902        let kind = node.kind(db);
31903        assert_eq!(
31904            kind,
31905            SyntaxKind::TerminalBadCharacters,
31906            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31907            kind,
31908            SyntaxKind::TerminalBadCharacters
31909        );
31910        Self { node }
31911    }
31912    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31913        let kind = node.kind(db);
31914        if kind == SyntaxKind::TerminalBadCharacters {
31915            Some(Self::from_syntax_node(db, node))
31916        } else {
31917            None
31918        }
31919    }
31920    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31921        self.node
31922    }
31923    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31924        TerminalBadCharactersPtr(self.node.stable_ptr(db))
31925    }
31926}
31927#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31928pub struct TokenColon<'db> {
31929    node: SyntaxNode<'db>,
31930}
31931impl<'db> Token<'db> for TokenColon<'db> {
31932    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31933        TokenColonGreen(
31934            GreenNode { kind: SyntaxKind::TokenColon, details: GreenNodeDetails::Token(text) }
31935                .intern(db),
31936        )
31937    }
31938    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31939        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31940    }
31941}
31942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31943pub struct TokenColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31944impl<'db> TypedStablePtr<'db> for TokenColonPtr<'db> {
31945    type SyntaxNode = TokenColon<'db>;
31946    fn untyped(self) -> SyntaxStablePtrId<'db> {
31947        self.0
31948    }
31949    fn lookup(&self, db: &'db dyn Database) -> TokenColon<'db> {
31950        TokenColon::from_syntax_node(db, self.0.lookup(db))
31951    }
31952}
31953impl<'db> From<TokenColonPtr<'db>> for SyntaxStablePtrId<'db> {
31954    fn from(ptr: TokenColonPtr<'db>) -> Self {
31955        ptr.untyped()
31956    }
31957}
31958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31959pub struct TokenColonGreen<'db>(pub GreenId<'db>);
31960impl<'db> TokenColonGreen<'db> {
31961    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31962        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31963    }
31964}
31965impl<'db> TypedSyntaxNode<'db> for TokenColon<'db> {
31966    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
31967    type StablePtr = TokenColonPtr<'db>;
31968    type Green = TokenColonGreen<'db>;
31969    fn missing(db: &'db dyn Database) -> Self::Green {
31970        TokenColonGreen(
31971            GreenNode {
31972                kind: SyntaxKind::TokenMissing,
31973                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31974            }
31975            .intern(db),
31976        )
31977    }
31978    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31979        match node.green_node(db).details {
31980            GreenNodeDetails::Token(_) => Self { node },
31981            GreenNodeDetails::Node { .. } => {
31982                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
31983            }
31984        }
31985    }
31986    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31987        match node.green_node(db).details {
31988            GreenNodeDetails::Token(_) => Some(Self { node }),
31989            GreenNodeDetails::Node { .. } => None,
31990        }
31991    }
31992    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31993        self.node
31994    }
31995    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31996        TokenColonPtr(self.node.stable_ptr(db))
31997    }
31998}
31999#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32000pub struct TerminalColon<'db> {
32001    node: SyntaxNode<'db>,
32002}
32003impl<'db> Terminal<'db> for TerminalColon<'db> {
32004    const KIND: SyntaxKind = SyntaxKind::TerminalColon;
32005    type TokenType = TokenColon<'db>;
32006    fn new_green(
32007        db: &'db dyn Database,
32008        leading_trivia: TriviaGreen<'db>,
32009        token: <<TerminalColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32010        trailing_trivia: TriviaGreen<'db>,
32011    ) -> Self::Green {
32012        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32013        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32014        TerminalColonGreen(
32015            GreenNode {
32016                kind: SyntaxKind::TerminalColon,
32017                details: GreenNodeDetails::Node { children: children.into(), width },
32018            }
32019            .intern(db),
32020        )
32021    }
32022    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32023        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32024            unreachable!("Expected a node, not a token");
32025        };
32026        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32027    }
32028}
32029impl<'db> TerminalColon<'db> {
32030    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32031        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32032    }
32033    pub fn token(&self, db: &'db dyn Database) -> TokenColon<'db> {
32034        TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
32035    }
32036    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32037        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32038    }
32039}
32040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32041pub struct TerminalColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32042impl<'db> TerminalColonPtr<'db> {}
32043impl<'db> TypedStablePtr<'db> for TerminalColonPtr<'db> {
32044    type SyntaxNode = TerminalColon<'db>;
32045    fn untyped(self) -> SyntaxStablePtrId<'db> {
32046        self.0
32047    }
32048    fn lookup(&self, db: &'db dyn Database) -> TerminalColon<'db> {
32049        TerminalColon::from_syntax_node(db, self.0.lookup(db))
32050    }
32051}
32052impl<'db> From<TerminalColonPtr<'db>> for SyntaxStablePtrId<'db> {
32053    fn from(ptr: TerminalColonPtr<'db>) -> Self {
32054        ptr.untyped()
32055    }
32056}
32057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32058pub struct TerminalColonGreen<'db>(pub GreenId<'db>);
32059impl<'db> TypedSyntaxNode<'db> for TerminalColon<'db> {
32060    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
32061    type StablePtr = TerminalColonPtr<'db>;
32062    type Green = TerminalColonGreen<'db>;
32063    fn missing(db: &'db dyn Database) -> Self::Green {
32064        TerminalColonGreen(
32065            GreenNode {
32066                kind: SyntaxKind::TerminalColon,
32067                details: GreenNodeDetails::Node {
32068                    children: [
32069                        Trivia::missing(db).0,
32070                        TokenColon::missing(db).0,
32071                        Trivia::missing(db).0,
32072                    ]
32073                    .into(),
32074                    width: TextWidth::default(),
32075                },
32076            }
32077            .intern(db),
32078        )
32079    }
32080    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32081        let kind = node.kind(db);
32082        assert_eq!(
32083            kind,
32084            SyntaxKind::TerminalColon,
32085            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32086            kind,
32087            SyntaxKind::TerminalColon
32088        );
32089        Self { node }
32090    }
32091    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32092        let kind = node.kind(db);
32093        if kind == SyntaxKind::TerminalColon {
32094            Some(Self::from_syntax_node(db, node))
32095        } else {
32096            None
32097        }
32098    }
32099    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32100        self.node
32101    }
32102    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32103        TerminalColonPtr(self.node.stable_ptr(db))
32104    }
32105}
32106#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32107pub struct TokenColonColon<'db> {
32108    node: SyntaxNode<'db>,
32109}
32110impl<'db> Token<'db> for TokenColonColon<'db> {
32111    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32112        TokenColonColonGreen(
32113            GreenNode { kind: SyntaxKind::TokenColonColon, details: GreenNodeDetails::Token(text) }
32114                .intern(db),
32115        )
32116    }
32117    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32118        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32119    }
32120}
32121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32122pub struct TokenColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32123impl<'db> TypedStablePtr<'db> for TokenColonColonPtr<'db> {
32124    type SyntaxNode = TokenColonColon<'db>;
32125    fn untyped(self) -> SyntaxStablePtrId<'db> {
32126        self.0
32127    }
32128    fn lookup(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32129        TokenColonColon::from_syntax_node(db, self.0.lookup(db))
32130    }
32131}
32132impl<'db> From<TokenColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32133    fn from(ptr: TokenColonColonPtr<'db>) -> Self {
32134        ptr.untyped()
32135    }
32136}
32137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32138pub struct TokenColonColonGreen<'db>(pub GreenId<'db>);
32139impl<'db> TokenColonColonGreen<'db> {
32140    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32141        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32142    }
32143}
32144impl<'db> TypedSyntaxNode<'db> for TokenColonColon<'db> {
32145    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
32146    type StablePtr = TokenColonColonPtr<'db>;
32147    type Green = TokenColonColonGreen<'db>;
32148    fn missing(db: &'db dyn Database) -> Self::Green {
32149        TokenColonColonGreen(
32150            GreenNode {
32151                kind: SyntaxKind::TokenMissing,
32152                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32153            }
32154            .intern(db),
32155        )
32156    }
32157    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32158        match node.green_node(db).details {
32159            GreenNodeDetails::Token(_) => Self { node },
32160            GreenNodeDetails::Node { .. } => {
32161                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
32162            }
32163        }
32164    }
32165    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32166        match node.green_node(db).details {
32167            GreenNodeDetails::Token(_) => Some(Self { node }),
32168            GreenNodeDetails::Node { .. } => None,
32169        }
32170    }
32171    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32172        self.node
32173    }
32174    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32175        TokenColonColonPtr(self.node.stable_ptr(db))
32176    }
32177}
32178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32179pub struct TerminalColonColon<'db> {
32180    node: SyntaxNode<'db>,
32181}
32182impl<'db> Terminal<'db> for TerminalColonColon<'db> {
32183    const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
32184    type TokenType = TokenColonColon<'db>;
32185    fn new_green(
32186        db: &'db dyn Database,
32187        leading_trivia: TriviaGreen<'db>,
32188        token: <<TerminalColonColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32189        trailing_trivia: TriviaGreen<'db>,
32190    ) -> Self::Green {
32191        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32192        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32193        TerminalColonColonGreen(
32194            GreenNode {
32195                kind: SyntaxKind::TerminalColonColon,
32196                details: GreenNodeDetails::Node { children: children.into(), width },
32197            }
32198            .intern(db),
32199        )
32200    }
32201    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32202        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32203            unreachable!("Expected a node, not a token");
32204        };
32205        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32206    }
32207}
32208impl<'db> TerminalColonColon<'db> {
32209    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32210        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32211    }
32212    pub fn token(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32213        TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
32214    }
32215    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32216        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32217    }
32218}
32219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32220pub struct TerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32221impl<'db> TerminalColonColonPtr<'db> {}
32222impl<'db> TypedStablePtr<'db> for TerminalColonColonPtr<'db> {
32223    type SyntaxNode = TerminalColonColon<'db>;
32224    fn untyped(self) -> SyntaxStablePtrId<'db> {
32225        self.0
32226    }
32227    fn lookup(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
32228        TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
32229    }
32230}
32231impl<'db> From<TerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32232    fn from(ptr: TerminalColonColonPtr<'db>) -> Self {
32233        ptr.untyped()
32234    }
32235}
32236#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32237pub struct TerminalColonColonGreen<'db>(pub GreenId<'db>);
32238impl<'db> TypedSyntaxNode<'db> for TerminalColonColon<'db> {
32239    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
32240    type StablePtr = TerminalColonColonPtr<'db>;
32241    type Green = TerminalColonColonGreen<'db>;
32242    fn missing(db: &'db dyn Database) -> Self::Green {
32243        TerminalColonColonGreen(
32244            GreenNode {
32245                kind: SyntaxKind::TerminalColonColon,
32246                details: GreenNodeDetails::Node {
32247                    children: [
32248                        Trivia::missing(db).0,
32249                        TokenColonColon::missing(db).0,
32250                        Trivia::missing(db).0,
32251                    ]
32252                    .into(),
32253                    width: TextWidth::default(),
32254                },
32255            }
32256            .intern(db),
32257        )
32258    }
32259    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32260        let kind = node.kind(db);
32261        assert_eq!(
32262            kind,
32263            SyntaxKind::TerminalColonColon,
32264            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32265            kind,
32266            SyntaxKind::TerminalColonColon
32267        );
32268        Self { node }
32269    }
32270    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32271        let kind = node.kind(db);
32272        if kind == SyntaxKind::TerminalColonColon {
32273            Some(Self::from_syntax_node(db, node))
32274        } else {
32275            None
32276        }
32277    }
32278    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32279        self.node
32280    }
32281    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32282        TerminalColonColonPtr(self.node.stable_ptr(db))
32283    }
32284}
32285#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32286pub struct TokenComma<'db> {
32287    node: SyntaxNode<'db>,
32288}
32289impl<'db> Token<'db> for TokenComma<'db> {
32290    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32291        TokenCommaGreen(
32292            GreenNode { kind: SyntaxKind::TokenComma, details: GreenNodeDetails::Token(text) }
32293                .intern(db),
32294        )
32295    }
32296    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32297        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32298    }
32299}
32300#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32301pub struct TokenCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32302impl<'db> TypedStablePtr<'db> for TokenCommaPtr<'db> {
32303    type SyntaxNode = TokenComma<'db>;
32304    fn untyped(self) -> SyntaxStablePtrId<'db> {
32305        self.0
32306    }
32307    fn lookup(&self, db: &'db dyn Database) -> TokenComma<'db> {
32308        TokenComma::from_syntax_node(db, self.0.lookup(db))
32309    }
32310}
32311impl<'db> From<TokenCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32312    fn from(ptr: TokenCommaPtr<'db>) -> Self {
32313        ptr.untyped()
32314    }
32315}
32316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32317pub struct TokenCommaGreen<'db>(pub GreenId<'db>);
32318impl<'db> TokenCommaGreen<'db> {
32319    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32320        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32321    }
32322}
32323impl<'db> TypedSyntaxNode<'db> for TokenComma<'db> {
32324    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32325    type StablePtr = TokenCommaPtr<'db>;
32326    type Green = TokenCommaGreen<'db>;
32327    fn missing(db: &'db dyn Database) -> Self::Green {
32328        TokenCommaGreen(
32329            GreenNode {
32330                kind: SyntaxKind::TokenMissing,
32331                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32332            }
32333            .intern(db),
32334        )
32335    }
32336    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32337        match node.green_node(db).details {
32338            GreenNodeDetails::Token(_) => Self { node },
32339            GreenNodeDetails::Node { .. } => {
32340                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32341            }
32342        }
32343    }
32344    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32345        match node.green_node(db).details {
32346            GreenNodeDetails::Token(_) => Some(Self { node }),
32347            GreenNodeDetails::Node { .. } => None,
32348        }
32349    }
32350    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32351        self.node
32352    }
32353    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32354        TokenCommaPtr(self.node.stable_ptr(db))
32355    }
32356}
32357#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32358pub struct TerminalComma<'db> {
32359    node: SyntaxNode<'db>,
32360}
32361impl<'db> Terminal<'db> for TerminalComma<'db> {
32362    const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32363    type TokenType = TokenComma<'db>;
32364    fn new_green(
32365        db: &'db dyn Database,
32366        leading_trivia: TriviaGreen<'db>,
32367        token: <<TerminalComma<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32368        trailing_trivia: TriviaGreen<'db>,
32369    ) -> Self::Green {
32370        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32371        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32372        TerminalCommaGreen(
32373            GreenNode {
32374                kind: SyntaxKind::TerminalComma,
32375                details: GreenNodeDetails::Node { children: children.into(), width },
32376            }
32377            .intern(db),
32378        )
32379    }
32380    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32381        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32382            unreachable!("Expected a node, not a token");
32383        };
32384        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32385    }
32386}
32387impl<'db> TerminalComma<'db> {
32388    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32389        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32390    }
32391    pub fn token(&self, db: &'db dyn Database) -> TokenComma<'db> {
32392        TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32393    }
32394    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32395        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32396    }
32397}
32398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32399pub struct TerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32400impl<'db> TerminalCommaPtr<'db> {}
32401impl<'db> TypedStablePtr<'db> for TerminalCommaPtr<'db> {
32402    type SyntaxNode = TerminalComma<'db>;
32403    fn untyped(self) -> SyntaxStablePtrId<'db> {
32404        self.0
32405    }
32406    fn lookup(&self, db: &'db dyn Database) -> TerminalComma<'db> {
32407        TerminalComma::from_syntax_node(db, self.0.lookup(db))
32408    }
32409}
32410impl<'db> From<TerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32411    fn from(ptr: TerminalCommaPtr<'db>) -> Self {
32412        ptr.untyped()
32413    }
32414}
32415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32416pub struct TerminalCommaGreen<'db>(pub GreenId<'db>);
32417impl<'db> TypedSyntaxNode<'db> for TerminalComma<'db> {
32418    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32419    type StablePtr = TerminalCommaPtr<'db>;
32420    type Green = TerminalCommaGreen<'db>;
32421    fn missing(db: &'db dyn Database) -> Self::Green {
32422        TerminalCommaGreen(
32423            GreenNode {
32424                kind: SyntaxKind::TerminalComma,
32425                details: GreenNodeDetails::Node {
32426                    children: [
32427                        Trivia::missing(db).0,
32428                        TokenComma::missing(db).0,
32429                        Trivia::missing(db).0,
32430                    ]
32431                    .into(),
32432                    width: TextWidth::default(),
32433                },
32434            }
32435            .intern(db),
32436        )
32437    }
32438    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32439        let kind = node.kind(db);
32440        assert_eq!(
32441            kind,
32442            SyntaxKind::TerminalComma,
32443            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32444            kind,
32445            SyntaxKind::TerminalComma
32446        );
32447        Self { node }
32448    }
32449    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32450        let kind = node.kind(db);
32451        if kind == SyntaxKind::TerminalComma {
32452            Some(Self::from_syntax_node(db, node))
32453        } else {
32454            None
32455        }
32456    }
32457    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32458        self.node
32459    }
32460    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32461        TerminalCommaPtr(self.node.stable_ptr(db))
32462    }
32463}
32464#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32465pub struct TokenDiv<'db> {
32466    node: SyntaxNode<'db>,
32467}
32468impl<'db> Token<'db> for TokenDiv<'db> {
32469    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32470        TokenDivGreen(
32471            GreenNode { kind: SyntaxKind::TokenDiv, details: GreenNodeDetails::Token(text) }
32472                .intern(db),
32473        )
32474    }
32475    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32476        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32477    }
32478}
32479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32480pub struct TokenDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32481impl<'db> TypedStablePtr<'db> for TokenDivPtr<'db> {
32482    type SyntaxNode = TokenDiv<'db>;
32483    fn untyped(self) -> SyntaxStablePtrId<'db> {
32484        self.0
32485    }
32486    fn lookup(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32487        TokenDiv::from_syntax_node(db, self.0.lookup(db))
32488    }
32489}
32490impl<'db> From<TokenDivPtr<'db>> for SyntaxStablePtrId<'db> {
32491    fn from(ptr: TokenDivPtr<'db>) -> Self {
32492        ptr.untyped()
32493    }
32494}
32495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32496pub struct TokenDivGreen<'db>(pub GreenId<'db>);
32497impl<'db> TokenDivGreen<'db> {
32498    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32499        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32500    }
32501}
32502impl<'db> TypedSyntaxNode<'db> for TokenDiv<'db> {
32503    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
32504    type StablePtr = TokenDivPtr<'db>;
32505    type Green = TokenDivGreen<'db>;
32506    fn missing(db: &'db dyn Database) -> Self::Green {
32507        TokenDivGreen(
32508            GreenNode {
32509                kind: SyntaxKind::TokenMissing,
32510                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32511            }
32512            .intern(db),
32513        )
32514    }
32515    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32516        match node.green_node(db).details {
32517            GreenNodeDetails::Token(_) => Self { node },
32518            GreenNodeDetails::Node { .. } => {
32519                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
32520            }
32521        }
32522    }
32523    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32524        match node.green_node(db).details {
32525            GreenNodeDetails::Token(_) => Some(Self { node }),
32526            GreenNodeDetails::Node { .. } => None,
32527        }
32528    }
32529    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32530        self.node
32531    }
32532    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32533        TokenDivPtr(self.node.stable_ptr(db))
32534    }
32535}
32536#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32537pub struct TerminalDiv<'db> {
32538    node: SyntaxNode<'db>,
32539}
32540impl<'db> Terminal<'db> for TerminalDiv<'db> {
32541    const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
32542    type TokenType = TokenDiv<'db>;
32543    fn new_green(
32544        db: &'db dyn Database,
32545        leading_trivia: TriviaGreen<'db>,
32546        token: <<TerminalDiv<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32547        trailing_trivia: TriviaGreen<'db>,
32548    ) -> Self::Green {
32549        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32550        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32551        TerminalDivGreen(
32552            GreenNode {
32553                kind: SyntaxKind::TerminalDiv,
32554                details: GreenNodeDetails::Node { children: children.into(), width },
32555            }
32556            .intern(db),
32557        )
32558    }
32559    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32560        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32561            unreachable!("Expected a node, not a token");
32562        };
32563        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32564    }
32565}
32566impl<'db> TerminalDiv<'db> {
32567    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32568        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32569    }
32570    pub fn token(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32571        TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
32572    }
32573    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32574        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32575    }
32576}
32577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32578pub struct TerminalDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32579impl<'db> TerminalDivPtr<'db> {}
32580impl<'db> TypedStablePtr<'db> for TerminalDivPtr<'db> {
32581    type SyntaxNode = TerminalDiv<'db>;
32582    fn untyped(self) -> SyntaxStablePtrId<'db> {
32583        self.0
32584    }
32585    fn lookup(&self, db: &'db dyn Database) -> TerminalDiv<'db> {
32586        TerminalDiv::from_syntax_node(db, self.0.lookup(db))
32587    }
32588}
32589impl<'db> From<TerminalDivPtr<'db>> for SyntaxStablePtrId<'db> {
32590    fn from(ptr: TerminalDivPtr<'db>) -> Self {
32591        ptr.untyped()
32592    }
32593}
32594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32595pub struct TerminalDivGreen<'db>(pub GreenId<'db>);
32596impl<'db> TypedSyntaxNode<'db> for TerminalDiv<'db> {
32597    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
32598    type StablePtr = TerminalDivPtr<'db>;
32599    type Green = TerminalDivGreen<'db>;
32600    fn missing(db: &'db dyn Database) -> Self::Green {
32601        TerminalDivGreen(
32602            GreenNode {
32603                kind: SyntaxKind::TerminalDiv,
32604                details: GreenNodeDetails::Node {
32605                    children: [
32606                        Trivia::missing(db).0,
32607                        TokenDiv::missing(db).0,
32608                        Trivia::missing(db).0,
32609                    ]
32610                    .into(),
32611                    width: TextWidth::default(),
32612                },
32613            }
32614            .intern(db),
32615        )
32616    }
32617    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32618        let kind = node.kind(db);
32619        assert_eq!(
32620            kind,
32621            SyntaxKind::TerminalDiv,
32622            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32623            kind,
32624            SyntaxKind::TerminalDiv
32625        );
32626        Self { node }
32627    }
32628    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32629        let kind = node.kind(db);
32630        if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
32631    }
32632    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32633        self.node
32634    }
32635    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32636        TerminalDivPtr(self.node.stable_ptr(db))
32637    }
32638}
32639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32640pub struct TokenDivEq<'db> {
32641    node: SyntaxNode<'db>,
32642}
32643impl<'db> Token<'db> for TokenDivEq<'db> {
32644    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32645        TokenDivEqGreen(
32646            GreenNode { kind: SyntaxKind::TokenDivEq, details: GreenNodeDetails::Token(text) }
32647                .intern(db),
32648        )
32649    }
32650    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32651        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32652    }
32653}
32654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32655pub struct TokenDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32656impl<'db> TypedStablePtr<'db> for TokenDivEqPtr<'db> {
32657    type SyntaxNode = TokenDivEq<'db>;
32658    fn untyped(self) -> SyntaxStablePtrId<'db> {
32659        self.0
32660    }
32661    fn lookup(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32662        TokenDivEq::from_syntax_node(db, self.0.lookup(db))
32663    }
32664}
32665impl<'db> From<TokenDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32666    fn from(ptr: TokenDivEqPtr<'db>) -> Self {
32667        ptr.untyped()
32668    }
32669}
32670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32671pub struct TokenDivEqGreen<'db>(pub GreenId<'db>);
32672impl<'db> TokenDivEqGreen<'db> {
32673    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32674        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32675    }
32676}
32677impl<'db> TypedSyntaxNode<'db> for TokenDivEq<'db> {
32678    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
32679    type StablePtr = TokenDivEqPtr<'db>;
32680    type Green = TokenDivEqGreen<'db>;
32681    fn missing(db: &'db dyn Database) -> Self::Green {
32682        TokenDivEqGreen(
32683            GreenNode {
32684                kind: SyntaxKind::TokenMissing,
32685                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32686            }
32687            .intern(db),
32688        )
32689    }
32690    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32691        match node.green_node(db).details {
32692            GreenNodeDetails::Token(_) => Self { node },
32693            GreenNodeDetails::Node { .. } => {
32694                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
32695            }
32696        }
32697    }
32698    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32699        match node.green_node(db).details {
32700            GreenNodeDetails::Token(_) => Some(Self { node }),
32701            GreenNodeDetails::Node { .. } => None,
32702        }
32703    }
32704    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32705        self.node
32706    }
32707    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32708        TokenDivEqPtr(self.node.stable_ptr(db))
32709    }
32710}
32711#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32712pub struct TerminalDivEq<'db> {
32713    node: SyntaxNode<'db>,
32714}
32715impl<'db> Terminal<'db> for TerminalDivEq<'db> {
32716    const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
32717    type TokenType = TokenDivEq<'db>;
32718    fn new_green(
32719        db: &'db dyn Database,
32720        leading_trivia: TriviaGreen<'db>,
32721        token: <<TerminalDivEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32722        trailing_trivia: TriviaGreen<'db>,
32723    ) -> Self::Green {
32724        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32725        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32726        TerminalDivEqGreen(
32727            GreenNode {
32728                kind: SyntaxKind::TerminalDivEq,
32729                details: GreenNodeDetails::Node { children: children.into(), width },
32730            }
32731            .intern(db),
32732        )
32733    }
32734    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32735        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32736            unreachable!("Expected a node, not a token");
32737        };
32738        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32739    }
32740}
32741impl<'db> TerminalDivEq<'db> {
32742    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32743        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32744    }
32745    pub fn token(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32746        TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
32747    }
32748    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32749        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32750    }
32751}
32752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32753pub struct TerminalDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32754impl<'db> TerminalDivEqPtr<'db> {}
32755impl<'db> TypedStablePtr<'db> for TerminalDivEqPtr<'db> {
32756    type SyntaxNode = TerminalDivEq<'db>;
32757    fn untyped(self) -> SyntaxStablePtrId<'db> {
32758        self.0
32759    }
32760    fn lookup(&self, db: &'db dyn Database) -> TerminalDivEq<'db> {
32761        TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
32762    }
32763}
32764impl<'db> From<TerminalDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32765    fn from(ptr: TerminalDivEqPtr<'db>) -> Self {
32766        ptr.untyped()
32767    }
32768}
32769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32770pub struct TerminalDivEqGreen<'db>(pub GreenId<'db>);
32771impl<'db> TypedSyntaxNode<'db> for TerminalDivEq<'db> {
32772    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
32773    type StablePtr = TerminalDivEqPtr<'db>;
32774    type Green = TerminalDivEqGreen<'db>;
32775    fn missing(db: &'db dyn Database) -> Self::Green {
32776        TerminalDivEqGreen(
32777            GreenNode {
32778                kind: SyntaxKind::TerminalDivEq,
32779                details: GreenNodeDetails::Node {
32780                    children: [
32781                        Trivia::missing(db).0,
32782                        TokenDivEq::missing(db).0,
32783                        Trivia::missing(db).0,
32784                    ]
32785                    .into(),
32786                    width: TextWidth::default(),
32787                },
32788            }
32789            .intern(db),
32790        )
32791    }
32792    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32793        let kind = node.kind(db);
32794        assert_eq!(
32795            kind,
32796            SyntaxKind::TerminalDivEq,
32797            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32798            kind,
32799            SyntaxKind::TerminalDivEq
32800        );
32801        Self { node }
32802    }
32803    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32804        let kind = node.kind(db);
32805        if kind == SyntaxKind::TerminalDivEq {
32806            Some(Self::from_syntax_node(db, node))
32807        } else {
32808            None
32809        }
32810    }
32811    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32812        self.node
32813    }
32814    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32815        TerminalDivEqPtr(self.node.stable_ptr(db))
32816    }
32817}
32818#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32819pub struct TokenDollar<'db> {
32820    node: SyntaxNode<'db>,
32821}
32822impl<'db> Token<'db> for TokenDollar<'db> {
32823    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32824        TokenDollarGreen(
32825            GreenNode { kind: SyntaxKind::TokenDollar, details: GreenNodeDetails::Token(text) }
32826                .intern(db),
32827        )
32828    }
32829    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32830        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32831    }
32832}
32833#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32834pub struct TokenDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32835impl<'db> TypedStablePtr<'db> for TokenDollarPtr<'db> {
32836    type SyntaxNode = TokenDollar<'db>;
32837    fn untyped(self) -> SyntaxStablePtrId<'db> {
32838        self.0
32839    }
32840    fn lookup(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32841        TokenDollar::from_syntax_node(db, self.0.lookup(db))
32842    }
32843}
32844impl<'db> From<TokenDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32845    fn from(ptr: TokenDollarPtr<'db>) -> Self {
32846        ptr.untyped()
32847    }
32848}
32849#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32850pub struct TokenDollarGreen<'db>(pub GreenId<'db>);
32851impl<'db> TokenDollarGreen<'db> {
32852    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32853        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32854    }
32855}
32856impl<'db> TypedSyntaxNode<'db> for TokenDollar<'db> {
32857    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
32858    type StablePtr = TokenDollarPtr<'db>;
32859    type Green = TokenDollarGreen<'db>;
32860    fn missing(db: &'db dyn Database) -> Self::Green {
32861        TokenDollarGreen(
32862            GreenNode {
32863                kind: SyntaxKind::TokenMissing,
32864                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32865            }
32866            .intern(db),
32867        )
32868    }
32869    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32870        match node.green_node(db).details {
32871            GreenNodeDetails::Token(_) => Self { node },
32872            GreenNodeDetails::Node { .. } => {
32873                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
32874            }
32875        }
32876    }
32877    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32878        match node.green_node(db).details {
32879            GreenNodeDetails::Token(_) => Some(Self { node }),
32880            GreenNodeDetails::Node { .. } => None,
32881        }
32882    }
32883    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32884        self.node
32885    }
32886    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32887        TokenDollarPtr(self.node.stable_ptr(db))
32888    }
32889}
32890#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32891pub struct TerminalDollar<'db> {
32892    node: SyntaxNode<'db>,
32893}
32894impl<'db> Terminal<'db> for TerminalDollar<'db> {
32895    const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
32896    type TokenType = TokenDollar<'db>;
32897    fn new_green(
32898        db: &'db dyn Database,
32899        leading_trivia: TriviaGreen<'db>,
32900        token: <<TerminalDollar<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32901        trailing_trivia: TriviaGreen<'db>,
32902    ) -> Self::Green {
32903        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32904        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32905        TerminalDollarGreen(
32906            GreenNode {
32907                kind: SyntaxKind::TerminalDollar,
32908                details: GreenNodeDetails::Node { children: children.into(), width },
32909            }
32910            .intern(db),
32911        )
32912    }
32913    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32914        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32915            unreachable!("Expected a node, not a token");
32916        };
32917        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32918    }
32919}
32920impl<'db> TerminalDollar<'db> {
32921    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32922        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32923    }
32924    pub fn token(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32925        TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
32926    }
32927    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32928        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32929    }
32930}
32931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32932pub struct TerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32933impl<'db> TerminalDollarPtr<'db> {}
32934impl<'db> TypedStablePtr<'db> for TerminalDollarPtr<'db> {
32935    type SyntaxNode = TerminalDollar<'db>;
32936    fn untyped(self) -> SyntaxStablePtrId<'db> {
32937        self.0
32938    }
32939    fn lookup(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
32940        TerminalDollar::from_syntax_node(db, self.0.lookup(db))
32941    }
32942}
32943impl<'db> From<TerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32944    fn from(ptr: TerminalDollarPtr<'db>) -> Self {
32945        ptr.untyped()
32946    }
32947}
32948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32949pub struct TerminalDollarGreen<'db>(pub GreenId<'db>);
32950impl<'db> TypedSyntaxNode<'db> for TerminalDollar<'db> {
32951    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
32952    type StablePtr = TerminalDollarPtr<'db>;
32953    type Green = TerminalDollarGreen<'db>;
32954    fn missing(db: &'db dyn Database) -> Self::Green {
32955        TerminalDollarGreen(
32956            GreenNode {
32957                kind: SyntaxKind::TerminalDollar,
32958                details: GreenNodeDetails::Node {
32959                    children: [
32960                        Trivia::missing(db).0,
32961                        TokenDollar::missing(db).0,
32962                        Trivia::missing(db).0,
32963                    ]
32964                    .into(),
32965                    width: TextWidth::default(),
32966                },
32967            }
32968            .intern(db),
32969        )
32970    }
32971    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32972        let kind = node.kind(db);
32973        assert_eq!(
32974            kind,
32975            SyntaxKind::TerminalDollar,
32976            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32977            kind,
32978            SyntaxKind::TerminalDollar
32979        );
32980        Self { node }
32981    }
32982    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32983        let kind = node.kind(db);
32984        if kind == SyntaxKind::TerminalDollar {
32985            Some(Self::from_syntax_node(db, node))
32986        } else {
32987            None
32988        }
32989    }
32990    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32991        self.node
32992    }
32993    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32994        TerminalDollarPtr(self.node.stable_ptr(db))
32995    }
32996}
32997#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32998pub struct TokenDot<'db> {
32999    node: SyntaxNode<'db>,
33000}
33001impl<'db> Token<'db> for TokenDot<'db> {
33002    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33003        TokenDotGreen(
33004            GreenNode { kind: SyntaxKind::TokenDot, details: GreenNodeDetails::Token(text) }
33005                .intern(db),
33006        )
33007    }
33008    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33009        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33010    }
33011}
33012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33013pub struct TokenDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33014impl<'db> TypedStablePtr<'db> for TokenDotPtr<'db> {
33015    type SyntaxNode = TokenDot<'db>;
33016    fn untyped(self) -> SyntaxStablePtrId<'db> {
33017        self.0
33018    }
33019    fn lookup(&self, db: &'db dyn Database) -> TokenDot<'db> {
33020        TokenDot::from_syntax_node(db, self.0.lookup(db))
33021    }
33022}
33023impl<'db> From<TokenDotPtr<'db>> for SyntaxStablePtrId<'db> {
33024    fn from(ptr: TokenDotPtr<'db>) -> Self {
33025        ptr.untyped()
33026    }
33027}
33028#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33029pub struct TokenDotGreen<'db>(pub GreenId<'db>);
33030impl<'db> TokenDotGreen<'db> {
33031    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33032        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33033    }
33034}
33035impl<'db> TypedSyntaxNode<'db> for TokenDot<'db> {
33036    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
33037    type StablePtr = TokenDotPtr<'db>;
33038    type Green = TokenDotGreen<'db>;
33039    fn missing(db: &'db dyn Database) -> Self::Green {
33040        TokenDotGreen(
33041            GreenNode {
33042                kind: SyntaxKind::TokenMissing,
33043                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33044            }
33045            .intern(db),
33046        )
33047    }
33048    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33049        match node.green_node(db).details {
33050            GreenNodeDetails::Token(_) => Self { node },
33051            GreenNodeDetails::Node { .. } => {
33052                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
33053            }
33054        }
33055    }
33056    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33057        match node.green_node(db).details {
33058            GreenNodeDetails::Token(_) => Some(Self { node }),
33059            GreenNodeDetails::Node { .. } => None,
33060        }
33061    }
33062    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33063        self.node
33064    }
33065    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33066        TokenDotPtr(self.node.stable_ptr(db))
33067    }
33068}
33069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33070pub struct TerminalDot<'db> {
33071    node: SyntaxNode<'db>,
33072}
33073impl<'db> Terminal<'db> for TerminalDot<'db> {
33074    const KIND: SyntaxKind = SyntaxKind::TerminalDot;
33075    type TokenType = TokenDot<'db>;
33076    fn new_green(
33077        db: &'db dyn Database,
33078        leading_trivia: TriviaGreen<'db>,
33079        token: <<TerminalDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33080        trailing_trivia: TriviaGreen<'db>,
33081    ) -> Self::Green {
33082        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33083        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33084        TerminalDotGreen(
33085            GreenNode {
33086                kind: SyntaxKind::TerminalDot,
33087                details: GreenNodeDetails::Node { children: children.into(), width },
33088            }
33089            .intern(db),
33090        )
33091    }
33092    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33093        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33094            unreachable!("Expected a node, not a token");
33095        };
33096        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33097    }
33098}
33099impl<'db> TerminalDot<'db> {
33100    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33101        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33102    }
33103    pub fn token(&self, db: &'db dyn Database) -> TokenDot<'db> {
33104        TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
33105    }
33106    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33107        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33108    }
33109}
33110#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33111pub struct TerminalDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33112impl<'db> TerminalDotPtr<'db> {}
33113impl<'db> TypedStablePtr<'db> for TerminalDotPtr<'db> {
33114    type SyntaxNode = TerminalDot<'db>;
33115    fn untyped(self) -> SyntaxStablePtrId<'db> {
33116        self.0
33117    }
33118    fn lookup(&self, db: &'db dyn Database) -> TerminalDot<'db> {
33119        TerminalDot::from_syntax_node(db, self.0.lookup(db))
33120    }
33121}
33122impl<'db> From<TerminalDotPtr<'db>> for SyntaxStablePtrId<'db> {
33123    fn from(ptr: TerminalDotPtr<'db>) -> Self {
33124        ptr.untyped()
33125    }
33126}
33127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33128pub struct TerminalDotGreen<'db>(pub GreenId<'db>);
33129impl<'db> TypedSyntaxNode<'db> for TerminalDot<'db> {
33130    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
33131    type StablePtr = TerminalDotPtr<'db>;
33132    type Green = TerminalDotGreen<'db>;
33133    fn missing(db: &'db dyn Database) -> Self::Green {
33134        TerminalDotGreen(
33135            GreenNode {
33136                kind: SyntaxKind::TerminalDot,
33137                details: GreenNodeDetails::Node {
33138                    children: [
33139                        Trivia::missing(db).0,
33140                        TokenDot::missing(db).0,
33141                        Trivia::missing(db).0,
33142                    ]
33143                    .into(),
33144                    width: TextWidth::default(),
33145                },
33146            }
33147            .intern(db),
33148        )
33149    }
33150    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33151        let kind = node.kind(db);
33152        assert_eq!(
33153            kind,
33154            SyntaxKind::TerminalDot,
33155            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33156            kind,
33157            SyntaxKind::TerminalDot
33158        );
33159        Self { node }
33160    }
33161    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33162        let kind = node.kind(db);
33163        if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
33164    }
33165    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33166        self.node
33167    }
33168    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33169        TerminalDotPtr(self.node.stable_ptr(db))
33170    }
33171}
33172#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33173pub struct TokenDotDot<'db> {
33174    node: SyntaxNode<'db>,
33175}
33176impl<'db> Token<'db> for TokenDotDot<'db> {
33177    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33178        TokenDotDotGreen(
33179            GreenNode { kind: SyntaxKind::TokenDotDot, details: GreenNodeDetails::Token(text) }
33180                .intern(db),
33181        )
33182    }
33183    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33184        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33185    }
33186}
33187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33188pub struct TokenDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33189impl<'db> TypedStablePtr<'db> for TokenDotDotPtr<'db> {
33190    type SyntaxNode = TokenDotDot<'db>;
33191    fn untyped(self) -> SyntaxStablePtrId<'db> {
33192        self.0
33193    }
33194    fn lookup(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33195        TokenDotDot::from_syntax_node(db, self.0.lookup(db))
33196    }
33197}
33198impl<'db> From<TokenDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33199    fn from(ptr: TokenDotDotPtr<'db>) -> Self {
33200        ptr.untyped()
33201    }
33202}
33203#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33204pub struct TokenDotDotGreen<'db>(pub GreenId<'db>);
33205impl<'db> TokenDotDotGreen<'db> {
33206    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33207        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33208    }
33209}
33210impl<'db> TypedSyntaxNode<'db> for TokenDotDot<'db> {
33211    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
33212    type StablePtr = TokenDotDotPtr<'db>;
33213    type Green = TokenDotDotGreen<'db>;
33214    fn missing(db: &'db dyn Database) -> Self::Green {
33215        TokenDotDotGreen(
33216            GreenNode {
33217                kind: SyntaxKind::TokenMissing,
33218                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33219            }
33220            .intern(db),
33221        )
33222    }
33223    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33224        match node.green_node(db).details {
33225            GreenNodeDetails::Token(_) => Self { node },
33226            GreenNodeDetails::Node { .. } => {
33227                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
33228            }
33229        }
33230    }
33231    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33232        match node.green_node(db).details {
33233            GreenNodeDetails::Token(_) => Some(Self { node }),
33234            GreenNodeDetails::Node { .. } => None,
33235        }
33236    }
33237    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33238        self.node
33239    }
33240    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33241        TokenDotDotPtr(self.node.stable_ptr(db))
33242    }
33243}
33244#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33245pub struct TerminalDotDot<'db> {
33246    node: SyntaxNode<'db>,
33247}
33248impl<'db> Terminal<'db> for TerminalDotDot<'db> {
33249    const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
33250    type TokenType = TokenDotDot<'db>;
33251    fn new_green(
33252        db: &'db dyn Database,
33253        leading_trivia: TriviaGreen<'db>,
33254        token: <<TerminalDotDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33255        trailing_trivia: TriviaGreen<'db>,
33256    ) -> Self::Green {
33257        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33258        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33259        TerminalDotDotGreen(
33260            GreenNode {
33261                kind: SyntaxKind::TerminalDotDot,
33262                details: GreenNodeDetails::Node { children: children.into(), width },
33263            }
33264            .intern(db),
33265        )
33266    }
33267    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33268        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33269            unreachable!("Expected a node, not a token");
33270        };
33271        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33272    }
33273}
33274impl<'db> TerminalDotDot<'db> {
33275    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33276        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33277    }
33278    pub fn token(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33279        TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33280    }
33281    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33282        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33283    }
33284}
33285#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33286pub struct TerminalDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33287impl<'db> TerminalDotDotPtr<'db> {}
33288impl<'db> TypedStablePtr<'db> for TerminalDotDotPtr<'db> {
33289    type SyntaxNode = TerminalDotDot<'db>;
33290    fn untyped(self) -> SyntaxStablePtrId<'db> {
33291        self.0
33292    }
33293    fn lookup(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
33294        TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33295    }
33296}
33297impl<'db> From<TerminalDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33298    fn from(ptr: TerminalDotDotPtr<'db>) -> Self {
33299        ptr.untyped()
33300    }
33301}
33302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33303pub struct TerminalDotDotGreen<'db>(pub GreenId<'db>);
33304impl<'db> TypedSyntaxNode<'db> for TerminalDotDot<'db> {
33305    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33306    type StablePtr = TerminalDotDotPtr<'db>;
33307    type Green = TerminalDotDotGreen<'db>;
33308    fn missing(db: &'db dyn Database) -> Self::Green {
33309        TerminalDotDotGreen(
33310            GreenNode {
33311                kind: SyntaxKind::TerminalDotDot,
33312                details: GreenNodeDetails::Node {
33313                    children: [
33314                        Trivia::missing(db).0,
33315                        TokenDotDot::missing(db).0,
33316                        Trivia::missing(db).0,
33317                    ]
33318                    .into(),
33319                    width: TextWidth::default(),
33320                },
33321            }
33322            .intern(db),
33323        )
33324    }
33325    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33326        let kind = node.kind(db);
33327        assert_eq!(
33328            kind,
33329            SyntaxKind::TerminalDotDot,
33330            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33331            kind,
33332            SyntaxKind::TerminalDotDot
33333        );
33334        Self { node }
33335    }
33336    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33337        let kind = node.kind(db);
33338        if kind == SyntaxKind::TerminalDotDot {
33339            Some(Self::from_syntax_node(db, node))
33340        } else {
33341            None
33342        }
33343    }
33344    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33345        self.node
33346    }
33347    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33348        TerminalDotDotPtr(self.node.stable_ptr(db))
33349    }
33350}
33351#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33352pub struct TokenDotDotEq<'db> {
33353    node: SyntaxNode<'db>,
33354}
33355impl<'db> Token<'db> for TokenDotDotEq<'db> {
33356    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33357        TokenDotDotEqGreen(
33358            GreenNode { kind: SyntaxKind::TokenDotDotEq, details: GreenNodeDetails::Token(text) }
33359                .intern(db),
33360        )
33361    }
33362    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33363        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33364    }
33365}
33366#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33367pub struct TokenDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33368impl<'db> TypedStablePtr<'db> for TokenDotDotEqPtr<'db> {
33369    type SyntaxNode = TokenDotDotEq<'db>;
33370    fn untyped(self) -> SyntaxStablePtrId<'db> {
33371        self.0
33372    }
33373    fn lookup(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33374        TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33375    }
33376}
33377impl<'db> From<TokenDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33378    fn from(ptr: TokenDotDotEqPtr<'db>) -> Self {
33379        ptr.untyped()
33380    }
33381}
33382#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33383pub struct TokenDotDotEqGreen<'db>(pub GreenId<'db>);
33384impl<'db> TokenDotDotEqGreen<'db> {
33385    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33386        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33387    }
33388}
33389impl<'db> TypedSyntaxNode<'db> for TokenDotDotEq<'db> {
33390    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33391    type StablePtr = TokenDotDotEqPtr<'db>;
33392    type Green = TokenDotDotEqGreen<'db>;
33393    fn missing(db: &'db dyn Database) -> Self::Green {
33394        TokenDotDotEqGreen(
33395            GreenNode {
33396                kind: SyntaxKind::TokenMissing,
33397                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33398            }
33399            .intern(db),
33400        )
33401    }
33402    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33403        match node.green_node(db).details {
33404            GreenNodeDetails::Token(_) => Self { node },
33405            GreenNodeDetails::Node { .. } => {
33406                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33407            }
33408        }
33409    }
33410    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33411        match node.green_node(db).details {
33412            GreenNodeDetails::Token(_) => Some(Self { node }),
33413            GreenNodeDetails::Node { .. } => None,
33414        }
33415    }
33416    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33417        self.node
33418    }
33419    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33420        TokenDotDotEqPtr(self.node.stable_ptr(db))
33421    }
33422}
33423#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33424pub struct TerminalDotDotEq<'db> {
33425    node: SyntaxNode<'db>,
33426}
33427impl<'db> Terminal<'db> for TerminalDotDotEq<'db> {
33428    const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
33429    type TokenType = TokenDotDotEq<'db>;
33430    fn new_green(
33431        db: &'db dyn Database,
33432        leading_trivia: TriviaGreen<'db>,
33433        token: <<TerminalDotDotEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33434        trailing_trivia: TriviaGreen<'db>,
33435    ) -> Self::Green {
33436        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33437        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33438        TerminalDotDotEqGreen(
33439            GreenNode {
33440                kind: SyntaxKind::TerminalDotDotEq,
33441                details: GreenNodeDetails::Node { children: children.into(), width },
33442            }
33443            .intern(db),
33444        )
33445    }
33446    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33447        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33448            unreachable!("Expected a node, not a token");
33449        };
33450        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33451    }
33452}
33453impl<'db> TerminalDotDotEq<'db> {
33454    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33455        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33456    }
33457    pub fn token(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33458        TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
33459    }
33460    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33461        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33462    }
33463}
33464#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33465pub struct TerminalDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33466impl<'db> TerminalDotDotEqPtr<'db> {}
33467impl<'db> TypedStablePtr<'db> for TerminalDotDotEqPtr<'db> {
33468    type SyntaxNode = TerminalDotDotEq<'db>;
33469    fn untyped(self) -> SyntaxStablePtrId<'db> {
33470        self.0
33471    }
33472    fn lookup(&self, db: &'db dyn Database) -> TerminalDotDotEq<'db> {
33473        TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
33474    }
33475}
33476impl<'db> From<TerminalDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33477    fn from(ptr: TerminalDotDotEqPtr<'db>) -> Self {
33478        ptr.untyped()
33479    }
33480}
33481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33482pub struct TerminalDotDotEqGreen<'db>(pub GreenId<'db>);
33483impl<'db> TypedSyntaxNode<'db> for TerminalDotDotEq<'db> {
33484    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
33485    type StablePtr = TerminalDotDotEqPtr<'db>;
33486    type Green = TerminalDotDotEqGreen<'db>;
33487    fn missing(db: &'db dyn Database) -> Self::Green {
33488        TerminalDotDotEqGreen(
33489            GreenNode {
33490                kind: SyntaxKind::TerminalDotDotEq,
33491                details: GreenNodeDetails::Node {
33492                    children: [
33493                        Trivia::missing(db).0,
33494                        TokenDotDotEq::missing(db).0,
33495                        Trivia::missing(db).0,
33496                    ]
33497                    .into(),
33498                    width: TextWidth::default(),
33499                },
33500            }
33501            .intern(db),
33502        )
33503    }
33504    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33505        let kind = node.kind(db);
33506        assert_eq!(
33507            kind,
33508            SyntaxKind::TerminalDotDotEq,
33509            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33510            kind,
33511            SyntaxKind::TerminalDotDotEq
33512        );
33513        Self { node }
33514    }
33515    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33516        let kind = node.kind(db);
33517        if kind == SyntaxKind::TerminalDotDotEq {
33518            Some(Self::from_syntax_node(db, node))
33519        } else {
33520            None
33521        }
33522    }
33523    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33524        self.node
33525    }
33526    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33527        TerminalDotDotEqPtr(self.node.stable_ptr(db))
33528    }
33529}
33530#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33531pub struct TokenEndOfFile<'db> {
33532    node: SyntaxNode<'db>,
33533}
33534impl<'db> Token<'db> for TokenEndOfFile<'db> {
33535    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33536        TokenEndOfFileGreen(
33537            GreenNode { kind: SyntaxKind::TokenEndOfFile, details: GreenNodeDetails::Token(text) }
33538                .intern(db),
33539        )
33540    }
33541    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33542        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33543    }
33544}
33545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33546pub struct TokenEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33547impl<'db> TypedStablePtr<'db> for TokenEndOfFilePtr<'db> {
33548    type SyntaxNode = TokenEndOfFile<'db>;
33549    fn untyped(self) -> SyntaxStablePtrId<'db> {
33550        self.0
33551    }
33552    fn lookup(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33553        TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
33554    }
33555}
33556impl<'db> From<TokenEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33557    fn from(ptr: TokenEndOfFilePtr<'db>) -> Self {
33558        ptr.untyped()
33559    }
33560}
33561#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33562pub struct TokenEndOfFileGreen<'db>(pub GreenId<'db>);
33563impl<'db> TokenEndOfFileGreen<'db> {
33564    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33565        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33566    }
33567}
33568impl<'db> TypedSyntaxNode<'db> for TokenEndOfFile<'db> {
33569    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
33570    type StablePtr = TokenEndOfFilePtr<'db>;
33571    type Green = TokenEndOfFileGreen<'db>;
33572    fn missing(db: &'db dyn Database) -> Self::Green {
33573        TokenEndOfFileGreen(
33574            GreenNode {
33575                kind: SyntaxKind::TokenMissing,
33576                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33577            }
33578            .intern(db),
33579        )
33580    }
33581    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33582        match node.green_node(db).details {
33583            GreenNodeDetails::Token(_) => Self { node },
33584            GreenNodeDetails::Node { .. } => {
33585                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
33586            }
33587        }
33588    }
33589    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33590        match node.green_node(db).details {
33591            GreenNodeDetails::Token(_) => Some(Self { node }),
33592            GreenNodeDetails::Node { .. } => None,
33593        }
33594    }
33595    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33596        self.node
33597    }
33598    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33599        TokenEndOfFilePtr(self.node.stable_ptr(db))
33600    }
33601}
33602#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33603pub struct TerminalEndOfFile<'db> {
33604    node: SyntaxNode<'db>,
33605}
33606impl<'db> Terminal<'db> for TerminalEndOfFile<'db> {
33607    const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
33608    type TokenType = TokenEndOfFile<'db>;
33609    fn new_green(
33610        db: &'db dyn Database,
33611        leading_trivia: TriviaGreen<'db>,
33612        token: <<TerminalEndOfFile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33613        trailing_trivia: TriviaGreen<'db>,
33614    ) -> Self::Green {
33615        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33616        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33617        TerminalEndOfFileGreen(
33618            GreenNode {
33619                kind: SyntaxKind::TerminalEndOfFile,
33620                details: GreenNodeDetails::Node { children: children.into(), width },
33621            }
33622            .intern(db),
33623        )
33624    }
33625    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33626        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33627            unreachable!("Expected a node, not a token");
33628        };
33629        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33630    }
33631}
33632impl<'db> TerminalEndOfFile<'db> {
33633    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33634        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33635    }
33636    pub fn token(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33637        TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
33638    }
33639    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33640        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33641    }
33642}
33643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33644pub struct TerminalEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33645impl<'db> TerminalEndOfFilePtr<'db> {}
33646impl<'db> TypedStablePtr<'db> for TerminalEndOfFilePtr<'db> {
33647    type SyntaxNode = TerminalEndOfFile<'db>;
33648    fn untyped(self) -> SyntaxStablePtrId<'db> {
33649        self.0
33650    }
33651    fn lookup(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
33652        TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
33653    }
33654}
33655impl<'db> From<TerminalEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33656    fn from(ptr: TerminalEndOfFilePtr<'db>) -> Self {
33657        ptr.untyped()
33658    }
33659}
33660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33661pub struct TerminalEndOfFileGreen<'db>(pub GreenId<'db>);
33662impl<'db> TypedSyntaxNode<'db> for TerminalEndOfFile<'db> {
33663    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
33664    type StablePtr = TerminalEndOfFilePtr<'db>;
33665    type Green = TerminalEndOfFileGreen<'db>;
33666    fn missing(db: &'db dyn Database) -> Self::Green {
33667        TerminalEndOfFileGreen(
33668            GreenNode {
33669                kind: SyntaxKind::TerminalEndOfFile,
33670                details: GreenNodeDetails::Node {
33671                    children: [
33672                        Trivia::missing(db).0,
33673                        TokenEndOfFile::missing(db).0,
33674                        Trivia::missing(db).0,
33675                    ]
33676                    .into(),
33677                    width: TextWidth::default(),
33678                },
33679            }
33680            .intern(db),
33681        )
33682    }
33683    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33684        let kind = node.kind(db);
33685        assert_eq!(
33686            kind,
33687            SyntaxKind::TerminalEndOfFile,
33688            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33689            kind,
33690            SyntaxKind::TerminalEndOfFile
33691        );
33692        Self { node }
33693    }
33694    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33695        let kind = node.kind(db);
33696        if kind == SyntaxKind::TerminalEndOfFile {
33697            Some(Self::from_syntax_node(db, node))
33698        } else {
33699            None
33700        }
33701    }
33702    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33703        self.node
33704    }
33705    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33706        TerminalEndOfFilePtr(self.node.stable_ptr(db))
33707    }
33708}
33709#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33710pub struct TokenEq<'db> {
33711    node: SyntaxNode<'db>,
33712}
33713impl<'db> Token<'db> for TokenEq<'db> {
33714    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33715        TokenEqGreen(
33716            GreenNode { kind: SyntaxKind::TokenEq, details: GreenNodeDetails::Token(text) }
33717                .intern(db),
33718        )
33719    }
33720    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33721        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33722    }
33723}
33724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33725pub struct TokenEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33726impl<'db> TypedStablePtr<'db> for TokenEqPtr<'db> {
33727    type SyntaxNode = TokenEq<'db>;
33728    fn untyped(self) -> SyntaxStablePtrId<'db> {
33729        self.0
33730    }
33731    fn lookup(&self, db: &'db dyn Database) -> TokenEq<'db> {
33732        TokenEq::from_syntax_node(db, self.0.lookup(db))
33733    }
33734}
33735impl<'db> From<TokenEqPtr<'db>> for SyntaxStablePtrId<'db> {
33736    fn from(ptr: TokenEqPtr<'db>) -> Self {
33737        ptr.untyped()
33738    }
33739}
33740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33741pub struct TokenEqGreen<'db>(pub GreenId<'db>);
33742impl<'db> TokenEqGreen<'db> {
33743    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33744        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33745    }
33746}
33747impl<'db> TypedSyntaxNode<'db> for TokenEq<'db> {
33748    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
33749    type StablePtr = TokenEqPtr<'db>;
33750    type Green = TokenEqGreen<'db>;
33751    fn missing(db: &'db dyn Database) -> Self::Green {
33752        TokenEqGreen(
33753            GreenNode {
33754                kind: SyntaxKind::TokenMissing,
33755                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33756            }
33757            .intern(db),
33758        )
33759    }
33760    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33761        match node.green_node(db).details {
33762            GreenNodeDetails::Token(_) => Self { node },
33763            GreenNodeDetails::Node { .. } => {
33764                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
33765            }
33766        }
33767    }
33768    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33769        match node.green_node(db).details {
33770            GreenNodeDetails::Token(_) => Some(Self { node }),
33771            GreenNodeDetails::Node { .. } => None,
33772        }
33773    }
33774    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33775        self.node
33776    }
33777    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33778        TokenEqPtr(self.node.stable_ptr(db))
33779    }
33780}
33781#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33782pub struct TerminalEq<'db> {
33783    node: SyntaxNode<'db>,
33784}
33785impl<'db> Terminal<'db> for TerminalEq<'db> {
33786    const KIND: SyntaxKind = SyntaxKind::TerminalEq;
33787    type TokenType = TokenEq<'db>;
33788    fn new_green(
33789        db: &'db dyn Database,
33790        leading_trivia: TriviaGreen<'db>,
33791        token: <<TerminalEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33792        trailing_trivia: TriviaGreen<'db>,
33793    ) -> Self::Green {
33794        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33795        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33796        TerminalEqGreen(
33797            GreenNode {
33798                kind: SyntaxKind::TerminalEq,
33799                details: GreenNodeDetails::Node { children: children.into(), width },
33800            }
33801            .intern(db),
33802        )
33803    }
33804    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33805        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33806            unreachable!("Expected a node, not a token");
33807        };
33808        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33809    }
33810}
33811impl<'db> TerminalEq<'db> {
33812    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33813        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33814    }
33815    pub fn token(&self, db: &'db dyn Database) -> TokenEq<'db> {
33816        TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
33817    }
33818    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33819        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33820    }
33821}
33822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33823pub struct TerminalEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33824impl<'db> TerminalEqPtr<'db> {}
33825impl<'db> TypedStablePtr<'db> for TerminalEqPtr<'db> {
33826    type SyntaxNode = TerminalEq<'db>;
33827    fn untyped(self) -> SyntaxStablePtrId<'db> {
33828        self.0
33829    }
33830    fn lookup(&self, db: &'db dyn Database) -> TerminalEq<'db> {
33831        TerminalEq::from_syntax_node(db, self.0.lookup(db))
33832    }
33833}
33834impl<'db> From<TerminalEqPtr<'db>> for SyntaxStablePtrId<'db> {
33835    fn from(ptr: TerminalEqPtr<'db>) -> Self {
33836        ptr.untyped()
33837    }
33838}
33839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33840pub struct TerminalEqGreen<'db>(pub GreenId<'db>);
33841impl<'db> TypedSyntaxNode<'db> for TerminalEq<'db> {
33842    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
33843    type StablePtr = TerminalEqPtr<'db>;
33844    type Green = TerminalEqGreen<'db>;
33845    fn missing(db: &'db dyn Database) -> Self::Green {
33846        TerminalEqGreen(
33847            GreenNode {
33848                kind: SyntaxKind::TerminalEq,
33849                details: GreenNodeDetails::Node {
33850                    children: [
33851                        Trivia::missing(db).0,
33852                        TokenEq::missing(db).0,
33853                        Trivia::missing(db).0,
33854                    ]
33855                    .into(),
33856                    width: TextWidth::default(),
33857                },
33858            }
33859            .intern(db),
33860        )
33861    }
33862    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33863        let kind = node.kind(db);
33864        assert_eq!(
33865            kind,
33866            SyntaxKind::TerminalEq,
33867            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33868            kind,
33869            SyntaxKind::TerminalEq
33870        );
33871        Self { node }
33872    }
33873    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33874        let kind = node.kind(db);
33875        if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
33876    }
33877    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33878        self.node
33879    }
33880    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33881        TerminalEqPtr(self.node.stable_ptr(db))
33882    }
33883}
33884#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33885pub struct TokenEqEq<'db> {
33886    node: SyntaxNode<'db>,
33887}
33888impl<'db> Token<'db> for TokenEqEq<'db> {
33889    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33890        TokenEqEqGreen(
33891            GreenNode { kind: SyntaxKind::TokenEqEq, details: GreenNodeDetails::Token(text) }
33892                .intern(db),
33893        )
33894    }
33895    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33896        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33897    }
33898}
33899#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33900pub struct TokenEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33901impl<'db> TypedStablePtr<'db> for TokenEqEqPtr<'db> {
33902    type SyntaxNode = TokenEqEq<'db>;
33903    fn untyped(self) -> SyntaxStablePtrId<'db> {
33904        self.0
33905    }
33906    fn lookup(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33907        TokenEqEq::from_syntax_node(db, self.0.lookup(db))
33908    }
33909}
33910impl<'db> From<TokenEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
33911    fn from(ptr: TokenEqEqPtr<'db>) -> Self {
33912        ptr.untyped()
33913    }
33914}
33915#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33916pub struct TokenEqEqGreen<'db>(pub GreenId<'db>);
33917impl<'db> TokenEqEqGreen<'db> {
33918    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33919        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33920    }
33921}
33922impl<'db> TypedSyntaxNode<'db> for TokenEqEq<'db> {
33923    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
33924    type StablePtr = TokenEqEqPtr<'db>;
33925    type Green = TokenEqEqGreen<'db>;
33926    fn missing(db: &'db dyn Database) -> Self::Green {
33927        TokenEqEqGreen(
33928            GreenNode {
33929                kind: SyntaxKind::TokenMissing,
33930                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33931            }
33932            .intern(db),
33933        )
33934    }
33935    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33936        match node.green_node(db).details {
33937            GreenNodeDetails::Token(_) => Self { node },
33938            GreenNodeDetails::Node { .. } => {
33939                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
33940            }
33941        }
33942    }
33943    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33944        match node.green_node(db).details {
33945            GreenNodeDetails::Token(_) => Some(Self { node }),
33946            GreenNodeDetails::Node { .. } => None,
33947        }
33948    }
33949    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33950        self.node
33951    }
33952    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33953        TokenEqEqPtr(self.node.stable_ptr(db))
33954    }
33955}
33956#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33957pub struct TerminalEqEq<'db> {
33958    node: SyntaxNode<'db>,
33959}
33960impl<'db> Terminal<'db> for TerminalEqEq<'db> {
33961    const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
33962    type TokenType = TokenEqEq<'db>;
33963    fn new_green(
33964        db: &'db dyn Database,
33965        leading_trivia: TriviaGreen<'db>,
33966        token: <<TerminalEqEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33967        trailing_trivia: TriviaGreen<'db>,
33968    ) -> Self::Green {
33969        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33970        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33971        TerminalEqEqGreen(
33972            GreenNode {
33973                kind: SyntaxKind::TerminalEqEq,
33974                details: GreenNodeDetails::Node { children: children.into(), width },
33975            }
33976            .intern(db),
33977        )
33978    }
33979    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33980        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33981            unreachable!("Expected a node, not a token");
33982        };
33983        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33984    }
33985}
33986impl<'db> TerminalEqEq<'db> {
33987    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33988        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33989    }
33990    pub fn token(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33991        TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
33992    }
33993    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33994        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33995    }
33996}
33997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33998pub struct TerminalEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33999impl<'db> TerminalEqEqPtr<'db> {}
34000impl<'db> TypedStablePtr<'db> for TerminalEqEqPtr<'db> {
34001    type SyntaxNode = TerminalEqEq<'db>;
34002    fn untyped(self) -> SyntaxStablePtrId<'db> {
34003        self.0
34004    }
34005    fn lookup(&self, db: &'db dyn Database) -> TerminalEqEq<'db> {
34006        TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
34007    }
34008}
34009impl<'db> From<TerminalEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
34010    fn from(ptr: TerminalEqEqPtr<'db>) -> Self {
34011        ptr.untyped()
34012    }
34013}
34014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34015pub struct TerminalEqEqGreen<'db>(pub GreenId<'db>);
34016impl<'db> TypedSyntaxNode<'db> for TerminalEqEq<'db> {
34017    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
34018    type StablePtr = TerminalEqEqPtr<'db>;
34019    type Green = TerminalEqEqGreen<'db>;
34020    fn missing(db: &'db dyn Database) -> Self::Green {
34021        TerminalEqEqGreen(
34022            GreenNode {
34023                kind: SyntaxKind::TerminalEqEq,
34024                details: GreenNodeDetails::Node {
34025                    children: [
34026                        Trivia::missing(db).0,
34027                        TokenEqEq::missing(db).0,
34028                        Trivia::missing(db).0,
34029                    ]
34030                    .into(),
34031                    width: TextWidth::default(),
34032                },
34033            }
34034            .intern(db),
34035        )
34036    }
34037    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34038        let kind = node.kind(db);
34039        assert_eq!(
34040            kind,
34041            SyntaxKind::TerminalEqEq,
34042            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34043            kind,
34044            SyntaxKind::TerminalEqEq
34045        );
34046        Self { node }
34047    }
34048    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34049        let kind = node.kind(db);
34050        if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
34051    }
34052    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34053        self.node
34054    }
34055    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34056        TerminalEqEqPtr(self.node.stable_ptr(db))
34057    }
34058}
34059#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34060pub struct TokenGE<'db> {
34061    node: SyntaxNode<'db>,
34062}
34063impl<'db> Token<'db> for TokenGE<'db> {
34064    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34065        TokenGEGreen(
34066            GreenNode { kind: SyntaxKind::TokenGE, details: GreenNodeDetails::Token(text) }
34067                .intern(db),
34068        )
34069    }
34070    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34071        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34072    }
34073}
34074#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34075pub struct TokenGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34076impl<'db> TypedStablePtr<'db> for TokenGEPtr<'db> {
34077    type SyntaxNode = TokenGE<'db>;
34078    fn untyped(self) -> SyntaxStablePtrId<'db> {
34079        self.0
34080    }
34081    fn lookup(&self, db: &'db dyn Database) -> TokenGE<'db> {
34082        TokenGE::from_syntax_node(db, self.0.lookup(db))
34083    }
34084}
34085impl<'db> From<TokenGEPtr<'db>> for SyntaxStablePtrId<'db> {
34086    fn from(ptr: TokenGEPtr<'db>) -> Self {
34087        ptr.untyped()
34088    }
34089}
34090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34091pub struct TokenGEGreen<'db>(pub GreenId<'db>);
34092impl<'db> TokenGEGreen<'db> {
34093    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34094        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34095    }
34096}
34097impl<'db> TypedSyntaxNode<'db> for TokenGE<'db> {
34098    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
34099    type StablePtr = TokenGEPtr<'db>;
34100    type Green = TokenGEGreen<'db>;
34101    fn missing(db: &'db dyn Database) -> Self::Green {
34102        TokenGEGreen(
34103            GreenNode {
34104                kind: SyntaxKind::TokenMissing,
34105                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34106            }
34107            .intern(db),
34108        )
34109    }
34110    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34111        match node.green_node(db).details {
34112            GreenNodeDetails::Token(_) => Self { node },
34113            GreenNodeDetails::Node { .. } => {
34114                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
34115            }
34116        }
34117    }
34118    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34119        match node.green_node(db).details {
34120            GreenNodeDetails::Token(_) => Some(Self { node }),
34121            GreenNodeDetails::Node { .. } => None,
34122        }
34123    }
34124    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34125        self.node
34126    }
34127    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34128        TokenGEPtr(self.node.stable_ptr(db))
34129    }
34130}
34131#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34132pub struct TerminalGE<'db> {
34133    node: SyntaxNode<'db>,
34134}
34135impl<'db> Terminal<'db> for TerminalGE<'db> {
34136    const KIND: SyntaxKind = SyntaxKind::TerminalGE;
34137    type TokenType = TokenGE<'db>;
34138    fn new_green(
34139        db: &'db dyn Database,
34140        leading_trivia: TriviaGreen<'db>,
34141        token: <<TerminalGE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34142        trailing_trivia: TriviaGreen<'db>,
34143    ) -> Self::Green {
34144        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34145        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34146        TerminalGEGreen(
34147            GreenNode {
34148                kind: SyntaxKind::TerminalGE,
34149                details: GreenNodeDetails::Node { children: children.into(), width },
34150            }
34151            .intern(db),
34152        )
34153    }
34154    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34155        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34156            unreachable!("Expected a node, not a token");
34157        };
34158        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34159    }
34160}
34161impl<'db> TerminalGE<'db> {
34162    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34163        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34164    }
34165    pub fn token(&self, db: &'db dyn Database) -> TokenGE<'db> {
34166        TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
34167    }
34168    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34169        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34170    }
34171}
34172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34173pub struct TerminalGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34174impl<'db> TerminalGEPtr<'db> {}
34175impl<'db> TypedStablePtr<'db> for TerminalGEPtr<'db> {
34176    type SyntaxNode = TerminalGE<'db>;
34177    fn untyped(self) -> SyntaxStablePtrId<'db> {
34178        self.0
34179    }
34180    fn lookup(&self, db: &'db dyn Database) -> TerminalGE<'db> {
34181        TerminalGE::from_syntax_node(db, self.0.lookup(db))
34182    }
34183}
34184impl<'db> From<TerminalGEPtr<'db>> for SyntaxStablePtrId<'db> {
34185    fn from(ptr: TerminalGEPtr<'db>) -> Self {
34186        ptr.untyped()
34187    }
34188}
34189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34190pub struct TerminalGEGreen<'db>(pub GreenId<'db>);
34191impl<'db> TypedSyntaxNode<'db> for TerminalGE<'db> {
34192    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
34193    type StablePtr = TerminalGEPtr<'db>;
34194    type Green = TerminalGEGreen<'db>;
34195    fn missing(db: &'db dyn Database) -> Self::Green {
34196        TerminalGEGreen(
34197            GreenNode {
34198                kind: SyntaxKind::TerminalGE,
34199                details: GreenNodeDetails::Node {
34200                    children: [
34201                        Trivia::missing(db).0,
34202                        TokenGE::missing(db).0,
34203                        Trivia::missing(db).0,
34204                    ]
34205                    .into(),
34206                    width: TextWidth::default(),
34207                },
34208            }
34209            .intern(db),
34210        )
34211    }
34212    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34213        let kind = node.kind(db);
34214        assert_eq!(
34215            kind,
34216            SyntaxKind::TerminalGE,
34217            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34218            kind,
34219            SyntaxKind::TerminalGE
34220        );
34221        Self { node }
34222    }
34223    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34224        let kind = node.kind(db);
34225        if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
34226    }
34227    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34228        self.node
34229    }
34230    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34231        TerminalGEPtr(self.node.stable_ptr(db))
34232    }
34233}
34234#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34235pub struct TokenGT<'db> {
34236    node: SyntaxNode<'db>,
34237}
34238impl<'db> Token<'db> for TokenGT<'db> {
34239    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34240        TokenGTGreen(
34241            GreenNode { kind: SyntaxKind::TokenGT, details: GreenNodeDetails::Token(text) }
34242                .intern(db),
34243        )
34244    }
34245    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34246        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34247    }
34248}
34249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34250pub struct TokenGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34251impl<'db> TypedStablePtr<'db> for TokenGTPtr<'db> {
34252    type SyntaxNode = TokenGT<'db>;
34253    fn untyped(self) -> SyntaxStablePtrId<'db> {
34254        self.0
34255    }
34256    fn lookup(&self, db: &'db dyn Database) -> TokenGT<'db> {
34257        TokenGT::from_syntax_node(db, self.0.lookup(db))
34258    }
34259}
34260impl<'db> From<TokenGTPtr<'db>> for SyntaxStablePtrId<'db> {
34261    fn from(ptr: TokenGTPtr<'db>) -> Self {
34262        ptr.untyped()
34263    }
34264}
34265#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34266pub struct TokenGTGreen<'db>(pub GreenId<'db>);
34267impl<'db> TokenGTGreen<'db> {
34268    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34269        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34270    }
34271}
34272impl<'db> TypedSyntaxNode<'db> for TokenGT<'db> {
34273    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34274    type StablePtr = TokenGTPtr<'db>;
34275    type Green = TokenGTGreen<'db>;
34276    fn missing(db: &'db dyn Database) -> Self::Green {
34277        TokenGTGreen(
34278            GreenNode {
34279                kind: SyntaxKind::TokenMissing,
34280                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34281            }
34282            .intern(db),
34283        )
34284    }
34285    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34286        match node.green_node(db).details {
34287            GreenNodeDetails::Token(_) => Self { node },
34288            GreenNodeDetails::Node { .. } => {
34289                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34290            }
34291        }
34292    }
34293    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34294        match node.green_node(db).details {
34295            GreenNodeDetails::Token(_) => Some(Self { node }),
34296            GreenNodeDetails::Node { .. } => None,
34297        }
34298    }
34299    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34300        self.node
34301    }
34302    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34303        TokenGTPtr(self.node.stable_ptr(db))
34304    }
34305}
34306#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34307pub struct TerminalGT<'db> {
34308    node: SyntaxNode<'db>,
34309}
34310impl<'db> Terminal<'db> for TerminalGT<'db> {
34311    const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34312    type TokenType = TokenGT<'db>;
34313    fn new_green(
34314        db: &'db dyn Database,
34315        leading_trivia: TriviaGreen<'db>,
34316        token: <<TerminalGT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34317        trailing_trivia: TriviaGreen<'db>,
34318    ) -> Self::Green {
34319        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34320        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34321        TerminalGTGreen(
34322            GreenNode {
34323                kind: SyntaxKind::TerminalGT,
34324                details: GreenNodeDetails::Node { children: children.into(), width },
34325            }
34326            .intern(db),
34327        )
34328    }
34329    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34330        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34331            unreachable!("Expected a node, not a token");
34332        };
34333        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34334    }
34335}
34336impl<'db> TerminalGT<'db> {
34337    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34338        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34339    }
34340    pub fn token(&self, db: &'db dyn Database) -> TokenGT<'db> {
34341        TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34342    }
34343    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34344        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34345    }
34346}
34347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34348pub struct TerminalGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34349impl<'db> TerminalGTPtr<'db> {}
34350impl<'db> TypedStablePtr<'db> for TerminalGTPtr<'db> {
34351    type SyntaxNode = TerminalGT<'db>;
34352    fn untyped(self) -> SyntaxStablePtrId<'db> {
34353        self.0
34354    }
34355    fn lookup(&self, db: &'db dyn Database) -> TerminalGT<'db> {
34356        TerminalGT::from_syntax_node(db, self.0.lookup(db))
34357    }
34358}
34359impl<'db> From<TerminalGTPtr<'db>> for SyntaxStablePtrId<'db> {
34360    fn from(ptr: TerminalGTPtr<'db>) -> Self {
34361        ptr.untyped()
34362    }
34363}
34364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34365pub struct TerminalGTGreen<'db>(pub GreenId<'db>);
34366impl<'db> TypedSyntaxNode<'db> for TerminalGT<'db> {
34367    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
34368    type StablePtr = TerminalGTPtr<'db>;
34369    type Green = TerminalGTGreen<'db>;
34370    fn missing(db: &'db dyn Database) -> Self::Green {
34371        TerminalGTGreen(
34372            GreenNode {
34373                kind: SyntaxKind::TerminalGT,
34374                details: GreenNodeDetails::Node {
34375                    children: [
34376                        Trivia::missing(db).0,
34377                        TokenGT::missing(db).0,
34378                        Trivia::missing(db).0,
34379                    ]
34380                    .into(),
34381                    width: TextWidth::default(),
34382                },
34383            }
34384            .intern(db),
34385        )
34386    }
34387    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34388        let kind = node.kind(db);
34389        assert_eq!(
34390            kind,
34391            SyntaxKind::TerminalGT,
34392            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34393            kind,
34394            SyntaxKind::TerminalGT
34395        );
34396        Self { node }
34397    }
34398    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34399        let kind = node.kind(db);
34400        if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
34401    }
34402    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34403        self.node
34404    }
34405    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34406        TerminalGTPtr(self.node.stable_ptr(db))
34407    }
34408}
34409#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34410pub struct TokenHash<'db> {
34411    node: SyntaxNode<'db>,
34412}
34413impl<'db> Token<'db> for TokenHash<'db> {
34414    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34415        TokenHashGreen(
34416            GreenNode { kind: SyntaxKind::TokenHash, details: GreenNodeDetails::Token(text) }
34417                .intern(db),
34418        )
34419    }
34420    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34421        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34422    }
34423}
34424#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34425pub struct TokenHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34426impl<'db> TypedStablePtr<'db> for TokenHashPtr<'db> {
34427    type SyntaxNode = TokenHash<'db>;
34428    fn untyped(self) -> SyntaxStablePtrId<'db> {
34429        self.0
34430    }
34431    fn lookup(&self, db: &'db dyn Database) -> TokenHash<'db> {
34432        TokenHash::from_syntax_node(db, self.0.lookup(db))
34433    }
34434}
34435impl<'db> From<TokenHashPtr<'db>> for SyntaxStablePtrId<'db> {
34436    fn from(ptr: TokenHashPtr<'db>) -> Self {
34437        ptr.untyped()
34438    }
34439}
34440#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34441pub struct TokenHashGreen<'db>(pub GreenId<'db>);
34442impl<'db> TokenHashGreen<'db> {
34443    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34444        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34445    }
34446}
34447impl<'db> TypedSyntaxNode<'db> for TokenHash<'db> {
34448    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
34449    type StablePtr = TokenHashPtr<'db>;
34450    type Green = TokenHashGreen<'db>;
34451    fn missing(db: &'db dyn Database) -> Self::Green {
34452        TokenHashGreen(
34453            GreenNode {
34454                kind: SyntaxKind::TokenMissing,
34455                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34456            }
34457            .intern(db),
34458        )
34459    }
34460    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34461        match node.green_node(db).details {
34462            GreenNodeDetails::Token(_) => Self { node },
34463            GreenNodeDetails::Node { .. } => {
34464                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
34465            }
34466        }
34467    }
34468    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34469        match node.green_node(db).details {
34470            GreenNodeDetails::Token(_) => Some(Self { node }),
34471            GreenNodeDetails::Node { .. } => None,
34472        }
34473    }
34474    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34475        self.node
34476    }
34477    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34478        TokenHashPtr(self.node.stable_ptr(db))
34479    }
34480}
34481#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34482pub struct TerminalHash<'db> {
34483    node: SyntaxNode<'db>,
34484}
34485impl<'db> Terminal<'db> for TerminalHash<'db> {
34486    const KIND: SyntaxKind = SyntaxKind::TerminalHash;
34487    type TokenType = TokenHash<'db>;
34488    fn new_green(
34489        db: &'db dyn Database,
34490        leading_trivia: TriviaGreen<'db>,
34491        token: <<TerminalHash<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34492        trailing_trivia: TriviaGreen<'db>,
34493    ) -> Self::Green {
34494        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34495        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34496        TerminalHashGreen(
34497            GreenNode {
34498                kind: SyntaxKind::TerminalHash,
34499                details: GreenNodeDetails::Node { children: children.into(), width },
34500            }
34501            .intern(db),
34502        )
34503    }
34504    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34505        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34506            unreachable!("Expected a node, not a token");
34507        };
34508        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34509    }
34510}
34511impl<'db> TerminalHash<'db> {
34512    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34513        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34514    }
34515    pub fn token(&self, db: &'db dyn Database) -> TokenHash<'db> {
34516        TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
34517    }
34518    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34519        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34520    }
34521}
34522#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34523pub struct TerminalHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34524impl<'db> TerminalHashPtr<'db> {}
34525impl<'db> TypedStablePtr<'db> for TerminalHashPtr<'db> {
34526    type SyntaxNode = TerminalHash<'db>;
34527    fn untyped(self) -> SyntaxStablePtrId<'db> {
34528        self.0
34529    }
34530    fn lookup(&self, db: &'db dyn Database) -> TerminalHash<'db> {
34531        TerminalHash::from_syntax_node(db, self.0.lookup(db))
34532    }
34533}
34534impl<'db> From<TerminalHashPtr<'db>> for SyntaxStablePtrId<'db> {
34535    fn from(ptr: TerminalHashPtr<'db>) -> Self {
34536        ptr.untyped()
34537    }
34538}
34539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34540pub struct TerminalHashGreen<'db>(pub GreenId<'db>);
34541impl<'db> TypedSyntaxNode<'db> for TerminalHash<'db> {
34542    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
34543    type StablePtr = TerminalHashPtr<'db>;
34544    type Green = TerminalHashGreen<'db>;
34545    fn missing(db: &'db dyn Database) -> Self::Green {
34546        TerminalHashGreen(
34547            GreenNode {
34548                kind: SyntaxKind::TerminalHash,
34549                details: GreenNodeDetails::Node {
34550                    children: [
34551                        Trivia::missing(db).0,
34552                        TokenHash::missing(db).0,
34553                        Trivia::missing(db).0,
34554                    ]
34555                    .into(),
34556                    width: TextWidth::default(),
34557                },
34558            }
34559            .intern(db),
34560        )
34561    }
34562    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34563        let kind = node.kind(db);
34564        assert_eq!(
34565            kind,
34566            SyntaxKind::TerminalHash,
34567            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34568            kind,
34569            SyntaxKind::TerminalHash
34570        );
34571        Self { node }
34572    }
34573    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34574        let kind = node.kind(db);
34575        if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
34576    }
34577    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34578        self.node
34579    }
34580    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34581        TerminalHashPtr(self.node.stable_ptr(db))
34582    }
34583}
34584#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34585pub struct TokenLBrace<'db> {
34586    node: SyntaxNode<'db>,
34587}
34588impl<'db> Token<'db> for TokenLBrace<'db> {
34589    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34590        TokenLBraceGreen(
34591            GreenNode { kind: SyntaxKind::TokenLBrace, details: GreenNodeDetails::Token(text) }
34592                .intern(db),
34593        )
34594    }
34595    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34596        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34597    }
34598}
34599#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34600pub struct TokenLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34601impl<'db> TypedStablePtr<'db> for TokenLBracePtr<'db> {
34602    type SyntaxNode = TokenLBrace<'db>;
34603    fn untyped(self) -> SyntaxStablePtrId<'db> {
34604        self.0
34605    }
34606    fn lookup(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34607        TokenLBrace::from_syntax_node(db, self.0.lookup(db))
34608    }
34609}
34610impl<'db> From<TokenLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34611    fn from(ptr: TokenLBracePtr<'db>) -> Self {
34612        ptr.untyped()
34613    }
34614}
34615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34616pub struct TokenLBraceGreen<'db>(pub GreenId<'db>);
34617impl<'db> TokenLBraceGreen<'db> {
34618    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34619        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34620    }
34621}
34622impl<'db> TypedSyntaxNode<'db> for TokenLBrace<'db> {
34623    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
34624    type StablePtr = TokenLBracePtr<'db>;
34625    type Green = TokenLBraceGreen<'db>;
34626    fn missing(db: &'db dyn Database) -> Self::Green {
34627        TokenLBraceGreen(
34628            GreenNode {
34629                kind: SyntaxKind::TokenMissing,
34630                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34631            }
34632            .intern(db),
34633        )
34634    }
34635    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34636        match node.green_node(db).details {
34637            GreenNodeDetails::Token(_) => Self { node },
34638            GreenNodeDetails::Node { .. } => {
34639                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
34640            }
34641        }
34642    }
34643    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34644        match node.green_node(db).details {
34645            GreenNodeDetails::Token(_) => Some(Self { node }),
34646            GreenNodeDetails::Node { .. } => None,
34647        }
34648    }
34649    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34650        self.node
34651    }
34652    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34653        TokenLBracePtr(self.node.stable_ptr(db))
34654    }
34655}
34656#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34657pub struct TerminalLBrace<'db> {
34658    node: SyntaxNode<'db>,
34659}
34660impl<'db> Terminal<'db> for TerminalLBrace<'db> {
34661    const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
34662    type TokenType = TokenLBrace<'db>;
34663    fn new_green(
34664        db: &'db dyn Database,
34665        leading_trivia: TriviaGreen<'db>,
34666        token: <<TerminalLBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34667        trailing_trivia: TriviaGreen<'db>,
34668    ) -> Self::Green {
34669        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34670        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34671        TerminalLBraceGreen(
34672            GreenNode {
34673                kind: SyntaxKind::TerminalLBrace,
34674                details: GreenNodeDetails::Node { children: children.into(), width },
34675            }
34676            .intern(db),
34677        )
34678    }
34679    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34680        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34681            unreachable!("Expected a node, not a token");
34682        };
34683        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34684    }
34685}
34686impl<'db> TerminalLBrace<'db> {
34687    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34688        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34689    }
34690    pub fn token(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34691        TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
34692    }
34693    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34694        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34695    }
34696}
34697#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34698pub struct TerminalLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34699impl<'db> TerminalLBracePtr<'db> {}
34700impl<'db> TypedStablePtr<'db> for TerminalLBracePtr<'db> {
34701    type SyntaxNode = TerminalLBrace<'db>;
34702    fn untyped(self) -> SyntaxStablePtrId<'db> {
34703        self.0
34704    }
34705    fn lookup(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
34706        TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
34707    }
34708}
34709impl<'db> From<TerminalLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34710    fn from(ptr: TerminalLBracePtr<'db>) -> Self {
34711        ptr.untyped()
34712    }
34713}
34714#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34715pub struct TerminalLBraceGreen<'db>(pub GreenId<'db>);
34716impl<'db> TypedSyntaxNode<'db> for TerminalLBrace<'db> {
34717    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
34718    type StablePtr = TerminalLBracePtr<'db>;
34719    type Green = TerminalLBraceGreen<'db>;
34720    fn missing(db: &'db dyn Database) -> Self::Green {
34721        TerminalLBraceGreen(
34722            GreenNode {
34723                kind: SyntaxKind::TerminalLBrace,
34724                details: GreenNodeDetails::Node {
34725                    children: [
34726                        Trivia::missing(db).0,
34727                        TokenLBrace::missing(db).0,
34728                        Trivia::missing(db).0,
34729                    ]
34730                    .into(),
34731                    width: TextWidth::default(),
34732                },
34733            }
34734            .intern(db),
34735        )
34736    }
34737    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34738        let kind = node.kind(db);
34739        assert_eq!(
34740            kind,
34741            SyntaxKind::TerminalLBrace,
34742            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34743            kind,
34744            SyntaxKind::TerminalLBrace
34745        );
34746        Self { node }
34747    }
34748    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34749        let kind = node.kind(db);
34750        if kind == SyntaxKind::TerminalLBrace {
34751            Some(Self::from_syntax_node(db, node))
34752        } else {
34753            None
34754        }
34755    }
34756    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34757        self.node
34758    }
34759    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34760        TerminalLBracePtr(self.node.stable_ptr(db))
34761    }
34762}
34763#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34764pub struct TokenLBrack<'db> {
34765    node: SyntaxNode<'db>,
34766}
34767impl<'db> Token<'db> for TokenLBrack<'db> {
34768    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34769        TokenLBrackGreen(
34770            GreenNode { kind: SyntaxKind::TokenLBrack, details: GreenNodeDetails::Token(text) }
34771                .intern(db),
34772        )
34773    }
34774    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34775        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34776    }
34777}
34778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34779pub struct TokenLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34780impl<'db> TypedStablePtr<'db> for TokenLBrackPtr<'db> {
34781    type SyntaxNode = TokenLBrack<'db>;
34782    fn untyped(self) -> SyntaxStablePtrId<'db> {
34783        self.0
34784    }
34785    fn lookup(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34786        TokenLBrack::from_syntax_node(db, self.0.lookup(db))
34787    }
34788}
34789impl<'db> From<TokenLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34790    fn from(ptr: TokenLBrackPtr<'db>) -> Self {
34791        ptr.untyped()
34792    }
34793}
34794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34795pub struct TokenLBrackGreen<'db>(pub GreenId<'db>);
34796impl<'db> TokenLBrackGreen<'db> {
34797    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34798        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34799    }
34800}
34801impl<'db> TypedSyntaxNode<'db> for TokenLBrack<'db> {
34802    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
34803    type StablePtr = TokenLBrackPtr<'db>;
34804    type Green = TokenLBrackGreen<'db>;
34805    fn missing(db: &'db dyn Database) -> Self::Green {
34806        TokenLBrackGreen(
34807            GreenNode {
34808                kind: SyntaxKind::TokenMissing,
34809                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34810            }
34811            .intern(db),
34812        )
34813    }
34814    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34815        match node.green_node(db).details {
34816            GreenNodeDetails::Token(_) => Self { node },
34817            GreenNodeDetails::Node { .. } => {
34818                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
34819            }
34820        }
34821    }
34822    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34823        match node.green_node(db).details {
34824            GreenNodeDetails::Token(_) => Some(Self { node }),
34825            GreenNodeDetails::Node { .. } => None,
34826        }
34827    }
34828    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34829        self.node
34830    }
34831    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34832        TokenLBrackPtr(self.node.stable_ptr(db))
34833    }
34834}
34835#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34836pub struct TerminalLBrack<'db> {
34837    node: SyntaxNode<'db>,
34838}
34839impl<'db> Terminal<'db> for TerminalLBrack<'db> {
34840    const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
34841    type TokenType = TokenLBrack<'db>;
34842    fn new_green(
34843        db: &'db dyn Database,
34844        leading_trivia: TriviaGreen<'db>,
34845        token: <<TerminalLBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34846        trailing_trivia: TriviaGreen<'db>,
34847    ) -> Self::Green {
34848        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34849        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34850        TerminalLBrackGreen(
34851            GreenNode {
34852                kind: SyntaxKind::TerminalLBrack,
34853                details: GreenNodeDetails::Node { children: children.into(), width },
34854            }
34855            .intern(db),
34856        )
34857    }
34858    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34859        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34860            unreachable!("Expected a node, not a token");
34861        };
34862        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34863    }
34864}
34865impl<'db> TerminalLBrack<'db> {
34866    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34867        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34868    }
34869    pub fn token(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34870        TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
34871    }
34872    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34873        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34874    }
34875}
34876#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34877pub struct TerminalLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34878impl<'db> TerminalLBrackPtr<'db> {}
34879impl<'db> TypedStablePtr<'db> for TerminalLBrackPtr<'db> {
34880    type SyntaxNode = TerminalLBrack<'db>;
34881    fn untyped(self) -> SyntaxStablePtrId<'db> {
34882        self.0
34883    }
34884    fn lookup(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
34885        TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
34886    }
34887}
34888impl<'db> From<TerminalLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34889    fn from(ptr: TerminalLBrackPtr<'db>) -> Self {
34890        ptr.untyped()
34891    }
34892}
34893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34894pub struct TerminalLBrackGreen<'db>(pub GreenId<'db>);
34895impl<'db> TypedSyntaxNode<'db> for TerminalLBrack<'db> {
34896    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
34897    type StablePtr = TerminalLBrackPtr<'db>;
34898    type Green = TerminalLBrackGreen<'db>;
34899    fn missing(db: &'db dyn Database) -> Self::Green {
34900        TerminalLBrackGreen(
34901            GreenNode {
34902                kind: SyntaxKind::TerminalLBrack,
34903                details: GreenNodeDetails::Node {
34904                    children: [
34905                        Trivia::missing(db).0,
34906                        TokenLBrack::missing(db).0,
34907                        Trivia::missing(db).0,
34908                    ]
34909                    .into(),
34910                    width: TextWidth::default(),
34911                },
34912            }
34913            .intern(db),
34914        )
34915    }
34916    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34917        let kind = node.kind(db);
34918        assert_eq!(
34919            kind,
34920            SyntaxKind::TerminalLBrack,
34921            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34922            kind,
34923            SyntaxKind::TerminalLBrack
34924        );
34925        Self { node }
34926    }
34927    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34928        let kind = node.kind(db);
34929        if kind == SyntaxKind::TerminalLBrack {
34930            Some(Self::from_syntax_node(db, node))
34931        } else {
34932            None
34933        }
34934    }
34935    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34936        self.node
34937    }
34938    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34939        TerminalLBrackPtr(self.node.stable_ptr(db))
34940    }
34941}
34942#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34943pub struct TokenLE<'db> {
34944    node: SyntaxNode<'db>,
34945}
34946impl<'db> Token<'db> for TokenLE<'db> {
34947    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34948        TokenLEGreen(
34949            GreenNode { kind: SyntaxKind::TokenLE, details: GreenNodeDetails::Token(text) }
34950                .intern(db),
34951        )
34952    }
34953    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34954        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34955    }
34956}
34957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34958pub struct TokenLEPtr<'db>(pub SyntaxStablePtrId<'db>);
34959impl<'db> TypedStablePtr<'db> for TokenLEPtr<'db> {
34960    type SyntaxNode = TokenLE<'db>;
34961    fn untyped(self) -> SyntaxStablePtrId<'db> {
34962        self.0
34963    }
34964    fn lookup(&self, db: &'db dyn Database) -> TokenLE<'db> {
34965        TokenLE::from_syntax_node(db, self.0.lookup(db))
34966    }
34967}
34968impl<'db> From<TokenLEPtr<'db>> for SyntaxStablePtrId<'db> {
34969    fn from(ptr: TokenLEPtr<'db>) -> Self {
34970        ptr.untyped()
34971    }
34972}
34973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34974pub struct TokenLEGreen<'db>(pub GreenId<'db>);
34975impl<'db> TokenLEGreen<'db> {
34976    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34977        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34978    }
34979}
34980impl<'db> TypedSyntaxNode<'db> for TokenLE<'db> {
34981    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
34982    type StablePtr = TokenLEPtr<'db>;
34983    type Green = TokenLEGreen<'db>;
34984    fn missing(db: &'db dyn Database) -> Self::Green {
34985        TokenLEGreen(
34986            GreenNode {
34987                kind: SyntaxKind::TokenMissing,
34988                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34989            }
34990            .intern(db),
34991        )
34992    }
34993    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34994        match node.green_node(db).details {
34995            GreenNodeDetails::Token(_) => Self { node },
34996            GreenNodeDetails::Node { .. } => {
34997                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
34998            }
34999        }
35000    }
35001    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35002        match node.green_node(db).details {
35003            GreenNodeDetails::Token(_) => Some(Self { node }),
35004            GreenNodeDetails::Node { .. } => None,
35005        }
35006    }
35007    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35008        self.node
35009    }
35010    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35011        TokenLEPtr(self.node.stable_ptr(db))
35012    }
35013}
35014#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35015pub struct TerminalLE<'db> {
35016    node: SyntaxNode<'db>,
35017}
35018impl<'db> Terminal<'db> for TerminalLE<'db> {
35019    const KIND: SyntaxKind = SyntaxKind::TerminalLE;
35020    type TokenType = TokenLE<'db>;
35021    fn new_green(
35022        db: &'db dyn Database,
35023        leading_trivia: TriviaGreen<'db>,
35024        token: <<TerminalLE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35025        trailing_trivia: TriviaGreen<'db>,
35026    ) -> Self::Green {
35027        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35028        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35029        TerminalLEGreen(
35030            GreenNode {
35031                kind: SyntaxKind::TerminalLE,
35032                details: GreenNodeDetails::Node { children: children.into(), width },
35033            }
35034            .intern(db),
35035        )
35036    }
35037    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35038        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35039            unreachable!("Expected a node, not a token");
35040        };
35041        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35042    }
35043}
35044impl<'db> TerminalLE<'db> {
35045    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35046        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35047    }
35048    pub fn token(&self, db: &'db dyn Database) -> TokenLE<'db> {
35049        TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
35050    }
35051    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35052        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35053    }
35054}
35055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35056pub struct TerminalLEPtr<'db>(pub SyntaxStablePtrId<'db>);
35057impl<'db> TerminalLEPtr<'db> {}
35058impl<'db> TypedStablePtr<'db> for TerminalLEPtr<'db> {
35059    type SyntaxNode = TerminalLE<'db>;
35060    fn untyped(self) -> SyntaxStablePtrId<'db> {
35061        self.0
35062    }
35063    fn lookup(&self, db: &'db dyn Database) -> TerminalLE<'db> {
35064        TerminalLE::from_syntax_node(db, self.0.lookup(db))
35065    }
35066}
35067impl<'db> From<TerminalLEPtr<'db>> for SyntaxStablePtrId<'db> {
35068    fn from(ptr: TerminalLEPtr<'db>) -> Self {
35069        ptr.untyped()
35070    }
35071}
35072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35073pub struct TerminalLEGreen<'db>(pub GreenId<'db>);
35074impl<'db> TypedSyntaxNode<'db> for TerminalLE<'db> {
35075    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
35076    type StablePtr = TerminalLEPtr<'db>;
35077    type Green = TerminalLEGreen<'db>;
35078    fn missing(db: &'db dyn Database) -> Self::Green {
35079        TerminalLEGreen(
35080            GreenNode {
35081                kind: SyntaxKind::TerminalLE,
35082                details: GreenNodeDetails::Node {
35083                    children: [
35084                        Trivia::missing(db).0,
35085                        TokenLE::missing(db).0,
35086                        Trivia::missing(db).0,
35087                    ]
35088                    .into(),
35089                    width: TextWidth::default(),
35090                },
35091            }
35092            .intern(db),
35093        )
35094    }
35095    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35096        let kind = node.kind(db);
35097        assert_eq!(
35098            kind,
35099            SyntaxKind::TerminalLE,
35100            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35101            kind,
35102            SyntaxKind::TerminalLE
35103        );
35104        Self { node }
35105    }
35106    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35107        let kind = node.kind(db);
35108        if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
35109    }
35110    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35111        self.node
35112    }
35113    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35114        TerminalLEPtr(self.node.stable_ptr(db))
35115    }
35116}
35117#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35118pub struct TokenLParen<'db> {
35119    node: SyntaxNode<'db>,
35120}
35121impl<'db> Token<'db> for TokenLParen<'db> {
35122    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35123        TokenLParenGreen(
35124            GreenNode { kind: SyntaxKind::TokenLParen, details: GreenNodeDetails::Token(text) }
35125                .intern(db),
35126        )
35127    }
35128    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35129        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35130    }
35131}
35132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35133pub struct TokenLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35134impl<'db> TypedStablePtr<'db> for TokenLParenPtr<'db> {
35135    type SyntaxNode = TokenLParen<'db>;
35136    fn untyped(self) -> SyntaxStablePtrId<'db> {
35137        self.0
35138    }
35139    fn lookup(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35140        TokenLParen::from_syntax_node(db, self.0.lookup(db))
35141    }
35142}
35143impl<'db> From<TokenLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35144    fn from(ptr: TokenLParenPtr<'db>) -> Self {
35145        ptr.untyped()
35146    }
35147}
35148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35149pub struct TokenLParenGreen<'db>(pub GreenId<'db>);
35150impl<'db> TokenLParenGreen<'db> {
35151    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35152        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35153    }
35154}
35155impl<'db> TypedSyntaxNode<'db> for TokenLParen<'db> {
35156    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
35157    type StablePtr = TokenLParenPtr<'db>;
35158    type Green = TokenLParenGreen<'db>;
35159    fn missing(db: &'db dyn Database) -> Self::Green {
35160        TokenLParenGreen(
35161            GreenNode {
35162                kind: SyntaxKind::TokenMissing,
35163                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35164            }
35165            .intern(db),
35166        )
35167    }
35168    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35169        match node.green_node(db).details {
35170            GreenNodeDetails::Token(_) => Self { node },
35171            GreenNodeDetails::Node { .. } => {
35172                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
35173            }
35174        }
35175    }
35176    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35177        match node.green_node(db).details {
35178            GreenNodeDetails::Token(_) => Some(Self { node }),
35179            GreenNodeDetails::Node { .. } => None,
35180        }
35181    }
35182    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35183        self.node
35184    }
35185    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35186        TokenLParenPtr(self.node.stable_ptr(db))
35187    }
35188}
35189#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35190pub struct TerminalLParen<'db> {
35191    node: SyntaxNode<'db>,
35192}
35193impl<'db> Terminal<'db> for TerminalLParen<'db> {
35194    const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
35195    type TokenType = TokenLParen<'db>;
35196    fn new_green(
35197        db: &'db dyn Database,
35198        leading_trivia: TriviaGreen<'db>,
35199        token: <<TerminalLParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35200        trailing_trivia: TriviaGreen<'db>,
35201    ) -> Self::Green {
35202        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35203        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35204        TerminalLParenGreen(
35205            GreenNode {
35206                kind: SyntaxKind::TerminalLParen,
35207                details: GreenNodeDetails::Node { children: children.into(), width },
35208            }
35209            .intern(db),
35210        )
35211    }
35212    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35213        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35214            unreachable!("Expected a node, not a token");
35215        };
35216        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35217    }
35218}
35219impl<'db> TerminalLParen<'db> {
35220    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35221        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35222    }
35223    pub fn token(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35224        TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
35225    }
35226    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35227        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35228    }
35229}
35230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35231pub struct TerminalLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35232impl<'db> TerminalLParenPtr<'db> {}
35233impl<'db> TypedStablePtr<'db> for TerminalLParenPtr<'db> {
35234    type SyntaxNode = TerminalLParen<'db>;
35235    fn untyped(self) -> SyntaxStablePtrId<'db> {
35236        self.0
35237    }
35238    fn lookup(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
35239        TerminalLParen::from_syntax_node(db, self.0.lookup(db))
35240    }
35241}
35242impl<'db> From<TerminalLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35243    fn from(ptr: TerminalLParenPtr<'db>) -> Self {
35244        ptr.untyped()
35245    }
35246}
35247#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35248pub struct TerminalLParenGreen<'db>(pub GreenId<'db>);
35249impl<'db> TypedSyntaxNode<'db> for TerminalLParen<'db> {
35250    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
35251    type StablePtr = TerminalLParenPtr<'db>;
35252    type Green = TerminalLParenGreen<'db>;
35253    fn missing(db: &'db dyn Database) -> Self::Green {
35254        TerminalLParenGreen(
35255            GreenNode {
35256                kind: SyntaxKind::TerminalLParen,
35257                details: GreenNodeDetails::Node {
35258                    children: [
35259                        Trivia::missing(db).0,
35260                        TokenLParen::missing(db).0,
35261                        Trivia::missing(db).0,
35262                    ]
35263                    .into(),
35264                    width: TextWidth::default(),
35265                },
35266            }
35267            .intern(db),
35268        )
35269    }
35270    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35271        let kind = node.kind(db);
35272        assert_eq!(
35273            kind,
35274            SyntaxKind::TerminalLParen,
35275            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35276            kind,
35277            SyntaxKind::TerminalLParen
35278        );
35279        Self { node }
35280    }
35281    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35282        let kind = node.kind(db);
35283        if kind == SyntaxKind::TerminalLParen {
35284            Some(Self::from_syntax_node(db, node))
35285        } else {
35286            None
35287        }
35288    }
35289    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35290        self.node
35291    }
35292    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35293        TerminalLParenPtr(self.node.stable_ptr(db))
35294    }
35295}
35296#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35297pub struct TokenLT<'db> {
35298    node: SyntaxNode<'db>,
35299}
35300impl<'db> Token<'db> for TokenLT<'db> {
35301    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35302        TokenLTGreen(
35303            GreenNode { kind: SyntaxKind::TokenLT, details: GreenNodeDetails::Token(text) }
35304                .intern(db),
35305        )
35306    }
35307    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35308        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35309    }
35310}
35311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35312pub struct TokenLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35313impl<'db> TypedStablePtr<'db> for TokenLTPtr<'db> {
35314    type SyntaxNode = TokenLT<'db>;
35315    fn untyped(self) -> SyntaxStablePtrId<'db> {
35316        self.0
35317    }
35318    fn lookup(&self, db: &'db dyn Database) -> TokenLT<'db> {
35319        TokenLT::from_syntax_node(db, self.0.lookup(db))
35320    }
35321}
35322impl<'db> From<TokenLTPtr<'db>> for SyntaxStablePtrId<'db> {
35323    fn from(ptr: TokenLTPtr<'db>) -> Self {
35324        ptr.untyped()
35325    }
35326}
35327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35328pub struct TokenLTGreen<'db>(pub GreenId<'db>);
35329impl<'db> TokenLTGreen<'db> {
35330    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35331        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35332    }
35333}
35334impl<'db> TypedSyntaxNode<'db> for TokenLT<'db> {
35335    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
35336    type StablePtr = TokenLTPtr<'db>;
35337    type Green = TokenLTGreen<'db>;
35338    fn missing(db: &'db dyn Database) -> Self::Green {
35339        TokenLTGreen(
35340            GreenNode {
35341                kind: SyntaxKind::TokenMissing,
35342                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35343            }
35344            .intern(db),
35345        )
35346    }
35347    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35348        match node.green_node(db).details {
35349            GreenNodeDetails::Token(_) => Self { node },
35350            GreenNodeDetails::Node { .. } => {
35351                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
35352            }
35353        }
35354    }
35355    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35356        match node.green_node(db).details {
35357            GreenNodeDetails::Token(_) => Some(Self { node }),
35358            GreenNodeDetails::Node { .. } => None,
35359        }
35360    }
35361    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35362        self.node
35363    }
35364    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35365        TokenLTPtr(self.node.stable_ptr(db))
35366    }
35367}
35368#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35369pub struct TerminalLT<'db> {
35370    node: SyntaxNode<'db>,
35371}
35372impl<'db> Terminal<'db> for TerminalLT<'db> {
35373    const KIND: SyntaxKind = SyntaxKind::TerminalLT;
35374    type TokenType = TokenLT<'db>;
35375    fn new_green(
35376        db: &'db dyn Database,
35377        leading_trivia: TriviaGreen<'db>,
35378        token: <<TerminalLT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35379        trailing_trivia: TriviaGreen<'db>,
35380    ) -> Self::Green {
35381        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35382        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35383        TerminalLTGreen(
35384            GreenNode {
35385                kind: SyntaxKind::TerminalLT,
35386                details: GreenNodeDetails::Node { children: children.into(), width },
35387            }
35388            .intern(db),
35389        )
35390    }
35391    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35392        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35393            unreachable!("Expected a node, not a token");
35394        };
35395        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35396    }
35397}
35398impl<'db> TerminalLT<'db> {
35399    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35400        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35401    }
35402    pub fn token(&self, db: &'db dyn Database) -> TokenLT<'db> {
35403        TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
35404    }
35405    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35406        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35407    }
35408}
35409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35410pub struct TerminalLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35411impl<'db> TerminalLTPtr<'db> {}
35412impl<'db> TypedStablePtr<'db> for TerminalLTPtr<'db> {
35413    type SyntaxNode = TerminalLT<'db>;
35414    fn untyped(self) -> SyntaxStablePtrId<'db> {
35415        self.0
35416    }
35417    fn lookup(&self, db: &'db dyn Database) -> TerminalLT<'db> {
35418        TerminalLT::from_syntax_node(db, self.0.lookup(db))
35419    }
35420}
35421impl<'db> From<TerminalLTPtr<'db>> for SyntaxStablePtrId<'db> {
35422    fn from(ptr: TerminalLTPtr<'db>) -> Self {
35423        ptr.untyped()
35424    }
35425}
35426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35427pub struct TerminalLTGreen<'db>(pub GreenId<'db>);
35428impl<'db> TypedSyntaxNode<'db> for TerminalLT<'db> {
35429    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
35430    type StablePtr = TerminalLTPtr<'db>;
35431    type Green = TerminalLTGreen<'db>;
35432    fn missing(db: &'db dyn Database) -> Self::Green {
35433        TerminalLTGreen(
35434            GreenNode {
35435                kind: SyntaxKind::TerminalLT,
35436                details: GreenNodeDetails::Node {
35437                    children: [
35438                        Trivia::missing(db).0,
35439                        TokenLT::missing(db).0,
35440                        Trivia::missing(db).0,
35441                    ]
35442                    .into(),
35443                    width: TextWidth::default(),
35444                },
35445            }
35446            .intern(db),
35447        )
35448    }
35449    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35450        let kind = node.kind(db);
35451        assert_eq!(
35452            kind,
35453            SyntaxKind::TerminalLT,
35454            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35455            kind,
35456            SyntaxKind::TerminalLT
35457        );
35458        Self { node }
35459    }
35460    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35461        let kind = node.kind(db);
35462        if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
35463    }
35464    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35465        self.node
35466    }
35467    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35468        TerminalLTPtr(self.node.stable_ptr(db))
35469    }
35470}
35471#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35472pub struct TokenMatchArrow<'db> {
35473    node: SyntaxNode<'db>,
35474}
35475impl<'db> Token<'db> for TokenMatchArrow<'db> {
35476    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35477        TokenMatchArrowGreen(
35478            GreenNode { kind: SyntaxKind::TokenMatchArrow, details: GreenNodeDetails::Token(text) }
35479                .intern(db),
35480        )
35481    }
35482    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35483        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35484    }
35485}
35486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35487pub struct TokenMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35488impl<'db> TypedStablePtr<'db> for TokenMatchArrowPtr<'db> {
35489    type SyntaxNode = TokenMatchArrow<'db>;
35490    fn untyped(self) -> SyntaxStablePtrId<'db> {
35491        self.0
35492    }
35493    fn lookup(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35494        TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
35495    }
35496}
35497impl<'db> From<TokenMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35498    fn from(ptr: TokenMatchArrowPtr<'db>) -> Self {
35499        ptr.untyped()
35500    }
35501}
35502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35503pub struct TokenMatchArrowGreen<'db>(pub GreenId<'db>);
35504impl<'db> TokenMatchArrowGreen<'db> {
35505    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35506        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35507    }
35508}
35509impl<'db> TypedSyntaxNode<'db> for TokenMatchArrow<'db> {
35510    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
35511    type StablePtr = TokenMatchArrowPtr<'db>;
35512    type Green = TokenMatchArrowGreen<'db>;
35513    fn missing(db: &'db dyn Database) -> Self::Green {
35514        TokenMatchArrowGreen(
35515            GreenNode {
35516                kind: SyntaxKind::TokenMissing,
35517                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35518            }
35519            .intern(db),
35520        )
35521    }
35522    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35523        match node.green_node(db).details {
35524            GreenNodeDetails::Token(_) => Self { node },
35525            GreenNodeDetails::Node { .. } => {
35526                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
35527            }
35528        }
35529    }
35530    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35531        match node.green_node(db).details {
35532            GreenNodeDetails::Token(_) => Some(Self { node }),
35533            GreenNodeDetails::Node { .. } => None,
35534        }
35535    }
35536    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35537        self.node
35538    }
35539    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35540        TokenMatchArrowPtr(self.node.stable_ptr(db))
35541    }
35542}
35543#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35544pub struct TerminalMatchArrow<'db> {
35545    node: SyntaxNode<'db>,
35546}
35547impl<'db> Terminal<'db> for TerminalMatchArrow<'db> {
35548    const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
35549    type TokenType = TokenMatchArrow<'db>;
35550    fn new_green(
35551        db: &'db dyn Database,
35552        leading_trivia: TriviaGreen<'db>,
35553        token: <<TerminalMatchArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35554        trailing_trivia: TriviaGreen<'db>,
35555    ) -> Self::Green {
35556        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35557        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35558        TerminalMatchArrowGreen(
35559            GreenNode {
35560                kind: SyntaxKind::TerminalMatchArrow,
35561                details: GreenNodeDetails::Node { children: children.into(), width },
35562            }
35563            .intern(db),
35564        )
35565    }
35566    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35567        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35568            unreachable!("Expected a node, not a token");
35569        };
35570        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35571    }
35572}
35573impl<'db> TerminalMatchArrow<'db> {
35574    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35575        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35576    }
35577    pub fn token(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35578        TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
35579    }
35580    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35581        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35582    }
35583}
35584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35585pub struct TerminalMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35586impl<'db> TerminalMatchArrowPtr<'db> {}
35587impl<'db> TypedStablePtr<'db> for TerminalMatchArrowPtr<'db> {
35588    type SyntaxNode = TerminalMatchArrow<'db>;
35589    fn untyped(self) -> SyntaxStablePtrId<'db> {
35590        self.0
35591    }
35592    fn lookup(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
35593        TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
35594    }
35595}
35596impl<'db> From<TerminalMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35597    fn from(ptr: TerminalMatchArrowPtr<'db>) -> Self {
35598        ptr.untyped()
35599    }
35600}
35601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35602pub struct TerminalMatchArrowGreen<'db>(pub GreenId<'db>);
35603impl<'db> TypedSyntaxNode<'db> for TerminalMatchArrow<'db> {
35604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
35605    type StablePtr = TerminalMatchArrowPtr<'db>;
35606    type Green = TerminalMatchArrowGreen<'db>;
35607    fn missing(db: &'db dyn Database) -> Self::Green {
35608        TerminalMatchArrowGreen(
35609            GreenNode {
35610                kind: SyntaxKind::TerminalMatchArrow,
35611                details: GreenNodeDetails::Node {
35612                    children: [
35613                        Trivia::missing(db).0,
35614                        TokenMatchArrow::missing(db).0,
35615                        Trivia::missing(db).0,
35616                    ]
35617                    .into(),
35618                    width: TextWidth::default(),
35619                },
35620            }
35621            .intern(db),
35622        )
35623    }
35624    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35625        let kind = node.kind(db);
35626        assert_eq!(
35627            kind,
35628            SyntaxKind::TerminalMatchArrow,
35629            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35630            kind,
35631            SyntaxKind::TerminalMatchArrow
35632        );
35633        Self { node }
35634    }
35635    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35636        let kind = node.kind(db);
35637        if kind == SyntaxKind::TerminalMatchArrow {
35638            Some(Self::from_syntax_node(db, node))
35639        } else {
35640            None
35641        }
35642    }
35643    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35644        self.node
35645    }
35646    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35647        TerminalMatchArrowPtr(self.node.stable_ptr(db))
35648    }
35649}
35650#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35651pub struct TokenMinus<'db> {
35652    node: SyntaxNode<'db>,
35653}
35654impl<'db> Token<'db> for TokenMinus<'db> {
35655    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35656        TokenMinusGreen(
35657            GreenNode { kind: SyntaxKind::TokenMinus, details: GreenNodeDetails::Token(text) }
35658                .intern(db),
35659        )
35660    }
35661    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35662        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35663    }
35664}
35665#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35666pub struct TokenMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35667impl<'db> TypedStablePtr<'db> for TokenMinusPtr<'db> {
35668    type SyntaxNode = TokenMinus<'db>;
35669    fn untyped(self) -> SyntaxStablePtrId<'db> {
35670        self.0
35671    }
35672    fn lookup(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35673        TokenMinus::from_syntax_node(db, self.0.lookup(db))
35674    }
35675}
35676impl<'db> From<TokenMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35677    fn from(ptr: TokenMinusPtr<'db>) -> Self {
35678        ptr.untyped()
35679    }
35680}
35681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35682pub struct TokenMinusGreen<'db>(pub GreenId<'db>);
35683impl<'db> TokenMinusGreen<'db> {
35684    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35685        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35686    }
35687}
35688impl<'db> TypedSyntaxNode<'db> for TokenMinus<'db> {
35689    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
35690    type StablePtr = TokenMinusPtr<'db>;
35691    type Green = TokenMinusGreen<'db>;
35692    fn missing(db: &'db dyn Database) -> Self::Green {
35693        TokenMinusGreen(
35694            GreenNode {
35695                kind: SyntaxKind::TokenMissing,
35696                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35697            }
35698            .intern(db),
35699        )
35700    }
35701    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35702        match node.green_node(db).details {
35703            GreenNodeDetails::Token(_) => Self { node },
35704            GreenNodeDetails::Node { .. } => {
35705                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
35706            }
35707        }
35708    }
35709    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35710        match node.green_node(db).details {
35711            GreenNodeDetails::Token(_) => Some(Self { node }),
35712            GreenNodeDetails::Node { .. } => None,
35713        }
35714    }
35715    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35716        self.node
35717    }
35718    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35719        TokenMinusPtr(self.node.stable_ptr(db))
35720    }
35721}
35722#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35723pub struct TerminalMinus<'db> {
35724    node: SyntaxNode<'db>,
35725}
35726impl<'db> Terminal<'db> for TerminalMinus<'db> {
35727    const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
35728    type TokenType = TokenMinus<'db>;
35729    fn new_green(
35730        db: &'db dyn Database,
35731        leading_trivia: TriviaGreen<'db>,
35732        token: <<TerminalMinus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35733        trailing_trivia: TriviaGreen<'db>,
35734    ) -> Self::Green {
35735        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35736        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35737        TerminalMinusGreen(
35738            GreenNode {
35739                kind: SyntaxKind::TerminalMinus,
35740                details: GreenNodeDetails::Node { children: children.into(), width },
35741            }
35742            .intern(db),
35743        )
35744    }
35745    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35746        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35747            unreachable!("Expected a node, not a token");
35748        };
35749        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35750    }
35751}
35752impl<'db> TerminalMinus<'db> {
35753    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35754        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35755    }
35756    pub fn token(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35757        TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
35758    }
35759    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35760        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35761    }
35762}
35763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35764pub struct TerminalMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35765impl<'db> TerminalMinusPtr<'db> {}
35766impl<'db> TypedStablePtr<'db> for TerminalMinusPtr<'db> {
35767    type SyntaxNode = TerminalMinus<'db>;
35768    fn untyped(self) -> SyntaxStablePtrId<'db> {
35769        self.0
35770    }
35771    fn lookup(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
35772        TerminalMinus::from_syntax_node(db, self.0.lookup(db))
35773    }
35774}
35775impl<'db> From<TerminalMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35776    fn from(ptr: TerminalMinusPtr<'db>) -> Self {
35777        ptr.untyped()
35778    }
35779}
35780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35781pub struct TerminalMinusGreen<'db>(pub GreenId<'db>);
35782impl<'db> TypedSyntaxNode<'db> for TerminalMinus<'db> {
35783    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
35784    type StablePtr = TerminalMinusPtr<'db>;
35785    type Green = TerminalMinusGreen<'db>;
35786    fn missing(db: &'db dyn Database) -> Self::Green {
35787        TerminalMinusGreen(
35788            GreenNode {
35789                kind: SyntaxKind::TerminalMinus,
35790                details: GreenNodeDetails::Node {
35791                    children: [
35792                        Trivia::missing(db).0,
35793                        TokenMinus::missing(db).0,
35794                        Trivia::missing(db).0,
35795                    ]
35796                    .into(),
35797                    width: TextWidth::default(),
35798                },
35799            }
35800            .intern(db),
35801        )
35802    }
35803    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35804        let kind = node.kind(db);
35805        assert_eq!(
35806            kind,
35807            SyntaxKind::TerminalMinus,
35808            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35809            kind,
35810            SyntaxKind::TerminalMinus
35811        );
35812        Self { node }
35813    }
35814    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35815        let kind = node.kind(db);
35816        if kind == SyntaxKind::TerminalMinus {
35817            Some(Self::from_syntax_node(db, node))
35818        } else {
35819            None
35820        }
35821    }
35822    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35823        self.node
35824    }
35825    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35826        TerminalMinusPtr(self.node.stable_ptr(db))
35827    }
35828}
35829#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35830pub struct TokenMinusEq<'db> {
35831    node: SyntaxNode<'db>,
35832}
35833impl<'db> Token<'db> for TokenMinusEq<'db> {
35834    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35835        TokenMinusEqGreen(
35836            GreenNode { kind: SyntaxKind::TokenMinusEq, details: GreenNodeDetails::Token(text) }
35837                .intern(db),
35838        )
35839    }
35840    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35841        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35842    }
35843}
35844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35845pub struct TokenMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35846impl<'db> TypedStablePtr<'db> for TokenMinusEqPtr<'db> {
35847    type SyntaxNode = TokenMinusEq<'db>;
35848    fn untyped(self) -> SyntaxStablePtrId<'db> {
35849        self.0
35850    }
35851    fn lookup(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35852        TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
35853    }
35854}
35855impl<'db> From<TokenMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35856    fn from(ptr: TokenMinusEqPtr<'db>) -> Self {
35857        ptr.untyped()
35858    }
35859}
35860#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35861pub struct TokenMinusEqGreen<'db>(pub GreenId<'db>);
35862impl<'db> TokenMinusEqGreen<'db> {
35863    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35864        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35865    }
35866}
35867impl<'db> TypedSyntaxNode<'db> for TokenMinusEq<'db> {
35868    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
35869    type StablePtr = TokenMinusEqPtr<'db>;
35870    type Green = TokenMinusEqGreen<'db>;
35871    fn missing(db: &'db dyn Database) -> Self::Green {
35872        TokenMinusEqGreen(
35873            GreenNode {
35874                kind: SyntaxKind::TokenMissing,
35875                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35876            }
35877            .intern(db),
35878        )
35879    }
35880    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35881        match node.green_node(db).details {
35882            GreenNodeDetails::Token(_) => Self { node },
35883            GreenNodeDetails::Node { .. } => {
35884                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
35885            }
35886        }
35887    }
35888    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35889        match node.green_node(db).details {
35890            GreenNodeDetails::Token(_) => Some(Self { node }),
35891            GreenNodeDetails::Node { .. } => None,
35892        }
35893    }
35894    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35895        self.node
35896    }
35897    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35898        TokenMinusEqPtr(self.node.stable_ptr(db))
35899    }
35900}
35901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35902pub struct TerminalMinusEq<'db> {
35903    node: SyntaxNode<'db>,
35904}
35905impl<'db> Terminal<'db> for TerminalMinusEq<'db> {
35906    const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
35907    type TokenType = TokenMinusEq<'db>;
35908    fn new_green(
35909        db: &'db dyn Database,
35910        leading_trivia: TriviaGreen<'db>,
35911        token: <<TerminalMinusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35912        trailing_trivia: TriviaGreen<'db>,
35913    ) -> Self::Green {
35914        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35915        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35916        TerminalMinusEqGreen(
35917            GreenNode {
35918                kind: SyntaxKind::TerminalMinusEq,
35919                details: GreenNodeDetails::Node { children: children.into(), width },
35920            }
35921            .intern(db),
35922        )
35923    }
35924    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35925        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35926            unreachable!("Expected a node, not a token");
35927        };
35928        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35929    }
35930}
35931impl<'db> TerminalMinusEq<'db> {
35932    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35933        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35934    }
35935    pub fn token(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35936        TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
35937    }
35938    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35939        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35940    }
35941}
35942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35943pub struct TerminalMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35944impl<'db> TerminalMinusEqPtr<'db> {}
35945impl<'db> TypedStablePtr<'db> for TerminalMinusEqPtr<'db> {
35946    type SyntaxNode = TerminalMinusEq<'db>;
35947    fn untyped(self) -> SyntaxStablePtrId<'db> {
35948        self.0
35949    }
35950    fn lookup(&self, db: &'db dyn Database) -> TerminalMinusEq<'db> {
35951        TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
35952    }
35953}
35954impl<'db> From<TerminalMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35955    fn from(ptr: TerminalMinusEqPtr<'db>) -> Self {
35956        ptr.untyped()
35957    }
35958}
35959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35960pub struct TerminalMinusEqGreen<'db>(pub GreenId<'db>);
35961impl<'db> TypedSyntaxNode<'db> for TerminalMinusEq<'db> {
35962    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
35963    type StablePtr = TerminalMinusEqPtr<'db>;
35964    type Green = TerminalMinusEqGreen<'db>;
35965    fn missing(db: &'db dyn Database) -> Self::Green {
35966        TerminalMinusEqGreen(
35967            GreenNode {
35968                kind: SyntaxKind::TerminalMinusEq,
35969                details: GreenNodeDetails::Node {
35970                    children: [
35971                        Trivia::missing(db).0,
35972                        TokenMinusEq::missing(db).0,
35973                        Trivia::missing(db).0,
35974                    ]
35975                    .into(),
35976                    width: TextWidth::default(),
35977                },
35978            }
35979            .intern(db),
35980        )
35981    }
35982    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35983        let kind = node.kind(db);
35984        assert_eq!(
35985            kind,
35986            SyntaxKind::TerminalMinusEq,
35987            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35988            kind,
35989            SyntaxKind::TerminalMinusEq
35990        );
35991        Self { node }
35992    }
35993    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35994        let kind = node.kind(db);
35995        if kind == SyntaxKind::TerminalMinusEq {
35996            Some(Self::from_syntax_node(db, node))
35997        } else {
35998            None
35999        }
36000    }
36001    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36002        self.node
36003    }
36004    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36005        TerminalMinusEqPtr(self.node.stable_ptr(db))
36006    }
36007}
36008#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36009pub struct TokenMod<'db> {
36010    node: SyntaxNode<'db>,
36011}
36012impl<'db> Token<'db> for TokenMod<'db> {
36013    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36014        TokenModGreen(
36015            GreenNode { kind: SyntaxKind::TokenMod, details: GreenNodeDetails::Token(text) }
36016                .intern(db),
36017        )
36018    }
36019    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36020        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36021    }
36022}
36023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36024pub struct TokenModPtr<'db>(pub SyntaxStablePtrId<'db>);
36025impl<'db> TypedStablePtr<'db> for TokenModPtr<'db> {
36026    type SyntaxNode = TokenMod<'db>;
36027    fn untyped(self) -> SyntaxStablePtrId<'db> {
36028        self.0
36029    }
36030    fn lookup(&self, db: &'db dyn Database) -> TokenMod<'db> {
36031        TokenMod::from_syntax_node(db, self.0.lookup(db))
36032    }
36033}
36034impl<'db> From<TokenModPtr<'db>> for SyntaxStablePtrId<'db> {
36035    fn from(ptr: TokenModPtr<'db>) -> Self {
36036        ptr.untyped()
36037    }
36038}
36039#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36040pub struct TokenModGreen<'db>(pub GreenId<'db>);
36041impl<'db> TokenModGreen<'db> {
36042    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36043        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36044    }
36045}
36046impl<'db> TypedSyntaxNode<'db> for TokenMod<'db> {
36047    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
36048    type StablePtr = TokenModPtr<'db>;
36049    type Green = TokenModGreen<'db>;
36050    fn missing(db: &'db dyn Database) -> Self::Green {
36051        TokenModGreen(
36052            GreenNode {
36053                kind: SyntaxKind::TokenMissing,
36054                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36055            }
36056            .intern(db),
36057        )
36058    }
36059    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36060        match node.green_node(db).details {
36061            GreenNodeDetails::Token(_) => Self { node },
36062            GreenNodeDetails::Node { .. } => {
36063                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
36064            }
36065        }
36066    }
36067    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36068        match node.green_node(db).details {
36069            GreenNodeDetails::Token(_) => Some(Self { node }),
36070            GreenNodeDetails::Node { .. } => None,
36071        }
36072    }
36073    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36074        self.node
36075    }
36076    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36077        TokenModPtr(self.node.stable_ptr(db))
36078    }
36079}
36080#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36081pub struct TerminalMod<'db> {
36082    node: SyntaxNode<'db>,
36083}
36084impl<'db> Terminal<'db> for TerminalMod<'db> {
36085    const KIND: SyntaxKind = SyntaxKind::TerminalMod;
36086    type TokenType = TokenMod<'db>;
36087    fn new_green(
36088        db: &'db dyn Database,
36089        leading_trivia: TriviaGreen<'db>,
36090        token: <<TerminalMod<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36091        trailing_trivia: TriviaGreen<'db>,
36092    ) -> Self::Green {
36093        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36094        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36095        TerminalModGreen(
36096            GreenNode {
36097                kind: SyntaxKind::TerminalMod,
36098                details: GreenNodeDetails::Node { children: children.into(), width },
36099            }
36100            .intern(db),
36101        )
36102    }
36103    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36104        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36105            unreachable!("Expected a node, not a token");
36106        };
36107        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36108    }
36109}
36110impl<'db> TerminalMod<'db> {
36111    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36112        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36113    }
36114    pub fn token(&self, db: &'db dyn Database) -> TokenMod<'db> {
36115        TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
36116    }
36117    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36118        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36119    }
36120}
36121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36122pub struct TerminalModPtr<'db>(pub SyntaxStablePtrId<'db>);
36123impl<'db> TerminalModPtr<'db> {}
36124impl<'db> TypedStablePtr<'db> for TerminalModPtr<'db> {
36125    type SyntaxNode = TerminalMod<'db>;
36126    fn untyped(self) -> SyntaxStablePtrId<'db> {
36127        self.0
36128    }
36129    fn lookup(&self, db: &'db dyn Database) -> TerminalMod<'db> {
36130        TerminalMod::from_syntax_node(db, self.0.lookup(db))
36131    }
36132}
36133impl<'db> From<TerminalModPtr<'db>> for SyntaxStablePtrId<'db> {
36134    fn from(ptr: TerminalModPtr<'db>) -> Self {
36135        ptr.untyped()
36136    }
36137}
36138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36139pub struct TerminalModGreen<'db>(pub GreenId<'db>);
36140impl<'db> TypedSyntaxNode<'db> for TerminalMod<'db> {
36141    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
36142    type StablePtr = TerminalModPtr<'db>;
36143    type Green = TerminalModGreen<'db>;
36144    fn missing(db: &'db dyn Database) -> Self::Green {
36145        TerminalModGreen(
36146            GreenNode {
36147                kind: SyntaxKind::TerminalMod,
36148                details: GreenNodeDetails::Node {
36149                    children: [
36150                        Trivia::missing(db).0,
36151                        TokenMod::missing(db).0,
36152                        Trivia::missing(db).0,
36153                    ]
36154                    .into(),
36155                    width: TextWidth::default(),
36156                },
36157            }
36158            .intern(db),
36159        )
36160    }
36161    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36162        let kind = node.kind(db);
36163        assert_eq!(
36164            kind,
36165            SyntaxKind::TerminalMod,
36166            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36167            kind,
36168            SyntaxKind::TerminalMod
36169        );
36170        Self { node }
36171    }
36172    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36173        let kind = node.kind(db);
36174        if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
36175    }
36176    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36177        self.node
36178    }
36179    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36180        TerminalModPtr(self.node.stable_ptr(db))
36181    }
36182}
36183#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36184pub struct TokenModEq<'db> {
36185    node: SyntaxNode<'db>,
36186}
36187impl<'db> Token<'db> for TokenModEq<'db> {
36188    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36189        TokenModEqGreen(
36190            GreenNode { kind: SyntaxKind::TokenModEq, details: GreenNodeDetails::Token(text) }
36191                .intern(db),
36192        )
36193    }
36194    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36195        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36196    }
36197}
36198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36199pub struct TokenModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36200impl<'db> TypedStablePtr<'db> for TokenModEqPtr<'db> {
36201    type SyntaxNode = TokenModEq<'db>;
36202    fn untyped(self) -> SyntaxStablePtrId<'db> {
36203        self.0
36204    }
36205    fn lookup(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36206        TokenModEq::from_syntax_node(db, self.0.lookup(db))
36207    }
36208}
36209impl<'db> From<TokenModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36210    fn from(ptr: TokenModEqPtr<'db>) -> Self {
36211        ptr.untyped()
36212    }
36213}
36214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36215pub struct TokenModEqGreen<'db>(pub GreenId<'db>);
36216impl<'db> TokenModEqGreen<'db> {
36217    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36218        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36219    }
36220}
36221impl<'db> TypedSyntaxNode<'db> for TokenModEq<'db> {
36222    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
36223    type StablePtr = TokenModEqPtr<'db>;
36224    type Green = TokenModEqGreen<'db>;
36225    fn missing(db: &'db dyn Database) -> Self::Green {
36226        TokenModEqGreen(
36227            GreenNode {
36228                kind: SyntaxKind::TokenMissing,
36229                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36230            }
36231            .intern(db),
36232        )
36233    }
36234    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36235        match node.green_node(db).details {
36236            GreenNodeDetails::Token(_) => Self { node },
36237            GreenNodeDetails::Node { .. } => {
36238                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
36239            }
36240        }
36241    }
36242    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36243        match node.green_node(db).details {
36244            GreenNodeDetails::Token(_) => Some(Self { node }),
36245            GreenNodeDetails::Node { .. } => None,
36246        }
36247    }
36248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36249        self.node
36250    }
36251    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36252        TokenModEqPtr(self.node.stable_ptr(db))
36253    }
36254}
36255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36256pub struct TerminalModEq<'db> {
36257    node: SyntaxNode<'db>,
36258}
36259impl<'db> Terminal<'db> for TerminalModEq<'db> {
36260    const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36261    type TokenType = TokenModEq<'db>;
36262    fn new_green(
36263        db: &'db dyn Database,
36264        leading_trivia: TriviaGreen<'db>,
36265        token: <<TerminalModEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36266        trailing_trivia: TriviaGreen<'db>,
36267    ) -> Self::Green {
36268        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36269        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36270        TerminalModEqGreen(
36271            GreenNode {
36272                kind: SyntaxKind::TerminalModEq,
36273                details: GreenNodeDetails::Node { children: children.into(), width },
36274            }
36275            .intern(db),
36276        )
36277    }
36278    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36279        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36280            unreachable!("Expected a node, not a token");
36281        };
36282        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36283    }
36284}
36285impl<'db> TerminalModEq<'db> {
36286    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36287        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36288    }
36289    pub fn token(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36290        TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
36291    }
36292    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36293        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36294    }
36295}
36296#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36297pub struct TerminalModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36298impl<'db> TerminalModEqPtr<'db> {}
36299impl<'db> TypedStablePtr<'db> for TerminalModEqPtr<'db> {
36300    type SyntaxNode = TerminalModEq<'db>;
36301    fn untyped(self) -> SyntaxStablePtrId<'db> {
36302        self.0
36303    }
36304    fn lookup(&self, db: &'db dyn Database) -> TerminalModEq<'db> {
36305        TerminalModEq::from_syntax_node(db, self.0.lookup(db))
36306    }
36307}
36308impl<'db> From<TerminalModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36309    fn from(ptr: TerminalModEqPtr<'db>) -> Self {
36310        ptr.untyped()
36311    }
36312}
36313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36314pub struct TerminalModEqGreen<'db>(pub GreenId<'db>);
36315impl<'db> TypedSyntaxNode<'db> for TerminalModEq<'db> {
36316    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
36317    type StablePtr = TerminalModEqPtr<'db>;
36318    type Green = TerminalModEqGreen<'db>;
36319    fn missing(db: &'db dyn Database) -> Self::Green {
36320        TerminalModEqGreen(
36321            GreenNode {
36322                kind: SyntaxKind::TerminalModEq,
36323                details: GreenNodeDetails::Node {
36324                    children: [
36325                        Trivia::missing(db).0,
36326                        TokenModEq::missing(db).0,
36327                        Trivia::missing(db).0,
36328                    ]
36329                    .into(),
36330                    width: TextWidth::default(),
36331                },
36332            }
36333            .intern(db),
36334        )
36335    }
36336    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36337        let kind = node.kind(db);
36338        assert_eq!(
36339            kind,
36340            SyntaxKind::TerminalModEq,
36341            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36342            kind,
36343            SyntaxKind::TerminalModEq
36344        );
36345        Self { node }
36346    }
36347    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36348        let kind = node.kind(db);
36349        if kind == SyntaxKind::TerminalModEq {
36350            Some(Self::from_syntax_node(db, node))
36351        } else {
36352            None
36353        }
36354    }
36355    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36356        self.node
36357    }
36358    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36359        TerminalModEqPtr(self.node.stable_ptr(db))
36360    }
36361}
36362#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36363pub struct TokenMul<'db> {
36364    node: SyntaxNode<'db>,
36365}
36366impl<'db> Token<'db> for TokenMul<'db> {
36367    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36368        TokenMulGreen(
36369            GreenNode { kind: SyntaxKind::TokenMul, details: GreenNodeDetails::Token(text) }
36370                .intern(db),
36371        )
36372    }
36373    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36374        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36375    }
36376}
36377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36378pub struct TokenMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36379impl<'db> TypedStablePtr<'db> for TokenMulPtr<'db> {
36380    type SyntaxNode = TokenMul<'db>;
36381    fn untyped(self) -> SyntaxStablePtrId<'db> {
36382        self.0
36383    }
36384    fn lookup(&self, db: &'db dyn Database) -> TokenMul<'db> {
36385        TokenMul::from_syntax_node(db, self.0.lookup(db))
36386    }
36387}
36388impl<'db> From<TokenMulPtr<'db>> for SyntaxStablePtrId<'db> {
36389    fn from(ptr: TokenMulPtr<'db>) -> Self {
36390        ptr.untyped()
36391    }
36392}
36393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36394pub struct TokenMulGreen<'db>(pub GreenId<'db>);
36395impl<'db> TokenMulGreen<'db> {
36396    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36397        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36398    }
36399}
36400impl<'db> TypedSyntaxNode<'db> for TokenMul<'db> {
36401    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
36402    type StablePtr = TokenMulPtr<'db>;
36403    type Green = TokenMulGreen<'db>;
36404    fn missing(db: &'db dyn Database) -> Self::Green {
36405        TokenMulGreen(
36406            GreenNode {
36407                kind: SyntaxKind::TokenMissing,
36408                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36409            }
36410            .intern(db),
36411        )
36412    }
36413    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36414        match node.green_node(db).details {
36415            GreenNodeDetails::Token(_) => Self { node },
36416            GreenNodeDetails::Node { .. } => {
36417                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
36418            }
36419        }
36420    }
36421    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36422        match node.green_node(db).details {
36423            GreenNodeDetails::Token(_) => Some(Self { node }),
36424            GreenNodeDetails::Node { .. } => None,
36425        }
36426    }
36427    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36428        self.node
36429    }
36430    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36431        TokenMulPtr(self.node.stable_ptr(db))
36432    }
36433}
36434#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36435pub struct TerminalMul<'db> {
36436    node: SyntaxNode<'db>,
36437}
36438impl<'db> Terminal<'db> for TerminalMul<'db> {
36439    const KIND: SyntaxKind = SyntaxKind::TerminalMul;
36440    type TokenType = TokenMul<'db>;
36441    fn new_green(
36442        db: &'db dyn Database,
36443        leading_trivia: TriviaGreen<'db>,
36444        token: <<TerminalMul<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36445        trailing_trivia: TriviaGreen<'db>,
36446    ) -> Self::Green {
36447        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36448        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36449        TerminalMulGreen(
36450            GreenNode {
36451                kind: SyntaxKind::TerminalMul,
36452                details: GreenNodeDetails::Node { children: children.into(), width },
36453            }
36454            .intern(db),
36455        )
36456    }
36457    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36458        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36459            unreachable!("Expected a node, not a token");
36460        };
36461        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36462    }
36463}
36464impl<'db> TerminalMul<'db> {
36465    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36466        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36467    }
36468    pub fn token(&self, db: &'db dyn Database) -> TokenMul<'db> {
36469        TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
36470    }
36471    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36472        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36473    }
36474}
36475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36476pub struct TerminalMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36477impl<'db> TerminalMulPtr<'db> {}
36478impl<'db> TypedStablePtr<'db> for TerminalMulPtr<'db> {
36479    type SyntaxNode = TerminalMul<'db>;
36480    fn untyped(self) -> SyntaxStablePtrId<'db> {
36481        self.0
36482    }
36483    fn lookup(&self, db: &'db dyn Database) -> TerminalMul<'db> {
36484        TerminalMul::from_syntax_node(db, self.0.lookup(db))
36485    }
36486}
36487impl<'db> From<TerminalMulPtr<'db>> for SyntaxStablePtrId<'db> {
36488    fn from(ptr: TerminalMulPtr<'db>) -> Self {
36489        ptr.untyped()
36490    }
36491}
36492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36493pub struct TerminalMulGreen<'db>(pub GreenId<'db>);
36494impl<'db> TypedSyntaxNode<'db> for TerminalMul<'db> {
36495    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
36496    type StablePtr = TerminalMulPtr<'db>;
36497    type Green = TerminalMulGreen<'db>;
36498    fn missing(db: &'db dyn Database) -> Self::Green {
36499        TerminalMulGreen(
36500            GreenNode {
36501                kind: SyntaxKind::TerminalMul,
36502                details: GreenNodeDetails::Node {
36503                    children: [
36504                        Trivia::missing(db).0,
36505                        TokenMul::missing(db).0,
36506                        Trivia::missing(db).0,
36507                    ]
36508                    .into(),
36509                    width: TextWidth::default(),
36510                },
36511            }
36512            .intern(db),
36513        )
36514    }
36515    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36516        let kind = node.kind(db);
36517        assert_eq!(
36518            kind,
36519            SyntaxKind::TerminalMul,
36520            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36521            kind,
36522            SyntaxKind::TerminalMul
36523        );
36524        Self { node }
36525    }
36526    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36527        let kind = node.kind(db);
36528        if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
36529    }
36530    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36531        self.node
36532    }
36533    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36534        TerminalMulPtr(self.node.stable_ptr(db))
36535    }
36536}
36537#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36538pub struct TokenMulEq<'db> {
36539    node: SyntaxNode<'db>,
36540}
36541impl<'db> Token<'db> for TokenMulEq<'db> {
36542    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36543        TokenMulEqGreen(
36544            GreenNode { kind: SyntaxKind::TokenMulEq, details: GreenNodeDetails::Token(text) }
36545                .intern(db),
36546        )
36547    }
36548    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36549        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36550    }
36551}
36552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36553pub struct TokenMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36554impl<'db> TypedStablePtr<'db> for TokenMulEqPtr<'db> {
36555    type SyntaxNode = TokenMulEq<'db>;
36556    fn untyped(self) -> SyntaxStablePtrId<'db> {
36557        self.0
36558    }
36559    fn lookup(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36560        TokenMulEq::from_syntax_node(db, self.0.lookup(db))
36561    }
36562}
36563impl<'db> From<TokenMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36564    fn from(ptr: TokenMulEqPtr<'db>) -> Self {
36565        ptr.untyped()
36566    }
36567}
36568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36569pub struct TokenMulEqGreen<'db>(pub GreenId<'db>);
36570impl<'db> TokenMulEqGreen<'db> {
36571    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36572        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36573    }
36574}
36575impl<'db> TypedSyntaxNode<'db> for TokenMulEq<'db> {
36576    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
36577    type StablePtr = TokenMulEqPtr<'db>;
36578    type Green = TokenMulEqGreen<'db>;
36579    fn missing(db: &'db dyn Database) -> Self::Green {
36580        TokenMulEqGreen(
36581            GreenNode {
36582                kind: SyntaxKind::TokenMissing,
36583                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36584            }
36585            .intern(db),
36586        )
36587    }
36588    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36589        match node.green_node(db).details {
36590            GreenNodeDetails::Token(_) => Self { node },
36591            GreenNodeDetails::Node { .. } => {
36592                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
36593            }
36594        }
36595    }
36596    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36597        match node.green_node(db).details {
36598            GreenNodeDetails::Token(_) => Some(Self { node }),
36599            GreenNodeDetails::Node { .. } => None,
36600        }
36601    }
36602    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36603        self.node
36604    }
36605    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36606        TokenMulEqPtr(self.node.stable_ptr(db))
36607    }
36608}
36609#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36610pub struct TerminalMulEq<'db> {
36611    node: SyntaxNode<'db>,
36612}
36613impl<'db> Terminal<'db> for TerminalMulEq<'db> {
36614    const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
36615    type TokenType = TokenMulEq<'db>;
36616    fn new_green(
36617        db: &'db dyn Database,
36618        leading_trivia: TriviaGreen<'db>,
36619        token: <<TerminalMulEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36620        trailing_trivia: TriviaGreen<'db>,
36621    ) -> Self::Green {
36622        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36623        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36624        TerminalMulEqGreen(
36625            GreenNode {
36626                kind: SyntaxKind::TerminalMulEq,
36627                details: GreenNodeDetails::Node { children: children.into(), width },
36628            }
36629            .intern(db),
36630        )
36631    }
36632    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36633        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36634            unreachable!("Expected a node, not a token");
36635        };
36636        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36637    }
36638}
36639impl<'db> TerminalMulEq<'db> {
36640    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36641        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36642    }
36643    pub fn token(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36644        TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
36645    }
36646    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36647        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36648    }
36649}
36650#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36651pub struct TerminalMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36652impl<'db> TerminalMulEqPtr<'db> {}
36653impl<'db> TypedStablePtr<'db> for TerminalMulEqPtr<'db> {
36654    type SyntaxNode = TerminalMulEq<'db>;
36655    fn untyped(self) -> SyntaxStablePtrId<'db> {
36656        self.0
36657    }
36658    fn lookup(&self, db: &'db dyn Database) -> TerminalMulEq<'db> {
36659        TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
36660    }
36661}
36662impl<'db> From<TerminalMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36663    fn from(ptr: TerminalMulEqPtr<'db>) -> Self {
36664        ptr.untyped()
36665    }
36666}
36667#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36668pub struct TerminalMulEqGreen<'db>(pub GreenId<'db>);
36669impl<'db> TypedSyntaxNode<'db> for TerminalMulEq<'db> {
36670    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
36671    type StablePtr = TerminalMulEqPtr<'db>;
36672    type Green = TerminalMulEqGreen<'db>;
36673    fn missing(db: &'db dyn Database) -> Self::Green {
36674        TerminalMulEqGreen(
36675            GreenNode {
36676                kind: SyntaxKind::TerminalMulEq,
36677                details: GreenNodeDetails::Node {
36678                    children: [
36679                        Trivia::missing(db).0,
36680                        TokenMulEq::missing(db).0,
36681                        Trivia::missing(db).0,
36682                    ]
36683                    .into(),
36684                    width: TextWidth::default(),
36685                },
36686            }
36687            .intern(db),
36688        )
36689    }
36690    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36691        let kind = node.kind(db);
36692        assert_eq!(
36693            kind,
36694            SyntaxKind::TerminalMulEq,
36695            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36696            kind,
36697            SyntaxKind::TerminalMulEq
36698        );
36699        Self { node }
36700    }
36701    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36702        let kind = node.kind(db);
36703        if kind == SyntaxKind::TerminalMulEq {
36704            Some(Self::from_syntax_node(db, node))
36705        } else {
36706            None
36707        }
36708    }
36709    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36710        self.node
36711    }
36712    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36713        TerminalMulEqPtr(self.node.stable_ptr(db))
36714    }
36715}
36716#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36717pub struct TokenNeq<'db> {
36718    node: SyntaxNode<'db>,
36719}
36720impl<'db> Token<'db> for TokenNeq<'db> {
36721    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36722        TokenNeqGreen(
36723            GreenNode { kind: SyntaxKind::TokenNeq, details: GreenNodeDetails::Token(text) }
36724                .intern(db),
36725        )
36726    }
36727    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36728        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36729    }
36730}
36731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36732pub struct TokenNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36733impl<'db> TypedStablePtr<'db> for TokenNeqPtr<'db> {
36734    type SyntaxNode = TokenNeq<'db>;
36735    fn untyped(self) -> SyntaxStablePtrId<'db> {
36736        self.0
36737    }
36738    fn lookup(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36739        TokenNeq::from_syntax_node(db, self.0.lookup(db))
36740    }
36741}
36742impl<'db> From<TokenNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36743    fn from(ptr: TokenNeqPtr<'db>) -> Self {
36744        ptr.untyped()
36745    }
36746}
36747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36748pub struct TokenNeqGreen<'db>(pub GreenId<'db>);
36749impl<'db> TokenNeqGreen<'db> {
36750    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36751        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36752    }
36753}
36754impl<'db> TypedSyntaxNode<'db> for TokenNeq<'db> {
36755    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
36756    type StablePtr = TokenNeqPtr<'db>;
36757    type Green = TokenNeqGreen<'db>;
36758    fn missing(db: &'db dyn Database) -> Self::Green {
36759        TokenNeqGreen(
36760            GreenNode {
36761                kind: SyntaxKind::TokenMissing,
36762                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36763            }
36764            .intern(db),
36765        )
36766    }
36767    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36768        match node.green_node(db).details {
36769            GreenNodeDetails::Token(_) => Self { node },
36770            GreenNodeDetails::Node { .. } => {
36771                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
36772            }
36773        }
36774    }
36775    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36776        match node.green_node(db).details {
36777            GreenNodeDetails::Token(_) => Some(Self { node }),
36778            GreenNodeDetails::Node { .. } => None,
36779        }
36780    }
36781    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36782        self.node
36783    }
36784    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36785        TokenNeqPtr(self.node.stable_ptr(db))
36786    }
36787}
36788#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36789pub struct TerminalNeq<'db> {
36790    node: SyntaxNode<'db>,
36791}
36792impl<'db> Terminal<'db> for TerminalNeq<'db> {
36793    const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
36794    type TokenType = TokenNeq<'db>;
36795    fn new_green(
36796        db: &'db dyn Database,
36797        leading_trivia: TriviaGreen<'db>,
36798        token: <<TerminalNeq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36799        trailing_trivia: TriviaGreen<'db>,
36800    ) -> Self::Green {
36801        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36802        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36803        TerminalNeqGreen(
36804            GreenNode {
36805                kind: SyntaxKind::TerminalNeq,
36806                details: GreenNodeDetails::Node { children: children.into(), width },
36807            }
36808            .intern(db),
36809        )
36810    }
36811    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36812        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36813            unreachable!("Expected a node, not a token");
36814        };
36815        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36816    }
36817}
36818impl<'db> TerminalNeq<'db> {
36819    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36820        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36821    }
36822    pub fn token(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36823        TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
36824    }
36825    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36826        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36827    }
36828}
36829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36830pub struct TerminalNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36831impl<'db> TerminalNeqPtr<'db> {}
36832impl<'db> TypedStablePtr<'db> for TerminalNeqPtr<'db> {
36833    type SyntaxNode = TerminalNeq<'db>;
36834    fn untyped(self) -> SyntaxStablePtrId<'db> {
36835        self.0
36836    }
36837    fn lookup(&self, db: &'db dyn Database) -> TerminalNeq<'db> {
36838        TerminalNeq::from_syntax_node(db, self.0.lookup(db))
36839    }
36840}
36841impl<'db> From<TerminalNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36842    fn from(ptr: TerminalNeqPtr<'db>) -> Self {
36843        ptr.untyped()
36844    }
36845}
36846#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36847pub struct TerminalNeqGreen<'db>(pub GreenId<'db>);
36848impl<'db> TypedSyntaxNode<'db> for TerminalNeq<'db> {
36849    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
36850    type StablePtr = TerminalNeqPtr<'db>;
36851    type Green = TerminalNeqGreen<'db>;
36852    fn missing(db: &'db dyn Database) -> Self::Green {
36853        TerminalNeqGreen(
36854            GreenNode {
36855                kind: SyntaxKind::TerminalNeq,
36856                details: GreenNodeDetails::Node {
36857                    children: [
36858                        Trivia::missing(db).0,
36859                        TokenNeq::missing(db).0,
36860                        Trivia::missing(db).0,
36861                    ]
36862                    .into(),
36863                    width: TextWidth::default(),
36864                },
36865            }
36866            .intern(db),
36867        )
36868    }
36869    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36870        let kind = node.kind(db);
36871        assert_eq!(
36872            kind,
36873            SyntaxKind::TerminalNeq,
36874            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36875            kind,
36876            SyntaxKind::TerminalNeq
36877        );
36878        Self { node }
36879    }
36880    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36881        let kind = node.kind(db);
36882        if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
36883    }
36884    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36885        self.node
36886    }
36887    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36888        TerminalNeqPtr(self.node.stable_ptr(db))
36889    }
36890}
36891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36892pub struct TokenNot<'db> {
36893    node: SyntaxNode<'db>,
36894}
36895impl<'db> Token<'db> for TokenNot<'db> {
36896    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36897        TokenNotGreen(
36898            GreenNode { kind: SyntaxKind::TokenNot, details: GreenNodeDetails::Token(text) }
36899                .intern(db),
36900        )
36901    }
36902    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36903        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36904    }
36905}
36906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36907pub struct TokenNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36908impl<'db> TypedStablePtr<'db> for TokenNotPtr<'db> {
36909    type SyntaxNode = TokenNot<'db>;
36910    fn untyped(self) -> SyntaxStablePtrId<'db> {
36911        self.0
36912    }
36913    fn lookup(&self, db: &'db dyn Database) -> TokenNot<'db> {
36914        TokenNot::from_syntax_node(db, self.0.lookup(db))
36915    }
36916}
36917impl<'db> From<TokenNotPtr<'db>> for SyntaxStablePtrId<'db> {
36918    fn from(ptr: TokenNotPtr<'db>) -> Self {
36919        ptr.untyped()
36920    }
36921}
36922#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36923pub struct TokenNotGreen<'db>(pub GreenId<'db>);
36924impl<'db> TokenNotGreen<'db> {
36925    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36926        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36927    }
36928}
36929impl<'db> TypedSyntaxNode<'db> for TokenNot<'db> {
36930    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
36931    type StablePtr = TokenNotPtr<'db>;
36932    type Green = TokenNotGreen<'db>;
36933    fn missing(db: &'db dyn Database) -> Self::Green {
36934        TokenNotGreen(
36935            GreenNode {
36936                kind: SyntaxKind::TokenMissing,
36937                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36938            }
36939            .intern(db),
36940        )
36941    }
36942    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36943        match node.green_node(db).details {
36944            GreenNodeDetails::Token(_) => Self { node },
36945            GreenNodeDetails::Node { .. } => {
36946                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
36947            }
36948        }
36949    }
36950    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36951        match node.green_node(db).details {
36952            GreenNodeDetails::Token(_) => Some(Self { node }),
36953            GreenNodeDetails::Node { .. } => None,
36954        }
36955    }
36956    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36957        self.node
36958    }
36959    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36960        TokenNotPtr(self.node.stable_ptr(db))
36961    }
36962}
36963#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36964pub struct TerminalNot<'db> {
36965    node: SyntaxNode<'db>,
36966}
36967impl<'db> Terminal<'db> for TerminalNot<'db> {
36968    const KIND: SyntaxKind = SyntaxKind::TerminalNot;
36969    type TokenType = TokenNot<'db>;
36970    fn new_green(
36971        db: &'db dyn Database,
36972        leading_trivia: TriviaGreen<'db>,
36973        token: <<TerminalNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36974        trailing_trivia: TriviaGreen<'db>,
36975    ) -> Self::Green {
36976        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36977        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36978        TerminalNotGreen(
36979            GreenNode {
36980                kind: SyntaxKind::TerminalNot,
36981                details: GreenNodeDetails::Node { children: children.into(), width },
36982            }
36983            .intern(db),
36984        )
36985    }
36986    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36987        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36988            unreachable!("Expected a node, not a token");
36989        };
36990        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36991    }
36992}
36993impl<'db> TerminalNot<'db> {
36994    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36995        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36996    }
36997    pub fn token(&self, db: &'db dyn Database) -> TokenNot<'db> {
36998        TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
36999    }
37000    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37001        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37002    }
37003}
37004#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37005pub struct TerminalNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37006impl<'db> TerminalNotPtr<'db> {}
37007impl<'db> TypedStablePtr<'db> for TerminalNotPtr<'db> {
37008    type SyntaxNode = TerminalNot<'db>;
37009    fn untyped(self) -> SyntaxStablePtrId<'db> {
37010        self.0
37011    }
37012    fn lookup(&self, db: &'db dyn Database) -> TerminalNot<'db> {
37013        TerminalNot::from_syntax_node(db, self.0.lookup(db))
37014    }
37015}
37016impl<'db> From<TerminalNotPtr<'db>> for SyntaxStablePtrId<'db> {
37017    fn from(ptr: TerminalNotPtr<'db>) -> Self {
37018        ptr.untyped()
37019    }
37020}
37021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37022pub struct TerminalNotGreen<'db>(pub GreenId<'db>);
37023impl<'db> TypedSyntaxNode<'db> for TerminalNot<'db> {
37024    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
37025    type StablePtr = TerminalNotPtr<'db>;
37026    type Green = TerminalNotGreen<'db>;
37027    fn missing(db: &'db dyn Database) -> Self::Green {
37028        TerminalNotGreen(
37029            GreenNode {
37030                kind: SyntaxKind::TerminalNot,
37031                details: GreenNodeDetails::Node {
37032                    children: [
37033                        Trivia::missing(db).0,
37034                        TokenNot::missing(db).0,
37035                        Trivia::missing(db).0,
37036                    ]
37037                    .into(),
37038                    width: TextWidth::default(),
37039                },
37040            }
37041            .intern(db),
37042        )
37043    }
37044    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37045        let kind = node.kind(db);
37046        assert_eq!(
37047            kind,
37048            SyntaxKind::TerminalNot,
37049            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37050            kind,
37051            SyntaxKind::TerminalNot
37052        );
37053        Self { node }
37054    }
37055    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37056        let kind = node.kind(db);
37057        if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
37058    }
37059    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37060        self.node
37061    }
37062    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37063        TerminalNotPtr(self.node.stable_ptr(db))
37064    }
37065}
37066#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37067pub struct TokenBitNot<'db> {
37068    node: SyntaxNode<'db>,
37069}
37070impl<'db> Token<'db> for TokenBitNot<'db> {
37071    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37072        TokenBitNotGreen(
37073            GreenNode { kind: SyntaxKind::TokenBitNot, details: GreenNodeDetails::Token(text) }
37074                .intern(db),
37075        )
37076    }
37077    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37078        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37079    }
37080}
37081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37082pub struct TokenBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37083impl<'db> TypedStablePtr<'db> for TokenBitNotPtr<'db> {
37084    type SyntaxNode = TokenBitNot<'db>;
37085    fn untyped(self) -> SyntaxStablePtrId<'db> {
37086        self.0
37087    }
37088    fn lookup(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37089        TokenBitNot::from_syntax_node(db, self.0.lookup(db))
37090    }
37091}
37092impl<'db> From<TokenBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37093    fn from(ptr: TokenBitNotPtr<'db>) -> Self {
37094        ptr.untyped()
37095    }
37096}
37097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37098pub struct TokenBitNotGreen<'db>(pub GreenId<'db>);
37099impl<'db> TokenBitNotGreen<'db> {
37100    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37101        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37102    }
37103}
37104impl<'db> TypedSyntaxNode<'db> for TokenBitNot<'db> {
37105    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
37106    type StablePtr = TokenBitNotPtr<'db>;
37107    type Green = TokenBitNotGreen<'db>;
37108    fn missing(db: &'db dyn Database) -> Self::Green {
37109        TokenBitNotGreen(
37110            GreenNode {
37111                kind: SyntaxKind::TokenMissing,
37112                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37113            }
37114            .intern(db),
37115        )
37116    }
37117    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37118        match node.green_node(db).details {
37119            GreenNodeDetails::Token(_) => Self { node },
37120            GreenNodeDetails::Node { .. } => {
37121                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
37122            }
37123        }
37124    }
37125    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37126        match node.green_node(db).details {
37127            GreenNodeDetails::Token(_) => Some(Self { node }),
37128            GreenNodeDetails::Node { .. } => None,
37129        }
37130    }
37131    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37132        self.node
37133    }
37134    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37135        TokenBitNotPtr(self.node.stable_ptr(db))
37136    }
37137}
37138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37139pub struct TerminalBitNot<'db> {
37140    node: SyntaxNode<'db>,
37141}
37142impl<'db> Terminal<'db> for TerminalBitNot<'db> {
37143    const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
37144    type TokenType = TokenBitNot<'db>;
37145    fn new_green(
37146        db: &'db dyn Database,
37147        leading_trivia: TriviaGreen<'db>,
37148        token: <<TerminalBitNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37149        trailing_trivia: TriviaGreen<'db>,
37150    ) -> Self::Green {
37151        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37152        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37153        TerminalBitNotGreen(
37154            GreenNode {
37155                kind: SyntaxKind::TerminalBitNot,
37156                details: GreenNodeDetails::Node { children: children.into(), width },
37157            }
37158            .intern(db),
37159        )
37160    }
37161    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37162        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37163            unreachable!("Expected a node, not a token");
37164        };
37165        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37166    }
37167}
37168impl<'db> TerminalBitNot<'db> {
37169    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37170        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37171    }
37172    pub fn token(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37173        TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
37174    }
37175    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37176        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37177    }
37178}
37179#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37180pub struct TerminalBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37181impl<'db> TerminalBitNotPtr<'db> {}
37182impl<'db> TypedStablePtr<'db> for TerminalBitNotPtr<'db> {
37183    type SyntaxNode = TerminalBitNot<'db>;
37184    fn untyped(self) -> SyntaxStablePtrId<'db> {
37185        self.0
37186    }
37187    fn lookup(&self, db: &'db dyn Database) -> TerminalBitNot<'db> {
37188        TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
37189    }
37190}
37191impl<'db> From<TerminalBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37192    fn from(ptr: TerminalBitNotPtr<'db>) -> Self {
37193        ptr.untyped()
37194    }
37195}
37196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37197pub struct TerminalBitNotGreen<'db>(pub GreenId<'db>);
37198impl<'db> TypedSyntaxNode<'db> for TerminalBitNot<'db> {
37199    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
37200    type StablePtr = TerminalBitNotPtr<'db>;
37201    type Green = TerminalBitNotGreen<'db>;
37202    fn missing(db: &'db dyn Database) -> Self::Green {
37203        TerminalBitNotGreen(
37204            GreenNode {
37205                kind: SyntaxKind::TerminalBitNot,
37206                details: GreenNodeDetails::Node {
37207                    children: [
37208                        Trivia::missing(db).0,
37209                        TokenBitNot::missing(db).0,
37210                        Trivia::missing(db).0,
37211                    ]
37212                    .into(),
37213                    width: TextWidth::default(),
37214                },
37215            }
37216            .intern(db),
37217        )
37218    }
37219    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37220        let kind = node.kind(db);
37221        assert_eq!(
37222            kind,
37223            SyntaxKind::TerminalBitNot,
37224            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37225            kind,
37226            SyntaxKind::TerminalBitNot
37227        );
37228        Self { node }
37229    }
37230    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37231        let kind = node.kind(db);
37232        if kind == SyntaxKind::TerminalBitNot {
37233            Some(Self::from_syntax_node(db, node))
37234        } else {
37235            None
37236        }
37237    }
37238    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37239        self.node
37240    }
37241    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37242        TerminalBitNotPtr(self.node.stable_ptr(db))
37243    }
37244}
37245#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37246pub struct TokenOr<'db> {
37247    node: SyntaxNode<'db>,
37248}
37249impl<'db> Token<'db> for TokenOr<'db> {
37250    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37251        TokenOrGreen(
37252            GreenNode { kind: SyntaxKind::TokenOr, details: GreenNodeDetails::Token(text) }
37253                .intern(db),
37254        )
37255    }
37256    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37257        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37258    }
37259}
37260#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37261pub struct TokenOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37262impl<'db> TypedStablePtr<'db> for TokenOrPtr<'db> {
37263    type SyntaxNode = TokenOr<'db>;
37264    fn untyped(self) -> SyntaxStablePtrId<'db> {
37265        self.0
37266    }
37267    fn lookup(&self, db: &'db dyn Database) -> TokenOr<'db> {
37268        TokenOr::from_syntax_node(db, self.0.lookup(db))
37269    }
37270}
37271impl<'db> From<TokenOrPtr<'db>> for SyntaxStablePtrId<'db> {
37272    fn from(ptr: TokenOrPtr<'db>) -> Self {
37273        ptr.untyped()
37274    }
37275}
37276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37277pub struct TokenOrGreen<'db>(pub GreenId<'db>);
37278impl<'db> TokenOrGreen<'db> {
37279    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37280        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37281    }
37282}
37283impl<'db> TypedSyntaxNode<'db> for TokenOr<'db> {
37284    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
37285    type StablePtr = TokenOrPtr<'db>;
37286    type Green = TokenOrGreen<'db>;
37287    fn missing(db: &'db dyn Database) -> Self::Green {
37288        TokenOrGreen(
37289            GreenNode {
37290                kind: SyntaxKind::TokenMissing,
37291                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37292            }
37293            .intern(db),
37294        )
37295    }
37296    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37297        match node.green_node(db).details {
37298            GreenNodeDetails::Token(_) => Self { node },
37299            GreenNodeDetails::Node { .. } => {
37300                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
37301            }
37302        }
37303    }
37304    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37305        match node.green_node(db).details {
37306            GreenNodeDetails::Token(_) => Some(Self { node }),
37307            GreenNodeDetails::Node { .. } => None,
37308        }
37309    }
37310    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37311        self.node
37312    }
37313    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37314        TokenOrPtr(self.node.stable_ptr(db))
37315    }
37316}
37317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37318pub struct TerminalOr<'db> {
37319    node: SyntaxNode<'db>,
37320}
37321impl<'db> Terminal<'db> for TerminalOr<'db> {
37322    const KIND: SyntaxKind = SyntaxKind::TerminalOr;
37323    type TokenType = TokenOr<'db>;
37324    fn new_green(
37325        db: &'db dyn Database,
37326        leading_trivia: TriviaGreen<'db>,
37327        token: <<TerminalOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37328        trailing_trivia: TriviaGreen<'db>,
37329    ) -> Self::Green {
37330        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37331        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37332        TerminalOrGreen(
37333            GreenNode {
37334                kind: SyntaxKind::TerminalOr,
37335                details: GreenNodeDetails::Node { children: children.into(), width },
37336            }
37337            .intern(db),
37338        )
37339    }
37340    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37341        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37342            unreachable!("Expected a node, not a token");
37343        };
37344        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37345    }
37346}
37347impl<'db> TerminalOr<'db> {
37348    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37349        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37350    }
37351    pub fn token(&self, db: &'db dyn Database) -> TokenOr<'db> {
37352        TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
37353    }
37354    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37355        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37356    }
37357}
37358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37359pub struct TerminalOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37360impl<'db> TerminalOrPtr<'db> {}
37361impl<'db> TypedStablePtr<'db> for TerminalOrPtr<'db> {
37362    type SyntaxNode = TerminalOr<'db>;
37363    fn untyped(self) -> SyntaxStablePtrId<'db> {
37364        self.0
37365    }
37366    fn lookup(&self, db: &'db dyn Database) -> TerminalOr<'db> {
37367        TerminalOr::from_syntax_node(db, self.0.lookup(db))
37368    }
37369}
37370impl<'db> From<TerminalOrPtr<'db>> for SyntaxStablePtrId<'db> {
37371    fn from(ptr: TerminalOrPtr<'db>) -> Self {
37372        ptr.untyped()
37373    }
37374}
37375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37376pub struct TerminalOrGreen<'db>(pub GreenId<'db>);
37377impl<'db> TypedSyntaxNode<'db> for TerminalOr<'db> {
37378    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
37379    type StablePtr = TerminalOrPtr<'db>;
37380    type Green = TerminalOrGreen<'db>;
37381    fn missing(db: &'db dyn Database) -> Self::Green {
37382        TerminalOrGreen(
37383            GreenNode {
37384                kind: SyntaxKind::TerminalOr,
37385                details: GreenNodeDetails::Node {
37386                    children: [
37387                        Trivia::missing(db).0,
37388                        TokenOr::missing(db).0,
37389                        Trivia::missing(db).0,
37390                    ]
37391                    .into(),
37392                    width: TextWidth::default(),
37393                },
37394            }
37395            .intern(db),
37396        )
37397    }
37398    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37399        let kind = node.kind(db);
37400        assert_eq!(
37401            kind,
37402            SyntaxKind::TerminalOr,
37403            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37404            kind,
37405            SyntaxKind::TerminalOr
37406        );
37407        Self { node }
37408    }
37409    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37410        let kind = node.kind(db);
37411        if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
37412    }
37413    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37414        self.node
37415    }
37416    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37417        TerminalOrPtr(self.node.stable_ptr(db))
37418    }
37419}
37420#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37421pub struct TokenOrOr<'db> {
37422    node: SyntaxNode<'db>,
37423}
37424impl<'db> Token<'db> for TokenOrOr<'db> {
37425    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37426        TokenOrOrGreen(
37427            GreenNode { kind: SyntaxKind::TokenOrOr, details: GreenNodeDetails::Token(text) }
37428                .intern(db),
37429        )
37430    }
37431    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37432        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37433    }
37434}
37435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37436pub struct TokenOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37437impl<'db> TypedStablePtr<'db> for TokenOrOrPtr<'db> {
37438    type SyntaxNode = TokenOrOr<'db>;
37439    fn untyped(self) -> SyntaxStablePtrId<'db> {
37440        self.0
37441    }
37442    fn lookup(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37443        TokenOrOr::from_syntax_node(db, self.0.lookup(db))
37444    }
37445}
37446impl<'db> From<TokenOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37447    fn from(ptr: TokenOrOrPtr<'db>) -> Self {
37448        ptr.untyped()
37449    }
37450}
37451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37452pub struct TokenOrOrGreen<'db>(pub GreenId<'db>);
37453impl<'db> TokenOrOrGreen<'db> {
37454    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37455        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37456    }
37457}
37458impl<'db> TypedSyntaxNode<'db> for TokenOrOr<'db> {
37459    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
37460    type StablePtr = TokenOrOrPtr<'db>;
37461    type Green = TokenOrOrGreen<'db>;
37462    fn missing(db: &'db dyn Database) -> Self::Green {
37463        TokenOrOrGreen(
37464            GreenNode {
37465                kind: SyntaxKind::TokenMissing,
37466                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37467            }
37468            .intern(db),
37469        )
37470    }
37471    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37472        match node.green_node(db).details {
37473            GreenNodeDetails::Token(_) => Self { node },
37474            GreenNodeDetails::Node { .. } => {
37475                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
37476            }
37477        }
37478    }
37479    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37480        match node.green_node(db).details {
37481            GreenNodeDetails::Token(_) => Some(Self { node }),
37482            GreenNodeDetails::Node { .. } => None,
37483        }
37484    }
37485    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37486        self.node
37487    }
37488    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37489        TokenOrOrPtr(self.node.stable_ptr(db))
37490    }
37491}
37492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37493pub struct TerminalOrOr<'db> {
37494    node: SyntaxNode<'db>,
37495}
37496impl<'db> Terminal<'db> for TerminalOrOr<'db> {
37497    const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
37498    type TokenType = TokenOrOr<'db>;
37499    fn new_green(
37500        db: &'db dyn Database,
37501        leading_trivia: TriviaGreen<'db>,
37502        token: <<TerminalOrOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37503        trailing_trivia: TriviaGreen<'db>,
37504    ) -> Self::Green {
37505        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37506        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37507        TerminalOrOrGreen(
37508            GreenNode {
37509                kind: SyntaxKind::TerminalOrOr,
37510                details: GreenNodeDetails::Node { children: children.into(), width },
37511            }
37512            .intern(db),
37513        )
37514    }
37515    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37516        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37517            unreachable!("Expected a node, not a token");
37518        };
37519        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37520    }
37521}
37522impl<'db> TerminalOrOr<'db> {
37523    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37524        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37525    }
37526    pub fn token(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37527        TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
37528    }
37529    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37530        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37531    }
37532}
37533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37534pub struct TerminalOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37535impl<'db> TerminalOrOrPtr<'db> {}
37536impl<'db> TypedStablePtr<'db> for TerminalOrOrPtr<'db> {
37537    type SyntaxNode = TerminalOrOr<'db>;
37538    fn untyped(self) -> SyntaxStablePtrId<'db> {
37539        self.0
37540    }
37541    fn lookup(&self, db: &'db dyn Database) -> TerminalOrOr<'db> {
37542        TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
37543    }
37544}
37545impl<'db> From<TerminalOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37546    fn from(ptr: TerminalOrOrPtr<'db>) -> Self {
37547        ptr.untyped()
37548    }
37549}
37550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37551pub struct TerminalOrOrGreen<'db>(pub GreenId<'db>);
37552impl<'db> TypedSyntaxNode<'db> for TerminalOrOr<'db> {
37553    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
37554    type StablePtr = TerminalOrOrPtr<'db>;
37555    type Green = TerminalOrOrGreen<'db>;
37556    fn missing(db: &'db dyn Database) -> Self::Green {
37557        TerminalOrOrGreen(
37558            GreenNode {
37559                kind: SyntaxKind::TerminalOrOr,
37560                details: GreenNodeDetails::Node {
37561                    children: [
37562                        Trivia::missing(db).0,
37563                        TokenOrOr::missing(db).0,
37564                        Trivia::missing(db).0,
37565                    ]
37566                    .into(),
37567                    width: TextWidth::default(),
37568                },
37569            }
37570            .intern(db),
37571        )
37572    }
37573    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37574        let kind = node.kind(db);
37575        assert_eq!(
37576            kind,
37577            SyntaxKind::TerminalOrOr,
37578            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37579            kind,
37580            SyntaxKind::TerminalOrOr
37581        );
37582        Self { node }
37583    }
37584    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37585        let kind = node.kind(db);
37586        if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
37587    }
37588    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37589        self.node
37590    }
37591    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37592        TerminalOrOrPtr(self.node.stable_ptr(db))
37593    }
37594}
37595#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37596pub struct TokenPlus<'db> {
37597    node: SyntaxNode<'db>,
37598}
37599impl<'db> Token<'db> for TokenPlus<'db> {
37600    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37601        TokenPlusGreen(
37602            GreenNode { kind: SyntaxKind::TokenPlus, details: GreenNodeDetails::Token(text) }
37603                .intern(db),
37604        )
37605    }
37606    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37607        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37608    }
37609}
37610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37611pub struct TokenPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37612impl<'db> TypedStablePtr<'db> for TokenPlusPtr<'db> {
37613    type SyntaxNode = TokenPlus<'db>;
37614    fn untyped(self) -> SyntaxStablePtrId<'db> {
37615        self.0
37616    }
37617    fn lookup(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37618        TokenPlus::from_syntax_node(db, self.0.lookup(db))
37619    }
37620}
37621impl<'db> From<TokenPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37622    fn from(ptr: TokenPlusPtr<'db>) -> Self {
37623        ptr.untyped()
37624    }
37625}
37626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37627pub struct TokenPlusGreen<'db>(pub GreenId<'db>);
37628impl<'db> TokenPlusGreen<'db> {
37629    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37630        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37631    }
37632}
37633impl<'db> TypedSyntaxNode<'db> for TokenPlus<'db> {
37634    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
37635    type StablePtr = TokenPlusPtr<'db>;
37636    type Green = TokenPlusGreen<'db>;
37637    fn missing(db: &'db dyn Database) -> Self::Green {
37638        TokenPlusGreen(
37639            GreenNode {
37640                kind: SyntaxKind::TokenMissing,
37641                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37642            }
37643            .intern(db),
37644        )
37645    }
37646    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37647        match node.green_node(db).details {
37648            GreenNodeDetails::Token(_) => Self { node },
37649            GreenNodeDetails::Node { .. } => {
37650                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
37651            }
37652        }
37653    }
37654    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37655        match node.green_node(db).details {
37656            GreenNodeDetails::Token(_) => Some(Self { node }),
37657            GreenNodeDetails::Node { .. } => None,
37658        }
37659    }
37660    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37661        self.node
37662    }
37663    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37664        TokenPlusPtr(self.node.stable_ptr(db))
37665    }
37666}
37667#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37668pub struct TerminalPlus<'db> {
37669    node: SyntaxNode<'db>,
37670}
37671impl<'db> Terminal<'db> for TerminalPlus<'db> {
37672    const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
37673    type TokenType = TokenPlus<'db>;
37674    fn new_green(
37675        db: &'db dyn Database,
37676        leading_trivia: TriviaGreen<'db>,
37677        token: <<TerminalPlus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37678        trailing_trivia: TriviaGreen<'db>,
37679    ) -> Self::Green {
37680        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37681        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37682        TerminalPlusGreen(
37683            GreenNode {
37684                kind: SyntaxKind::TerminalPlus,
37685                details: GreenNodeDetails::Node { children: children.into(), width },
37686            }
37687            .intern(db),
37688        )
37689    }
37690    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37691        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37692            unreachable!("Expected a node, not a token");
37693        };
37694        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37695    }
37696}
37697impl<'db> TerminalPlus<'db> {
37698    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37699        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37700    }
37701    pub fn token(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37702        TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
37703    }
37704    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37705        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37706    }
37707}
37708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37709pub struct TerminalPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37710impl<'db> TerminalPlusPtr<'db> {}
37711impl<'db> TypedStablePtr<'db> for TerminalPlusPtr<'db> {
37712    type SyntaxNode = TerminalPlus<'db>;
37713    fn untyped(self) -> SyntaxStablePtrId<'db> {
37714        self.0
37715    }
37716    fn lookup(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
37717        TerminalPlus::from_syntax_node(db, self.0.lookup(db))
37718    }
37719}
37720impl<'db> From<TerminalPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37721    fn from(ptr: TerminalPlusPtr<'db>) -> Self {
37722        ptr.untyped()
37723    }
37724}
37725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37726pub struct TerminalPlusGreen<'db>(pub GreenId<'db>);
37727impl<'db> TypedSyntaxNode<'db> for TerminalPlus<'db> {
37728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
37729    type StablePtr = TerminalPlusPtr<'db>;
37730    type Green = TerminalPlusGreen<'db>;
37731    fn missing(db: &'db dyn Database) -> Self::Green {
37732        TerminalPlusGreen(
37733            GreenNode {
37734                kind: SyntaxKind::TerminalPlus,
37735                details: GreenNodeDetails::Node {
37736                    children: [
37737                        Trivia::missing(db).0,
37738                        TokenPlus::missing(db).0,
37739                        Trivia::missing(db).0,
37740                    ]
37741                    .into(),
37742                    width: TextWidth::default(),
37743                },
37744            }
37745            .intern(db),
37746        )
37747    }
37748    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37749        let kind = node.kind(db);
37750        assert_eq!(
37751            kind,
37752            SyntaxKind::TerminalPlus,
37753            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37754            kind,
37755            SyntaxKind::TerminalPlus
37756        );
37757        Self { node }
37758    }
37759    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37760        let kind = node.kind(db);
37761        if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
37762    }
37763    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37764        self.node
37765    }
37766    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37767        TerminalPlusPtr(self.node.stable_ptr(db))
37768    }
37769}
37770#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37771pub struct TokenPlusEq<'db> {
37772    node: SyntaxNode<'db>,
37773}
37774impl<'db> Token<'db> for TokenPlusEq<'db> {
37775    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37776        TokenPlusEqGreen(
37777            GreenNode { kind: SyntaxKind::TokenPlusEq, details: GreenNodeDetails::Token(text) }
37778                .intern(db),
37779        )
37780    }
37781    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37782        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37783    }
37784}
37785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37786pub struct TokenPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37787impl<'db> TypedStablePtr<'db> for TokenPlusEqPtr<'db> {
37788    type SyntaxNode = TokenPlusEq<'db>;
37789    fn untyped(self) -> SyntaxStablePtrId<'db> {
37790        self.0
37791    }
37792    fn lookup(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37793        TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
37794    }
37795}
37796impl<'db> From<TokenPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37797    fn from(ptr: TokenPlusEqPtr<'db>) -> Self {
37798        ptr.untyped()
37799    }
37800}
37801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37802pub struct TokenPlusEqGreen<'db>(pub GreenId<'db>);
37803impl<'db> TokenPlusEqGreen<'db> {
37804    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37805        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37806    }
37807}
37808impl<'db> TypedSyntaxNode<'db> for TokenPlusEq<'db> {
37809    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
37810    type StablePtr = TokenPlusEqPtr<'db>;
37811    type Green = TokenPlusEqGreen<'db>;
37812    fn missing(db: &'db dyn Database) -> Self::Green {
37813        TokenPlusEqGreen(
37814            GreenNode {
37815                kind: SyntaxKind::TokenMissing,
37816                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37817            }
37818            .intern(db),
37819        )
37820    }
37821    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37822        match node.green_node(db).details {
37823            GreenNodeDetails::Token(_) => Self { node },
37824            GreenNodeDetails::Node { .. } => {
37825                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
37826            }
37827        }
37828    }
37829    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37830        match node.green_node(db).details {
37831            GreenNodeDetails::Token(_) => Some(Self { node }),
37832            GreenNodeDetails::Node { .. } => None,
37833        }
37834    }
37835    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37836        self.node
37837    }
37838    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37839        TokenPlusEqPtr(self.node.stable_ptr(db))
37840    }
37841}
37842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37843pub struct TerminalPlusEq<'db> {
37844    node: SyntaxNode<'db>,
37845}
37846impl<'db> Terminal<'db> for TerminalPlusEq<'db> {
37847    const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
37848    type TokenType = TokenPlusEq<'db>;
37849    fn new_green(
37850        db: &'db dyn Database,
37851        leading_trivia: TriviaGreen<'db>,
37852        token: <<TerminalPlusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37853        trailing_trivia: TriviaGreen<'db>,
37854    ) -> Self::Green {
37855        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37856        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37857        TerminalPlusEqGreen(
37858            GreenNode {
37859                kind: SyntaxKind::TerminalPlusEq,
37860                details: GreenNodeDetails::Node { children: children.into(), width },
37861            }
37862            .intern(db),
37863        )
37864    }
37865    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37866        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37867            unreachable!("Expected a node, not a token");
37868        };
37869        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37870    }
37871}
37872impl<'db> TerminalPlusEq<'db> {
37873    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37874        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37875    }
37876    pub fn token(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37877        TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
37878    }
37879    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37880        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37881    }
37882}
37883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37884pub struct TerminalPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37885impl<'db> TerminalPlusEqPtr<'db> {}
37886impl<'db> TypedStablePtr<'db> for TerminalPlusEqPtr<'db> {
37887    type SyntaxNode = TerminalPlusEq<'db>;
37888    fn untyped(self) -> SyntaxStablePtrId<'db> {
37889        self.0
37890    }
37891    fn lookup(&self, db: &'db dyn Database) -> TerminalPlusEq<'db> {
37892        TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
37893    }
37894}
37895impl<'db> From<TerminalPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37896    fn from(ptr: TerminalPlusEqPtr<'db>) -> Self {
37897        ptr.untyped()
37898    }
37899}
37900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37901pub struct TerminalPlusEqGreen<'db>(pub GreenId<'db>);
37902impl<'db> TypedSyntaxNode<'db> for TerminalPlusEq<'db> {
37903    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
37904    type StablePtr = TerminalPlusEqPtr<'db>;
37905    type Green = TerminalPlusEqGreen<'db>;
37906    fn missing(db: &'db dyn Database) -> Self::Green {
37907        TerminalPlusEqGreen(
37908            GreenNode {
37909                kind: SyntaxKind::TerminalPlusEq,
37910                details: GreenNodeDetails::Node {
37911                    children: [
37912                        Trivia::missing(db).0,
37913                        TokenPlusEq::missing(db).0,
37914                        Trivia::missing(db).0,
37915                    ]
37916                    .into(),
37917                    width: TextWidth::default(),
37918                },
37919            }
37920            .intern(db),
37921        )
37922    }
37923    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37924        let kind = node.kind(db);
37925        assert_eq!(
37926            kind,
37927            SyntaxKind::TerminalPlusEq,
37928            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37929            kind,
37930            SyntaxKind::TerminalPlusEq
37931        );
37932        Self { node }
37933    }
37934    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37935        let kind = node.kind(db);
37936        if kind == SyntaxKind::TerminalPlusEq {
37937            Some(Self::from_syntax_node(db, node))
37938        } else {
37939            None
37940        }
37941    }
37942    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37943        self.node
37944    }
37945    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37946        TerminalPlusEqPtr(self.node.stable_ptr(db))
37947    }
37948}
37949#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37950pub struct TokenQuestionMark<'db> {
37951    node: SyntaxNode<'db>,
37952}
37953impl<'db> Token<'db> for TokenQuestionMark<'db> {
37954    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37955        TokenQuestionMarkGreen(
37956            GreenNode {
37957                kind: SyntaxKind::TokenQuestionMark,
37958                details: GreenNodeDetails::Token(text),
37959            }
37960            .intern(db),
37961        )
37962    }
37963    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37964        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37965    }
37966}
37967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37968pub struct TokenQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
37969impl<'db> TypedStablePtr<'db> for TokenQuestionMarkPtr<'db> {
37970    type SyntaxNode = TokenQuestionMark<'db>;
37971    fn untyped(self) -> SyntaxStablePtrId<'db> {
37972        self.0
37973    }
37974    fn lookup(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
37975        TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
37976    }
37977}
37978impl<'db> From<TokenQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
37979    fn from(ptr: TokenQuestionMarkPtr<'db>) -> Self {
37980        ptr.untyped()
37981    }
37982}
37983#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37984pub struct TokenQuestionMarkGreen<'db>(pub GreenId<'db>);
37985impl<'db> TokenQuestionMarkGreen<'db> {
37986    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37987        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37988    }
37989}
37990impl<'db> TypedSyntaxNode<'db> for TokenQuestionMark<'db> {
37991    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
37992    type StablePtr = TokenQuestionMarkPtr<'db>;
37993    type Green = TokenQuestionMarkGreen<'db>;
37994    fn missing(db: &'db dyn Database) -> Self::Green {
37995        TokenQuestionMarkGreen(
37996            GreenNode {
37997                kind: SyntaxKind::TokenMissing,
37998                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37999            }
38000            .intern(db),
38001        )
38002    }
38003    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38004        match node.green_node(db).details {
38005            GreenNodeDetails::Token(_) => Self { node },
38006            GreenNodeDetails::Node { .. } => {
38007                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
38008            }
38009        }
38010    }
38011    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38012        match node.green_node(db).details {
38013            GreenNodeDetails::Token(_) => Some(Self { node }),
38014            GreenNodeDetails::Node { .. } => None,
38015        }
38016    }
38017    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38018        self.node
38019    }
38020    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38021        TokenQuestionMarkPtr(self.node.stable_ptr(db))
38022    }
38023}
38024#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38025pub struct TerminalQuestionMark<'db> {
38026    node: SyntaxNode<'db>,
38027}
38028impl<'db> Terminal<'db> for TerminalQuestionMark<'db> {
38029    const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
38030    type TokenType = TokenQuestionMark<'db>;
38031    fn new_green(
38032        db: &'db dyn Database,
38033        leading_trivia: TriviaGreen<'db>,
38034        token: <<TerminalQuestionMark<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38035        trailing_trivia: TriviaGreen<'db>,
38036    ) -> Self::Green {
38037        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38038        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38039        TerminalQuestionMarkGreen(
38040            GreenNode {
38041                kind: SyntaxKind::TerminalQuestionMark,
38042                details: GreenNodeDetails::Node { children: children.into(), width },
38043            }
38044            .intern(db),
38045        )
38046    }
38047    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38048        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38049            unreachable!("Expected a node, not a token");
38050        };
38051        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38052    }
38053}
38054impl<'db> TerminalQuestionMark<'db> {
38055    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38056        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38057    }
38058    pub fn token(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
38059        TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
38060    }
38061    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38062        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38063    }
38064}
38065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38066pub struct TerminalQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
38067impl<'db> TerminalQuestionMarkPtr<'db> {}
38068impl<'db> TypedStablePtr<'db> for TerminalQuestionMarkPtr<'db> {
38069    type SyntaxNode = TerminalQuestionMark<'db>;
38070    fn untyped(self) -> SyntaxStablePtrId<'db> {
38071        self.0
38072    }
38073    fn lookup(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
38074        TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
38075    }
38076}
38077impl<'db> From<TerminalQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
38078    fn from(ptr: TerminalQuestionMarkPtr<'db>) -> Self {
38079        ptr.untyped()
38080    }
38081}
38082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38083pub struct TerminalQuestionMarkGreen<'db>(pub GreenId<'db>);
38084impl<'db> TypedSyntaxNode<'db> for TerminalQuestionMark<'db> {
38085    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
38086    type StablePtr = TerminalQuestionMarkPtr<'db>;
38087    type Green = TerminalQuestionMarkGreen<'db>;
38088    fn missing(db: &'db dyn Database) -> Self::Green {
38089        TerminalQuestionMarkGreen(
38090            GreenNode {
38091                kind: SyntaxKind::TerminalQuestionMark,
38092                details: GreenNodeDetails::Node {
38093                    children: [
38094                        Trivia::missing(db).0,
38095                        TokenQuestionMark::missing(db).0,
38096                        Trivia::missing(db).0,
38097                    ]
38098                    .into(),
38099                    width: TextWidth::default(),
38100                },
38101            }
38102            .intern(db),
38103        )
38104    }
38105    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38106        let kind = node.kind(db);
38107        assert_eq!(
38108            kind,
38109            SyntaxKind::TerminalQuestionMark,
38110            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38111            kind,
38112            SyntaxKind::TerminalQuestionMark
38113        );
38114        Self { node }
38115    }
38116    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38117        let kind = node.kind(db);
38118        if kind == SyntaxKind::TerminalQuestionMark {
38119            Some(Self::from_syntax_node(db, node))
38120        } else {
38121            None
38122        }
38123    }
38124    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38125        self.node
38126    }
38127    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38128        TerminalQuestionMarkPtr(self.node.stable_ptr(db))
38129    }
38130}
38131#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38132pub struct TokenRBrace<'db> {
38133    node: SyntaxNode<'db>,
38134}
38135impl<'db> Token<'db> for TokenRBrace<'db> {
38136    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38137        TokenRBraceGreen(
38138            GreenNode { kind: SyntaxKind::TokenRBrace, details: GreenNodeDetails::Token(text) }
38139                .intern(db),
38140        )
38141    }
38142    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38143        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38144    }
38145}
38146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38147pub struct TokenRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38148impl<'db> TypedStablePtr<'db> for TokenRBracePtr<'db> {
38149    type SyntaxNode = TokenRBrace<'db>;
38150    fn untyped(self) -> SyntaxStablePtrId<'db> {
38151        self.0
38152    }
38153    fn lookup(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38154        TokenRBrace::from_syntax_node(db, self.0.lookup(db))
38155    }
38156}
38157impl<'db> From<TokenRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38158    fn from(ptr: TokenRBracePtr<'db>) -> Self {
38159        ptr.untyped()
38160    }
38161}
38162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38163pub struct TokenRBraceGreen<'db>(pub GreenId<'db>);
38164impl<'db> TokenRBraceGreen<'db> {
38165    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38166        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38167    }
38168}
38169impl<'db> TypedSyntaxNode<'db> for TokenRBrace<'db> {
38170    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
38171    type StablePtr = TokenRBracePtr<'db>;
38172    type Green = TokenRBraceGreen<'db>;
38173    fn missing(db: &'db dyn Database) -> Self::Green {
38174        TokenRBraceGreen(
38175            GreenNode {
38176                kind: SyntaxKind::TokenMissing,
38177                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38178            }
38179            .intern(db),
38180        )
38181    }
38182    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38183        match node.green_node(db).details {
38184            GreenNodeDetails::Token(_) => Self { node },
38185            GreenNodeDetails::Node { .. } => {
38186                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
38187            }
38188        }
38189    }
38190    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38191        match node.green_node(db).details {
38192            GreenNodeDetails::Token(_) => Some(Self { node }),
38193            GreenNodeDetails::Node { .. } => None,
38194        }
38195    }
38196    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38197        self.node
38198    }
38199    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38200        TokenRBracePtr(self.node.stable_ptr(db))
38201    }
38202}
38203#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38204pub struct TerminalRBrace<'db> {
38205    node: SyntaxNode<'db>,
38206}
38207impl<'db> Terminal<'db> for TerminalRBrace<'db> {
38208    const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
38209    type TokenType = TokenRBrace<'db>;
38210    fn new_green(
38211        db: &'db dyn Database,
38212        leading_trivia: TriviaGreen<'db>,
38213        token: <<TerminalRBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38214        trailing_trivia: TriviaGreen<'db>,
38215    ) -> Self::Green {
38216        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38217        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38218        TerminalRBraceGreen(
38219            GreenNode {
38220                kind: SyntaxKind::TerminalRBrace,
38221                details: GreenNodeDetails::Node { children: children.into(), width },
38222            }
38223            .intern(db),
38224        )
38225    }
38226    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38227        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38228            unreachable!("Expected a node, not a token");
38229        };
38230        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38231    }
38232}
38233impl<'db> TerminalRBrace<'db> {
38234    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38235        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38236    }
38237    pub fn token(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38238        TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
38239    }
38240    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38241        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38242    }
38243}
38244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38245pub struct TerminalRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38246impl<'db> TerminalRBracePtr<'db> {}
38247impl<'db> TypedStablePtr<'db> for TerminalRBracePtr<'db> {
38248    type SyntaxNode = TerminalRBrace<'db>;
38249    fn untyped(self) -> SyntaxStablePtrId<'db> {
38250        self.0
38251    }
38252    fn lookup(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
38253        TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
38254    }
38255}
38256impl<'db> From<TerminalRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38257    fn from(ptr: TerminalRBracePtr<'db>) -> Self {
38258        ptr.untyped()
38259    }
38260}
38261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38262pub struct TerminalRBraceGreen<'db>(pub GreenId<'db>);
38263impl<'db> TypedSyntaxNode<'db> for TerminalRBrace<'db> {
38264    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
38265    type StablePtr = TerminalRBracePtr<'db>;
38266    type Green = TerminalRBraceGreen<'db>;
38267    fn missing(db: &'db dyn Database) -> Self::Green {
38268        TerminalRBraceGreen(
38269            GreenNode {
38270                kind: SyntaxKind::TerminalRBrace,
38271                details: GreenNodeDetails::Node {
38272                    children: [
38273                        Trivia::missing(db).0,
38274                        TokenRBrace::missing(db).0,
38275                        Trivia::missing(db).0,
38276                    ]
38277                    .into(),
38278                    width: TextWidth::default(),
38279                },
38280            }
38281            .intern(db),
38282        )
38283    }
38284    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38285        let kind = node.kind(db);
38286        assert_eq!(
38287            kind,
38288            SyntaxKind::TerminalRBrace,
38289            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38290            kind,
38291            SyntaxKind::TerminalRBrace
38292        );
38293        Self { node }
38294    }
38295    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38296        let kind = node.kind(db);
38297        if kind == SyntaxKind::TerminalRBrace {
38298            Some(Self::from_syntax_node(db, node))
38299        } else {
38300            None
38301        }
38302    }
38303    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38304        self.node
38305    }
38306    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38307        TerminalRBracePtr(self.node.stable_ptr(db))
38308    }
38309}
38310#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38311pub struct TokenRBrack<'db> {
38312    node: SyntaxNode<'db>,
38313}
38314impl<'db> Token<'db> for TokenRBrack<'db> {
38315    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38316        TokenRBrackGreen(
38317            GreenNode { kind: SyntaxKind::TokenRBrack, details: GreenNodeDetails::Token(text) }
38318                .intern(db),
38319        )
38320    }
38321    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38322        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38323    }
38324}
38325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38326pub struct TokenRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38327impl<'db> TypedStablePtr<'db> for TokenRBrackPtr<'db> {
38328    type SyntaxNode = TokenRBrack<'db>;
38329    fn untyped(self) -> SyntaxStablePtrId<'db> {
38330        self.0
38331    }
38332    fn lookup(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38333        TokenRBrack::from_syntax_node(db, self.0.lookup(db))
38334    }
38335}
38336impl<'db> From<TokenRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38337    fn from(ptr: TokenRBrackPtr<'db>) -> Self {
38338        ptr.untyped()
38339    }
38340}
38341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38342pub struct TokenRBrackGreen<'db>(pub GreenId<'db>);
38343impl<'db> TokenRBrackGreen<'db> {
38344    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38345        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38346    }
38347}
38348impl<'db> TypedSyntaxNode<'db> for TokenRBrack<'db> {
38349    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
38350    type StablePtr = TokenRBrackPtr<'db>;
38351    type Green = TokenRBrackGreen<'db>;
38352    fn missing(db: &'db dyn Database) -> Self::Green {
38353        TokenRBrackGreen(
38354            GreenNode {
38355                kind: SyntaxKind::TokenMissing,
38356                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38357            }
38358            .intern(db),
38359        )
38360    }
38361    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38362        match node.green_node(db).details {
38363            GreenNodeDetails::Token(_) => Self { node },
38364            GreenNodeDetails::Node { .. } => {
38365                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
38366            }
38367        }
38368    }
38369    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38370        match node.green_node(db).details {
38371            GreenNodeDetails::Token(_) => Some(Self { node }),
38372            GreenNodeDetails::Node { .. } => None,
38373        }
38374    }
38375    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38376        self.node
38377    }
38378    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38379        TokenRBrackPtr(self.node.stable_ptr(db))
38380    }
38381}
38382#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38383pub struct TerminalRBrack<'db> {
38384    node: SyntaxNode<'db>,
38385}
38386impl<'db> Terminal<'db> for TerminalRBrack<'db> {
38387    const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
38388    type TokenType = TokenRBrack<'db>;
38389    fn new_green(
38390        db: &'db dyn Database,
38391        leading_trivia: TriviaGreen<'db>,
38392        token: <<TerminalRBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38393        trailing_trivia: TriviaGreen<'db>,
38394    ) -> Self::Green {
38395        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38396        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38397        TerminalRBrackGreen(
38398            GreenNode {
38399                kind: SyntaxKind::TerminalRBrack,
38400                details: GreenNodeDetails::Node { children: children.into(), width },
38401            }
38402            .intern(db),
38403        )
38404    }
38405    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38406        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38407            unreachable!("Expected a node, not a token");
38408        };
38409        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38410    }
38411}
38412impl<'db> TerminalRBrack<'db> {
38413    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38414        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38415    }
38416    pub fn token(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38417        TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
38418    }
38419    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38420        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38421    }
38422}
38423#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38424pub struct TerminalRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38425impl<'db> TerminalRBrackPtr<'db> {}
38426impl<'db> TypedStablePtr<'db> for TerminalRBrackPtr<'db> {
38427    type SyntaxNode = TerminalRBrack<'db>;
38428    fn untyped(self) -> SyntaxStablePtrId<'db> {
38429        self.0
38430    }
38431    fn lookup(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
38432        TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
38433    }
38434}
38435impl<'db> From<TerminalRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38436    fn from(ptr: TerminalRBrackPtr<'db>) -> Self {
38437        ptr.untyped()
38438    }
38439}
38440#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38441pub struct TerminalRBrackGreen<'db>(pub GreenId<'db>);
38442impl<'db> TypedSyntaxNode<'db> for TerminalRBrack<'db> {
38443    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
38444    type StablePtr = TerminalRBrackPtr<'db>;
38445    type Green = TerminalRBrackGreen<'db>;
38446    fn missing(db: &'db dyn Database) -> Self::Green {
38447        TerminalRBrackGreen(
38448            GreenNode {
38449                kind: SyntaxKind::TerminalRBrack,
38450                details: GreenNodeDetails::Node {
38451                    children: [
38452                        Trivia::missing(db).0,
38453                        TokenRBrack::missing(db).0,
38454                        Trivia::missing(db).0,
38455                    ]
38456                    .into(),
38457                    width: TextWidth::default(),
38458                },
38459            }
38460            .intern(db),
38461        )
38462    }
38463    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38464        let kind = node.kind(db);
38465        assert_eq!(
38466            kind,
38467            SyntaxKind::TerminalRBrack,
38468            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38469            kind,
38470            SyntaxKind::TerminalRBrack
38471        );
38472        Self { node }
38473    }
38474    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38475        let kind = node.kind(db);
38476        if kind == SyntaxKind::TerminalRBrack {
38477            Some(Self::from_syntax_node(db, node))
38478        } else {
38479            None
38480        }
38481    }
38482    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38483        self.node
38484    }
38485    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38486        TerminalRBrackPtr(self.node.stable_ptr(db))
38487    }
38488}
38489#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38490pub struct TokenRParen<'db> {
38491    node: SyntaxNode<'db>,
38492}
38493impl<'db> Token<'db> for TokenRParen<'db> {
38494    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38495        TokenRParenGreen(
38496            GreenNode { kind: SyntaxKind::TokenRParen, details: GreenNodeDetails::Token(text) }
38497                .intern(db),
38498        )
38499    }
38500    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38501        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38502    }
38503}
38504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38505pub struct TokenRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38506impl<'db> TypedStablePtr<'db> for TokenRParenPtr<'db> {
38507    type SyntaxNode = TokenRParen<'db>;
38508    fn untyped(self) -> SyntaxStablePtrId<'db> {
38509        self.0
38510    }
38511    fn lookup(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38512        TokenRParen::from_syntax_node(db, self.0.lookup(db))
38513    }
38514}
38515impl<'db> From<TokenRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38516    fn from(ptr: TokenRParenPtr<'db>) -> Self {
38517        ptr.untyped()
38518    }
38519}
38520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38521pub struct TokenRParenGreen<'db>(pub GreenId<'db>);
38522impl<'db> TokenRParenGreen<'db> {
38523    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38524        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38525    }
38526}
38527impl<'db> TypedSyntaxNode<'db> for TokenRParen<'db> {
38528    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
38529    type StablePtr = TokenRParenPtr<'db>;
38530    type Green = TokenRParenGreen<'db>;
38531    fn missing(db: &'db dyn Database) -> Self::Green {
38532        TokenRParenGreen(
38533            GreenNode {
38534                kind: SyntaxKind::TokenMissing,
38535                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38536            }
38537            .intern(db),
38538        )
38539    }
38540    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38541        match node.green_node(db).details {
38542            GreenNodeDetails::Token(_) => Self { node },
38543            GreenNodeDetails::Node { .. } => {
38544                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
38545            }
38546        }
38547    }
38548    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38549        match node.green_node(db).details {
38550            GreenNodeDetails::Token(_) => Some(Self { node }),
38551            GreenNodeDetails::Node { .. } => None,
38552        }
38553    }
38554    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38555        self.node
38556    }
38557    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38558        TokenRParenPtr(self.node.stable_ptr(db))
38559    }
38560}
38561#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38562pub struct TerminalRParen<'db> {
38563    node: SyntaxNode<'db>,
38564}
38565impl<'db> Terminal<'db> for TerminalRParen<'db> {
38566    const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
38567    type TokenType = TokenRParen<'db>;
38568    fn new_green(
38569        db: &'db dyn Database,
38570        leading_trivia: TriviaGreen<'db>,
38571        token: <<TerminalRParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38572        trailing_trivia: TriviaGreen<'db>,
38573    ) -> Self::Green {
38574        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38575        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38576        TerminalRParenGreen(
38577            GreenNode {
38578                kind: SyntaxKind::TerminalRParen,
38579                details: GreenNodeDetails::Node { children: children.into(), width },
38580            }
38581            .intern(db),
38582        )
38583    }
38584    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38585        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38586            unreachable!("Expected a node, not a token");
38587        };
38588        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38589    }
38590}
38591impl<'db> TerminalRParen<'db> {
38592    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38593        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38594    }
38595    pub fn token(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38596        TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
38597    }
38598    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38599        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38600    }
38601}
38602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38603pub struct TerminalRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38604impl<'db> TerminalRParenPtr<'db> {}
38605impl<'db> TypedStablePtr<'db> for TerminalRParenPtr<'db> {
38606    type SyntaxNode = TerminalRParen<'db>;
38607    fn untyped(self) -> SyntaxStablePtrId<'db> {
38608        self.0
38609    }
38610    fn lookup(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
38611        TerminalRParen::from_syntax_node(db, self.0.lookup(db))
38612    }
38613}
38614impl<'db> From<TerminalRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38615    fn from(ptr: TerminalRParenPtr<'db>) -> Self {
38616        ptr.untyped()
38617    }
38618}
38619#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38620pub struct TerminalRParenGreen<'db>(pub GreenId<'db>);
38621impl<'db> TypedSyntaxNode<'db> for TerminalRParen<'db> {
38622    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
38623    type StablePtr = TerminalRParenPtr<'db>;
38624    type Green = TerminalRParenGreen<'db>;
38625    fn missing(db: &'db dyn Database) -> Self::Green {
38626        TerminalRParenGreen(
38627            GreenNode {
38628                kind: SyntaxKind::TerminalRParen,
38629                details: GreenNodeDetails::Node {
38630                    children: [
38631                        Trivia::missing(db).0,
38632                        TokenRParen::missing(db).0,
38633                        Trivia::missing(db).0,
38634                    ]
38635                    .into(),
38636                    width: TextWidth::default(),
38637                },
38638            }
38639            .intern(db),
38640        )
38641    }
38642    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38643        let kind = node.kind(db);
38644        assert_eq!(
38645            kind,
38646            SyntaxKind::TerminalRParen,
38647            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38648            kind,
38649            SyntaxKind::TerminalRParen
38650        );
38651        Self { node }
38652    }
38653    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38654        let kind = node.kind(db);
38655        if kind == SyntaxKind::TerminalRParen {
38656            Some(Self::from_syntax_node(db, node))
38657        } else {
38658            None
38659        }
38660    }
38661    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38662        self.node
38663    }
38664    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38665        TerminalRParenPtr(self.node.stable_ptr(db))
38666    }
38667}
38668#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38669pub struct TokenSemicolon<'db> {
38670    node: SyntaxNode<'db>,
38671}
38672impl<'db> Token<'db> for TokenSemicolon<'db> {
38673    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38674        TokenSemicolonGreen(
38675            GreenNode { kind: SyntaxKind::TokenSemicolon, details: GreenNodeDetails::Token(text) }
38676                .intern(db),
38677        )
38678    }
38679    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38680        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38681    }
38682}
38683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38684pub struct TokenSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38685impl<'db> TypedStablePtr<'db> for TokenSemicolonPtr<'db> {
38686    type SyntaxNode = TokenSemicolon<'db>;
38687    fn untyped(self) -> SyntaxStablePtrId<'db> {
38688        self.0
38689    }
38690    fn lookup(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38691        TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
38692    }
38693}
38694impl<'db> From<TokenSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38695    fn from(ptr: TokenSemicolonPtr<'db>) -> Self {
38696        ptr.untyped()
38697    }
38698}
38699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38700pub struct TokenSemicolonGreen<'db>(pub GreenId<'db>);
38701impl<'db> TokenSemicolonGreen<'db> {
38702    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38703        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38704    }
38705}
38706impl<'db> TypedSyntaxNode<'db> for TokenSemicolon<'db> {
38707    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
38708    type StablePtr = TokenSemicolonPtr<'db>;
38709    type Green = TokenSemicolonGreen<'db>;
38710    fn missing(db: &'db dyn Database) -> Self::Green {
38711        TokenSemicolonGreen(
38712            GreenNode {
38713                kind: SyntaxKind::TokenMissing,
38714                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38715            }
38716            .intern(db),
38717        )
38718    }
38719    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38720        match node.green_node(db).details {
38721            GreenNodeDetails::Token(_) => Self { node },
38722            GreenNodeDetails::Node { .. } => {
38723                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
38724            }
38725        }
38726    }
38727    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38728        match node.green_node(db).details {
38729            GreenNodeDetails::Token(_) => Some(Self { node }),
38730            GreenNodeDetails::Node { .. } => None,
38731        }
38732    }
38733    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38734        self.node
38735    }
38736    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38737        TokenSemicolonPtr(self.node.stable_ptr(db))
38738    }
38739}
38740#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38741pub struct TerminalSemicolon<'db> {
38742    node: SyntaxNode<'db>,
38743}
38744impl<'db> Terminal<'db> for TerminalSemicolon<'db> {
38745    const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
38746    type TokenType = TokenSemicolon<'db>;
38747    fn new_green(
38748        db: &'db dyn Database,
38749        leading_trivia: TriviaGreen<'db>,
38750        token: <<TerminalSemicolon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38751        trailing_trivia: TriviaGreen<'db>,
38752    ) -> Self::Green {
38753        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38754        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38755        TerminalSemicolonGreen(
38756            GreenNode {
38757                kind: SyntaxKind::TerminalSemicolon,
38758                details: GreenNodeDetails::Node { children: children.into(), width },
38759            }
38760            .intern(db),
38761        )
38762    }
38763    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38764        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38765            unreachable!("Expected a node, not a token");
38766        };
38767        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38768    }
38769}
38770impl<'db> TerminalSemicolon<'db> {
38771    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38772        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38773    }
38774    pub fn token(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38775        TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
38776    }
38777    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38778        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38779    }
38780}
38781#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38782pub struct TerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38783impl<'db> TerminalSemicolonPtr<'db> {}
38784impl<'db> TypedStablePtr<'db> for TerminalSemicolonPtr<'db> {
38785    type SyntaxNode = TerminalSemicolon<'db>;
38786    fn untyped(self) -> SyntaxStablePtrId<'db> {
38787        self.0
38788    }
38789    fn lookup(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
38790        TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
38791    }
38792}
38793impl<'db> From<TerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38794    fn from(ptr: TerminalSemicolonPtr<'db>) -> Self {
38795        ptr.untyped()
38796    }
38797}
38798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38799pub struct TerminalSemicolonGreen<'db>(pub GreenId<'db>);
38800impl<'db> TypedSyntaxNode<'db> for TerminalSemicolon<'db> {
38801    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
38802    type StablePtr = TerminalSemicolonPtr<'db>;
38803    type Green = TerminalSemicolonGreen<'db>;
38804    fn missing(db: &'db dyn Database) -> Self::Green {
38805        TerminalSemicolonGreen(
38806            GreenNode {
38807                kind: SyntaxKind::TerminalSemicolon,
38808                details: GreenNodeDetails::Node {
38809                    children: [
38810                        Trivia::missing(db).0,
38811                        TokenSemicolon::missing(db).0,
38812                        Trivia::missing(db).0,
38813                    ]
38814                    .into(),
38815                    width: TextWidth::default(),
38816                },
38817            }
38818            .intern(db),
38819        )
38820    }
38821    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38822        let kind = node.kind(db);
38823        assert_eq!(
38824            kind,
38825            SyntaxKind::TerminalSemicolon,
38826            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38827            kind,
38828            SyntaxKind::TerminalSemicolon
38829        );
38830        Self { node }
38831    }
38832    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38833        let kind = node.kind(db);
38834        if kind == SyntaxKind::TerminalSemicolon {
38835            Some(Self::from_syntax_node(db, node))
38836        } else {
38837            None
38838        }
38839    }
38840    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38841        self.node
38842    }
38843    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38844        TerminalSemicolonPtr(self.node.stable_ptr(db))
38845    }
38846}
38847#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38848pub struct TokenUnderscore<'db> {
38849    node: SyntaxNode<'db>,
38850}
38851impl<'db> Token<'db> for TokenUnderscore<'db> {
38852    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38853        TokenUnderscoreGreen(
38854            GreenNode { kind: SyntaxKind::TokenUnderscore, details: GreenNodeDetails::Token(text) }
38855                .intern(db),
38856        )
38857    }
38858    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38859        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38860    }
38861}
38862#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38863pub struct TokenUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38864impl<'db> TypedStablePtr<'db> for TokenUnderscorePtr<'db> {
38865    type SyntaxNode = TokenUnderscore<'db>;
38866    fn untyped(self) -> SyntaxStablePtrId<'db> {
38867        self.0
38868    }
38869    fn lookup(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38870        TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
38871    }
38872}
38873impl<'db> From<TokenUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38874    fn from(ptr: TokenUnderscorePtr<'db>) -> Self {
38875        ptr.untyped()
38876    }
38877}
38878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38879pub struct TokenUnderscoreGreen<'db>(pub GreenId<'db>);
38880impl<'db> TokenUnderscoreGreen<'db> {
38881    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38882        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38883    }
38884}
38885impl<'db> TypedSyntaxNode<'db> for TokenUnderscore<'db> {
38886    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
38887    type StablePtr = TokenUnderscorePtr<'db>;
38888    type Green = TokenUnderscoreGreen<'db>;
38889    fn missing(db: &'db dyn Database) -> Self::Green {
38890        TokenUnderscoreGreen(
38891            GreenNode {
38892                kind: SyntaxKind::TokenMissing,
38893                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38894            }
38895            .intern(db),
38896        )
38897    }
38898    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38899        match node.green_node(db).details {
38900            GreenNodeDetails::Token(_) => Self { node },
38901            GreenNodeDetails::Node { .. } => {
38902                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
38903            }
38904        }
38905    }
38906    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38907        match node.green_node(db).details {
38908            GreenNodeDetails::Token(_) => Some(Self { node }),
38909            GreenNodeDetails::Node { .. } => None,
38910        }
38911    }
38912    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38913        self.node
38914    }
38915    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38916        TokenUnderscorePtr(self.node.stable_ptr(db))
38917    }
38918}
38919#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38920pub struct TerminalUnderscore<'db> {
38921    node: SyntaxNode<'db>,
38922}
38923impl<'db> Terminal<'db> for TerminalUnderscore<'db> {
38924    const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
38925    type TokenType = TokenUnderscore<'db>;
38926    fn new_green(
38927        db: &'db dyn Database,
38928        leading_trivia: TriviaGreen<'db>,
38929        token: <<TerminalUnderscore<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38930        trailing_trivia: TriviaGreen<'db>,
38931    ) -> Self::Green {
38932        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38933        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38934        TerminalUnderscoreGreen(
38935            GreenNode {
38936                kind: SyntaxKind::TerminalUnderscore,
38937                details: GreenNodeDetails::Node { children: children.into(), width },
38938            }
38939            .intern(db),
38940        )
38941    }
38942    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38943        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38944            unreachable!("Expected a node, not a token");
38945        };
38946        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38947    }
38948}
38949impl<'db> TerminalUnderscore<'db> {
38950    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38951        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38952    }
38953    pub fn token(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38954        TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
38955    }
38956    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38957        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38958    }
38959}
38960#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38961pub struct TerminalUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38962impl<'db> TerminalUnderscorePtr<'db> {}
38963impl<'db> TypedStablePtr<'db> for TerminalUnderscorePtr<'db> {
38964    type SyntaxNode = TerminalUnderscore<'db>;
38965    fn untyped(self) -> SyntaxStablePtrId<'db> {
38966        self.0
38967    }
38968    fn lookup(&self, db: &'db dyn Database) -> TerminalUnderscore<'db> {
38969        TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
38970    }
38971}
38972impl<'db> From<TerminalUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38973    fn from(ptr: TerminalUnderscorePtr<'db>) -> Self {
38974        ptr.untyped()
38975    }
38976}
38977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38978pub struct TerminalUnderscoreGreen<'db>(pub GreenId<'db>);
38979impl<'db> TypedSyntaxNode<'db> for TerminalUnderscore<'db> {
38980    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
38981    type StablePtr = TerminalUnderscorePtr<'db>;
38982    type Green = TerminalUnderscoreGreen<'db>;
38983    fn missing(db: &'db dyn Database) -> Self::Green {
38984        TerminalUnderscoreGreen(
38985            GreenNode {
38986                kind: SyntaxKind::TerminalUnderscore,
38987                details: GreenNodeDetails::Node {
38988                    children: [
38989                        Trivia::missing(db).0,
38990                        TokenUnderscore::missing(db).0,
38991                        Trivia::missing(db).0,
38992                    ]
38993                    .into(),
38994                    width: TextWidth::default(),
38995                },
38996            }
38997            .intern(db),
38998        )
38999    }
39000    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39001        let kind = node.kind(db);
39002        assert_eq!(
39003            kind,
39004            SyntaxKind::TerminalUnderscore,
39005            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39006            kind,
39007            SyntaxKind::TerminalUnderscore
39008        );
39009        Self { node }
39010    }
39011    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39012        let kind = node.kind(db);
39013        if kind == SyntaxKind::TerminalUnderscore {
39014            Some(Self::from_syntax_node(db, node))
39015        } else {
39016            None
39017        }
39018    }
39019    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39020        self.node
39021    }
39022    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39023        TerminalUnderscorePtr(self.node.stable_ptr(db))
39024    }
39025}
39026#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39027pub struct TokenXor<'db> {
39028    node: SyntaxNode<'db>,
39029}
39030impl<'db> Token<'db> for TokenXor<'db> {
39031    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39032        TokenXorGreen(
39033            GreenNode { kind: SyntaxKind::TokenXor, details: GreenNodeDetails::Token(text) }
39034                .intern(db),
39035        )
39036    }
39037    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39038        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39039    }
39040}
39041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39042pub struct TokenXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39043impl<'db> TypedStablePtr<'db> for TokenXorPtr<'db> {
39044    type SyntaxNode = TokenXor<'db>;
39045    fn untyped(self) -> SyntaxStablePtrId<'db> {
39046        self.0
39047    }
39048    fn lookup(&self, db: &'db dyn Database) -> TokenXor<'db> {
39049        TokenXor::from_syntax_node(db, self.0.lookup(db))
39050    }
39051}
39052impl<'db> From<TokenXorPtr<'db>> for SyntaxStablePtrId<'db> {
39053    fn from(ptr: TokenXorPtr<'db>) -> Self {
39054        ptr.untyped()
39055    }
39056}
39057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39058pub struct TokenXorGreen<'db>(pub GreenId<'db>);
39059impl<'db> TokenXorGreen<'db> {
39060    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39061        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39062    }
39063}
39064impl<'db> TypedSyntaxNode<'db> for TokenXor<'db> {
39065    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
39066    type StablePtr = TokenXorPtr<'db>;
39067    type Green = TokenXorGreen<'db>;
39068    fn missing(db: &'db dyn Database) -> Self::Green {
39069        TokenXorGreen(
39070            GreenNode {
39071                kind: SyntaxKind::TokenMissing,
39072                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39073            }
39074            .intern(db),
39075        )
39076    }
39077    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39078        match node.green_node(db).details {
39079            GreenNodeDetails::Token(_) => Self { node },
39080            GreenNodeDetails::Node { .. } => {
39081                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
39082            }
39083        }
39084    }
39085    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39086        match node.green_node(db).details {
39087            GreenNodeDetails::Token(_) => Some(Self { node }),
39088            GreenNodeDetails::Node { .. } => None,
39089        }
39090    }
39091    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39092        self.node
39093    }
39094    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39095        TokenXorPtr(self.node.stable_ptr(db))
39096    }
39097}
39098#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39099pub struct TerminalXor<'db> {
39100    node: SyntaxNode<'db>,
39101}
39102impl<'db> Terminal<'db> for TerminalXor<'db> {
39103    const KIND: SyntaxKind = SyntaxKind::TerminalXor;
39104    type TokenType = TokenXor<'db>;
39105    fn new_green(
39106        db: &'db dyn Database,
39107        leading_trivia: TriviaGreen<'db>,
39108        token: <<TerminalXor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39109        trailing_trivia: TriviaGreen<'db>,
39110    ) -> Self::Green {
39111        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39112        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39113        TerminalXorGreen(
39114            GreenNode {
39115                kind: SyntaxKind::TerminalXor,
39116                details: GreenNodeDetails::Node { children: children.into(), width },
39117            }
39118            .intern(db),
39119        )
39120    }
39121    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39122        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
39123            unreachable!("Expected a node, not a token");
39124        };
39125        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39126    }
39127}
39128impl<'db> TerminalXor<'db> {
39129    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39130        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39131    }
39132    pub fn token(&self, db: &'db dyn Database) -> TokenXor<'db> {
39133        TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
39134    }
39135    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39136        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39137    }
39138}
39139#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39140pub struct TerminalXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39141impl<'db> TerminalXorPtr<'db> {}
39142impl<'db> TypedStablePtr<'db> for TerminalXorPtr<'db> {
39143    type SyntaxNode = TerminalXor<'db>;
39144    fn untyped(self) -> SyntaxStablePtrId<'db> {
39145        self.0
39146    }
39147    fn lookup(&self, db: &'db dyn Database) -> TerminalXor<'db> {
39148        TerminalXor::from_syntax_node(db, self.0.lookup(db))
39149    }
39150}
39151impl<'db> From<TerminalXorPtr<'db>> for SyntaxStablePtrId<'db> {
39152    fn from(ptr: TerminalXorPtr<'db>) -> Self {
39153        ptr.untyped()
39154    }
39155}
39156#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39157pub struct TerminalXorGreen<'db>(pub GreenId<'db>);
39158impl<'db> TypedSyntaxNode<'db> for TerminalXor<'db> {
39159    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
39160    type StablePtr = TerminalXorPtr<'db>;
39161    type Green = TerminalXorGreen<'db>;
39162    fn missing(db: &'db dyn Database) -> Self::Green {
39163        TerminalXorGreen(
39164            GreenNode {
39165                kind: SyntaxKind::TerminalXor,
39166                details: GreenNodeDetails::Node {
39167                    children: [
39168                        Trivia::missing(db).0,
39169                        TokenXor::missing(db).0,
39170                        Trivia::missing(db).0,
39171                    ]
39172                    .into(),
39173                    width: TextWidth::default(),
39174                },
39175            }
39176            .intern(db),
39177        )
39178    }
39179    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39180        let kind = node.kind(db);
39181        assert_eq!(
39182            kind,
39183            SyntaxKind::TerminalXor,
39184            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39185            kind,
39186            SyntaxKind::TerminalXor
39187        );
39188        Self { node }
39189    }
39190    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39191        let kind = node.kind(db);
39192        if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
39193    }
39194    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39195        self.node
39196    }
39197    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39198        TerminalXorPtr(self.node.stable_ptr(db))
39199    }
39200}
39201#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39202pub struct SyntaxFile<'db> {
39203    node: SyntaxNode<'db>,
39204}
39205impl<'db> SyntaxFile<'db> {
39206    pub const INDEX_ITEMS: usize = 0;
39207    pub const INDEX_EOF: usize = 1;
39208    pub fn new_green(
39209        db: &'db dyn Database,
39210        items: ModuleItemListGreen<'db>,
39211        eof: TerminalEndOfFileGreen<'db>,
39212    ) -> SyntaxFileGreen<'db> {
39213        let children = [items.0, eof.0];
39214        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39215        SyntaxFileGreen(
39216            GreenNode {
39217                kind: SyntaxKind::SyntaxFile,
39218                details: GreenNodeDetails::Node { children: children.into(), width },
39219            }
39220            .intern(db),
39221        )
39222    }
39223}
39224impl<'db> SyntaxFile<'db> {
39225    pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
39226        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
39227    }
39228    pub fn eof(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
39229        TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
39230    }
39231}
39232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39233pub struct SyntaxFilePtr<'db>(pub SyntaxStablePtrId<'db>);
39234impl<'db> SyntaxFilePtr<'db> {}
39235impl<'db> TypedStablePtr<'db> for SyntaxFilePtr<'db> {
39236    type SyntaxNode = SyntaxFile<'db>;
39237    fn untyped(self) -> SyntaxStablePtrId<'db> {
39238        self.0
39239    }
39240    fn lookup(&self, db: &'db dyn Database) -> SyntaxFile<'db> {
39241        SyntaxFile::from_syntax_node(db, self.0.lookup(db))
39242    }
39243}
39244impl<'db> From<SyntaxFilePtr<'db>> for SyntaxStablePtrId<'db> {
39245    fn from(ptr: SyntaxFilePtr<'db>) -> Self {
39246        ptr.untyped()
39247    }
39248}
39249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39250pub struct SyntaxFileGreen<'db>(pub GreenId<'db>);
39251impl<'db> TypedSyntaxNode<'db> for SyntaxFile<'db> {
39252    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
39253    type StablePtr = SyntaxFilePtr<'db>;
39254    type Green = SyntaxFileGreen<'db>;
39255    fn missing(db: &'db dyn Database) -> Self::Green {
39256        SyntaxFileGreen(
39257            GreenNode {
39258                kind: SyntaxKind::SyntaxFile,
39259                details: GreenNodeDetails::Node {
39260                    children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
39261                        .into(),
39262                    width: TextWidth::default(),
39263                },
39264            }
39265            .intern(db),
39266        )
39267    }
39268    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39269        let kind = node.kind(db);
39270        assert_eq!(
39271            kind,
39272            SyntaxKind::SyntaxFile,
39273            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39274            kind,
39275            SyntaxKind::SyntaxFile
39276        );
39277        Self { node }
39278    }
39279    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39280        let kind = node.kind(db);
39281        if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
39282    }
39283    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39284        self.node
39285    }
39286    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39287        SyntaxFilePtr(self.node.stable_ptr(db))
39288    }
39289}
39290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39291pub struct TokenEmpty<'db> {
39292    node: SyntaxNode<'db>,
39293}
39294impl<'db> Token<'db> for TokenEmpty<'db> {
39295    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39296        TokenEmptyGreen(
39297            GreenNode { kind: SyntaxKind::TokenEmpty, details: GreenNodeDetails::Token(text) }
39298                .intern(db),
39299        )
39300    }
39301    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39302        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39303    }
39304}
39305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39306pub struct TokenEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39307impl<'db> TypedStablePtr<'db> for TokenEmptyPtr<'db> {
39308    type SyntaxNode = TokenEmpty<'db>;
39309    fn untyped(self) -> SyntaxStablePtrId<'db> {
39310        self.0
39311    }
39312    fn lookup(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39313        TokenEmpty::from_syntax_node(db, self.0.lookup(db))
39314    }
39315}
39316impl<'db> From<TokenEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39317    fn from(ptr: TokenEmptyPtr<'db>) -> Self {
39318        ptr.untyped()
39319    }
39320}
39321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39322pub struct TokenEmptyGreen<'db>(pub GreenId<'db>);
39323impl<'db> TokenEmptyGreen<'db> {
39324    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39325        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39326    }
39327}
39328impl<'db> TypedSyntaxNode<'db> for TokenEmpty<'db> {
39329    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
39330    type StablePtr = TokenEmptyPtr<'db>;
39331    type Green = TokenEmptyGreen<'db>;
39332    fn missing(db: &'db dyn Database) -> Self::Green {
39333        TokenEmptyGreen(
39334            GreenNode {
39335                kind: SyntaxKind::TokenMissing,
39336                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39337            }
39338            .intern(db),
39339        )
39340    }
39341    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39342        match node.green_node(db).details {
39343            GreenNodeDetails::Token(_) => Self { node },
39344            GreenNodeDetails::Node { .. } => {
39345                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
39346            }
39347        }
39348    }
39349    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39350        match node.green_node(db).details {
39351            GreenNodeDetails::Token(_) => Some(Self { node }),
39352            GreenNodeDetails::Node { .. } => None,
39353        }
39354    }
39355    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39356        self.node
39357    }
39358    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39359        TokenEmptyPtr(self.node.stable_ptr(db))
39360    }
39361}
39362#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39363pub struct TerminalEmpty<'db> {
39364    node: SyntaxNode<'db>,
39365}
39366impl<'db> Terminal<'db> for TerminalEmpty<'db> {
39367    const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
39368    type TokenType = TokenEmpty<'db>;
39369    fn new_green(
39370        db: &'db dyn Database,
39371        leading_trivia: TriviaGreen<'db>,
39372        token: <<TerminalEmpty<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39373        trailing_trivia: TriviaGreen<'db>,
39374    ) -> Self::Green {
39375        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39376        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39377        TerminalEmptyGreen(
39378            GreenNode {
39379                kind: SyntaxKind::TerminalEmpty,
39380                details: GreenNodeDetails::Node { children: children.into(), width },
39381            }
39382            .intern(db),
39383        )
39384    }
39385    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39386        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
39387            unreachable!("Expected a node, not a token");
39388        };
39389        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39390    }
39391}
39392impl<'db> TerminalEmpty<'db> {
39393    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39394        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39395    }
39396    pub fn token(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39397        TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
39398    }
39399    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39400        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39401    }
39402}
39403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39404pub struct TerminalEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39405impl<'db> TerminalEmptyPtr<'db> {}
39406impl<'db> TypedStablePtr<'db> for TerminalEmptyPtr<'db> {
39407    type SyntaxNode = TerminalEmpty<'db>;
39408    fn untyped(self) -> SyntaxStablePtrId<'db> {
39409        self.0
39410    }
39411    fn lookup(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
39412        TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
39413    }
39414}
39415impl<'db> From<TerminalEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39416    fn from(ptr: TerminalEmptyPtr<'db>) -> Self {
39417        ptr.untyped()
39418    }
39419}
39420#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39421pub struct TerminalEmptyGreen<'db>(pub GreenId<'db>);
39422impl<'db> TypedSyntaxNode<'db> for TerminalEmpty<'db> {
39423    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
39424    type StablePtr = TerminalEmptyPtr<'db>;
39425    type Green = TerminalEmptyGreen<'db>;
39426    fn missing(db: &'db dyn Database) -> Self::Green {
39427        TerminalEmptyGreen(
39428            GreenNode {
39429                kind: SyntaxKind::TerminalEmpty,
39430                details: GreenNodeDetails::Node {
39431                    children: [
39432                        Trivia::missing(db).0,
39433                        TokenEmpty::missing(db).0,
39434                        Trivia::missing(db).0,
39435                    ]
39436                    .into(),
39437                    width: TextWidth::default(),
39438                },
39439            }
39440            .intern(db),
39441        )
39442    }
39443    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39444        let kind = node.kind(db);
39445        assert_eq!(
39446            kind,
39447            SyntaxKind::TerminalEmpty,
39448            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39449            kind,
39450            SyntaxKind::TerminalEmpty
39451        );
39452        Self { node }
39453    }
39454    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39455        let kind = node.kind(db);
39456        if kind == SyntaxKind::TerminalEmpty {
39457            Some(Self::from_syntax_node(db, node))
39458        } else {
39459            None
39460        }
39461    }
39462    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39463        self.node
39464    }
39465    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39466        TerminalEmptyPtr(self.node.stable_ptr(db))
39467    }
39468}
39469#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39470pub struct TokenSingleLineComment<'db> {
39471    node: SyntaxNode<'db>,
39472}
39473impl<'db> Token<'db> for TokenSingleLineComment<'db> {
39474    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39475        TokenSingleLineCommentGreen(
39476            GreenNode {
39477                kind: SyntaxKind::TokenSingleLineComment,
39478                details: GreenNodeDetails::Token(text),
39479            }
39480            .intern(db),
39481        )
39482    }
39483    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39484        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39485    }
39486}
39487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39488pub struct TokenSingleLineCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39489impl<'db> TypedStablePtr<'db> for TokenSingleLineCommentPtr<'db> {
39490    type SyntaxNode = TokenSingleLineComment<'db>;
39491    fn untyped(self) -> SyntaxStablePtrId<'db> {
39492        self.0
39493    }
39494    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineComment<'db> {
39495        TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
39496    }
39497}
39498impl<'db> From<TokenSingleLineCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39499    fn from(ptr: TokenSingleLineCommentPtr<'db>) -> Self {
39500        ptr.untyped()
39501    }
39502}
39503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39504pub struct TokenSingleLineCommentGreen<'db>(pub GreenId<'db>);
39505impl<'db> TokenSingleLineCommentGreen<'db> {
39506    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39507        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39508    }
39509}
39510impl<'db> TypedSyntaxNode<'db> for TokenSingleLineComment<'db> {
39511    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
39512    type StablePtr = TokenSingleLineCommentPtr<'db>;
39513    type Green = TokenSingleLineCommentGreen<'db>;
39514    fn missing(db: &'db dyn Database) -> Self::Green {
39515        TokenSingleLineCommentGreen(
39516            GreenNode {
39517                kind: SyntaxKind::TokenMissing,
39518                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39519            }
39520            .intern(db),
39521        )
39522    }
39523    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39524        match node.green_node(db).details {
39525            GreenNodeDetails::Token(_) => Self { node },
39526            GreenNodeDetails::Node { .. } => panic!(
39527                "Expected a token {:?}, not an internal node",
39528                SyntaxKind::TokenSingleLineComment
39529            ),
39530        }
39531    }
39532    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39533        match node.green_node(db).details {
39534            GreenNodeDetails::Token(_) => Some(Self { node }),
39535            GreenNodeDetails::Node { .. } => None,
39536        }
39537    }
39538    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39539        self.node
39540    }
39541    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39542        TokenSingleLineCommentPtr(self.node.stable_ptr(db))
39543    }
39544}
39545#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39546pub struct TokenSingleLineInnerComment<'db> {
39547    node: SyntaxNode<'db>,
39548}
39549impl<'db> Token<'db> for TokenSingleLineInnerComment<'db> {
39550    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39551        TokenSingleLineInnerCommentGreen(
39552            GreenNode {
39553                kind: SyntaxKind::TokenSingleLineInnerComment,
39554                details: GreenNodeDetails::Token(text),
39555            }
39556            .intern(db),
39557        )
39558    }
39559    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39560        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39561    }
39562}
39563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39564pub struct TokenSingleLineInnerCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39565impl<'db> TypedStablePtr<'db> for TokenSingleLineInnerCommentPtr<'db> {
39566    type SyntaxNode = TokenSingleLineInnerComment<'db>;
39567    fn untyped(self) -> SyntaxStablePtrId<'db> {
39568        self.0
39569    }
39570    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineInnerComment<'db> {
39571        TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
39572    }
39573}
39574impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39575    fn from(ptr: TokenSingleLineInnerCommentPtr<'db>) -> Self {
39576        ptr.untyped()
39577    }
39578}
39579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39580pub struct TokenSingleLineInnerCommentGreen<'db>(pub GreenId<'db>);
39581impl<'db> TokenSingleLineInnerCommentGreen<'db> {
39582    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39583        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39584    }
39585}
39586impl<'db> TypedSyntaxNode<'db> for TokenSingleLineInnerComment<'db> {
39587    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
39588    type StablePtr = TokenSingleLineInnerCommentPtr<'db>;
39589    type Green = TokenSingleLineInnerCommentGreen<'db>;
39590    fn missing(db: &'db dyn Database) -> Self::Green {
39591        TokenSingleLineInnerCommentGreen(
39592            GreenNode {
39593                kind: SyntaxKind::TokenMissing,
39594                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39595            }
39596            .intern(db),
39597        )
39598    }
39599    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39600        match node.green_node(db).details {
39601            GreenNodeDetails::Token(_) => Self { node },
39602            GreenNodeDetails::Node { .. } => panic!(
39603                "Expected a token {:?}, not an internal node",
39604                SyntaxKind::TokenSingleLineInnerComment
39605            ),
39606        }
39607    }
39608    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39609        match node.green_node(db).details {
39610            GreenNodeDetails::Token(_) => Some(Self { node }),
39611            GreenNodeDetails::Node { .. } => None,
39612        }
39613    }
39614    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39615        self.node
39616    }
39617    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39618        TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
39619    }
39620}
39621#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39622pub struct TokenSingleLineDocComment<'db> {
39623    node: SyntaxNode<'db>,
39624}
39625impl<'db> Token<'db> for TokenSingleLineDocComment<'db> {
39626    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39627        TokenSingleLineDocCommentGreen(
39628            GreenNode {
39629                kind: SyntaxKind::TokenSingleLineDocComment,
39630                details: GreenNodeDetails::Token(text),
39631            }
39632            .intern(db),
39633        )
39634    }
39635    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39636        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39637    }
39638}
39639#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39640pub struct TokenSingleLineDocCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39641impl<'db> TypedStablePtr<'db> for TokenSingleLineDocCommentPtr<'db> {
39642    type SyntaxNode = TokenSingleLineDocComment<'db>;
39643    fn untyped(self) -> SyntaxStablePtrId<'db> {
39644        self.0
39645    }
39646    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineDocComment<'db> {
39647        TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
39648    }
39649}
39650impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39651    fn from(ptr: TokenSingleLineDocCommentPtr<'db>) -> Self {
39652        ptr.untyped()
39653    }
39654}
39655#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39656pub struct TokenSingleLineDocCommentGreen<'db>(pub GreenId<'db>);
39657impl<'db> TokenSingleLineDocCommentGreen<'db> {
39658    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39659        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39660    }
39661}
39662impl<'db> TypedSyntaxNode<'db> for TokenSingleLineDocComment<'db> {
39663    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
39664    type StablePtr = TokenSingleLineDocCommentPtr<'db>;
39665    type Green = TokenSingleLineDocCommentGreen<'db>;
39666    fn missing(db: &'db dyn Database) -> Self::Green {
39667        TokenSingleLineDocCommentGreen(
39668            GreenNode {
39669                kind: SyntaxKind::TokenMissing,
39670                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39671            }
39672            .intern(db),
39673        )
39674    }
39675    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39676        match node.green_node(db).details {
39677            GreenNodeDetails::Token(_) => Self { node },
39678            GreenNodeDetails::Node { .. } => panic!(
39679                "Expected a token {:?}, not an internal node",
39680                SyntaxKind::TokenSingleLineDocComment
39681            ),
39682        }
39683    }
39684    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39685        match node.green_node(db).details {
39686            GreenNodeDetails::Token(_) => Some(Self { node }),
39687            GreenNodeDetails::Node { .. } => None,
39688        }
39689    }
39690    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39691        self.node
39692    }
39693    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39694        TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
39695    }
39696}
39697#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39698pub struct TokenWhitespace<'db> {
39699    node: SyntaxNode<'db>,
39700}
39701impl<'db> Token<'db> for TokenWhitespace<'db> {
39702    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39703        TokenWhitespaceGreen(
39704            GreenNode { kind: SyntaxKind::TokenWhitespace, details: GreenNodeDetails::Token(text) }
39705                .intern(db),
39706        )
39707    }
39708    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39709        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39710    }
39711}
39712#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39713pub struct TokenWhitespacePtr<'db>(pub SyntaxStablePtrId<'db>);
39714impl<'db> TypedStablePtr<'db> for TokenWhitespacePtr<'db> {
39715    type SyntaxNode = TokenWhitespace<'db>;
39716    fn untyped(self) -> SyntaxStablePtrId<'db> {
39717        self.0
39718    }
39719    fn lookup(&self, db: &'db dyn Database) -> TokenWhitespace<'db> {
39720        TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
39721    }
39722}
39723impl<'db> From<TokenWhitespacePtr<'db>> for SyntaxStablePtrId<'db> {
39724    fn from(ptr: TokenWhitespacePtr<'db>) -> Self {
39725        ptr.untyped()
39726    }
39727}
39728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39729pub struct TokenWhitespaceGreen<'db>(pub GreenId<'db>);
39730impl<'db> TokenWhitespaceGreen<'db> {
39731    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39732        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39733    }
39734}
39735impl<'db> TypedSyntaxNode<'db> for TokenWhitespace<'db> {
39736    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
39737    type StablePtr = TokenWhitespacePtr<'db>;
39738    type Green = TokenWhitespaceGreen<'db>;
39739    fn missing(db: &'db dyn Database) -> Self::Green {
39740        TokenWhitespaceGreen(
39741            GreenNode {
39742                kind: SyntaxKind::TokenMissing,
39743                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39744            }
39745            .intern(db),
39746        )
39747    }
39748    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39749        match node.green_node(db).details {
39750            GreenNodeDetails::Token(_) => Self { node },
39751            GreenNodeDetails::Node { .. } => {
39752                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
39753            }
39754        }
39755    }
39756    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39757        match node.green_node(db).details {
39758            GreenNodeDetails::Token(_) => Some(Self { node }),
39759            GreenNodeDetails::Node { .. } => None,
39760        }
39761    }
39762    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39763        self.node
39764    }
39765    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39766        TokenWhitespacePtr(self.node.stable_ptr(db))
39767    }
39768}
39769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39770pub struct TokenNewline<'db> {
39771    node: SyntaxNode<'db>,
39772}
39773impl<'db> Token<'db> for TokenNewline<'db> {
39774    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39775        TokenNewlineGreen(
39776            GreenNode { kind: SyntaxKind::TokenNewline, details: GreenNodeDetails::Token(text) }
39777                .intern(db),
39778        )
39779    }
39780    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39781        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39782    }
39783}
39784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39785pub struct TokenNewlinePtr<'db>(pub SyntaxStablePtrId<'db>);
39786impl<'db> TypedStablePtr<'db> for TokenNewlinePtr<'db> {
39787    type SyntaxNode = TokenNewline<'db>;
39788    fn untyped(self) -> SyntaxStablePtrId<'db> {
39789        self.0
39790    }
39791    fn lookup(&self, db: &'db dyn Database) -> TokenNewline<'db> {
39792        TokenNewline::from_syntax_node(db, self.0.lookup(db))
39793    }
39794}
39795impl<'db> From<TokenNewlinePtr<'db>> for SyntaxStablePtrId<'db> {
39796    fn from(ptr: TokenNewlinePtr<'db>) -> Self {
39797        ptr.untyped()
39798    }
39799}
39800#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39801pub struct TokenNewlineGreen<'db>(pub GreenId<'db>);
39802impl<'db> TokenNewlineGreen<'db> {
39803    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39804        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39805    }
39806}
39807impl<'db> TypedSyntaxNode<'db> for TokenNewline<'db> {
39808    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
39809    type StablePtr = TokenNewlinePtr<'db>;
39810    type Green = TokenNewlineGreen<'db>;
39811    fn missing(db: &'db dyn Database) -> Self::Green {
39812        TokenNewlineGreen(
39813            GreenNode {
39814                kind: SyntaxKind::TokenMissing,
39815                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39816            }
39817            .intern(db),
39818        )
39819    }
39820    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39821        match node.green_node(db).details {
39822            GreenNodeDetails::Token(_) => Self { node },
39823            GreenNodeDetails::Node { .. } => {
39824                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
39825            }
39826        }
39827    }
39828    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39829        match node.green_node(db).details {
39830            GreenNodeDetails::Token(_) => Some(Self { node }),
39831            GreenNodeDetails::Node { .. } => None,
39832        }
39833    }
39834    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39835        self.node
39836    }
39837    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39838        TokenNewlinePtr(self.node.stable_ptr(db))
39839    }
39840}
39841#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39842pub struct TokenMissing<'db> {
39843    node: SyntaxNode<'db>,
39844}
39845impl<'db> Token<'db> for TokenMissing<'db> {
39846    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39847        TokenMissingGreen(
39848            GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token(text) }
39849                .intern(db),
39850        )
39851    }
39852    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39853        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39854    }
39855}
39856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39857pub struct TokenMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
39858impl<'db> TypedStablePtr<'db> for TokenMissingPtr<'db> {
39859    type SyntaxNode = TokenMissing<'db>;
39860    fn untyped(self) -> SyntaxStablePtrId<'db> {
39861        self.0
39862    }
39863    fn lookup(&self, db: &'db dyn Database) -> TokenMissing<'db> {
39864        TokenMissing::from_syntax_node(db, self.0.lookup(db))
39865    }
39866}
39867impl<'db> From<TokenMissingPtr<'db>> for SyntaxStablePtrId<'db> {
39868    fn from(ptr: TokenMissingPtr<'db>) -> Self {
39869        ptr.untyped()
39870    }
39871}
39872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39873pub struct TokenMissingGreen<'db>(pub GreenId<'db>);
39874impl<'db> TokenMissingGreen<'db> {
39875    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39876        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39877    }
39878}
39879impl<'db> TypedSyntaxNode<'db> for TokenMissing<'db> {
39880    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
39881    type StablePtr = TokenMissingPtr<'db>;
39882    type Green = TokenMissingGreen<'db>;
39883    fn missing(db: &'db dyn Database) -> Self::Green {
39884        TokenMissingGreen(
39885            GreenNode {
39886                kind: SyntaxKind::TokenMissing,
39887                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39888            }
39889            .intern(db),
39890        )
39891    }
39892    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39893        match node.green_node(db).details {
39894            GreenNodeDetails::Token(_) => Self { node },
39895            GreenNodeDetails::Node { .. } => {
39896                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
39897            }
39898        }
39899    }
39900    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39901        match node.green_node(db).details {
39902            GreenNodeDetails::Token(_) => Some(Self { node }),
39903            GreenNodeDetails::Node { .. } => None,
39904        }
39905    }
39906    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39907        self.node
39908    }
39909    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39910        TokenMissingPtr(self.node.stable_ptr(db))
39911    }
39912}
39913#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39914pub struct TokenSkipped<'db> {
39915    node: SyntaxNode<'db>,
39916}
39917impl<'db> Token<'db> for TokenSkipped<'db> {
39918    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39919        TokenSkippedGreen(
39920            GreenNode { kind: SyntaxKind::TokenSkipped, details: GreenNodeDetails::Token(text) }
39921                .intern(db),
39922        )
39923    }
39924    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39925        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39926    }
39927}
39928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39929pub struct TokenSkippedPtr<'db>(pub SyntaxStablePtrId<'db>);
39930impl<'db> TypedStablePtr<'db> for TokenSkippedPtr<'db> {
39931    type SyntaxNode = TokenSkipped<'db>;
39932    fn untyped(self) -> SyntaxStablePtrId<'db> {
39933        self.0
39934    }
39935    fn lookup(&self, db: &'db dyn Database) -> TokenSkipped<'db> {
39936        TokenSkipped::from_syntax_node(db, self.0.lookup(db))
39937    }
39938}
39939impl<'db> From<TokenSkippedPtr<'db>> for SyntaxStablePtrId<'db> {
39940    fn from(ptr: TokenSkippedPtr<'db>) -> Self {
39941        ptr.untyped()
39942    }
39943}
39944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39945pub struct TokenSkippedGreen<'db>(pub GreenId<'db>);
39946impl<'db> TokenSkippedGreen<'db> {
39947    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39948        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39949    }
39950}
39951impl<'db> TypedSyntaxNode<'db> for TokenSkipped<'db> {
39952    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
39953    type StablePtr = TokenSkippedPtr<'db>;
39954    type Green = TokenSkippedGreen<'db>;
39955    fn missing(db: &'db dyn Database) -> Self::Green {
39956        TokenSkippedGreen(
39957            GreenNode {
39958                kind: SyntaxKind::TokenMissing,
39959                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39960            }
39961            .intern(db),
39962        )
39963    }
39964    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39965        match node.green_node(db).details {
39966            GreenNodeDetails::Token(_) => Self { node },
39967            GreenNodeDetails::Node { .. } => {
39968                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
39969            }
39970        }
39971    }
39972    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39973        match node.green_node(db).details {
39974            GreenNodeDetails::Token(_) => Some(Self { node }),
39975            GreenNodeDetails::Node { .. } => None,
39976        }
39977    }
39978    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39979        self.node
39980    }
39981    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39982        TokenSkippedPtr(self.node.stable_ptr(db))
39983    }
39984}
39985#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39986pub enum TokenNode<'db> {
39987    TerminalIdentifier(TerminalIdentifier<'db>),
39988    TerminalLiteralNumber(TerminalLiteralNumber<'db>),
39989    TerminalShortString(TerminalShortString<'db>),
39990    TerminalString(TerminalString<'db>),
39991    TerminalAs(TerminalAs<'db>),
39992    TerminalConst(TerminalConst<'db>),
39993    TerminalElse(TerminalElse<'db>),
39994    TerminalEnum(TerminalEnum<'db>),
39995    TerminalExtern(TerminalExtern<'db>),
39996    TerminalFalse(TerminalFalse<'db>),
39997    TerminalFunction(TerminalFunction<'db>),
39998    TerminalIf(TerminalIf<'db>),
39999    TerminalWhile(TerminalWhile<'db>),
40000    TerminalFor(TerminalFor<'db>),
40001    TerminalLoop(TerminalLoop<'db>),
40002    TerminalImpl(TerminalImpl<'db>),
40003    TerminalImplicits(TerminalImplicits<'db>),
40004    TerminalLet(TerminalLet<'db>),
40005    TerminalMacro(TerminalMacro<'db>),
40006    TerminalMatch(TerminalMatch<'db>),
40007    TerminalModule(TerminalModule<'db>),
40008    TerminalMut(TerminalMut<'db>),
40009    TerminalNoPanic(TerminalNoPanic<'db>),
40010    TerminalOf(TerminalOf<'db>),
40011    TerminalRef(TerminalRef<'db>),
40012    TerminalContinue(TerminalContinue<'db>),
40013    TerminalReturn(TerminalReturn<'db>),
40014    TerminalBreak(TerminalBreak<'db>),
40015    TerminalStruct(TerminalStruct<'db>),
40016    TerminalTrait(TerminalTrait<'db>),
40017    TerminalTrue(TerminalTrue<'db>),
40018    TerminalType(TerminalType<'db>),
40019    TerminalUse(TerminalUse<'db>),
40020    TerminalPub(TerminalPub<'db>),
40021    TerminalAnd(TerminalAnd<'db>),
40022    TerminalAndAnd(TerminalAndAnd<'db>),
40023    TerminalArrow(TerminalArrow<'db>),
40024    TerminalAt(TerminalAt<'db>),
40025    TerminalBadCharacters(TerminalBadCharacters<'db>),
40026    TerminalColon(TerminalColon<'db>),
40027    TerminalColonColon(TerminalColonColon<'db>),
40028    TerminalComma(TerminalComma<'db>),
40029    TerminalDiv(TerminalDiv<'db>),
40030    TerminalDivEq(TerminalDivEq<'db>),
40031    TerminalDollar(TerminalDollar<'db>),
40032    TerminalDot(TerminalDot<'db>),
40033    TerminalDotDot(TerminalDotDot<'db>),
40034    TerminalDotDotEq(TerminalDotDotEq<'db>),
40035    TerminalEndOfFile(TerminalEndOfFile<'db>),
40036    TerminalEq(TerminalEq<'db>),
40037    TerminalEqEq(TerminalEqEq<'db>),
40038    TerminalGE(TerminalGE<'db>),
40039    TerminalGT(TerminalGT<'db>),
40040    TerminalHash(TerminalHash<'db>),
40041    TerminalLBrace(TerminalLBrace<'db>),
40042    TerminalLBrack(TerminalLBrack<'db>),
40043    TerminalLE(TerminalLE<'db>),
40044    TerminalLParen(TerminalLParen<'db>),
40045    TerminalLT(TerminalLT<'db>),
40046    TerminalMatchArrow(TerminalMatchArrow<'db>),
40047    TerminalMinus(TerminalMinus<'db>),
40048    TerminalMinusEq(TerminalMinusEq<'db>),
40049    TerminalMod(TerminalMod<'db>),
40050    TerminalModEq(TerminalModEq<'db>),
40051    TerminalMul(TerminalMul<'db>),
40052    TerminalMulEq(TerminalMulEq<'db>),
40053    TerminalNeq(TerminalNeq<'db>),
40054    TerminalNot(TerminalNot<'db>),
40055    TerminalBitNot(TerminalBitNot<'db>),
40056    TerminalOr(TerminalOr<'db>),
40057    TerminalOrOr(TerminalOrOr<'db>),
40058    TerminalPlus(TerminalPlus<'db>),
40059    TerminalPlusEq(TerminalPlusEq<'db>),
40060    TerminalQuestionMark(TerminalQuestionMark<'db>),
40061    TerminalRBrace(TerminalRBrace<'db>),
40062    TerminalRBrack(TerminalRBrack<'db>),
40063    TerminalRParen(TerminalRParen<'db>),
40064    TerminalSemicolon(TerminalSemicolon<'db>),
40065    TerminalUnderscore(TerminalUnderscore<'db>),
40066    TerminalXor(TerminalXor<'db>),
40067    TerminalEmpty(TerminalEmpty<'db>),
40068}
40069#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40070pub struct TokenNodePtr<'db>(pub SyntaxStablePtrId<'db>);
40071impl<'db> TypedStablePtr<'db> for TokenNodePtr<'db> {
40072    type SyntaxNode = TokenNode<'db>;
40073    fn untyped(self) -> SyntaxStablePtrId<'db> {
40074        self.0
40075    }
40076    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
40077        TokenNode::from_syntax_node(db, self.0.lookup(db))
40078    }
40079}
40080impl<'db> From<TokenNodePtr<'db>> for SyntaxStablePtrId<'db> {
40081    fn from(ptr: TokenNodePtr<'db>) -> Self {
40082        ptr.untyped()
40083    }
40084}
40085impl<'db> From<TerminalIdentifierPtr<'db>> for TokenNodePtr<'db> {
40086    fn from(value: TerminalIdentifierPtr<'db>) -> Self {
40087        Self(value.0)
40088    }
40089}
40090impl<'db> From<TerminalLiteralNumberPtr<'db>> for TokenNodePtr<'db> {
40091    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
40092        Self(value.0)
40093    }
40094}
40095impl<'db> From<TerminalShortStringPtr<'db>> for TokenNodePtr<'db> {
40096    fn from(value: TerminalShortStringPtr<'db>) -> Self {
40097        Self(value.0)
40098    }
40099}
40100impl<'db> From<TerminalStringPtr<'db>> for TokenNodePtr<'db> {
40101    fn from(value: TerminalStringPtr<'db>) -> Self {
40102        Self(value.0)
40103    }
40104}
40105impl<'db> From<TerminalAsPtr<'db>> for TokenNodePtr<'db> {
40106    fn from(value: TerminalAsPtr<'db>) -> Self {
40107        Self(value.0)
40108    }
40109}
40110impl<'db> From<TerminalConstPtr<'db>> for TokenNodePtr<'db> {
40111    fn from(value: TerminalConstPtr<'db>) -> Self {
40112        Self(value.0)
40113    }
40114}
40115impl<'db> From<TerminalElsePtr<'db>> for TokenNodePtr<'db> {
40116    fn from(value: TerminalElsePtr<'db>) -> Self {
40117        Self(value.0)
40118    }
40119}
40120impl<'db> From<TerminalEnumPtr<'db>> for TokenNodePtr<'db> {
40121    fn from(value: TerminalEnumPtr<'db>) -> Self {
40122        Self(value.0)
40123    }
40124}
40125impl<'db> From<TerminalExternPtr<'db>> for TokenNodePtr<'db> {
40126    fn from(value: TerminalExternPtr<'db>) -> Self {
40127        Self(value.0)
40128    }
40129}
40130impl<'db> From<TerminalFalsePtr<'db>> for TokenNodePtr<'db> {
40131    fn from(value: TerminalFalsePtr<'db>) -> Self {
40132        Self(value.0)
40133    }
40134}
40135impl<'db> From<TerminalFunctionPtr<'db>> for TokenNodePtr<'db> {
40136    fn from(value: TerminalFunctionPtr<'db>) -> Self {
40137        Self(value.0)
40138    }
40139}
40140impl<'db> From<TerminalIfPtr<'db>> for TokenNodePtr<'db> {
40141    fn from(value: TerminalIfPtr<'db>) -> Self {
40142        Self(value.0)
40143    }
40144}
40145impl<'db> From<TerminalWhilePtr<'db>> for TokenNodePtr<'db> {
40146    fn from(value: TerminalWhilePtr<'db>) -> Self {
40147        Self(value.0)
40148    }
40149}
40150impl<'db> From<TerminalForPtr<'db>> for TokenNodePtr<'db> {
40151    fn from(value: TerminalForPtr<'db>) -> Self {
40152        Self(value.0)
40153    }
40154}
40155impl<'db> From<TerminalLoopPtr<'db>> for TokenNodePtr<'db> {
40156    fn from(value: TerminalLoopPtr<'db>) -> Self {
40157        Self(value.0)
40158    }
40159}
40160impl<'db> From<TerminalImplPtr<'db>> for TokenNodePtr<'db> {
40161    fn from(value: TerminalImplPtr<'db>) -> Self {
40162        Self(value.0)
40163    }
40164}
40165impl<'db> From<TerminalImplicitsPtr<'db>> for TokenNodePtr<'db> {
40166    fn from(value: TerminalImplicitsPtr<'db>) -> Self {
40167        Self(value.0)
40168    }
40169}
40170impl<'db> From<TerminalLetPtr<'db>> for TokenNodePtr<'db> {
40171    fn from(value: TerminalLetPtr<'db>) -> Self {
40172        Self(value.0)
40173    }
40174}
40175impl<'db> From<TerminalMacroPtr<'db>> for TokenNodePtr<'db> {
40176    fn from(value: TerminalMacroPtr<'db>) -> Self {
40177        Self(value.0)
40178    }
40179}
40180impl<'db> From<TerminalMatchPtr<'db>> for TokenNodePtr<'db> {
40181    fn from(value: TerminalMatchPtr<'db>) -> Self {
40182        Self(value.0)
40183    }
40184}
40185impl<'db> From<TerminalModulePtr<'db>> for TokenNodePtr<'db> {
40186    fn from(value: TerminalModulePtr<'db>) -> Self {
40187        Self(value.0)
40188    }
40189}
40190impl<'db> From<TerminalMutPtr<'db>> for TokenNodePtr<'db> {
40191    fn from(value: TerminalMutPtr<'db>) -> Self {
40192        Self(value.0)
40193    }
40194}
40195impl<'db> From<TerminalNoPanicPtr<'db>> for TokenNodePtr<'db> {
40196    fn from(value: TerminalNoPanicPtr<'db>) -> Self {
40197        Self(value.0)
40198    }
40199}
40200impl<'db> From<TerminalOfPtr<'db>> for TokenNodePtr<'db> {
40201    fn from(value: TerminalOfPtr<'db>) -> Self {
40202        Self(value.0)
40203    }
40204}
40205impl<'db> From<TerminalRefPtr<'db>> for TokenNodePtr<'db> {
40206    fn from(value: TerminalRefPtr<'db>) -> Self {
40207        Self(value.0)
40208    }
40209}
40210impl<'db> From<TerminalContinuePtr<'db>> for TokenNodePtr<'db> {
40211    fn from(value: TerminalContinuePtr<'db>) -> Self {
40212        Self(value.0)
40213    }
40214}
40215impl<'db> From<TerminalReturnPtr<'db>> for TokenNodePtr<'db> {
40216    fn from(value: TerminalReturnPtr<'db>) -> Self {
40217        Self(value.0)
40218    }
40219}
40220impl<'db> From<TerminalBreakPtr<'db>> for TokenNodePtr<'db> {
40221    fn from(value: TerminalBreakPtr<'db>) -> Self {
40222        Self(value.0)
40223    }
40224}
40225impl<'db> From<TerminalStructPtr<'db>> for TokenNodePtr<'db> {
40226    fn from(value: TerminalStructPtr<'db>) -> Self {
40227        Self(value.0)
40228    }
40229}
40230impl<'db> From<TerminalTraitPtr<'db>> for TokenNodePtr<'db> {
40231    fn from(value: TerminalTraitPtr<'db>) -> Self {
40232        Self(value.0)
40233    }
40234}
40235impl<'db> From<TerminalTruePtr<'db>> for TokenNodePtr<'db> {
40236    fn from(value: TerminalTruePtr<'db>) -> Self {
40237        Self(value.0)
40238    }
40239}
40240impl<'db> From<TerminalTypePtr<'db>> for TokenNodePtr<'db> {
40241    fn from(value: TerminalTypePtr<'db>) -> Self {
40242        Self(value.0)
40243    }
40244}
40245impl<'db> From<TerminalUsePtr<'db>> for TokenNodePtr<'db> {
40246    fn from(value: TerminalUsePtr<'db>) -> Self {
40247        Self(value.0)
40248    }
40249}
40250impl<'db> From<TerminalPubPtr<'db>> for TokenNodePtr<'db> {
40251    fn from(value: TerminalPubPtr<'db>) -> Self {
40252        Self(value.0)
40253    }
40254}
40255impl<'db> From<TerminalAndPtr<'db>> for TokenNodePtr<'db> {
40256    fn from(value: TerminalAndPtr<'db>) -> Self {
40257        Self(value.0)
40258    }
40259}
40260impl<'db> From<TerminalAndAndPtr<'db>> for TokenNodePtr<'db> {
40261    fn from(value: TerminalAndAndPtr<'db>) -> Self {
40262        Self(value.0)
40263    }
40264}
40265impl<'db> From<TerminalArrowPtr<'db>> for TokenNodePtr<'db> {
40266    fn from(value: TerminalArrowPtr<'db>) -> Self {
40267        Self(value.0)
40268    }
40269}
40270impl<'db> From<TerminalAtPtr<'db>> for TokenNodePtr<'db> {
40271    fn from(value: TerminalAtPtr<'db>) -> Self {
40272        Self(value.0)
40273    }
40274}
40275impl<'db> From<TerminalBadCharactersPtr<'db>> for TokenNodePtr<'db> {
40276    fn from(value: TerminalBadCharactersPtr<'db>) -> Self {
40277        Self(value.0)
40278    }
40279}
40280impl<'db> From<TerminalColonPtr<'db>> for TokenNodePtr<'db> {
40281    fn from(value: TerminalColonPtr<'db>) -> Self {
40282        Self(value.0)
40283    }
40284}
40285impl<'db> From<TerminalColonColonPtr<'db>> for TokenNodePtr<'db> {
40286    fn from(value: TerminalColonColonPtr<'db>) -> Self {
40287        Self(value.0)
40288    }
40289}
40290impl<'db> From<TerminalCommaPtr<'db>> for TokenNodePtr<'db> {
40291    fn from(value: TerminalCommaPtr<'db>) -> Self {
40292        Self(value.0)
40293    }
40294}
40295impl<'db> From<TerminalDivPtr<'db>> for TokenNodePtr<'db> {
40296    fn from(value: TerminalDivPtr<'db>) -> Self {
40297        Self(value.0)
40298    }
40299}
40300impl<'db> From<TerminalDivEqPtr<'db>> for TokenNodePtr<'db> {
40301    fn from(value: TerminalDivEqPtr<'db>) -> Self {
40302        Self(value.0)
40303    }
40304}
40305impl<'db> From<TerminalDollarPtr<'db>> for TokenNodePtr<'db> {
40306    fn from(value: TerminalDollarPtr<'db>) -> Self {
40307        Self(value.0)
40308    }
40309}
40310impl<'db> From<TerminalDotPtr<'db>> for TokenNodePtr<'db> {
40311    fn from(value: TerminalDotPtr<'db>) -> Self {
40312        Self(value.0)
40313    }
40314}
40315impl<'db> From<TerminalDotDotPtr<'db>> for TokenNodePtr<'db> {
40316    fn from(value: TerminalDotDotPtr<'db>) -> Self {
40317        Self(value.0)
40318    }
40319}
40320impl<'db> From<TerminalDotDotEqPtr<'db>> for TokenNodePtr<'db> {
40321    fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
40322        Self(value.0)
40323    }
40324}
40325impl<'db> From<TerminalEndOfFilePtr<'db>> for TokenNodePtr<'db> {
40326    fn from(value: TerminalEndOfFilePtr<'db>) -> Self {
40327        Self(value.0)
40328    }
40329}
40330impl<'db> From<TerminalEqPtr<'db>> for TokenNodePtr<'db> {
40331    fn from(value: TerminalEqPtr<'db>) -> Self {
40332        Self(value.0)
40333    }
40334}
40335impl<'db> From<TerminalEqEqPtr<'db>> for TokenNodePtr<'db> {
40336    fn from(value: TerminalEqEqPtr<'db>) -> Self {
40337        Self(value.0)
40338    }
40339}
40340impl<'db> From<TerminalGEPtr<'db>> for TokenNodePtr<'db> {
40341    fn from(value: TerminalGEPtr<'db>) -> Self {
40342        Self(value.0)
40343    }
40344}
40345impl<'db> From<TerminalGTPtr<'db>> for TokenNodePtr<'db> {
40346    fn from(value: TerminalGTPtr<'db>) -> Self {
40347        Self(value.0)
40348    }
40349}
40350impl<'db> From<TerminalHashPtr<'db>> for TokenNodePtr<'db> {
40351    fn from(value: TerminalHashPtr<'db>) -> Self {
40352        Self(value.0)
40353    }
40354}
40355impl<'db> From<TerminalLBracePtr<'db>> for TokenNodePtr<'db> {
40356    fn from(value: TerminalLBracePtr<'db>) -> Self {
40357        Self(value.0)
40358    }
40359}
40360impl<'db> From<TerminalLBrackPtr<'db>> for TokenNodePtr<'db> {
40361    fn from(value: TerminalLBrackPtr<'db>) -> Self {
40362        Self(value.0)
40363    }
40364}
40365impl<'db> From<TerminalLEPtr<'db>> for TokenNodePtr<'db> {
40366    fn from(value: TerminalLEPtr<'db>) -> Self {
40367        Self(value.0)
40368    }
40369}
40370impl<'db> From<TerminalLParenPtr<'db>> for TokenNodePtr<'db> {
40371    fn from(value: TerminalLParenPtr<'db>) -> Self {
40372        Self(value.0)
40373    }
40374}
40375impl<'db> From<TerminalLTPtr<'db>> for TokenNodePtr<'db> {
40376    fn from(value: TerminalLTPtr<'db>) -> Self {
40377        Self(value.0)
40378    }
40379}
40380impl<'db> From<TerminalMatchArrowPtr<'db>> for TokenNodePtr<'db> {
40381    fn from(value: TerminalMatchArrowPtr<'db>) -> Self {
40382        Self(value.0)
40383    }
40384}
40385impl<'db> From<TerminalMinusPtr<'db>> for TokenNodePtr<'db> {
40386    fn from(value: TerminalMinusPtr<'db>) -> Self {
40387        Self(value.0)
40388    }
40389}
40390impl<'db> From<TerminalMinusEqPtr<'db>> for TokenNodePtr<'db> {
40391    fn from(value: TerminalMinusEqPtr<'db>) -> Self {
40392        Self(value.0)
40393    }
40394}
40395impl<'db> From<TerminalModPtr<'db>> for TokenNodePtr<'db> {
40396    fn from(value: TerminalModPtr<'db>) -> Self {
40397        Self(value.0)
40398    }
40399}
40400impl<'db> From<TerminalModEqPtr<'db>> for TokenNodePtr<'db> {
40401    fn from(value: TerminalModEqPtr<'db>) -> Self {
40402        Self(value.0)
40403    }
40404}
40405impl<'db> From<TerminalMulPtr<'db>> for TokenNodePtr<'db> {
40406    fn from(value: TerminalMulPtr<'db>) -> Self {
40407        Self(value.0)
40408    }
40409}
40410impl<'db> From<TerminalMulEqPtr<'db>> for TokenNodePtr<'db> {
40411    fn from(value: TerminalMulEqPtr<'db>) -> Self {
40412        Self(value.0)
40413    }
40414}
40415impl<'db> From<TerminalNeqPtr<'db>> for TokenNodePtr<'db> {
40416    fn from(value: TerminalNeqPtr<'db>) -> Self {
40417        Self(value.0)
40418    }
40419}
40420impl<'db> From<TerminalNotPtr<'db>> for TokenNodePtr<'db> {
40421    fn from(value: TerminalNotPtr<'db>) -> Self {
40422        Self(value.0)
40423    }
40424}
40425impl<'db> From<TerminalBitNotPtr<'db>> for TokenNodePtr<'db> {
40426    fn from(value: TerminalBitNotPtr<'db>) -> Self {
40427        Self(value.0)
40428    }
40429}
40430impl<'db> From<TerminalOrPtr<'db>> for TokenNodePtr<'db> {
40431    fn from(value: TerminalOrPtr<'db>) -> Self {
40432        Self(value.0)
40433    }
40434}
40435impl<'db> From<TerminalOrOrPtr<'db>> for TokenNodePtr<'db> {
40436    fn from(value: TerminalOrOrPtr<'db>) -> Self {
40437        Self(value.0)
40438    }
40439}
40440impl<'db> From<TerminalPlusPtr<'db>> for TokenNodePtr<'db> {
40441    fn from(value: TerminalPlusPtr<'db>) -> Self {
40442        Self(value.0)
40443    }
40444}
40445impl<'db> From<TerminalPlusEqPtr<'db>> for TokenNodePtr<'db> {
40446    fn from(value: TerminalPlusEqPtr<'db>) -> Self {
40447        Self(value.0)
40448    }
40449}
40450impl<'db> From<TerminalQuestionMarkPtr<'db>> for TokenNodePtr<'db> {
40451    fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
40452        Self(value.0)
40453    }
40454}
40455impl<'db> From<TerminalRBracePtr<'db>> for TokenNodePtr<'db> {
40456    fn from(value: TerminalRBracePtr<'db>) -> Self {
40457        Self(value.0)
40458    }
40459}
40460impl<'db> From<TerminalRBrackPtr<'db>> for TokenNodePtr<'db> {
40461    fn from(value: TerminalRBrackPtr<'db>) -> Self {
40462        Self(value.0)
40463    }
40464}
40465impl<'db> From<TerminalRParenPtr<'db>> for TokenNodePtr<'db> {
40466    fn from(value: TerminalRParenPtr<'db>) -> Self {
40467        Self(value.0)
40468    }
40469}
40470impl<'db> From<TerminalSemicolonPtr<'db>> for TokenNodePtr<'db> {
40471    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
40472        Self(value.0)
40473    }
40474}
40475impl<'db> From<TerminalUnderscorePtr<'db>> for TokenNodePtr<'db> {
40476    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
40477        Self(value.0)
40478    }
40479}
40480impl<'db> From<TerminalXorPtr<'db>> for TokenNodePtr<'db> {
40481    fn from(value: TerminalXorPtr<'db>) -> Self {
40482        Self(value.0)
40483    }
40484}
40485impl<'db> From<TerminalEmptyPtr<'db>> for TokenNodePtr<'db> {
40486    fn from(value: TerminalEmptyPtr<'db>) -> Self {
40487        Self(value.0)
40488    }
40489}
40490impl<'db> From<TerminalIdentifierGreen<'db>> for TokenNodeGreen<'db> {
40491    fn from(value: TerminalIdentifierGreen<'db>) -> Self {
40492        Self(value.0)
40493    }
40494}
40495impl<'db> From<TerminalLiteralNumberGreen<'db>> for TokenNodeGreen<'db> {
40496    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
40497        Self(value.0)
40498    }
40499}
40500impl<'db> From<TerminalShortStringGreen<'db>> for TokenNodeGreen<'db> {
40501    fn from(value: TerminalShortStringGreen<'db>) -> Self {
40502        Self(value.0)
40503    }
40504}
40505impl<'db> From<TerminalStringGreen<'db>> for TokenNodeGreen<'db> {
40506    fn from(value: TerminalStringGreen<'db>) -> Self {
40507        Self(value.0)
40508    }
40509}
40510impl<'db> From<TerminalAsGreen<'db>> for TokenNodeGreen<'db> {
40511    fn from(value: TerminalAsGreen<'db>) -> Self {
40512        Self(value.0)
40513    }
40514}
40515impl<'db> From<TerminalConstGreen<'db>> for TokenNodeGreen<'db> {
40516    fn from(value: TerminalConstGreen<'db>) -> Self {
40517        Self(value.0)
40518    }
40519}
40520impl<'db> From<TerminalElseGreen<'db>> for TokenNodeGreen<'db> {
40521    fn from(value: TerminalElseGreen<'db>) -> Self {
40522        Self(value.0)
40523    }
40524}
40525impl<'db> From<TerminalEnumGreen<'db>> for TokenNodeGreen<'db> {
40526    fn from(value: TerminalEnumGreen<'db>) -> Self {
40527        Self(value.0)
40528    }
40529}
40530impl<'db> From<TerminalExternGreen<'db>> for TokenNodeGreen<'db> {
40531    fn from(value: TerminalExternGreen<'db>) -> Self {
40532        Self(value.0)
40533    }
40534}
40535impl<'db> From<TerminalFalseGreen<'db>> for TokenNodeGreen<'db> {
40536    fn from(value: TerminalFalseGreen<'db>) -> Self {
40537        Self(value.0)
40538    }
40539}
40540impl<'db> From<TerminalFunctionGreen<'db>> for TokenNodeGreen<'db> {
40541    fn from(value: TerminalFunctionGreen<'db>) -> Self {
40542        Self(value.0)
40543    }
40544}
40545impl<'db> From<TerminalIfGreen<'db>> for TokenNodeGreen<'db> {
40546    fn from(value: TerminalIfGreen<'db>) -> Self {
40547        Self(value.0)
40548    }
40549}
40550impl<'db> From<TerminalWhileGreen<'db>> for TokenNodeGreen<'db> {
40551    fn from(value: TerminalWhileGreen<'db>) -> Self {
40552        Self(value.0)
40553    }
40554}
40555impl<'db> From<TerminalForGreen<'db>> for TokenNodeGreen<'db> {
40556    fn from(value: TerminalForGreen<'db>) -> Self {
40557        Self(value.0)
40558    }
40559}
40560impl<'db> From<TerminalLoopGreen<'db>> for TokenNodeGreen<'db> {
40561    fn from(value: TerminalLoopGreen<'db>) -> Self {
40562        Self(value.0)
40563    }
40564}
40565impl<'db> From<TerminalImplGreen<'db>> for TokenNodeGreen<'db> {
40566    fn from(value: TerminalImplGreen<'db>) -> Self {
40567        Self(value.0)
40568    }
40569}
40570impl<'db> From<TerminalImplicitsGreen<'db>> for TokenNodeGreen<'db> {
40571    fn from(value: TerminalImplicitsGreen<'db>) -> Self {
40572        Self(value.0)
40573    }
40574}
40575impl<'db> From<TerminalLetGreen<'db>> for TokenNodeGreen<'db> {
40576    fn from(value: TerminalLetGreen<'db>) -> Self {
40577        Self(value.0)
40578    }
40579}
40580impl<'db> From<TerminalMacroGreen<'db>> for TokenNodeGreen<'db> {
40581    fn from(value: TerminalMacroGreen<'db>) -> Self {
40582        Self(value.0)
40583    }
40584}
40585impl<'db> From<TerminalMatchGreen<'db>> for TokenNodeGreen<'db> {
40586    fn from(value: TerminalMatchGreen<'db>) -> Self {
40587        Self(value.0)
40588    }
40589}
40590impl<'db> From<TerminalModuleGreen<'db>> for TokenNodeGreen<'db> {
40591    fn from(value: TerminalModuleGreen<'db>) -> Self {
40592        Self(value.0)
40593    }
40594}
40595impl<'db> From<TerminalMutGreen<'db>> for TokenNodeGreen<'db> {
40596    fn from(value: TerminalMutGreen<'db>) -> Self {
40597        Self(value.0)
40598    }
40599}
40600impl<'db> From<TerminalNoPanicGreen<'db>> for TokenNodeGreen<'db> {
40601    fn from(value: TerminalNoPanicGreen<'db>) -> Self {
40602        Self(value.0)
40603    }
40604}
40605impl<'db> From<TerminalOfGreen<'db>> for TokenNodeGreen<'db> {
40606    fn from(value: TerminalOfGreen<'db>) -> Self {
40607        Self(value.0)
40608    }
40609}
40610impl<'db> From<TerminalRefGreen<'db>> for TokenNodeGreen<'db> {
40611    fn from(value: TerminalRefGreen<'db>) -> Self {
40612        Self(value.0)
40613    }
40614}
40615impl<'db> From<TerminalContinueGreen<'db>> for TokenNodeGreen<'db> {
40616    fn from(value: TerminalContinueGreen<'db>) -> Self {
40617        Self(value.0)
40618    }
40619}
40620impl<'db> From<TerminalReturnGreen<'db>> for TokenNodeGreen<'db> {
40621    fn from(value: TerminalReturnGreen<'db>) -> Self {
40622        Self(value.0)
40623    }
40624}
40625impl<'db> From<TerminalBreakGreen<'db>> for TokenNodeGreen<'db> {
40626    fn from(value: TerminalBreakGreen<'db>) -> Self {
40627        Self(value.0)
40628    }
40629}
40630impl<'db> From<TerminalStructGreen<'db>> for TokenNodeGreen<'db> {
40631    fn from(value: TerminalStructGreen<'db>) -> Self {
40632        Self(value.0)
40633    }
40634}
40635impl<'db> From<TerminalTraitGreen<'db>> for TokenNodeGreen<'db> {
40636    fn from(value: TerminalTraitGreen<'db>) -> Self {
40637        Self(value.0)
40638    }
40639}
40640impl<'db> From<TerminalTrueGreen<'db>> for TokenNodeGreen<'db> {
40641    fn from(value: TerminalTrueGreen<'db>) -> Self {
40642        Self(value.0)
40643    }
40644}
40645impl<'db> From<TerminalTypeGreen<'db>> for TokenNodeGreen<'db> {
40646    fn from(value: TerminalTypeGreen<'db>) -> Self {
40647        Self(value.0)
40648    }
40649}
40650impl<'db> From<TerminalUseGreen<'db>> for TokenNodeGreen<'db> {
40651    fn from(value: TerminalUseGreen<'db>) -> Self {
40652        Self(value.0)
40653    }
40654}
40655impl<'db> From<TerminalPubGreen<'db>> for TokenNodeGreen<'db> {
40656    fn from(value: TerminalPubGreen<'db>) -> Self {
40657        Self(value.0)
40658    }
40659}
40660impl<'db> From<TerminalAndGreen<'db>> for TokenNodeGreen<'db> {
40661    fn from(value: TerminalAndGreen<'db>) -> Self {
40662        Self(value.0)
40663    }
40664}
40665impl<'db> From<TerminalAndAndGreen<'db>> for TokenNodeGreen<'db> {
40666    fn from(value: TerminalAndAndGreen<'db>) -> Self {
40667        Self(value.0)
40668    }
40669}
40670impl<'db> From<TerminalArrowGreen<'db>> for TokenNodeGreen<'db> {
40671    fn from(value: TerminalArrowGreen<'db>) -> Self {
40672        Self(value.0)
40673    }
40674}
40675impl<'db> From<TerminalAtGreen<'db>> for TokenNodeGreen<'db> {
40676    fn from(value: TerminalAtGreen<'db>) -> Self {
40677        Self(value.0)
40678    }
40679}
40680impl<'db> From<TerminalBadCharactersGreen<'db>> for TokenNodeGreen<'db> {
40681    fn from(value: TerminalBadCharactersGreen<'db>) -> Self {
40682        Self(value.0)
40683    }
40684}
40685impl<'db> From<TerminalColonGreen<'db>> for TokenNodeGreen<'db> {
40686    fn from(value: TerminalColonGreen<'db>) -> Self {
40687        Self(value.0)
40688    }
40689}
40690impl<'db> From<TerminalColonColonGreen<'db>> for TokenNodeGreen<'db> {
40691    fn from(value: TerminalColonColonGreen<'db>) -> Self {
40692        Self(value.0)
40693    }
40694}
40695impl<'db> From<TerminalCommaGreen<'db>> for TokenNodeGreen<'db> {
40696    fn from(value: TerminalCommaGreen<'db>) -> Self {
40697        Self(value.0)
40698    }
40699}
40700impl<'db> From<TerminalDivGreen<'db>> for TokenNodeGreen<'db> {
40701    fn from(value: TerminalDivGreen<'db>) -> Self {
40702        Self(value.0)
40703    }
40704}
40705impl<'db> From<TerminalDivEqGreen<'db>> for TokenNodeGreen<'db> {
40706    fn from(value: TerminalDivEqGreen<'db>) -> Self {
40707        Self(value.0)
40708    }
40709}
40710impl<'db> From<TerminalDollarGreen<'db>> for TokenNodeGreen<'db> {
40711    fn from(value: TerminalDollarGreen<'db>) -> Self {
40712        Self(value.0)
40713    }
40714}
40715impl<'db> From<TerminalDotGreen<'db>> for TokenNodeGreen<'db> {
40716    fn from(value: TerminalDotGreen<'db>) -> Self {
40717        Self(value.0)
40718    }
40719}
40720impl<'db> From<TerminalDotDotGreen<'db>> for TokenNodeGreen<'db> {
40721    fn from(value: TerminalDotDotGreen<'db>) -> Self {
40722        Self(value.0)
40723    }
40724}
40725impl<'db> From<TerminalDotDotEqGreen<'db>> for TokenNodeGreen<'db> {
40726    fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
40727        Self(value.0)
40728    }
40729}
40730impl<'db> From<TerminalEndOfFileGreen<'db>> for TokenNodeGreen<'db> {
40731    fn from(value: TerminalEndOfFileGreen<'db>) -> Self {
40732        Self(value.0)
40733    }
40734}
40735impl<'db> From<TerminalEqGreen<'db>> for TokenNodeGreen<'db> {
40736    fn from(value: TerminalEqGreen<'db>) -> Self {
40737        Self(value.0)
40738    }
40739}
40740impl<'db> From<TerminalEqEqGreen<'db>> for TokenNodeGreen<'db> {
40741    fn from(value: TerminalEqEqGreen<'db>) -> Self {
40742        Self(value.0)
40743    }
40744}
40745impl<'db> From<TerminalGEGreen<'db>> for TokenNodeGreen<'db> {
40746    fn from(value: TerminalGEGreen<'db>) -> Self {
40747        Self(value.0)
40748    }
40749}
40750impl<'db> From<TerminalGTGreen<'db>> for TokenNodeGreen<'db> {
40751    fn from(value: TerminalGTGreen<'db>) -> Self {
40752        Self(value.0)
40753    }
40754}
40755impl<'db> From<TerminalHashGreen<'db>> for TokenNodeGreen<'db> {
40756    fn from(value: TerminalHashGreen<'db>) -> Self {
40757        Self(value.0)
40758    }
40759}
40760impl<'db> From<TerminalLBraceGreen<'db>> for TokenNodeGreen<'db> {
40761    fn from(value: TerminalLBraceGreen<'db>) -> Self {
40762        Self(value.0)
40763    }
40764}
40765impl<'db> From<TerminalLBrackGreen<'db>> for TokenNodeGreen<'db> {
40766    fn from(value: TerminalLBrackGreen<'db>) -> Self {
40767        Self(value.0)
40768    }
40769}
40770impl<'db> From<TerminalLEGreen<'db>> for TokenNodeGreen<'db> {
40771    fn from(value: TerminalLEGreen<'db>) -> Self {
40772        Self(value.0)
40773    }
40774}
40775impl<'db> From<TerminalLParenGreen<'db>> for TokenNodeGreen<'db> {
40776    fn from(value: TerminalLParenGreen<'db>) -> Self {
40777        Self(value.0)
40778    }
40779}
40780impl<'db> From<TerminalLTGreen<'db>> for TokenNodeGreen<'db> {
40781    fn from(value: TerminalLTGreen<'db>) -> Self {
40782        Self(value.0)
40783    }
40784}
40785impl<'db> From<TerminalMatchArrowGreen<'db>> for TokenNodeGreen<'db> {
40786    fn from(value: TerminalMatchArrowGreen<'db>) -> Self {
40787        Self(value.0)
40788    }
40789}
40790impl<'db> From<TerminalMinusGreen<'db>> for TokenNodeGreen<'db> {
40791    fn from(value: TerminalMinusGreen<'db>) -> Self {
40792        Self(value.0)
40793    }
40794}
40795impl<'db> From<TerminalMinusEqGreen<'db>> for TokenNodeGreen<'db> {
40796    fn from(value: TerminalMinusEqGreen<'db>) -> Self {
40797        Self(value.0)
40798    }
40799}
40800impl<'db> From<TerminalModGreen<'db>> for TokenNodeGreen<'db> {
40801    fn from(value: TerminalModGreen<'db>) -> Self {
40802        Self(value.0)
40803    }
40804}
40805impl<'db> From<TerminalModEqGreen<'db>> for TokenNodeGreen<'db> {
40806    fn from(value: TerminalModEqGreen<'db>) -> Self {
40807        Self(value.0)
40808    }
40809}
40810impl<'db> From<TerminalMulGreen<'db>> for TokenNodeGreen<'db> {
40811    fn from(value: TerminalMulGreen<'db>) -> Self {
40812        Self(value.0)
40813    }
40814}
40815impl<'db> From<TerminalMulEqGreen<'db>> for TokenNodeGreen<'db> {
40816    fn from(value: TerminalMulEqGreen<'db>) -> Self {
40817        Self(value.0)
40818    }
40819}
40820impl<'db> From<TerminalNeqGreen<'db>> for TokenNodeGreen<'db> {
40821    fn from(value: TerminalNeqGreen<'db>) -> Self {
40822        Self(value.0)
40823    }
40824}
40825impl<'db> From<TerminalNotGreen<'db>> for TokenNodeGreen<'db> {
40826    fn from(value: TerminalNotGreen<'db>) -> Self {
40827        Self(value.0)
40828    }
40829}
40830impl<'db> From<TerminalBitNotGreen<'db>> for TokenNodeGreen<'db> {
40831    fn from(value: TerminalBitNotGreen<'db>) -> Self {
40832        Self(value.0)
40833    }
40834}
40835impl<'db> From<TerminalOrGreen<'db>> for TokenNodeGreen<'db> {
40836    fn from(value: TerminalOrGreen<'db>) -> Self {
40837        Self(value.0)
40838    }
40839}
40840impl<'db> From<TerminalOrOrGreen<'db>> for TokenNodeGreen<'db> {
40841    fn from(value: TerminalOrOrGreen<'db>) -> Self {
40842        Self(value.0)
40843    }
40844}
40845impl<'db> From<TerminalPlusGreen<'db>> for TokenNodeGreen<'db> {
40846    fn from(value: TerminalPlusGreen<'db>) -> Self {
40847        Self(value.0)
40848    }
40849}
40850impl<'db> From<TerminalPlusEqGreen<'db>> for TokenNodeGreen<'db> {
40851    fn from(value: TerminalPlusEqGreen<'db>) -> Self {
40852        Self(value.0)
40853    }
40854}
40855impl<'db> From<TerminalQuestionMarkGreen<'db>> for TokenNodeGreen<'db> {
40856    fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
40857        Self(value.0)
40858    }
40859}
40860impl<'db> From<TerminalRBraceGreen<'db>> for TokenNodeGreen<'db> {
40861    fn from(value: TerminalRBraceGreen<'db>) -> Self {
40862        Self(value.0)
40863    }
40864}
40865impl<'db> From<TerminalRBrackGreen<'db>> for TokenNodeGreen<'db> {
40866    fn from(value: TerminalRBrackGreen<'db>) -> Self {
40867        Self(value.0)
40868    }
40869}
40870impl<'db> From<TerminalRParenGreen<'db>> for TokenNodeGreen<'db> {
40871    fn from(value: TerminalRParenGreen<'db>) -> Self {
40872        Self(value.0)
40873    }
40874}
40875impl<'db> From<TerminalSemicolonGreen<'db>> for TokenNodeGreen<'db> {
40876    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
40877        Self(value.0)
40878    }
40879}
40880impl<'db> From<TerminalUnderscoreGreen<'db>> for TokenNodeGreen<'db> {
40881    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
40882        Self(value.0)
40883    }
40884}
40885impl<'db> From<TerminalXorGreen<'db>> for TokenNodeGreen<'db> {
40886    fn from(value: TerminalXorGreen<'db>) -> Self {
40887        Self(value.0)
40888    }
40889}
40890impl<'db> From<TerminalEmptyGreen<'db>> for TokenNodeGreen<'db> {
40891    fn from(value: TerminalEmptyGreen<'db>) -> Self {
40892        Self(value.0)
40893    }
40894}
40895#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40896pub struct TokenNodeGreen<'db>(pub GreenId<'db>);
40897impl<'db> TypedSyntaxNode<'db> for TokenNode<'db> {
40898    const OPTIONAL_KIND: Option<SyntaxKind> = None;
40899    type StablePtr = TokenNodePtr<'db>;
40900    type Green = TokenNodeGreen<'db>;
40901    fn missing(db: &'db dyn Database) -> Self::Green {
40902        panic!("No missing variant.");
40903    }
40904    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40905        let kind = node.kind(db);
40906        match kind {
40907            SyntaxKind::TerminalIdentifier => {
40908                TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
40909            }
40910            SyntaxKind::TerminalLiteralNumber => {
40911                TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
40912            }
40913            SyntaxKind::TerminalShortString => {
40914                TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
40915            }
40916            SyntaxKind::TerminalString => {
40917                TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
40918            }
40919            SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
40920            SyntaxKind::TerminalConst => {
40921                TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
40922            }
40923            SyntaxKind::TerminalElse => {
40924                TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
40925            }
40926            SyntaxKind::TerminalEnum => {
40927                TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
40928            }
40929            SyntaxKind::TerminalExtern => {
40930                TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
40931            }
40932            SyntaxKind::TerminalFalse => {
40933                TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
40934            }
40935            SyntaxKind::TerminalFunction => {
40936                TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
40937            }
40938            SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
40939            SyntaxKind::TerminalWhile => {
40940                TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
40941            }
40942            SyntaxKind::TerminalFor => {
40943                TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
40944            }
40945            SyntaxKind::TerminalLoop => {
40946                TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
40947            }
40948            SyntaxKind::TerminalImpl => {
40949                TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
40950            }
40951            SyntaxKind::TerminalImplicits => {
40952                TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
40953            }
40954            SyntaxKind::TerminalLet => {
40955                TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
40956            }
40957            SyntaxKind::TerminalMacro => {
40958                TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
40959            }
40960            SyntaxKind::TerminalMatch => {
40961                TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
40962            }
40963            SyntaxKind::TerminalModule => {
40964                TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
40965            }
40966            SyntaxKind::TerminalMut => {
40967                TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
40968            }
40969            SyntaxKind::TerminalNoPanic => {
40970                TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
40971            }
40972            SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
40973            SyntaxKind::TerminalRef => {
40974                TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
40975            }
40976            SyntaxKind::TerminalContinue => {
40977                TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
40978            }
40979            SyntaxKind::TerminalReturn => {
40980                TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
40981            }
40982            SyntaxKind::TerminalBreak => {
40983                TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
40984            }
40985            SyntaxKind::TerminalStruct => {
40986                TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
40987            }
40988            SyntaxKind::TerminalTrait => {
40989                TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
40990            }
40991            SyntaxKind::TerminalTrue => {
40992                TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
40993            }
40994            SyntaxKind::TerminalType => {
40995                TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
40996            }
40997            SyntaxKind::TerminalUse => {
40998                TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
40999            }
41000            SyntaxKind::TerminalPub => {
41001                TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
41002            }
41003            SyntaxKind::TerminalAnd => {
41004                TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
41005            }
41006            SyntaxKind::TerminalAndAnd => {
41007                TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
41008            }
41009            SyntaxKind::TerminalArrow => {
41010                TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
41011            }
41012            SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
41013            SyntaxKind::TerminalBadCharacters => {
41014                TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
41015            }
41016            SyntaxKind::TerminalColon => {
41017                TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
41018            }
41019            SyntaxKind::TerminalColonColon => {
41020                TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
41021            }
41022            SyntaxKind::TerminalComma => {
41023                TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
41024            }
41025            SyntaxKind::TerminalDiv => {
41026                TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
41027            }
41028            SyntaxKind::TerminalDivEq => {
41029                TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
41030            }
41031            SyntaxKind::TerminalDollar => {
41032                TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
41033            }
41034            SyntaxKind::TerminalDot => {
41035                TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
41036            }
41037            SyntaxKind::TerminalDotDot => {
41038                TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
41039            }
41040            SyntaxKind::TerminalDotDotEq => {
41041                TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
41042            }
41043            SyntaxKind::TerminalEndOfFile => {
41044                TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
41045            }
41046            SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
41047            SyntaxKind::TerminalEqEq => {
41048                TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
41049            }
41050            SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
41051            SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
41052            SyntaxKind::TerminalHash => {
41053                TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
41054            }
41055            SyntaxKind::TerminalLBrace => {
41056                TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
41057            }
41058            SyntaxKind::TerminalLBrack => {
41059                TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
41060            }
41061            SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
41062            SyntaxKind::TerminalLParen => {
41063                TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
41064            }
41065            SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
41066            SyntaxKind::TerminalMatchArrow => {
41067                TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
41068            }
41069            SyntaxKind::TerminalMinus => {
41070                TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
41071            }
41072            SyntaxKind::TerminalMinusEq => {
41073                TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
41074            }
41075            SyntaxKind::TerminalMod => {
41076                TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
41077            }
41078            SyntaxKind::TerminalModEq => {
41079                TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
41080            }
41081            SyntaxKind::TerminalMul => {
41082                TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
41083            }
41084            SyntaxKind::TerminalMulEq => {
41085                TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
41086            }
41087            SyntaxKind::TerminalNeq => {
41088                TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
41089            }
41090            SyntaxKind::TerminalNot => {
41091                TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
41092            }
41093            SyntaxKind::TerminalBitNot => {
41094                TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
41095            }
41096            SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
41097            SyntaxKind::TerminalOrOr => {
41098                TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
41099            }
41100            SyntaxKind::TerminalPlus => {
41101                TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
41102            }
41103            SyntaxKind::TerminalPlusEq => {
41104                TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
41105            }
41106            SyntaxKind::TerminalQuestionMark => {
41107                TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
41108            }
41109            SyntaxKind::TerminalRBrace => {
41110                TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
41111            }
41112            SyntaxKind::TerminalRBrack => {
41113                TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
41114            }
41115            SyntaxKind::TerminalRParen => {
41116                TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
41117            }
41118            SyntaxKind::TerminalSemicolon => {
41119                TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
41120            }
41121            SyntaxKind::TerminalUnderscore => {
41122                TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
41123            }
41124            SyntaxKind::TerminalXor => {
41125                TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
41126            }
41127            SyntaxKind::TerminalEmpty => {
41128                TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
41129            }
41130            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
41131        }
41132    }
41133    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
41134        let kind = node.kind(db);
41135        match kind {
41136            SyntaxKind::TerminalIdentifier => {
41137                Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
41138            }
41139            SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
41140                TerminalLiteralNumber::from_syntax_node(db, node),
41141            )),
41142            SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
41143                TerminalShortString::from_syntax_node(db, node),
41144            )),
41145            SyntaxKind::TerminalString => {
41146                Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
41147            }
41148            SyntaxKind::TerminalAs => {
41149                Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
41150            }
41151            SyntaxKind::TerminalConst => {
41152                Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
41153            }
41154            SyntaxKind::TerminalElse => {
41155                Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
41156            }
41157            SyntaxKind::TerminalEnum => {
41158                Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
41159            }
41160            SyntaxKind::TerminalExtern => {
41161                Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
41162            }
41163            SyntaxKind::TerminalFalse => {
41164                Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
41165            }
41166            SyntaxKind::TerminalFunction => {
41167                Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
41168            }
41169            SyntaxKind::TerminalIf => {
41170                Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
41171            }
41172            SyntaxKind::TerminalWhile => {
41173                Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
41174            }
41175            SyntaxKind::TerminalFor => {
41176                Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
41177            }
41178            SyntaxKind::TerminalLoop => {
41179                Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
41180            }
41181            SyntaxKind::TerminalImpl => {
41182                Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
41183            }
41184            SyntaxKind::TerminalImplicits => {
41185                Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
41186            }
41187            SyntaxKind::TerminalLet => {
41188                Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
41189            }
41190            SyntaxKind::TerminalMacro => {
41191                Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
41192            }
41193            SyntaxKind::TerminalMatch => {
41194                Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
41195            }
41196            SyntaxKind::TerminalModule => {
41197                Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
41198            }
41199            SyntaxKind::TerminalMut => {
41200                Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
41201            }
41202            SyntaxKind::TerminalNoPanic => {
41203                Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
41204            }
41205            SyntaxKind::TerminalOf => {
41206                Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
41207            }
41208            SyntaxKind::TerminalRef => {
41209                Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
41210            }
41211            SyntaxKind::TerminalContinue => {
41212                Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
41213            }
41214            SyntaxKind::TerminalReturn => {
41215                Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
41216            }
41217            SyntaxKind::TerminalBreak => {
41218                Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
41219            }
41220            SyntaxKind::TerminalStruct => {
41221                Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
41222            }
41223            SyntaxKind::TerminalTrait => {
41224                Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
41225            }
41226            SyntaxKind::TerminalTrue => {
41227                Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
41228            }
41229            SyntaxKind::TerminalType => {
41230                Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
41231            }
41232            SyntaxKind::TerminalUse => {
41233                Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
41234            }
41235            SyntaxKind::TerminalPub => {
41236                Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
41237            }
41238            SyntaxKind::TerminalAnd => {
41239                Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
41240            }
41241            SyntaxKind::TerminalAndAnd => {
41242                Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
41243            }
41244            SyntaxKind::TerminalArrow => {
41245                Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
41246            }
41247            SyntaxKind::TerminalAt => {
41248                Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
41249            }
41250            SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
41251                TerminalBadCharacters::from_syntax_node(db, node),
41252            )),
41253            SyntaxKind::TerminalColon => {
41254                Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
41255            }
41256            SyntaxKind::TerminalColonColon => {
41257                Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
41258            }
41259            SyntaxKind::TerminalComma => {
41260                Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
41261            }
41262            SyntaxKind::TerminalDiv => {
41263                Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
41264            }
41265            SyntaxKind::TerminalDivEq => {
41266                Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
41267            }
41268            SyntaxKind::TerminalDollar => {
41269                Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
41270            }
41271            SyntaxKind::TerminalDot => {
41272                Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
41273            }
41274            SyntaxKind::TerminalDotDot => {
41275                Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
41276            }
41277            SyntaxKind::TerminalDotDotEq => {
41278                Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
41279            }
41280            SyntaxKind::TerminalEndOfFile => {
41281                Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
41282            }
41283            SyntaxKind::TerminalEq => {
41284                Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
41285            }
41286            SyntaxKind::TerminalEqEq => {
41287                Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
41288            }
41289            SyntaxKind::TerminalGE => {
41290                Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
41291            }
41292            SyntaxKind::TerminalGT => {
41293                Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
41294            }
41295            SyntaxKind::TerminalHash => {
41296                Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
41297            }
41298            SyntaxKind::TerminalLBrace => {
41299                Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
41300            }
41301            SyntaxKind::TerminalLBrack => {
41302                Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
41303            }
41304            SyntaxKind::TerminalLE => {
41305                Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
41306            }
41307            SyntaxKind::TerminalLParen => {
41308                Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
41309            }
41310            SyntaxKind::TerminalLT => {
41311                Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
41312            }
41313            SyntaxKind::TerminalMatchArrow => {
41314                Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
41315            }
41316            SyntaxKind::TerminalMinus => {
41317                Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
41318            }
41319            SyntaxKind::TerminalMinusEq => {
41320                Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
41321            }
41322            SyntaxKind::TerminalMod => {
41323                Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
41324            }
41325            SyntaxKind::TerminalModEq => {
41326                Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
41327            }
41328            SyntaxKind::TerminalMul => {
41329                Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
41330            }
41331            SyntaxKind::TerminalMulEq => {
41332                Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
41333            }
41334            SyntaxKind::TerminalNeq => {
41335                Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
41336            }
41337            SyntaxKind::TerminalNot => {
41338                Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
41339            }
41340            SyntaxKind::TerminalBitNot => {
41341                Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
41342            }
41343            SyntaxKind::TerminalOr => {
41344                Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
41345            }
41346            SyntaxKind::TerminalOrOr => {
41347                Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
41348            }
41349            SyntaxKind::TerminalPlus => {
41350                Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
41351            }
41352            SyntaxKind::TerminalPlusEq => {
41353                Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
41354            }
41355            SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
41356                TerminalQuestionMark::from_syntax_node(db, node),
41357            )),
41358            SyntaxKind::TerminalRBrace => {
41359                Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
41360            }
41361            SyntaxKind::TerminalRBrack => {
41362                Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
41363            }
41364            SyntaxKind::TerminalRParen => {
41365                Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
41366            }
41367            SyntaxKind::TerminalSemicolon => {
41368                Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
41369            }
41370            SyntaxKind::TerminalUnderscore => {
41371                Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
41372            }
41373            SyntaxKind::TerminalXor => {
41374                Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
41375            }
41376            SyntaxKind::TerminalEmpty => {
41377                Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
41378            }
41379            _ => None,
41380        }
41381    }
41382    fn as_syntax_node(&self) -> SyntaxNode<'db> {
41383        match self {
41384            TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
41385            TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
41386            TokenNode::TerminalShortString(x) => x.as_syntax_node(),
41387            TokenNode::TerminalString(x) => x.as_syntax_node(),
41388            TokenNode::TerminalAs(x) => x.as_syntax_node(),
41389            TokenNode::TerminalConst(x) => x.as_syntax_node(),
41390            TokenNode::TerminalElse(x) => x.as_syntax_node(),
41391            TokenNode::TerminalEnum(x) => x.as_syntax_node(),
41392            TokenNode::TerminalExtern(x) => x.as_syntax_node(),
41393            TokenNode::TerminalFalse(x) => x.as_syntax_node(),
41394            TokenNode::TerminalFunction(x) => x.as_syntax_node(),
41395            TokenNode::TerminalIf(x) => x.as_syntax_node(),
41396            TokenNode::TerminalWhile(x) => x.as_syntax_node(),
41397            TokenNode::TerminalFor(x) => x.as_syntax_node(),
41398            TokenNode::TerminalLoop(x) => x.as_syntax_node(),
41399            TokenNode::TerminalImpl(x) => x.as_syntax_node(),
41400            TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
41401            TokenNode::TerminalLet(x) => x.as_syntax_node(),
41402            TokenNode::TerminalMacro(x) => x.as_syntax_node(),
41403            TokenNode::TerminalMatch(x) => x.as_syntax_node(),
41404            TokenNode::TerminalModule(x) => x.as_syntax_node(),
41405            TokenNode::TerminalMut(x) => x.as_syntax_node(),
41406            TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
41407            TokenNode::TerminalOf(x) => x.as_syntax_node(),
41408            TokenNode::TerminalRef(x) => x.as_syntax_node(),
41409            TokenNode::TerminalContinue(x) => x.as_syntax_node(),
41410            TokenNode::TerminalReturn(x) => x.as_syntax_node(),
41411            TokenNode::TerminalBreak(x) => x.as_syntax_node(),
41412            TokenNode::TerminalStruct(x) => x.as_syntax_node(),
41413            TokenNode::TerminalTrait(x) => x.as_syntax_node(),
41414            TokenNode::TerminalTrue(x) => x.as_syntax_node(),
41415            TokenNode::TerminalType(x) => x.as_syntax_node(),
41416            TokenNode::TerminalUse(x) => x.as_syntax_node(),
41417            TokenNode::TerminalPub(x) => x.as_syntax_node(),
41418            TokenNode::TerminalAnd(x) => x.as_syntax_node(),
41419            TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
41420            TokenNode::TerminalArrow(x) => x.as_syntax_node(),
41421            TokenNode::TerminalAt(x) => x.as_syntax_node(),
41422            TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
41423            TokenNode::TerminalColon(x) => x.as_syntax_node(),
41424            TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
41425            TokenNode::TerminalComma(x) => x.as_syntax_node(),
41426            TokenNode::TerminalDiv(x) => x.as_syntax_node(),
41427            TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
41428            TokenNode::TerminalDollar(x) => x.as_syntax_node(),
41429            TokenNode::TerminalDot(x) => x.as_syntax_node(),
41430            TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
41431            TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
41432            TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
41433            TokenNode::TerminalEq(x) => x.as_syntax_node(),
41434            TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
41435            TokenNode::TerminalGE(x) => x.as_syntax_node(),
41436            TokenNode::TerminalGT(x) => x.as_syntax_node(),
41437            TokenNode::TerminalHash(x) => x.as_syntax_node(),
41438            TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
41439            TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
41440            TokenNode::TerminalLE(x) => x.as_syntax_node(),
41441            TokenNode::TerminalLParen(x) => x.as_syntax_node(),
41442            TokenNode::TerminalLT(x) => x.as_syntax_node(),
41443            TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
41444            TokenNode::TerminalMinus(x) => x.as_syntax_node(),
41445            TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
41446            TokenNode::TerminalMod(x) => x.as_syntax_node(),
41447            TokenNode::TerminalModEq(x) => x.as_syntax_node(),
41448            TokenNode::TerminalMul(x) => x.as_syntax_node(),
41449            TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
41450            TokenNode::TerminalNeq(x) => x.as_syntax_node(),
41451            TokenNode::TerminalNot(x) => x.as_syntax_node(),
41452            TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
41453            TokenNode::TerminalOr(x) => x.as_syntax_node(),
41454            TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
41455            TokenNode::TerminalPlus(x) => x.as_syntax_node(),
41456            TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
41457            TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
41458            TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
41459            TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
41460            TokenNode::TerminalRParen(x) => x.as_syntax_node(),
41461            TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
41462            TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
41463            TokenNode::TerminalXor(x) => x.as_syntax_node(),
41464            TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
41465        }
41466    }
41467    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
41468        TokenNodePtr(self.as_syntax_node().stable_ptr(db))
41469    }
41470}
41471impl<'db> TokenNode<'db> {
41472    /// Checks if a kind of a variant of [TokenNode].
41473    pub fn is_variant(kind: SyntaxKind) -> bool {
41474        matches!(
41475            kind,
41476            SyntaxKind::TerminalIdentifier
41477                | SyntaxKind::TerminalLiteralNumber
41478                | SyntaxKind::TerminalShortString
41479                | SyntaxKind::TerminalString
41480                | SyntaxKind::TerminalAs
41481                | SyntaxKind::TerminalConst
41482                | SyntaxKind::TerminalElse
41483                | SyntaxKind::TerminalEnum
41484                | SyntaxKind::TerminalExtern
41485                | SyntaxKind::TerminalFalse
41486                | SyntaxKind::TerminalFunction
41487                | SyntaxKind::TerminalIf
41488                | SyntaxKind::TerminalWhile
41489                | SyntaxKind::TerminalFor
41490                | SyntaxKind::TerminalLoop
41491                | SyntaxKind::TerminalImpl
41492                | SyntaxKind::TerminalImplicits
41493                | SyntaxKind::TerminalLet
41494                | SyntaxKind::TerminalMacro
41495                | SyntaxKind::TerminalMatch
41496                | SyntaxKind::TerminalModule
41497                | SyntaxKind::TerminalMut
41498                | SyntaxKind::TerminalNoPanic
41499                | SyntaxKind::TerminalOf
41500                | SyntaxKind::TerminalRef
41501                | SyntaxKind::TerminalContinue
41502                | SyntaxKind::TerminalReturn
41503                | SyntaxKind::TerminalBreak
41504                | SyntaxKind::TerminalStruct
41505                | SyntaxKind::TerminalTrait
41506                | SyntaxKind::TerminalTrue
41507                | SyntaxKind::TerminalType
41508                | SyntaxKind::TerminalUse
41509                | SyntaxKind::TerminalPub
41510                | SyntaxKind::TerminalAnd
41511                | SyntaxKind::TerminalAndAnd
41512                | SyntaxKind::TerminalArrow
41513                | SyntaxKind::TerminalAt
41514                | SyntaxKind::TerminalBadCharacters
41515                | SyntaxKind::TerminalColon
41516                | SyntaxKind::TerminalColonColon
41517                | SyntaxKind::TerminalComma
41518                | SyntaxKind::TerminalDiv
41519                | SyntaxKind::TerminalDivEq
41520                | SyntaxKind::TerminalDollar
41521                | SyntaxKind::TerminalDot
41522                | SyntaxKind::TerminalDotDot
41523                | SyntaxKind::TerminalDotDotEq
41524                | SyntaxKind::TerminalEndOfFile
41525                | SyntaxKind::TerminalEq
41526                | SyntaxKind::TerminalEqEq
41527                | SyntaxKind::TerminalGE
41528                | SyntaxKind::TerminalGT
41529                | SyntaxKind::TerminalHash
41530                | SyntaxKind::TerminalLBrace
41531                | SyntaxKind::TerminalLBrack
41532                | SyntaxKind::TerminalLE
41533                | SyntaxKind::TerminalLParen
41534                | SyntaxKind::TerminalLT
41535                | SyntaxKind::TerminalMatchArrow
41536                | SyntaxKind::TerminalMinus
41537                | SyntaxKind::TerminalMinusEq
41538                | SyntaxKind::TerminalMod
41539                | SyntaxKind::TerminalModEq
41540                | SyntaxKind::TerminalMul
41541                | SyntaxKind::TerminalMulEq
41542                | SyntaxKind::TerminalNeq
41543                | SyntaxKind::TerminalNot
41544                | SyntaxKind::TerminalBitNot
41545                | SyntaxKind::TerminalOr
41546                | SyntaxKind::TerminalOrOr
41547                | SyntaxKind::TerminalPlus
41548                | SyntaxKind::TerminalPlusEq
41549                | SyntaxKind::TerminalQuestionMark
41550                | SyntaxKind::TerminalRBrace
41551                | SyntaxKind::TerminalRBrack
41552                | SyntaxKind::TerminalRParen
41553                | SyntaxKind::TerminalSemicolon
41554                | SyntaxKind::TerminalUnderscore
41555                | SyntaxKind::TerminalXor
41556                | SyntaxKind::TerminalEmpty
41557        )
41558    }
41559}