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, SyntaxStablePtr, SyntaxStablePtrId, Terminal, Token,
18    TypedStablePtr, 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().long(db).stable_ptr)
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().long(db).stable_ptr)
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().long(db).stable_ptr)
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().long(db).stable_ptr)
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().long(db).stable_ptr)
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().long(db).stable_ptr)
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}
2710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2711pub struct UnaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2712impl<'db> TypedStablePtr<'db> for UnaryOperatorPtr<'db> {
2713    type SyntaxNode = UnaryOperator<'db>;
2714    fn untyped(self) -> SyntaxStablePtrId<'db> {
2715        self.0
2716    }
2717    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2718        UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2719    }
2720}
2721impl<'db> From<UnaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2722    fn from(ptr: UnaryOperatorPtr<'db>) -> Self {
2723        ptr.untyped()
2724    }
2725}
2726impl<'db> From<TerminalNotPtr<'db>> for UnaryOperatorPtr<'db> {
2727    fn from(value: TerminalNotPtr<'db>) -> Self {
2728        Self(value.0)
2729    }
2730}
2731impl<'db> From<TerminalBitNotPtr<'db>> for UnaryOperatorPtr<'db> {
2732    fn from(value: TerminalBitNotPtr<'db>) -> Self {
2733        Self(value.0)
2734    }
2735}
2736impl<'db> From<TerminalMinusPtr<'db>> for UnaryOperatorPtr<'db> {
2737    fn from(value: TerminalMinusPtr<'db>) -> Self {
2738        Self(value.0)
2739    }
2740}
2741impl<'db> From<TerminalAtPtr<'db>> for UnaryOperatorPtr<'db> {
2742    fn from(value: TerminalAtPtr<'db>) -> Self {
2743        Self(value.0)
2744    }
2745}
2746impl<'db> From<TerminalMulPtr<'db>> for UnaryOperatorPtr<'db> {
2747    fn from(value: TerminalMulPtr<'db>) -> Self {
2748        Self(value.0)
2749    }
2750}
2751impl<'db> From<TerminalNotGreen<'db>> for UnaryOperatorGreen<'db> {
2752    fn from(value: TerminalNotGreen<'db>) -> Self {
2753        Self(value.0)
2754    }
2755}
2756impl<'db> From<TerminalBitNotGreen<'db>> for UnaryOperatorGreen<'db> {
2757    fn from(value: TerminalBitNotGreen<'db>) -> Self {
2758        Self(value.0)
2759    }
2760}
2761impl<'db> From<TerminalMinusGreen<'db>> for UnaryOperatorGreen<'db> {
2762    fn from(value: TerminalMinusGreen<'db>) -> Self {
2763        Self(value.0)
2764    }
2765}
2766impl<'db> From<TerminalAtGreen<'db>> for UnaryOperatorGreen<'db> {
2767    fn from(value: TerminalAtGreen<'db>) -> Self {
2768        Self(value.0)
2769    }
2770}
2771impl<'db> From<TerminalMulGreen<'db>> for UnaryOperatorGreen<'db> {
2772    fn from(value: TerminalMulGreen<'db>) -> Self {
2773        Self(value.0)
2774    }
2775}
2776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2777pub struct UnaryOperatorGreen<'db>(pub GreenId<'db>);
2778impl<'db> TypedSyntaxNode<'db> for UnaryOperator<'db> {
2779    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2780    type StablePtr = UnaryOperatorPtr<'db>;
2781    type Green = UnaryOperatorGreen<'db>;
2782    fn missing(db: &'db dyn Database) -> Self::Green {
2783        panic!("No missing variant.");
2784    }
2785    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2786        let kind = node.kind(db);
2787        match kind {
2788            SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2789            SyntaxKind::TerminalBitNot => {
2790                UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2791            }
2792            SyntaxKind::TerminalMinus => {
2793                UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2794            }
2795            SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2796            SyntaxKind::TerminalMul => {
2797                UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2798            }
2799            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2800        }
2801    }
2802    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2803        let kind = node.kind(db);
2804        match kind {
2805            SyntaxKind::TerminalNot => {
2806                Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2807            }
2808            SyntaxKind::TerminalBitNot => {
2809                Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2810            }
2811            SyntaxKind::TerminalMinus => {
2812                Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2813            }
2814            SyntaxKind::TerminalAt => {
2815                Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2816            }
2817            SyntaxKind::TerminalMul => {
2818                Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2819            }
2820            _ => None,
2821        }
2822    }
2823    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2824        match self {
2825            UnaryOperator::Not(x) => x.as_syntax_node(),
2826            UnaryOperator::BitNot(x) => x.as_syntax_node(),
2827            UnaryOperator::Minus(x) => x.as_syntax_node(),
2828            UnaryOperator::At(x) => x.as_syntax_node(),
2829            UnaryOperator::Desnap(x) => x.as_syntax_node(),
2830        }
2831    }
2832    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2833        UnaryOperatorPtr(self.as_syntax_node().long(db).stable_ptr)
2834    }
2835}
2836impl<'db> UnaryOperator<'db> {
2837    /// Checks if a kind of a variant of [UnaryOperator].
2838    pub fn is_variant(kind: SyntaxKind) -> bool {
2839        matches!(
2840            kind,
2841            SyntaxKind::TerminalNot
2842                | SyntaxKind::TerminalBitNot
2843                | SyntaxKind::TerminalMinus
2844                | SyntaxKind::TerminalAt
2845                | SyntaxKind::TerminalMul
2846        )
2847    }
2848}
2849#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2850pub struct ExprBinary<'db> {
2851    node: SyntaxNode<'db>,
2852}
2853impl<'db> ExprBinary<'db> {
2854    pub const INDEX_LHS: usize = 0;
2855    pub const INDEX_OP: usize = 1;
2856    pub const INDEX_RHS: usize = 2;
2857    pub fn new_green(
2858        db: &'db dyn Database,
2859        lhs: ExprGreen<'db>,
2860        op: BinaryOperatorGreen<'db>,
2861        rhs: ExprGreen<'db>,
2862    ) -> ExprBinaryGreen<'db> {
2863        let children = [lhs.0, op.0, rhs.0];
2864        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2865        ExprBinaryGreen(
2866            GreenNode {
2867                kind: SyntaxKind::ExprBinary,
2868                details: GreenNodeDetails::Node { children: children.into(), width },
2869            }
2870            .intern(db),
2871        )
2872    }
2873}
2874impl<'db> ExprBinary<'db> {
2875    pub fn lhs(&self, db: &'db dyn Database) -> Expr<'db> {
2876        Expr::from_syntax_node(db, self.node.get_children(db)[0])
2877    }
2878    pub fn op(&self, db: &'db dyn Database) -> BinaryOperator<'db> {
2879        BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2880    }
2881    pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
2882        Expr::from_syntax_node(db, self.node.get_children(db)[2])
2883    }
2884}
2885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2886pub struct ExprBinaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2887impl<'db> ExprBinaryPtr<'db> {}
2888impl<'db> TypedStablePtr<'db> for ExprBinaryPtr<'db> {
2889    type SyntaxNode = ExprBinary<'db>;
2890    fn untyped(self) -> SyntaxStablePtrId<'db> {
2891        self.0
2892    }
2893    fn lookup(&self, db: &'db dyn Database) -> ExprBinary<'db> {
2894        ExprBinary::from_syntax_node(db, self.0.lookup(db))
2895    }
2896}
2897impl<'db> From<ExprBinaryPtr<'db>> for SyntaxStablePtrId<'db> {
2898    fn from(ptr: ExprBinaryPtr<'db>) -> Self {
2899        ptr.untyped()
2900    }
2901}
2902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2903pub struct ExprBinaryGreen<'db>(pub GreenId<'db>);
2904impl<'db> TypedSyntaxNode<'db> for ExprBinary<'db> {
2905    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2906    type StablePtr = ExprBinaryPtr<'db>;
2907    type Green = ExprBinaryGreen<'db>;
2908    fn missing(db: &'db dyn Database) -> Self::Green {
2909        ExprBinaryGreen(
2910            GreenNode {
2911                kind: SyntaxKind::ExprBinary,
2912                details: GreenNodeDetails::Node {
2913                    children: [
2914                        Expr::missing(db).0,
2915                        BinaryOperator::missing(db).0,
2916                        Expr::missing(db).0,
2917                    ]
2918                    .into(),
2919                    width: TextWidth::default(),
2920                },
2921            }
2922            .intern(db),
2923        )
2924    }
2925    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2926        let kind = node.kind(db);
2927        assert_eq!(
2928            kind,
2929            SyntaxKind::ExprBinary,
2930            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2931            kind,
2932            SyntaxKind::ExprBinary
2933        );
2934        Self { node }
2935    }
2936    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2937        let kind = node.kind(db);
2938        if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2939    }
2940    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2941        self.node
2942    }
2943    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2944        ExprBinaryPtr(self.node.stable_ptr(db))
2945    }
2946}
2947#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2948pub enum BinaryOperator<'db> {
2949    Dot(TerminalDot<'db>),
2950    Not(TerminalNot<'db>),
2951    Mul(TerminalMul<'db>),
2952    MulEq(TerminalMulEq<'db>),
2953    Div(TerminalDiv<'db>),
2954    DivEq(TerminalDivEq<'db>),
2955    Mod(TerminalMod<'db>),
2956    ModEq(TerminalModEq<'db>),
2957    Plus(TerminalPlus<'db>),
2958    PlusEq(TerminalPlusEq<'db>),
2959    Minus(TerminalMinus<'db>),
2960    MinusEq(TerminalMinusEq<'db>),
2961    EqEq(TerminalEqEq<'db>),
2962    Neq(TerminalNeq<'db>),
2963    Eq(TerminalEq<'db>),
2964    And(TerminalAnd<'db>),
2965    AndAnd(TerminalAndAnd<'db>),
2966    Or(TerminalOr<'db>),
2967    OrOr(TerminalOrOr<'db>),
2968    Xor(TerminalXor<'db>),
2969    LE(TerminalLE<'db>),
2970    GE(TerminalGE<'db>),
2971    LT(TerminalLT<'db>),
2972    GT(TerminalGT<'db>),
2973    DotDot(TerminalDotDot<'db>),
2974    DotDotEq(TerminalDotDotEq<'db>),
2975}
2976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2977pub struct BinaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2978impl<'db> TypedStablePtr<'db> for BinaryOperatorPtr<'db> {
2979    type SyntaxNode = BinaryOperator<'db>;
2980    fn untyped(self) -> SyntaxStablePtrId<'db> {
2981        self.0
2982    }
2983    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2984        BinaryOperator::from_syntax_node(db, self.0.lookup(db))
2985    }
2986}
2987impl<'db> From<BinaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2988    fn from(ptr: BinaryOperatorPtr<'db>) -> Self {
2989        ptr.untyped()
2990    }
2991}
2992impl<'db> From<TerminalDotPtr<'db>> for BinaryOperatorPtr<'db> {
2993    fn from(value: TerminalDotPtr<'db>) -> Self {
2994        Self(value.0)
2995    }
2996}
2997impl<'db> From<TerminalNotPtr<'db>> for BinaryOperatorPtr<'db> {
2998    fn from(value: TerminalNotPtr<'db>) -> Self {
2999        Self(value.0)
3000    }
3001}
3002impl<'db> From<TerminalMulPtr<'db>> for BinaryOperatorPtr<'db> {
3003    fn from(value: TerminalMulPtr<'db>) -> Self {
3004        Self(value.0)
3005    }
3006}
3007impl<'db> From<TerminalMulEqPtr<'db>> for BinaryOperatorPtr<'db> {
3008    fn from(value: TerminalMulEqPtr<'db>) -> Self {
3009        Self(value.0)
3010    }
3011}
3012impl<'db> From<TerminalDivPtr<'db>> for BinaryOperatorPtr<'db> {
3013    fn from(value: TerminalDivPtr<'db>) -> Self {
3014        Self(value.0)
3015    }
3016}
3017impl<'db> From<TerminalDivEqPtr<'db>> for BinaryOperatorPtr<'db> {
3018    fn from(value: TerminalDivEqPtr<'db>) -> Self {
3019        Self(value.0)
3020    }
3021}
3022impl<'db> From<TerminalModPtr<'db>> for BinaryOperatorPtr<'db> {
3023    fn from(value: TerminalModPtr<'db>) -> Self {
3024        Self(value.0)
3025    }
3026}
3027impl<'db> From<TerminalModEqPtr<'db>> for BinaryOperatorPtr<'db> {
3028    fn from(value: TerminalModEqPtr<'db>) -> Self {
3029        Self(value.0)
3030    }
3031}
3032impl<'db> From<TerminalPlusPtr<'db>> for BinaryOperatorPtr<'db> {
3033    fn from(value: TerminalPlusPtr<'db>) -> Self {
3034        Self(value.0)
3035    }
3036}
3037impl<'db> From<TerminalPlusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3038    fn from(value: TerminalPlusEqPtr<'db>) -> Self {
3039        Self(value.0)
3040    }
3041}
3042impl<'db> From<TerminalMinusPtr<'db>> for BinaryOperatorPtr<'db> {
3043    fn from(value: TerminalMinusPtr<'db>) -> Self {
3044        Self(value.0)
3045    }
3046}
3047impl<'db> From<TerminalMinusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3048    fn from(value: TerminalMinusEqPtr<'db>) -> Self {
3049        Self(value.0)
3050    }
3051}
3052impl<'db> From<TerminalEqEqPtr<'db>> for BinaryOperatorPtr<'db> {
3053    fn from(value: TerminalEqEqPtr<'db>) -> Self {
3054        Self(value.0)
3055    }
3056}
3057impl<'db> From<TerminalNeqPtr<'db>> for BinaryOperatorPtr<'db> {
3058    fn from(value: TerminalNeqPtr<'db>) -> Self {
3059        Self(value.0)
3060    }
3061}
3062impl<'db> From<TerminalEqPtr<'db>> for BinaryOperatorPtr<'db> {
3063    fn from(value: TerminalEqPtr<'db>) -> Self {
3064        Self(value.0)
3065    }
3066}
3067impl<'db> From<TerminalAndPtr<'db>> for BinaryOperatorPtr<'db> {
3068    fn from(value: TerminalAndPtr<'db>) -> Self {
3069        Self(value.0)
3070    }
3071}
3072impl<'db> From<TerminalAndAndPtr<'db>> for BinaryOperatorPtr<'db> {
3073    fn from(value: TerminalAndAndPtr<'db>) -> Self {
3074        Self(value.0)
3075    }
3076}
3077impl<'db> From<TerminalOrPtr<'db>> for BinaryOperatorPtr<'db> {
3078    fn from(value: TerminalOrPtr<'db>) -> Self {
3079        Self(value.0)
3080    }
3081}
3082impl<'db> From<TerminalOrOrPtr<'db>> for BinaryOperatorPtr<'db> {
3083    fn from(value: TerminalOrOrPtr<'db>) -> Self {
3084        Self(value.0)
3085    }
3086}
3087impl<'db> From<TerminalXorPtr<'db>> for BinaryOperatorPtr<'db> {
3088    fn from(value: TerminalXorPtr<'db>) -> Self {
3089        Self(value.0)
3090    }
3091}
3092impl<'db> From<TerminalLEPtr<'db>> for BinaryOperatorPtr<'db> {
3093    fn from(value: TerminalLEPtr<'db>) -> Self {
3094        Self(value.0)
3095    }
3096}
3097impl<'db> From<TerminalGEPtr<'db>> for BinaryOperatorPtr<'db> {
3098    fn from(value: TerminalGEPtr<'db>) -> Self {
3099        Self(value.0)
3100    }
3101}
3102impl<'db> From<TerminalLTPtr<'db>> for BinaryOperatorPtr<'db> {
3103    fn from(value: TerminalLTPtr<'db>) -> Self {
3104        Self(value.0)
3105    }
3106}
3107impl<'db> From<TerminalGTPtr<'db>> for BinaryOperatorPtr<'db> {
3108    fn from(value: TerminalGTPtr<'db>) -> Self {
3109        Self(value.0)
3110    }
3111}
3112impl<'db> From<TerminalDotDotPtr<'db>> for BinaryOperatorPtr<'db> {
3113    fn from(value: TerminalDotDotPtr<'db>) -> Self {
3114        Self(value.0)
3115    }
3116}
3117impl<'db> From<TerminalDotDotEqPtr<'db>> for BinaryOperatorPtr<'db> {
3118    fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
3119        Self(value.0)
3120    }
3121}
3122impl<'db> From<TerminalDotGreen<'db>> for BinaryOperatorGreen<'db> {
3123    fn from(value: TerminalDotGreen<'db>) -> Self {
3124        Self(value.0)
3125    }
3126}
3127impl<'db> From<TerminalNotGreen<'db>> for BinaryOperatorGreen<'db> {
3128    fn from(value: TerminalNotGreen<'db>) -> Self {
3129        Self(value.0)
3130    }
3131}
3132impl<'db> From<TerminalMulGreen<'db>> for BinaryOperatorGreen<'db> {
3133    fn from(value: TerminalMulGreen<'db>) -> Self {
3134        Self(value.0)
3135    }
3136}
3137impl<'db> From<TerminalMulEqGreen<'db>> for BinaryOperatorGreen<'db> {
3138    fn from(value: TerminalMulEqGreen<'db>) -> Self {
3139        Self(value.0)
3140    }
3141}
3142impl<'db> From<TerminalDivGreen<'db>> for BinaryOperatorGreen<'db> {
3143    fn from(value: TerminalDivGreen<'db>) -> Self {
3144        Self(value.0)
3145    }
3146}
3147impl<'db> From<TerminalDivEqGreen<'db>> for BinaryOperatorGreen<'db> {
3148    fn from(value: TerminalDivEqGreen<'db>) -> Self {
3149        Self(value.0)
3150    }
3151}
3152impl<'db> From<TerminalModGreen<'db>> for BinaryOperatorGreen<'db> {
3153    fn from(value: TerminalModGreen<'db>) -> Self {
3154        Self(value.0)
3155    }
3156}
3157impl<'db> From<TerminalModEqGreen<'db>> for BinaryOperatorGreen<'db> {
3158    fn from(value: TerminalModEqGreen<'db>) -> Self {
3159        Self(value.0)
3160    }
3161}
3162impl<'db> From<TerminalPlusGreen<'db>> for BinaryOperatorGreen<'db> {
3163    fn from(value: TerminalPlusGreen<'db>) -> Self {
3164        Self(value.0)
3165    }
3166}
3167impl<'db> From<TerminalPlusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3168    fn from(value: TerminalPlusEqGreen<'db>) -> Self {
3169        Self(value.0)
3170    }
3171}
3172impl<'db> From<TerminalMinusGreen<'db>> for BinaryOperatorGreen<'db> {
3173    fn from(value: TerminalMinusGreen<'db>) -> Self {
3174        Self(value.0)
3175    }
3176}
3177impl<'db> From<TerminalMinusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3178    fn from(value: TerminalMinusEqGreen<'db>) -> Self {
3179        Self(value.0)
3180    }
3181}
3182impl<'db> From<TerminalEqEqGreen<'db>> for BinaryOperatorGreen<'db> {
3183    fn from(value: TerminalEqEqGreen<'db>) -> Self {
3184        Self(value.0)
3185    }
3186}
3187impl<'db> From<TerminalNeqGreen<'db>> for BinaryOperatorGreen<'db> {
3188    fn from(value: TerminalNeqGreen<'db>) -> Self {
3189        Self(value.0)
3190    }
3191}
3192impl<'db> From<TerminalEqGreen<'db>> for BinaryOperatorGreen<'db> {
3193    fn from(value: TerminalEqGreen<'db>) -> Self {
3194        Self(value.0)
3195    }
3196}
3197impl<'db> From<TerminalAndGreen<'db>> for BinaryOperatorGreen<'db> {
3198    fn from(value: TerminalAndGreen<'db>) -> Self {
3199        Self(value.0)
3200    }
3201}
3202impl<'db> From<TerminalAndAndGreen<'db>> for BinaryOperatorGreen<'db> {
3203    fn from(value: TerminalAndAndGreen<'db>) -> Self {
3204        Self(value.0)
3205    }
3206}
3207impl<'db> From<TerminalOrGreen<'db>> for BinaryOperatorGreen<'db> {
3208    fn from(value: TerminalOrGreen<'db>) -> Self {
3209        Self(value.0)
3210    }
3211}
3212impl<'db> From<TerminalOrOrGreen<'db>> for BinaryOperatorGreen<'db> {
3213    fn from(value: TerminalOrOrGreen<'db>) -> Self {
3214        Self(value.0)
3215    }
3216}
3217impl<'db> From<TerminalXorGreen<'db>> for BinaryOperatorGreen<'db> {
3218    fn from(value: TerminalXorGreen<'db>) -> Self {
3219        Self(value.0)
3220    }
3221}
3222impl<'db> From<TerminalLEGreen<'db>> for BinaryOperatorGreen<'db> {
3223    fn from(value: TerminalLEGreen<'db>) -> Self {
3224        Self(value.0)
3225    }
3226}
3227impl<'db> From<TerminalGEGreen<'db>> for BinaryOperatorGreen<'db> {
3228    fn from(value: TerminalGEGreen<'db>) -> Self {
3229        Self(value.0)
3230    }
3231}
3232impl<'db> From<TerminalLTGreen<'db>> for BinaryOperatorGreen<'db> {
3233    fn from(value: TerminalLTGreen<'db>) -> Self {
3234        Self(value.0)
3235    }
3236}
3237impl<'db> From<TerminalGTGreen<'db>> for BinaryOperatorGreen<'db> {
3238    fn from(value: TerminalGTGreen<'db>) -> Self {
3239        Self(value.0)
3240    }
3241}
3242impl<'db> From<TerminalDotDotGreen<'db>> for BinaryOperatorGreen<'db> {
3243    fn from(value: TerminalDotDotGreen<'db>) -> Self {
3244        Self(value.0)
3245    }
3246}
3247impl<'db> From<TerminalDotDotEqGreen<'db>> for BinaryOperatorGreen<'db> {
3248    fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
3249        Self(value.0)
3250    }
3251}
3252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3253pub struct BinaryOperatorGreen<'db>(pub GreenId<'db>);
3254impl<'db> TypedSyntaxNode<'db> for BinaryOperator<'db> {
3255    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3256    type StablePtr = BinaryOperatorPtr<'db>;
3257    type Green = BinaryOperatorGreen<'db>;
3258    fn missing(db: &'db dyn Database) -> Self::Green {
3259        panic!("No missing variant.");
3260    }
3261    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3262        let kind = node.kind(db);
3263        match kind {
3264            SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3265            SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3266            SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3267            SyntaxKind::TerminalMulEq => {
3268                BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3269            }
3270            SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3271            SyntaxKind::TerminalDivEq => {
3272                BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3273            }
3274            SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3275            SyntaxKind::TerminalModEq => {
3276                BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3277            }
3278            SyntaxKind::TerminalPlus => {
3279                BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3280            }
3281            SyntaxKind::TerminalPlusEq => {
3282                BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3283            }
3284            SyntaxKind::TerminalMinus => {
3285                BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3286            }
3287            SyntaxKind::TerminalMinusEq => {
3288                BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3289            }
3290            SyntaxKind::TerminalEqEq => {
3291                BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3292            }
3293            SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3294            SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3295            SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3296            SyntaxKind::TerminalAndAnd => {
3297                BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3298            }
3299            SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3300            SyntaxKind::TerminalOrOr => {
3301                BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3302            }
3303            SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3304            SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3305            SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3306            SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3307            SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3308            SyntaxKind::TerminalDotDot => {
3309                BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3310            }
3311            SyntaxKind::TerminalDotDotEq => {
3312                BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3313            }
3314            _ => {
3315                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3316            }
3317        }
3318    }
3319    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3320        let kind = node.kind(db);
3321        match kind {
3322            SyntaxKind::TerminalDot => {
3323                Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3324            }
3325            SyntaxKind::TerminalNot => {
3326                Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3327            }
3328            SyntaxKind::TerminalMul => {
3329                Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3330            }
3331            SyntaxKind::TerminalMulEq => {
3332                Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3333            }
3334            SyntaxKind::TerminalDiv => {
3335                Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3336            }
3337            SyntaxKind::TerminalDivEq => {
3338                Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3339            }
3340            SyntaxKind::TerminalMod => {
3341                Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3342            }
3343            SyntaxKind::TerminalModEq => {
3344                Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3345            }
3346            SyntaxKind::TerminalPlus => {
3347                Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3348            }
3349            SyntaxKind::TerminalPlusEq => {
3350                Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3351            }
3352            SyntaxKind::TerminalMinus => {
3353                Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3354            }
3355            SyntaxKind::TerminalMinusEq => {
3356                Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3357            }
3358            SyntaxKind::TerminalEqEq => {
3359                Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3360            }
3361            SyntaxKind::TerminalNeq => {
3362                Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3363            }
3364            SyntaxKind::TerminalEq => {
3365                Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3366            }
3367            SyntaxKind::TerminalAnd => {
3368                Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3369            }
3370            SyntaxKind::TerminalAndAnd => {
3371                Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3372            }
3373            SyntaxKind::TerminalOr => {
3374                Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3375            }
3376            SyntaxKind::TerminalOrOr => {
3377                Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3378            }
3379            SyntaxKind::TerminalXor => {
3380                Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3381            }
3382            SyntaxKind::TerminalLE => {
3383                Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3384            }
3385            SyntaxKind::TerminalGE => {
3386                Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3387            }
3388            SyntaxKind::TerminalLT => {
3389                Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3390            }
3391            SyntaxKind::TerminalGT => {
3392                Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3393            }
3394            SyntaxKind::TerminalDotDot => {
3395                Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3396            }
3397            SyntaxKind::TerminalDotDotEq => {
3398                Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3399            }
3400            _ => None,
3401        }
3402    }
3403    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3404        match self {
3405            BinaryOperator::Dot(x) => x.as_syntax_node(),
3406            BinaryOperator::Not(x) => x.as_syntax_node(),
3407            BinaryOperator::Mul(x) => x.as_syntax_node(),
3408            BinaryOperator::MulEq(x) => x.as_syntax_node(),
3409            BinaryOperator::Div(x) => x.as_syntax_node(),
3410            BinaryOperator::DivEq(x) => x.as_syntax_node(),
3411            BinaryOperator::Mod(x) => x.as_syntax_node(),
3412            BinaryOperator::ModEq(x) => x.as_syntax_node(),
3413            BinaryOperator::Plus(x) => x.as_syntax_node(),
3414            BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3415            BinaryOperator::Minus(x) => x.as_syntax_node(),
3416            BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3417            BinaryOperator::EqEq(x) => x.as_syntax_node(),
3418            BinaryOperator::Neq(x) => x.as_syntax_node(),
3419            BinaryOperator::Eq(x) => x.as_syntax_node(),
3420            BinaryOperator::And(x) => x.as_syntax_node(),
3421            BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3422            BinaryOperator::Or(x) => x.as_syntax_node(),
3423            BinaryOperator::OrOr(x) => x.as_syntax_node(),
3424            BinaryOperator::Xor(x) => x.as_syntax_node(),
3425            BinaryOperator::LE(x) => x.as_syntax_node(),
3426            BinaryOperator::GE(x) => x.as_syntax_node(),
3427            BinaryOperator::LT(x) => x.as_syntax_node(),
3428            BinaryOperator::GT(x) => x.as_syntax_node(),
3429            BinaryOperator::DotDot(x) => x.as_syntax_node(),
3430            BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3431        }
3432    }
3433    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3434        BinaryOperatorPtr(self.as_syntax_node().long(db).stable_ptr)
3435    }
3436}
3437impl<'db> BinaryOperator<'db> {
3438    /// Checks if a kind of a variant of [BinaryOperator].
3439    pub fn is_variant(kind: SyntaxKind) -> bool {
3440        matches!(
3441            kind,
3442            SyntaxKind::TerminalDot
3443                | SyntaxKind::TerminalNot
3444                | SyntaxKind::TerminalMul
3445                | SyntaxKind::TerminalMulEq
3446                | SyntaxKind::TerminalDiv
3447                | SyntaxKind::TerminalDivEq
3448                | SyntaxKind::TerminalMod
3449                | SyntaxKind::TerminalModEq
3450                | SyntaxKind::TerminalPlus
3451                | SyntaxKind::TerminalPlusEq
3452                | SyntaxKind::TerminalMinus
3453                | SyntaxKind::TerminalMinusEq
3454                | SyntaxKind::TerminalEqEq
3455                | SyntaxKind::TerminalNeq
3456                | SyntaxKind::TerminalEq
3457                | SyntaxKind::TerminalAnd
3458                | SyntaxKind::TerminalAndAnd
3459                | SyntaxKind::TerminalOr
3460                | SyntaxKind::TerminalOrOr
3461                | SyntaxKind::TerminalXor
3462                | SyntaxKind::TerminalLE
3463                | SyntaxKind::TerminalGE
3464                | SyntaxKind::TerminalLT
3465                | SyntaxKind::TerminalGT
3466                | SyntaxKind::TerminalDotDot
3467                | SyntaxKind::TerminalDotDotEq
3468        )
3469    }
3470}
3471#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3472pub struct ExprListParenthesized<'db> {
3473    node: SyntaxNode<'db>,
3474}
3475impl<'db> ExprListParenthesized<'db> {
3476    pub const INDEX_LPAREN: usize = 0;
3477    pub const INDEX_EXPRESSIONS: usize = 1;
3478    pub const INDEX_RPAREN: usize = 2;
3479    pub fn new_green(
3480        db: &'db dyn Database,
3481        lparen: TerminalLParenGreen<'db>,
3482        expressions: ExprListGreen<'db>,
3483        rparen: TerminalRParenGreen<'db>,
3484    ) -> ExprListParenthesizedGreen<'db> {
3485        let children = [lparen.0, expressions.0, rparen.0];
3486        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3487        ExprListParenthesizedGreen(
3488            GreenNode {
3489                kind: SyntaxKind::ExprListParenthesized,
3490                details: GreenNodeDetails::Node { children: children.into(), width },
3491            }
3492            .intern(db),
3493        )
3494    }
3495}
3496impl<'db> ExprListParenthesized<'db> {
3497    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3498        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3499    }
3500    pub fn expressions(&self, db: &'db dyn Database) -> ExprList<'db> {
3501        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3502    }
3503    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3504        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3505    }
3506}
3507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3508pub struct ExprListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3509impl<'db> ExprListParenthesizedPtr<'db> {}
3510impl<'db> TypedStablePtr<'db> for ExprListParenthesizedPtr<'db> {
3511    type SyntaxNode = ExprListParenthesized<'db>;
3512    fn untyped(self) -> SyntaxStablePtrId<'db> {
3513        self.0
3514    }
3515    fn lookup(&self, db: &'db dyn Database) -> ExprListParenthesized<'db> {
3516        ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3517    }
3518}
3519impl<'db> From<ExprListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3520    fn from(ptr: ExprListParenthesizedPtr<'db>) -> Self {
3521        ptr.untyped()
3522    }
3523}
3524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3525pub struct ExprListParenthesizedGreen<'db>(pub GreenId<'db>);
3526impl<'db> TypedSyntaxNode<'db> for ExprListParenthesized<'db> {
3527    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3528    type StablePtr = ExprListParenthesizedPtr<'db>;
3529    type Green = ExprListParenthesizedGreen<'db>;
3530    fn missing(db: &'db dyn Database) -> Self::Green {
3531        ExprListParenthesizedGreen(
3532            GreenNode {
3533                kind: SyntaxKind::ExprListParenthesized,
3534                details: GreenNodeDetails::Node {
3535                    children: [
3536                        TerminalLParen::missing(db).0,
3537                        ExprList::missing(db).0,
3538                        TerminalRParen::missing(db).0,
3539                    ]
3540                    .into(),
3541                    width: TextWidth::default(),
3542                },
3543            }
3544            .intern(db),
3545        )
3546    }
3547    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3548        let kind = node.kind(db);
3549        assert_eq!(
3550            kind,
3551            SyntaxKind::ExprListParenthesized,
3552            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3553            kind,
3554            SyntaxKind::ExprListParenthesized
3555        );
3556        Self { node }
3557    }
3558    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3559        let kind = node.kind(db);
3560        if kind == SyntaxKind::ExprListParenthesized {
3561            Some(Self::from_syntax_node(db, node))
3562        } else {
3563            None
3564        }
3565    }
3566    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3567        self.node
3568    }
3569    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3570        ExprListParenthesizedPtr(self.node.stable_ptr(db))
3571    }
3572}
3573#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3574pub struct ExprFunctionCall<'db> {
3575    node: SyntaxNode<'db>,
3576}
3577impl<'db> ExprFunctionCall<'db> {
3578    pub const INDEX_PATH: usize = 0;
3579    pub const INDEX_ARGUMENTS: usize = 1;
3580    pub fn new_green(
3581        db: &'db dyn Database,
3582        path: ExprPathGreen<'db>,
3583        arguments: ArgListParenthesizedGreen<'db>,
3584    ) -> ExprFunctionCallGreen<'db> {
3585        let children = [path.0, arguments.0];
3586        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3587        ExprFunctionCallGreen(
3588            GreenNode {
3589                kind: SyntaxKind::ExprFunctionCall,
3590                details: GreenNodeDetails::Node { children: children.into(), width },
3591            }
3592            .intern(db),
3593        )
3594    }
3595}
3596impl<'db> ExprFunctionCall<'db> {
3597    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3598        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3599    }
3600    pub fn arguments(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3601        ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3602    }
3603}
3604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3605pub struct ExprFunctionCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3606impl<'db> ExprFunctionCallPtr<'db> {}
3607impl<'db> TypedStablePtr<'db> for ExprFunctionCallPtr<'db> {
3608    type SyntaxNode = ExprFunctionCall<'db>;
3609    fn untyped(self) -> SyntaxStablePtrId<'db> {
3610        self.0
3611    }
3612    fn lookup(&self, db: &'db dyn Database) -> ExprFunctionCall<'db> {
3613        ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3614    }
3615}
3616impl<'db> From<ExprFunctionCallPtr<'db>> for SyntaxStablePtrId<'db> {
3617    fn from(ptr: ExprFunctionCallPtr<'db>) -> Self {
3618        ptr.untyped()
3619    }
3620}
3621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3622pub struct ExprFunctionCallGreen<'db>(pub GreenId<'db>);
3623impl<'db> TypedSyntaxNode<'db> for ExprFunctionCall<'db> {
3624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3625    type StablePtr = ExprFunctionCallPtr<'db>;
3626    type Green = ExprFunctionCallGreen<'db>;
3627    fn missing(db: &'db dyn Database) -> Self::Green {
3628        ExprFunctionCallGreen(
3629            GreenNode {
3630                kind: SyntaxKind::ExprFunctionCall,
3631                details: GreenNodeDetails::Node {
3632                    children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3633                    width: TextWidth::default(),
3634                },
3635            }
3636            .intern(db),
3637        )
3638    }
3639    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3640        let kind = node.kind(db);
3641        assert_eq!(
3642            kind,
3643            SyntaxKind::ExprFunctionCall,
3644            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3645            kind,
3646            SyntaxKind::ExprFunctionCall
3647        );
3648        Self { node }
3649    }
3650    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3651        let kind = node.kind(db);
3652        if kind == SyntaxKind::ExprFunctionCall {
3653            Some(Self::from_syntax_node(db, node))
3654        } else {
3655            None
3656        }
3657    }
3658    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3659        self.node
3660    }
3661    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3662        ExprFunctionCallPtr(self.node.stable_ptr(db))
3663    }
3664}
3665#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3666pub struct ArgListParenthesized<'db> {
3667    node: SyntaxNode<'db>,
3668}
3669impl<'db> ArgListParenthesized<'db> {
3670    pub const INDEX_LPAREN: usize = 0;
3671    pub const INDEX_ARGUMENTS: usize = 1;
3672    pub const INDEX_RPAREN: usize = 2;
3673    pub fn new_green(
3674        db: &'db dyn Database,
3675        lparen: TerminalLParenGreen<'db>,
3676        arguments: ArgListGreen<'db>,
3677        rparen: TerminalRParenGreen<'db>,
3678    ) -> ArgListParenthesizedGreen<'db> {
3679        let children = [lparen.0, arguments.0, rparen.0];
3680        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3681        ArgListParenthesizedGreen(
3682            GreenNode {
3683                kind: SyntaxKind::ArgListParenthesized,
3684                details: GreenNodeDetails::Node { children: children.into(), width },
3685            }
3686            .intern(db),
3687        )
3688    }
3689}
3690impl<'db> ArgListParenthesized<'db> {
3691    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3692        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3693    }
3694    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
3695        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3696    }
3697    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3698        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3699    }
3700}
3701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3702pub struct ArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3703impl<'db> ArgListParenthesizedPtr<'db> {}
3704impl<'db> TypedStablePtr<'db> for ArgListParenthesizedPtr<'db> {
3705    type SyntaxNode = ArgListParenthesized<'db>;
3706    fn untyped(self) -> SyntaxStablePtrId<'db> {
3707        self.0
3708    }
3709    fn lookup(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3710        ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3711    }
3712}
3713impl<'db> From<ArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3714    fn from(ptr: ArgListParenthesizedPtr<'db>) -> Self {
3715        ptr.untyped()
3716    }
3717}
3718#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3719pub struct ArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3720impl<'db> TypedSyntaxNode<'db> for ArgListParenthesized<'db> {
3721    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3722    type StablePtr = ArgListParenthesizedPtr<'db>;
3723    type Green = ArgListParenthesizedGreen<'db>;
3724    fn missing(db: &'db dyn Database) -> Self::Green {
3725        ArgListParenthesizedGreen(
3726            GreenNode {
3727                kind: SyntaxKind::ArgListParenthesized,
3728                details: GreenNodeDetails::Node {
3729                    children: [
3730                        TerminalLParen::missing(db).0,
3731                        ArgList::missing(db).0,
3732                        TerminalRParen::missing(db).0,
3733                    ]
3734                    .into(),
3735                    width: TextWidth::default(),
3736                },
3737            }
3738            .intern(db),
3739        )
3740    }
3741    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3742        let kind = node.kind(db);
3743        assert_eq!(
3744            kind,
3745            SyntaxKind::ArgListParenthesized,
3746            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3747            kind,
3748            SyntaxKind::ArgListParenthesized
3749        );
3750        Self { node }
3751    }
3752    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3753        let kind = node.kind(db);
3754        if kind == SyntaxKind::ArgListParenthesized {
3755            Some(Self::from_syntax_node(db, node))
3756        } else {
3757            None
3758        }
3759    }
3760    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3761        self.node
3762    }
3763    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3764        ArgListParenthesizedPtr(self.node.stable_ptr(db))
3765    }
3766}
3767#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3768pub enum OptionArgListParenthesized<'db> {
3769    Empty(OptionArgListParenthesizedEmpty<'db>),
3770    ArgListParenthesized(ArgListParenthesized<'db>),
3771}
3772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3773pub struct OptionArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3774impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedPtr<'db> {
3775    type SyntaxNode = OptionArgListParenthesized<'db>;
3776    fn untyped(self) -> SyntaxStablePtrId<'db> {
3777        self.0
3778    }
3779    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3780        OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3781    }
3782}
3783impl<'db> From<OptionArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3784    fn from(ptr: OptionArgListParenthesizedPtr<'db>) -> Self {
3785        ptr.untyped()
3786    }
3787}
3788impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3789    fn from(value: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3790        Self(value.0)
3791    }
3792}
3793impl<'db> From<ArgListParenthesizedPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3794    fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
3795        Self(value.0)
3796    }
3797}
3798impl<'db> From<OptionArgListParenthesizedEmptyGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3799    fn from(value: OptionArgListParenthesizedEmptyGreen<'db>) -> Self {
3800        Self(value.0)
3801    }
3802}
3803impl<'db> From<ArgListParenthesizedGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3804    fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
3805        Self(value.0)
3806    }
3807}
3808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3809pub struct OptionArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3810impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesized<'db> {
3811    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3812    type StablePtr = OptionArgListParenthesizedPtr<'db>;
3813    type Green = OptionArgListParenthesizedGreen<'db>;
3814    fn missing(db: &'db dyn Database) -> Self::Green {
3815        panic!("No missing variant.");
3816    }
3817    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3818        let kind = node.kind(db);
3819        match kind {
3820            SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3821                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3822            ),
3823            SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3824                ArgListParenthesized::from_syntax_node(db, node),
3825            ),
3826            _ => panic!(
3827                "Unexpected syntax kind {:?} when constructing {}.",
3828                kind, "OptionArgListParenthesized"
3829            ),
3830        }
3831    }
3832    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3833        let kind = node.kind(db);
3834        match kind {
3835            SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3836                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3837            )),
3838            SyntaxKind::ArgListParenthesized => {
3839                Some(OptionArgListParenthesized::ArgListParenthesized(
3840                    ArgListParenthesized::from_syntax_node(db, node),
3841                ))
3842            }
3843            _ => None,
3844        }
3845    }
3846    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3847        match self {
3848            OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3849            OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3850        }
3851    }
3852    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3853        OptionArgListParenthesizedPtr(self.as_syntax_node().long(db).stable_ptr)
3854    }
3855}
3856impl<'db> OptionArgListParenthesized<'db> {
3857    /// Checks if a kind of a variant of [OptionArgListParenthesized].
3858    pub fn is_variant(kind: SyntaxKind) -> bool {
3859        matches!(
3860            kind,
3861            SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3862        )
3863    }
3864}
3865#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3866pub struct OptionArgListParenthesizedEmpty<'db> {
3867    node: SyntaxNode<'db>,
3868}
3869impl<'db> OptionArgListParenthesizedEmpty<'db> {
3870    pub fn new_green(db: &'db dyn Database) -> OptionArgListParenthesizedEmptyGreen<'db> {
3871        let children = [];
3872        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3873        OptionArgListParenthesizedEmptyGreen(
3874            GreenNode {
3875                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3876                details: GreenNodeDetails::Node { children: children.into(), width },
3877            }
3878            .intern(db),
3879        )
3880    }
3881}
3882impl<'db> OptionArgListParenthesizedEmpty<'db> {}
3883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3884pub struct OptionArgListParenthesizedEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
3885impl<'db> OptionArgListParenthesizedEmptyPtr<'db> {}
3886impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedEmptyPtr<'db> {
3887    type SyntaxNode = OptionArgListParenthesizedEmpty<'db>;
3888    fn untyped(self) -> SyntaxStablePtrId<'db> {
3889        self.0
3890    }
3891    fn lookup(&self, db: &'db dyn Database) -> OptionArgListParenthesizedEmpty<'db> {
3892        OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3893    }
3894}
3895impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
3896    fn from(ptr: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3897        ptr.untyped()
3898    }
3899}
3900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3901pub struct OptionArgListParenthesizedEmptyGreen<'db>(pub GreenId<'db>);
3902impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesizedEmpty<'db> {
3903    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3904    type StablePtr = OptionArgListParenthesizedEmptyPtr<'db>;
3905    type Green = OptionArgListParenthesizedEmptyGreen<'db>;
3906    fn missing(db: &'db dyn Database) -> Self::Green {
3907        OptionArgListParenthesizedEmptyGreen(
3908            GreenNode {
3909                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3910                details: GreenNodeDetails::Node {
3911                    children: [].into(),
3912                    width: TextWidth::default(),
3913                },
3914            }
3915            .intern(db),
3916        )
3917    }
3918    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3919        let kind = node.kind(db);
3920        assert_eq!(
3921            kind,
3922            SyntaxKind::OptionArgListParenthesizedEmpty,
3923            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3924            kind,
3925            SyntaxKind::OptionArgListParenthesizedEmpty
3926        );
3927        Self { node }
3928    }
3929    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3930        let kind = node.kind(db);
3931        if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3932            Some(Self::from_syntax_node(db, node))
3933        } else {
3934            None
3935        }
3936    }
3937    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3938        self.node
3939    }
3940    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3941        OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3942    }
3943}
3944#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3945pub struct ExprStructCtorCall<'db> {
3946    node: SyntaxNode<'db>,
3947}
3948impl<'db> ExprStructCtorCall<'db> {
3949    pub const INDEX_PATH: usize = 0;
3950    pub const INDEX_ARGUMENTS: usize = 1;
3951    pub fn new_green(
3952        db: &'db dyn Database,
3953        path: ExprPathGreen<'db>,
3954        arguments: StructArgListBracedGreen<'db>,
3955    ) -> ExprStructCtorCallGreen<'db> {
3956        let children = [path.0, arguments.0];
3957        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3958        ExprStructCtorCallGreen(
3959            GreenNode {
3960                kind: SyntaxKind::ExprStructCtorCall,
3961                details: GreenNodeDetails::Node { children: children.into(), width },
3962            }
3963            .intern(db),
3964        )
3965    }
3966}
3967impl<'db> ExprStructCtorCall<'db> {
3968    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3969        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3970    }
3971    pub fn arguments(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
3972        StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
3973    }
3974}
3975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3976pub struct ExprStructCtorCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3977impl<'db> ExprStructCtorCallPtr<'db> {}
3978impl<'db> TypedStablePtr<'db> for ExprStructCtorCallPtr<'db> {
3979    type SyntaxNode = ExprStructCtorCall<'db>;
3980    fn untyped(self) -> SyntaxStablePtrId<'db> {
3981        self.0
3982    }
3983    fn lookup(&self, db: &'db dyn Database) -> ExprStructCtorCall<'db> {
3984        ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
3985    }
3986}
3987impl<'db> From<ExprStructCtorCallPtr<'db>> for SyntaxStablePtrId<'db> {
3988    fn from(ptr: ExprStructCtorCallPtr<'db>) -> Self {
3989        ptr.untyped()
3990    }
3991}
3992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3993pub struct ExprStructCtorCallGreen<'db>(pub GreenId<'db>);
3994impl<'db> TypedSyntaxNode<'db> for ExprStructCtorCall<'db> {
3995    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
3996    type StablePtr = ExprStructCtorCallPtr<'db>;
3997    type Green = ExprStructCtorCallGreen<'db>;
3998    fn missing(db: &'db dyn Database) -> Self::Green {
3999        ExprStructCtorCallGreen(
4000            GreenNode {
4001                kind: SyntaxKind::ExprStructCtorCall,
4002                details: GreenNodeDetails::Node {
4003                    children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4004                    width: TextWidth::default(),
4005                },
4006            }
4007            .intern(db),
4008        )
4009    }
4010    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4011        let kind = node.kind(db);
4012        assert_eq!(
4013            kind,
4014            SyntaxKind::ExprStructCtorCall,
4015            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4016            kind,
4017            SyntaxKind::ExprStructCtorCall
4018        );
4019        Self { node }
4020    }
4021    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4022        let kind = node.kind(db);
4023        if kind == SyntaxKind::ExprStructCtorCall {
4024            Some(Self::from_syntax_node(db, node))
4025        } else {
4026            None
4027        }
4028    }
4029    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4030        self.node
4031    }
4032    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4033        ExprStructCtorCallPtr(self.node.stable_ptr(db))
4034    }
4035}
4036#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4037pub struct StructArgListBraced<'db> {
4038    node: SyntaxNode<'db>,
4039}
4040impl<'db> StructArgListBraced<'db> {
4041    pub const INDEX_LBRACE: usize = 0;
4042    pub const INDEX_ARGUMENTS: usize = 1;
4043    pub const INDEX_RBRACE: usize = 2;
4044    pub fn new_green(
4045        db: &'db dyn Database,
4046        lbrace: TerminalLBraceGreen<'db>,
4047        arguments: StructArgListGreen<'db>,
4048        rbrace: TerminalRBraceGreen<'db>,
4049    ) -> StructArgListBracedGreen<'db> {
4050        let children = [lbrace.0, arguments.0, rbrace.0];
4051        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4052        StructArgListBracedGreen(
4053            GreenNode {
4054                kind: SyntaxKind::StructArgListBraced,
4055                details: GreenNodeDetails::Node { children: children.into(), width },
4056            }
4057            .intern(db),
4058        )
4059    }
4060}
4061impl<'db> StructArgListBraced<'db> {
4062    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4063        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4064    }
4065    pub fn arguments(&self, db: &'db dyn Database) -> StructArgList<'db> {
4066        StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4067    }
4068    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4069        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4070    }
4071}
4072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4073pub struct StructArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
4074impl<'db> StructArgListBracedPtr<'db> {}
4075impl<'db> TypedStablePtr<'db> for StructArgListBracedPtr<'db> {
4076    type SyntaxNode = StructArgListBraced<'db>;
4077    fn untyped(self) -> SyntaxStablePtrId<'db> {
4078        self.0
4079    }
4080    fn lookup(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4081        StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4082    }
4083}
4084impl<'db> From<StructArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
4085    fn from(ptr: StructArgListBracedPtr<'db>) -> Self {
4086        ptr.untyped()
4087    }
4088}
4089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4090pub struct StructArgListBracedGreen<'db>(pub GreenId<'db>);
4091impl<'db> TypedSyntaxNode<'db> for StructArgListBraced<'db> {
4092    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4093    type StablePtr = StructArgListBracedPtr<'db>;
4094    type Green = StructArgListBracedGreen<'db>;
4095    fn missing(db: &'db dyn Database) -> Self::Green {
4096        StructArgListBracedGreen(
4097            GreenNode {
4098                kind: SyntaxKind::StructArgListBraced,
4099                details: GreenNodeDetails::Node {
4100                    children: [
4101                        TerminalLBrace::missing(db).0,
4102                        StructArgList::missing(db).0,
4103                        TerminalRBrace::missing(db).0,
4104                    ]
4105                    .into(),
4106                    width: TextWidth::default(),
4107                },
4108            }
4109            .intern(db),
4110        )
4111    }
4112    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4113        let kind = node.kind(db);
4114        assert_eq!(
4115            kind,
4116            SyntaxKind::StructArgListBraced,
4117            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4118            kind,
4119            SyntaxKind::StructArgListBraced
4120        );
4121        Self { node }
4122    }
4123    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4124        let kind = node.kind(db);
4125        if kind == SyntaxKind::StructArgListBraced {
4126            Some(Self::from_syntax_node(db, node))
4127        } else {
4128            None
4129        }
4130    }
4131    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4132        self.node
4133    }
4134    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4135        StructArgListBracedPtr(self.node.stable_ptr(db))
4136    }
4137}
4138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4139pub struct ExprBlock<'db> {
4140    node: SyntaxNode<'db>,
4141}
4142impl<'db> ExprBlock<'db> {
4143    pub const INDEX_LBRACE: usize = 0;
4144    pub const INDEX_STATEMENTS: usize = 1;
4145    pub const INDEX_RBRACE: usize = 2;
4146    pub fn new_green(
4147        db: &'db dyn Database,
4148        lbrace: TerminalLBraceGreen<'db>,
4149        statements: StatementListGreen<'db>,
4150        rbrace: TerminalRBraceGreen<'db>,
4151    ) -> ExprBlockGreen<'db> {
4152        let children = [lbrace.0, statements.0, rbrace.0];
4153        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4154        ExprBlockGreen(
4155            GreenNode {
4156                kind: SyntaxKind::ExprBlock,
4157                details: GreenNodeDetails::Node { children: children.into(), width },
4158            }
4159            .intern(db),
4160        )
4161    }
4162}
4163impl<'db> ExprBlock<'db> {
4164    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4165        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4166    }
4167    pub fn statements(&self, db: &'db dyn Database) -> StatementList<'db> {
4168        StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4169    }
4170    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4171        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4172    }
4173}
4174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4175pub struct ExprBlockPtr<'db>(pub SyntaxStablePtrId<'db>);
4176impl<'db> ExprBlockPtr<'db> {}
4177impl<'db> TypedStablePtr<'db> for ExprBlockPtr<'db> {
4178    type SyntaxNode = ExprBlock<'db>;
4179    fn untyped(self) -> SyntaxStablePtrId<'db> {
4180        self.0
4181    }
4182    fn lookup(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4183        ExprBlock::from_syntax_node(db, self.0.lookup(db))
4184    }
4185}
4186impl<'db> From<ExprBlockPtr<'db>> for SyntaxStablePtrId<'db> {
4187    fn from(ptr: ExprBlockPtr<'db>) -> Self {
4188        ptr.untyped()
4189    }
4190}
4191#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4192pub struct ExprBlockGreen<'db>(pub GreenId<'db>);
4193impl<'db> TypedSyntaxNode<'db> for ExprBlock<'db> {
4194    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4195    type StablePtr = ExprBlockPtr<'db>;
4196    type Green = ExprBlockGreen<'db>;
4197    fn missing(db: &'db dyn Database) -> Self::Green {
4198        ExprBlockGreen(
4199            GreenNode {
4200                kind: SyntaxKind::ExprBlock,
4201                details: GreenNodeDetails::Node {
4202                    children: [
4203                        TerminalLBrace::missing(db).0,
4204                        StatementList::missing(db).0,
4205                        TerminalRBrace::missing(db).0,
4206                    ]
4207                    .into(),
4208                    width: TextWidth::default(),
4209                },
4210            }
4211            .intern(db),
4212        )
4213    }
4214    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4215        let kind = node.kind(db);
4216        assert_eq!(
4217            kind,
4218            SyntaxKind::ExprBlock,
4219            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4220            kind,
4221            SyntaxKind::ExprBlock
4222        );
4223        Self { node }
4224    }
4225    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4226        let kind = node.kind(db);
4227        if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4228    }
4229    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4230        self.node
4231    }
4232    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4233        ExprBlockPtr(self.node.stable_ptr(db))
4234    }
4235}
4236#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4237pub struct ExprMatch<'db> {
4238    node: SyntaxNode<'db>,
4239}
4240impl<'db> ExprMatch<'db> {
4241    pub const INDEX_MATCH_KW: usize = 0;
4242    pub const INDEX_EXPR: usize = 1;
4243    pub const INDEX_LBRACE: usize = 2;
4244    pub const INDEX_ARMS: usize = 3;
4245    pub const INDEX_RBRACE: usize = 4;
4246    pub fn new_green(
4247        db: &'db dyn Database,
4248        match_kw: TerminalMatchGreen<'db>,
4249        expr: ExprGreen<'db>,
4250        lbrace: TerminalLBraceGreen<'db>,
4251        arms: MatchArmsGreen<'db>,
4252        rbrace: TerminalRBraceGreen<'db>,
4253    ) -> ExprMatchGreen<'db> {
4254        let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4255        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4256        ExprMatchGreen(
4257            GreenNode {
4258                kind: SyntaxKind::ExprMatch,
4259                details: GreenNodeDetails::Node { children: children.into(), width },
4260            }
4261            .intern(db),
4262        )
4263    }
4264}
4265impl<'db> ExprMatch<'db> {
4266    pub fn match_kw(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
4267        TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4268    }
4269    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4270        Expr::from_syntax_node(db, self.node.get_children(db)[1])
4271    }
4272    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4273        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4274    }
4275    pub fn arms(&self, db: &'db dyn Database) -> MatchArms<'db> {
4276        MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4277    }
4278    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4279        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4280    }
4281}
4282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4283pub struct ExprMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
4284impl<'db> ExprMatchPtr<'db> {}
4285impl<'db> TypedStablePtr<'db> for ExprMatchPtr<'db> {
4286    type SyntaxNode = ExprMatch<'db>;
4287    fn untyped(self) -> SyntaxStablePtrId<'db> {
4288        self.0
4289    }
4290    fn lookup(&self, db: &'db dyn Database) -> ExprMatch<'db> {
4291        ExprMatch::from_syntax_node(db, self.0.lookup(db))
4292    }
4293}
4294impl<'db> From<ExprMatchPtr<'db>> for SyntaxStablePtrId<'db> {
4295    fn from(ptr: ExprMatchPtr<'db>) -> Self {
4296        ptr.untyped()
4297    }
4298}
4299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4300pub struct ExprMatchGreen<'db>(pub GreenId<'db>);
4301impl<'db> TypedSyntaxNode<'db> for ExprMatch<'db> {
4302    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4303    type StablePtr = ExprMatchPtr<'db>;
4304    type Green = ExprMatchGreen<'db>;
4305    fn missing(db: &'db dyn Database) -> Self::Green {
4306        ExprMatchGreen(
4307            GreenNode {
4308                kind: SyntaxKind::ExprMatch,
4309                details: GreenNodeDetails::Node {
4310                    children: [
4311                        TerminalMatch::missing(db).0,
4312                        Expr::missing(db).0,
4313                        TerminalLBrace::missing(db).0,
4314                        MatchArms::missing(db).0,
4315                        TerminalRBrace::missing(db).0,
4316                    ]
4317                    .into(),
4318                    width: TextWidth::default(),
4319                },
4320            }
4321            .intern(db),
4322        )
4323    }
4324    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4325        let kind = node.kind(db);
4326        assert_eq!(
4327            kind,
4328            SyntaxKind::ExprMatch,
4329            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4330            kind,
4331            SyntaxKind::ExprMatch
4332        );
4333        Self { node }
4334    }
4335    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4336        let kind = node.kind(db);
4337        if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4338    }
4339    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4340        self.node
4341    }
4342    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4343        ExprMatchPtr(self.node.stable_ptr(db))
4344    }
4345}
4346#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4347pub struct MatchArms<'db>(ElementList<'db, MatchArm<'db>, 2>);
4348impl<'db> Deref for MatchArms<'db> {
4349    type Target = ElementList<'db, MatchArm<'db>, 2>;
4350    fn deref(&self) -> &Self::Target {
4351        &self.0
4352    }
4353}
4354impl<'db> MatchArms<'db> {
4355    pub fn new_green(
4356        db: &'db dyn Database,
4357        children: &[MatchArmsElementOrSeparatorGreen<'db>],
4358    ) -> MatchArmsGreen<'db> {
4359        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4360        MatchArmsGreen(
4361            GreenNode {
4362                kind: SyntaxKind::MatchArms,
4363                details: GreenNodeDetails::Node {
4364                    children: children.iter().map(|x| x.id()).collect(),
4365                    width,
4366                },
4367            }
4368            .intern(db),
4369        )
4370    }
4371}
4372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4373pub struct MatchArmsPtr<'db>(pub SyntaxStablePtrId<'db>);
4374impl<'db> TypedStablePtr<'db> for MatchArmsPtr<'db> {
4375    type SyntaxNode = MatchArms<'db>;
4376    fn untyped(self) -> SyntaxStablePtrId<'db> {
4377        self.0
4378    }
4379    fn lookup(&self, db: &'db dyn Database) -> MatchArms<'db> {
4380        MatchArms::from_syntax_node(db, self.0.lookup(db))
4381    }
4382}
4383impl<'db> From<MatchArmsPtr<'db>> for SyntaxStablePtrId<'db> {
4384    fn from(ptr: MatchArmsPtr<'db>) -> Self {
4385        ptr.untyped()
4386    }
4387}
4388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4389pub enum MatchArmsElementOrSeparatorGreen<'db> {
4390    Separator(TerminalCommaGreen<'db>),
4391    Element(MatchArmGreen<'db>),
4392}
4393impl<'db> From<TerminalCommaGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4394    fn from(value: TerminalCommaGreen<'db>) -> Self {
4395        MatchArmsElementOrSeparatorGreen::Separator(value)
4396    }
4397}
4398impl<'db> From<MatchArmGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4399    fn from(value: MatchArmGreen<'db>) -> Self {
4400        MatchArmsElementOrSeparatorGreen::Element(value)
4401    }
4402}
4403impl<'db> MatchArmsElementOrSeparatorGreen<'db> {
4404    fn id(&self) -> GreenId<'db> {
4405        match self {
4406            MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4407            MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4408        }
4409    }
4410}
4411#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4412pub struct MatchArmsGreen<'db>(pub GreenId<'db>);
4413impl<'db> TypedSyntaxNode<'db> for MatchArms<'db> {
4414    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4415    type StablePtr = MatchArmsPtr<'db>;
4416    type Green = MatchArmsGreen<'db>;
4417    fn missing(db: &'db dyn Database) -> Self::Green {
4418        MatchArmsGreen(
4419            GreenNode {
4420                kind: SyntaxKind::MatchArms,
4421                details: GreenNodeDetails::Node {
4422                    children: [].into(),
4423                    width: TextWidth::default(),
4424                },
4425            }
4426            .intern(db),
4427        )
4428    }
4429    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4430        Self(ElementList::new(node))
4431    }
4432    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4433        if node.kind(db) == SyntaxKind::MatchArms {
4434            Some(Self(ElementList::new(node)))
4435        } else {
4436            None
4437        }
4438    }
4439    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4440        self.node
4441    }
4442    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4443        MatchArmsPtr(self.node.stable_ptr(db))
4444    }
4445}
4446#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4447pub struct MatchArm<'db> {
4448    node: SyntaxNode<'db>,
4449}
4450impl<'db> MatchArm<'db> {
4451    pub const INDEX_PATTERNS: usize = 0;
4452    pub const INDEX_ARROW: usize = 1;
4453    pub const INDEX_EXPRESSION: usize = 2;
4454    pub fn new_green(
4455        db: &'db dyn Database,
4456        patterns: PatternListOrGreen<'db>,
4457        arrow: TerminalMatchArrowGreen<'db>,
4458        expression: ExprGreen<'db>,
4459    ) -> MatchArmGreen<'db> {
4460        let children = [patterns.0, arrow.0, expression.0];
4461        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4462        MatchArmGreen(
4463            GreenNode {
4464                kind: SyntaxKind::MatchArm,
4465                details: GreenNodeDetails::Node { children: children.into(), width },
4466            }
4467            .intern(db),
4468        )
4469    }
4470}
4471impl<'db> MatchArm<'db> {
4472    pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4473        PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4474    }
4475    pub fn arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
4476        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4477    }
4478    pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
4479        Expr::from_syntax_node(db, self.node.get_children(db)[2])
4480    }
4481}
4482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4483pub struct MatchArmPtr<'db>(pub SyntaxStablePtrId<'db>);
4484impl<'db> MatchArmPtr<'db> {}
4485impl<'db> TypedStablePtr<'db> for MatchArmPtr<'db> {
4486    type SyntaxNode = MatchArm<'db>;
4487    fn untyped(self) -> SyntaxStablePtrId<'db> {
4488        self.0
4489    }
4490    fn lookup(&self, db: &'db dyn Database) -> MatchArm<'db> {
4491        MatchArm::from_syntax_node(db, self.0.lookup(db))
4492    }
4493}
4494impl<'db> From<MatchArmPtr<'db>> for SyntaxStablePtrId<'db> {
4495    fn from(ptr: MatchArmPtr<'db>) -> Self {
4496        ptr.untyped()
4497    }
4498}
4499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4500pub struct MatchArmGreen<'db>(pub GreenId<'db>);
4501impl<'db> TypedSyntaxNode<'db> for MatchArm<'db> {
4502    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4503    type StablePtr = MatchArmPtr<'db>;
4504    type Green = MatchArmGreen<'db>;
4505    fn missing(db: &'db dyn Database) -> Self::Green {
4506        MatchArmGreen(
4507            GreenNode {
4508                kind: SyntaxKind::MatchArm,
4509                details: GreenNodeDetails::Node {
4510                    children: [
4511                        PatternListOr::missing(db).0,
4512                        TerminalMatchArrow::missing(db).0,
4513                        Expr::missing(db).0,
4514                    ]
4515                    .into(),
4516                    width: TextWidth::default(),
4517                },
4518            }
4519            .intern(db),
4520        )
4521    }
4522    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4523        let kind = node.kind(db);
4524        assert_eq!(
4525            kind,
4526            SyntaxKind::MatchArm,
4527            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4528            kind,
4529            SyntaxKind::MatchArm
4530        );
4531        Self { node }
4532    }
4533    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4534        let kind = node.kind(db);
4535        if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4536    }
4537    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4538        self.node
4539    }
4540    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4541        MatchArmPtr(self.node.stable_ptr(db))
4542    }
4543}
4544#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4545pub struct ExprIf<'db> {
4546    node: SyntaxNode<'db>,
4547}
4548impl<'db> ExprIf<'db> {
4549    pub const INDEX_IF_KW: usize = 0;
4550    pub const INDEX_CONDITIONS: usize = 1;
4551    pub const INDEX_IF_BLOCK: usize = 2;
4552    pub const INDEX_ELSE_CLAUSE: usize = 3;
4553    pub fn new_green(
4554        db: &'db dyn Database,
4555        if_kw: TerminalIfGreen<'db>,
4556        conditions: ConditionListAndGreen<'db>,
4557        if_block: ExprBlockGreen<'db>,
4558        else_clause: OptionElseClauseGreen<'db>,
4559    ) -> ExprIfGreen<'db> {
4560        let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4561        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4562        ExprIfGreen(
4563            GreenNode {
4564                kind: SyntaxKind::ExprIf,
4565                details: GreenNodeDetails::Node { children: children.into(), width },
4566            }
4567            .intern(db),
4568        )
4569    }
4570}
4571impl<'db> ExprIf<'db> {
4572    pub fn if_kw(&self, db: &'db dyn Database) -> TerminalIf<'db> {
4573        TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4574    }
4575    pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4576        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4577    }
4578    pub fn if_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4579        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4580    }
4581    pub fn else_clause(&self, db: &'db dyn Database) -> OptionElseClause<'db> {
4582        OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4583    }
4584}
4585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4586pub struct ExprIfPtr<'db>(pub SyntaxStablePtrId<'db>);
4587impl<'db> ExprIfPtr<'db> {}
4588impl<'db> TypedStablePtr<'db> for ExprIfPtr<'db> {
4589    type SyntaxNode = ExprIf<'db>;
4590    fn untyped(self) -> SyntaxStablePtrId<'db> {
4591        self.0
4592    }
4593    fn lookup(&self, db: &'db dyn Database) -> ExprIf<'db> {
4594        ExprIf::from_syntax_node(db, self.0.lookup(db))
4595    }
4596}
4597impl<'db> From<ExprIfPtr<'db>> for SyntaxStablePtrId<'db> {
4598    fn from(ptr: ExprIfPtr<'db>) -> Self {
4599        ptr.untyped()
4600    }
4601}
4602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4603pub struct ExprIfGreen<'db>(pub GreenId<'db>);
4604impl<'db> TypedSyntaxNode<'db> for ExprIf<'db> {
4605    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4606    type StablePtr = ExprIfPtr<'db>;
4607    type Green = ExprIfGreen<'db>;
4608    fn missing(db: &'db dyn Database) -> Self::Green {
4609        ExprIfGreen(
4610            GreenNode {
4611                kind: SyntaxKind::ExprIf,
4612                details: GreenNodeDetails::Node {
4613                    children: [
4614                        TerminalIf::missing(db).0,
4615                        ConditionListAnd::missing(db).0,
4616                        ExprBlock::missing(db).0,
4617                        OptionElseClause::missing(db).0,
4618                    ]
4619                    .into(),
4620                    width: TextWidth::default(),
4621                },
4622            }
4623            .intern(db),
4624        )
4625    }
4626    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4627        let kind = node.kind(db);
4628        assert_eq!(
4629            kind,
4630            SyntaxKind::ExprIf,
4631            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4632            kind,
4633            SyntaxKind::ExprIf
4634        );
4635        Self { node }
4636    }
4637    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4638        let kind = node.kind(db);
4639        if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4640    }
4641    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4642        self.node
4643    }
4644    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4645        ExprIfPtr(self.node.stable_ptr(db))
4646    }
4647}
4648#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4649pub struct ConditionListAnd<'db>(ElementList<'db, Condition<'db>, 2>);
4650impl<'db> Deref for ConditionListAnd<'db> {
4651    type Target = ElementList<'db, Condition<'db>, 2>;
4652    fn deref(&self) -> &Self::Target {
4653        &self.0
4654    }
4655}
4656impl<'db> ConditionListAnd<'db> {
4657    pub fn new_green(
4658        db: &'db dyn Database,
4659        children: &[ConditionListAndElementOrSeparatorGreen<'db>],
4660    ) -> ConditionListAndGreen<'db> {
4661        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4662        ConditionListAndGreen(
4663            GreenNode {
4664                kind: SyntaxKind::ConditionListAnd,
4665                details: GreenNodeDetails::Node {
4666                    children: children.iter().map(|x| x.id()).collect(),
4667                    width,
4668                },
4669            }
4670            .intern(db),
4671        )
4672    }
4673}
4674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4675pub struct ConditionListAndPtr<'db>(pub SyntaxStablePtrId<'db>);
4676impl<'db> TypedStablePtr<'db> for ConditionListAndPtr<'db> {
4677    type SyntaxNode = ConditionListAnd<'db>;
4678    fn untyped(self) -> SyntaxStablePtrId<'db> {
4679        self.0
4680    }
4681    fn lookup(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4682        ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4683    }
4684}
4685impl<'db> From<ConditionListAndPtr<'db>> for SyntaxStablePtrId<'db> {
4686    fn from(ptr: ConditionListAndPtr<'db>) -> Self {
4687        ptr.untyped()
4688    }
4689}
4690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4691pub enum ConditionListAndElementOrSeparatorGreen<'db> {
4692    Separator(TerminalAndAndGreen<'db>),
4693    Element(ConditionGreen<'db>),
4694}
4695impl<'db> From<TerminalAndAndGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4696    fn from(value: TerminalAndAndGreen<'db>) -> Self {
4697        ConditionListAndElementOrSeparatorGreen::Separator(value)
4698    }
4699}
4700impl<'db> From<ConditionGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4701    fn from(value: ConditionGreen<'db>) -> Self {
4702        ConditionListAndElementOrSeparatorGreen::Element(value)
4703    }
4704}
4705impl<'db> ConditionListAndElementOrSeparatorGreen<'db> {
4706    fn id(&self) -> GreenId<'db> {
4707        match self {
4708            ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4709            ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4710        }
4711    }
4712}
4713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4714pub struct ConditionListAndGreen<'db>(pub GreenId<'db>);
4715impl<'db> TypedSyntaxNode<'db> for ConditionListAnd<'db> {
4716    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4717    type StablePtr = ConditionListAndPtr<'db>;
4718    type Green = ConditionListAndGreen<'db>;
4719    fn missing(db: &'db dyn Database) -> Self::Green {
4720        ConditionListAndGreen(
4721            GreenNode {
4722                kind: SyntaxKind::ConditionListAnd,
4723                details: GreenNodeDetails::Node {
4724                    children: [].into(),
4725                    width: TextWidth::default(),
4726                },
4727            }
4728            .intern(db),
4729        )
4730    }
4731    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4732        Self(ElementList::new(node))
4733    }
4734    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4735        if node.kind(db) == SyntaxKind::ConditionListAnd {
4736            Some(Self(ElementList::new(node)))
4737        } else {
4738            None
4739        }
4740    }
4741    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4742        self.node
4743    }
4744    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4745        ConditionListAndPtr(self.node.stable_ptr(db))
4746    }
4747}
4748#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4749pub enum Condition<'db> {
4750    Let(ConditionLet<'db>),
4751    Expr(ConditionExpr<'db>),
4752}
4753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4754pub struct ConditionPtr<'db>(pub SyntaxStablePtrId<'db>);
4755impl<'db> TypedStablePtr<'db> for ConditionPtr<'db> {
4756    type SyntaxNode = Condition<'db>;
4757    fn untyped(self) -> SyntaxStablePtrId<'db> {
4758        self.0
4759    }
4760    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
4761        Condition::from_syntax_node(db, self.0.lookup(db))
4762    }
4763}
4764impl<'db> From<ConditionPtr<'db>> for SyntaxStablePtrId<'db> {
4765    fn from(ptr: ConditionPtr<'db>) -> Self {
4766        ptr.untyped()
4767    }
4768}
4769impl<'db> From<ConditionLetPtr<'db>> for ConditionPtr<'db> {
4770    fn from(value: ConditionLetPtr<'db>) -> Self {
4771        Self(value.0)
4772    }
4773}
4774impl<'db> From<ConditionExprPtr<'db>> for ConditionPtr<'db> {
4775    fn from(value: ConditionExprPtr<'db>) -> Self {
4776        Self(value.0)
4777    }
4778}
4779impl<'db> From<ConditionLetGreen<'db>> for ConditionGreen<'db> {
4780    fn from(value: ConditionLetGreen<'db>) -> Self {
4781        Self(value.0)
4782    }
4783}
4784impl<'db> From<ConditionExprGreen<'db>> for ConditionGreen<'db> {
4785    fn from(value: ConditionExprGreen<'db>) -> Self {
4786        Self(value.0)
4787    }
4788}
4789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4790pub struct ConditionGreen<'db>(pub GreenId<'db>);
4791impl<'db> TypedSyntaxNode<'db> for Condition<'db> {
4792    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4793    type StablePtr = ConditionPtr<'db>;
4794    type Green = ConditionGreen<'db>;
4795    fn missing(db: &'db dyn Database) -> Self::Green {
4796        panic!("No missing variant.");
4797    }
4798    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4799        let kind = node.kind(db);
4800        match kind {
4801            SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4802            SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4803            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4804        }
4805    }
4806    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4807        let kind = node.kind(db);
4808        match kind {
4809            SyntaxKind::ConditionLet => {
4810                Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4811            }
4812            SyntaxKind::ConditionExpr => {
4813                Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4814            }
4815            _ => None,
4816        }
4817    }
4818    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4819        match self {
4820            Condition::Let(x) => x.as_syntax_node(),
4821            Condition::Expr(x) => x.as_syntax_node(),
4822        }
4823    }
4824    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4825        ConditionPtr(self.as_syntax_node().long(db).stable_ptr)
4826    }
4827}
4828impl<'db> Condition<'db> {
4829    /// Checks if a kind of a variant of [Condition].
4830    pub fn is_variant(kind: SyntaxKind) -> bool {
4831        matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4832    }
4833}
4834#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4835pub struct ConditionLet<'db> {
4836    node: SyntaxNode<'db>,
4837}
4838impl<'db> ConditionLet<'db> {
4839    pub const INDEX_LET_KW: usize = 0;
4840    pub const INDEX_PATTERNS: usize = 1;
4841    pub const INDEX_EQ: usize = 2;
4842    pub const INDEX_EXPR: usize = 3;
4843    pub fn new_green(
4844        db: &'db dyn Database,
4845        let_kw: TerminalLetGreen<'db>,
4846        patterns: PatternListOrGreen<'db>,
4847        eq: TerminalEqGreen<'db>,
4848        expr: ExprGreen<'db>,
4849    ) -> ConditionLetGreen<'db> {
4850        let children = [let_kw.0, patterns.0, eq.0, expr.0];
4851        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4852        ConditionLetGreen(
4853            GreenNode {
4854                kind: SyntaxKind::ConditionLet,
4855                details: GreenNodeDetails::Node { children: children.into(), width },
4856            }
4857            .intern(db),
4858        )
4859    }
4860}
4861impl<'db> ConditionLet<'db> {
4862    pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
4863        TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4864    }
4865    pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4866        PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4867    }
4868    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
4869        TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4870    }
4871    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4872        Expr::from_syntax_node(db, self.node.get_children(db)[3])
4873    }
4874}
4875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4876pub struct ConditionLetPtr<'db>(pub SyntaxStablePtrId<'db>);
4877impl<'db> ConditionLetPtr<'db> {}
4878impl<'db> TypedStablePtr<'db> for ConditionLetPtr<'db> {
4879    type SyntaxNode = ConditionLet<'db>;
4880    fn untyped(self) -> SyntaxStablePtrId<'db> {
4881        self.0
4882    }
4883    fn lookup(&self, db: &'db dyn Database) -> ConditionLet<'db> {
4884        ConditionLet::from_syntax_node(db, self.0.lookup(db))
4885    }
4886}
4887impl<'db> From<ConditionLetPtr<'db>> for SyntaxStablePtrId<'db> {
4888    fn from(ptr: ConditionLetPtr<'db>) -> Self {
4889        ptr.untyped()
4890    }
4891}
4892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4893pub struct ConditionLetGreen<'db>(pub GreenId<'db>);
4894impl<'db> TypedSyntaxNode<'db> for ConditionLet<'db> {
4895    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4896    type StablePtr = ConditionLetPtr<'db>;
4897    type Green = ConditionLetGreen<'db>;
4898    fn missing(db: &'db dyn Database) -> Self::Green {
4899        ConditionLetGreen(
4900            GreenNode {
4901                kind: SyntaxKind::ConditionLet,
4902                details: GreenNodeDetails::Node {
4903                    children: [
4904                        TerminalLet::missing(db).0,
4905                        PatternListOr::missing(db).0,
4906                        TerminalEq::missing(db).0,
4907                        Expr::missing(db).0,
4908                    ]
4909                    .into(),
4910                    width: TextWidth::default(),
4911                },
4912            }
4913            .intern(db),
4914        )
4915    }
4916    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4917        let kind = node.kind(db);
4918        assert_eq!(
4919            kind,
4920            SyntaxKind::ConditionLet,
4921            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4922            kind,
4923            SyntaxKind::ConditionLet
4924        );
4925        Self { node }
4926    }
4927    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4928        let kind = node.kind(db);
4929        if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4930    }
4931    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4932        self.node
4933    }
4934    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4935        ConditionLetPtr(self.node.stable_ptr(db))
4936    }
4937}
4938#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4939pub struct ConditionExpr<'db> {
4940    node: SyntaxNode<'db>,
4941}
4942impl<'db> ConditionExpr<'db> {
4943    pub const INDEX_EXPR: usize = 0;
4944    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ConditionExprGreen<'db> {
4945        let children = [expr.0];
4946        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4947        ConditionExprGreen(
4948            GreenNode {
4949                kind: SyntaxKind::ConditionExpr,
4950                details: GreenNodeDetails::Node { children: children.into(), width },
4951            }
4952            .intern(db),
4953        )
4954    }
4955}
4956impl<'db> ConditionExpr<'db> {
4957    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4958        Expr::from_syntax_node(db, self.node.get_children(db)[0])
4959    }
4960}
4961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4962pub struct ConditionExprPtr<'db>(pub SyntaxStablePtrId<'db>);
4963impl<'db> ConditionExprPtr<'db> {}
4964impl<'db> TypedStablePtr<'db> for ConditionExprPtr<'db> {
4965    type SyntaxNode = ConditionExpr<'db>;
4966    fn untyped(self) -> SyntaxStablePtrId<'db> {
4967        self.0
4968    }
4969    fn lookup(&self, db: &'db dyn Database) -> ConditionExpr<'db> {
4970        ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4971    }
4972}
4973impl<'db> From<ConditionExprPtr<'db>> for SyntaxStablePtrId<'db> {
4974    fn from(ptr: ConditionExprPtr<'db>) -> Self {
4975        ptr.untyped()
4976    }
4977}
4978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4979pub struct ConditionExprGreen<'db>(pub GreenId<'db>);
4980impl<'db> TypedSyntaxNode<'db> for ConditionExpr<'db> {
4981    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
4982    type StablePtr = ConditionExprPtr<'db>;
4983    type Green = ConditionExprGreen<'db>;
4984    fn missing(db: &'db dyn Database) -> Self::Green {
4985        ConditionExprGreen(
4986            GreenNode {
4987                kind: SyntaxKind::ConditionExpr,
4988                details: GreenNodeDetails::Node {
4989                    children: [Expr::missing(db).0].into(),
4990                    width: TextWidth::default(),
4991                },
4992            }
4993            .intern(db),
4994        )
4995    }
4996    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4997        let kind = node.kind(db);
4998        assert_eq!(
4999            kind,
5000            SyntaxKind::ConditionExpr,
5001            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5002            kind,
5003            SyntaxKind::ConditionExpr
5004        );
5005        Self { node }
5006    }
5007    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5008        let kind = node.kind(db);
5009        if kind == SyntaxKind::ConditionExpr {
5010            Some(Self::from_syntax_node(db, node))
5011        } else {
5012            None
5013        }
5014    }
5015    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5016        self.node
5017    }
5018    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5019        ConditionExprPtr(self.node.stable_ptr(db))
5020    }
5021}
5022#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5023pub enum BlockOrIf<'db> {
5024    Block(ExprBlock<'db>),
5025    If(ExprIf<'db>),
5026}
5027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5028pub struct BlockOrIfPtr<'db>(pub SyntaxStablePtrId<'db>);
5029impl<'db> TypedStablePtr<'db> for BlockOrIfPtr<'db> {
5030    type SyntaxNode = BlockOrIf<'db>;
5031    fn untyped(self) -> SyntaxStablePtrId<'db> {
5032        self.0
5033    }
5034    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5035        BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5036    }
5037}
5038impl<'db> From<BlockOrIfPtr<'db>> for SyntaxStablePtrId<'db> {
5039    fn from(ptr: BlockOrIfPtr<'db>) -> Self {
5040        ptr.untyped()
5041    }
5042}
5043impl<'db> From<ExprBlockPtr<'db>> for BlockOrIfPtr<'db> {
5044    fn from(value: ExprBlockPtr<'db>) -> Self {
5045        Self(value.0)
5046    }
5047}
5048impl<'db> From<ExprIfPtr<'db>> for BlockOrIfPtr<'db> {
5049    fn from(value: ExprIfPtr<'db>) -> Self {
5050        Self(value.0)
5051    }
5052}
5053impl<'db> From<ExprBlockGreen<'db>> for BlockOrIfGreen<'db> {
5054    fn from(value: ExprBlockGreen<'db>) -> Self {
5055        Self(value.0)
5056    }
5057}
5058impl<'db> From<ExprIfGreen<'db>> for BlockOrIfGreen<'db> {
5059    fn from(value: ExprIfGreen<'db>) -> Self {
5060        Self(value.0)
5061    }
5062}
5063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5064pub struct BlockOrIfGreen<'db>(pub GreenId<'db>);
5065impl<'db> TypedSyntaxNode<'db> for BlockOrIf<'db> {
5066    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5067    type StablePtr = BlockOrIfPtr<'db>;
5068    type Green = BlockOrIfGreen<'db>;
5069    fn missing(db: &'db dyn Database) -> Self::Green {
5070        panic!("No missing variant.");
5071    }
5072    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5073        let kind = node.kind(db);
5074        match kind {
5075            SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5076            SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5077            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5078        }
5079    }
5080    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5081        let kind = node.kind(db);
5082        match kind {
5083            SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5084            SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5085            _ => None,
5086        }
5087    }
5088    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5089        match self {
5090            BlockOrIf::Block(x) => x.as_syntax_node(),
5091            BlockOrIf::If(x) => x.as_syntax_node(),
5092        }
5093    }
5094    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5095        BlockOrIfPtr(self.as_syntax_node().long(db).stable_ptr)
5096    }
5097}
5098impl<'db> BlockOrIf<'db> {
5099    /// Checks if a kind of a variant of [BlockOrIf].
5100    pub fn is_variant(kind: SyntaxKind) -> bool {
5101        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5102    }
5103}
5104#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5105pub struct ExprLoop<'db> {
5106    node: SyntaxNode<'db>,
5107}
5108impl<'db> ExprLoop<'db> {
5109    pub const INDEX_LOOP_KW: usize = 0;
5110    pub const INDEX_BODY: usize = 1;
5111    pub fn new_green(
5112        db: &'db dyn Database,
5113        loop_kw: TerminalLoopGreen<'db>,
5114        body: ExprBlockGreen<'db>,
5115    ) -> ExprLoopGreen<'db> {
5116        let children = [loop_kw.0, body.0];
5117        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5118        ExprLoopGreen(
5119            GreenNode {
5120                kind: SyntaxKind::ExprLoop,
5121                details: GreenNodeDetails::Node { children: children.into(), width },
5122            }
5123            .intern(db),
5124        )
5125    }
5126}
5127impl<'db> ExprLoop<'db> {
5128    pub fn loop_kw(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
5129        TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5130    }
5131    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5132        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5133    }
5134}
5135#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5136pub struct ExprLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
5137impl<'db> ExprLoopPtr<'db> {}
5138impl<'db> TypedStablePtr<'db> for ExprLoopPtr<'db> {
5139    type SyntaxNode = ExprLoop<'db>;
5140    fn untyped(self) -> SyntaxStablePtrId<'db> {
5141        self.0
5142    }
5143    fn lookup(&self, db: &'db dyn Database) -> ExprLoop<'db> {
5144        ExprLoop::from_syntax_node(db, self.0.lookup(db))
5145    }
5146}
5147impl<'db> From<ExprLoopPtr<'db>> for SyntaxStablePtrId<'db> {
5148    fn from(ptr: ExprLoopPtr<'db>) -> Self {
5149        ptr.untyped()
5150    }
5151}
5152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5153pub struct ExprLoopGreen<'db>(pub GreenId<'db>);
5154impl<'db> TypedSyntaxNode<'db> for ExprLoop<'db> {
5155    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5156    type StablePtr = ExprLoopPtr<'db>;
5157    type Green = ExprLoopGreen<'db>;
5158    fn missing(db: &'db dyn Database) -> Self::Green {
5159        ExprLoopGreen(
5160            GreenNode {
5161                kind: SyntaxKind::ExprLoop,
5162                details: GreenNodeDetails::Node {
5163                    children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5164                    width: TextWidth::default(),
5165                },
5166            }
5167            .intern(db),
5168        )
5169    }
5170    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5171        let kind = node.kind(db);
5172        assert_eq!(
5173            kind,
5174            SyntaxKind::ExprLoop,
5175            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5176            kind,
5177            SyntaxKind::ExprLoop
5178        );
5179        Self { node }
5180    }
5181    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5182        let kind = node.kind(db);
5183        if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5184    }
5185    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5186        self.node
5187    }
5188    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5189        ExprLoopPtr(self.node.stable_ptr(db))
5190    }
5191}
5192#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5193pub struct ExprWhile<'db> {
5194    node: SyntaxNode<'db>,
5195}
5196impl<'db> ExprWhile<'db> {
5197    pub const INDEX_WHILE_KW: usize = 0;
5198    pub const INDEX_CONDITIONS: usize = 1;
5199    pub const INDEX_BODY: usize = 2;
5200    pub fn new_green(
5201        db: &'db dyn Database,
5202        while_kw: TerminalWhileGreen<'db>,
5203        conditions: ConditionListAndGreen<'db>,
5204        body: ExprBlockGreen<'db>,
5205    ) -> ExprWhileGreen<'db> {
5206        let children = [while_kw.0, conditions.0, body.0];
5207        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5208        ExprWhileGreen(
5209            GreenNode {
5210                kind: SyntaxKind::ExprWhile,
5211                details: GreenNodeDetails::Node { children: children.into(), width },
5212            }
5213            .intern(db),
5214        )
5215    }
5216}
5217impl<'db> ExprWhile<'db> {
5218    pub fn while_kw(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
5219        TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5220    }
5221    pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
5222        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5223    }
5224    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5225        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5226    }
5227}
5228#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5229pub struct ExprWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
5230impl<'db> ExprWhilePtr<'db> {}
5231impl<'db> TypedStablePtr<'db> for ExprWhilePtr<'db> {
5232    type SyntaxNode = ExprWhile<'db>;
5233    fn untyped(self) -> SyntaxStablePtrId<'db> {
5234        self.0
5235    }
5236    fn lookup(&self, db: &'db dyn Database) -> ExprWhile<'db> {
5237        ExprWhile::from_syntax_node(db, self.0.lookup(db))
5238    }
5239}
5240impl<'db> From<ExprWhilePtr<'db>> for SyntaxStablePtrId<'db> {
5241    fn from(ptr: ExprWhilePtr<'db>) -> Self {
5242        ptr.untyped()
5243    }
5244}
5245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5246pub struct ExprWhileGreen<'db>(pub GreenId<'db>);
5247impl<'db> TypedSyntaxNode<'db> for ExprWhile<'db> {
5248    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5249    type StablePtr = ExprWhilePtr<'db>;
5250    type Green = ExprWhileGreen<'db>;
5251    fn missing(db: &'db dyn Database) -> Self::Green {
5252        ExprWhileGreen(
5253            GreenNode {
5254                kind: SyntaxKind::ExprWhile,
5255                details: GreenNodeDetails::Node {
5256                    children: [
5257                        TerminalWhile::missing(db).0,
5258                        ConditionListAnd::missing(db).0,
5259                        ExprBlock::missing(db).0,
5260                    ]
5261                    .into(),
5262                    width: TextWidth::default(),
5263                },
5264            }
5265            .intern(db),
5266        )
5267    }
5268    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5269        let kind = node.kind(db);
5270        assert_eq!(
5271            kind,
5272            SyntaxKind::ExprWhile,
5273            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5274            kind,
5275            SyntaxKind::ExprWhile
5276        );
5277        Self { node }
5278    }
5279    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5280        let kind = node.kind(db);
5281        if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5282    }
5283    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5284        self.node
5285    }
5286    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5287        ExprWhilePtr(self.node.stable_ptr(db))
5288    }
5289}
5290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5291pub struct ExprFor<'db> {
5292    node: SyntaxNode<'db>,
5293}
5294impl<'db> ExprFor<'db> {
5295    pub const INDEX_FOR_KW: usize = 0;
5296    pub const INDEX_PATTERN: usize = 1;
5297    pub const INDEX_IDENTIFIER: usize = 2;
5298    pub const INDEX_EXPR: usize = 3;
5299    pub const INDEX_BODY: usize = 4;
5300    pub fn new_green(
5301        db: &'db dyn Database,
5302        for_kw: TerminalForGreen<'db>,
5303        pattern: PatternGreen<'db>,
5304        identifier: TerminalIdentifierGreen<'db>,
5305        expr: ExprGreen<'db>,
5306        body: ExprBlockGreen<'db>,
5307    ) -> ExprForGreen<'db> {
5308        let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5309        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5310        ExprForGreen(
5311            GreenNode {
5312                kind: SyntaxKind::ExprFor,
5313                details: GreenNodeDetails::Node { children: children.into(), width },
5314            }
5315            .intern(db),
5316        )
5317    }
5318}
5319impl<'db> ExprFor<'db> {
5320    pub fn for_kw(&self, db: &'db dyn Database) -> TerminalFor<'db> {
5321        TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5322    }
5323    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
5324        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5325    }
5326    pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
5327        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5328    }
5329    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5330        Expr::from_syntax_node(db, self.node.get_children(db)[3])
5331    }
5332    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5333        ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5334    }
5335}
5336#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5337pub struct ExprForPtr<'db>(pub SyntaxStablePtrId<'db>);
5338impl<'db> ExprForPtr<'db> {
5339    pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
5340        let ptr = self.0.long(db);
5341        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5342            PatternGreen(key_fields[0])
5343        } else {
5344            panic!("Unexpected key field query on root.");
5345        }
5346    }
5347    pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
5348        let ptr = self.0.long(db);
5349        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
5350            TerminalIdentifierGreen(key_fields[1])
5351        } else {
5352            panic!("Unexpected key field query on root.");
5353        }
5354    }
5355}
5356impl<'db> TypedStablePtr<'db> for ExprForPtr<'db> {
5357    type SyntaxNode = ExprFor<'db>;
5358    fn untyped(self) -> SyntaxStablePtrId<'db> {
5359        self.0
5360    }
5361    fn lookup(&self, db: &'db dyn Database) -> ExprFor<'db> {
5362        ExprFor::from_syntax_node(db, self.0.lookup(db))
5363    }
5364}
5365impl<'db> From<ExprForPtr<'db>> for SyntaxStablePtrId<'db> {
5366    fn from(ptr: ExprForPtr<'db>) -> Self {
5367        ptr.untyped()
5368    }
5369}
5370#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5371pub struct ExprForGreen<'db>(pub GreenId<'db>);
5372impl<'db> TypedSyntaxNode<'db> for ExprFor<'db> {
5373    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5374    type StablePtr = ExprForPtr<'db>;
5375    type Green = ExprForGreen<'db>;
5376    fn missing(db: &'db dyn Database) -> Self::Green {
5377        ExprForGreen(
5378            GreenNode {
5379                kind: SyntaxKind::ExprFor,
5380                details: GreenNodeDetails::Node {
5381                    children: [
5382                        TerminalFor::missing(db).0,
5383                        Pattern::missing(db).0,
5384                        TerminalIdentifier::missing(db).0,
5385                        Expr::missing(db).0,
5386                        ExprBlock::missing(db).0,
5387                    ]
5388                    .into(),
5389                    width: TextWidth::default(),
5390                },
5391            }
5392            .intern(db),
5393        )
5394    }
5395    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5396        let kind = node.kind(db);
5397        assert_eq!(
5398            kind,
5399            SyntaxKind::ExprFor,
5400            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5401            kind,
5402            SyntaxKind::ExprFor
5403        );
5404        Self { node }
5405    }
5406    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5407        let kind = node.kind(db);
5408        if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5409    }
5410    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5411        self.node
5412    }
5413    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5414        ExprForPtr(self.node.stable_ptr(db))
5415    }
5416}
5417#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5418pub struct ElseClause<'db> {
5419    node: SyntaxNode<'db>,
5420}
5421impl<'db> ElseClause<'db> {
5422    pub const INDEX_ELSE_KW: usize = 0;
5423    pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5424    pub fn new_green(
5425        db: &'db dyn Database,
5426        else_kw: TerminalElseGreen<'db>,
5427        else_block_or_if: BlockOrIfGreen<'db>,
5428    ) -> ElseClauseGreen<'db> {
5429        let children = [else_kw.0, else_block_or_if.0];
5430        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5431        ElseClauseGreen(
5432            GreenNode {
5433                kind: SyntaxKind::ElseClause,
5434                details: GreenNodeDetails::Node { children: children.into(), width },
5435            }
5436            .intern(db),
5437        )
5438    }
5439}
5440impl<'db> ElseClause<'db> {
5441    pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
5442        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5443    }
5444    pub fn else_block_or_if(&self, db: &'db dyn Database) -> BlockOrIf<'db> {
5445        BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5446    }
5447}
5448#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5449pub struct ElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5450impl<'db> ElseClausePtr<'db> {}
5451impl<'db> TypedStablePtr<'db> for ElseClausePtr<'db> {
5452    type SyntaxNode = ElseClause<'db>;
5453    fn untyped(self) -> SyntaxStablePtrId<'db> {
5454        self.0
5455    }
5456    fn lookup(&self, db: &'db dyn Database) -> ElseClause<'db> {
5457        ElseClause::from_syntax_node(db, self.0.lookup(db))
5458    }
5459}
5460impl<'db> From<ElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5461    fn from(ptr: ElseClausePtr<'db>) -> Self {
5462        ptr.untyped()
5463    }
5464}
5465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5466pub struct ElseClauseGreen<'db>(pub GreenId<'db>);
5467impl<'db> TypedSyntaxNode<'db> for ElseClause<'db> {
5468    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5469    type StablePtr = ElseClausePtr<'db>;
5470    type Green = ElseClauseGreen<'db>;
5471    fn missing(db: &'db dyn Database) -> Self::Green {
5472        ElseClauseGreen(
5473            GreenNode {
5474                kind: SyntaxKind::ElseClause,
5475                details: GreenNodeDetails::Node {
5476                    children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5477                    width: TextWidth::default(),
5478                },
5479            }
5480            .intern(db),
5481        )
5482    }
5483    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5484        let kind = node.kind(db);
5485        assert_eq!(
5486            kind,
5487            SyntaxKind::ElseClause,
5488            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5489            kind,
5490            SyntaxKind::ElseClause
5491        );
5492        Self { node }
5493    }
5494    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5495        let kind = node.kind(db);
5496        if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5497    }
5498    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5499        self.node
5500    }
5501    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5502        ElseClausePtr(self.node.stable_ptr(db))
5503    }
5504}
5505#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5506pub enum OptionElseClause<'db> {
5507    Empty(OptionElseClauseEmpty<'db>),
5508    ElseClause(ElseClause<'db>),
5509}
5510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5511pub struct OptionElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5512impl<'db> TypedStablePtr<'db> for OptionElseClausePtr<'db> {
5513    type SyntaxNode = OptionElseClause<'db>;
5514    fn untyped(self) -> SyntaxStablePtrId<'db> {
5515        self.0
5516    }
5517    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5518        OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5519    }
5520}
5521impl<'db> From<OptionElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5522    fn from(ptr: OptionElseClausePtr<'db>) -> Self {
5523        ptr.untyped()
5524    }
5525}
5526impl<'db> From<OptionElseClauseEmptyPtr<'db>> for OptionElseClausePtr<'db> {
5527    fn from(value: OptionElseClauseEmptyPtr<'db>) -> Self {
5528        Self(value.0)
5529    }
5530}
5531impl<'db> From<ElseClausePtr<'db>> for OptionElseClausePtr<'db> {
5532    fn from(value: ElseClausePtr<'db>) -> Self {
5533        Self(value.0)
5534    }
5535}
5536impl<'db> From<OptionElseClauseEmptyGreen<'db>> for OptionElseClauseGreen<'db> {
5537    fn from(value: OptionElseClauseEmptyGreen<'db>) -> Self {
5538        Self(value.0)
5539    }
5540}
5541impl<'db> From<ElseClauseGreen<'db>> for OptionElseClauseGreen<'db> {
5542    fn from(value: ElseClauseGreen<'db>) -> Self {
5543        Self(value.0)
5544    }
5545}
5546#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5547pub struct OptionElseClauseGreen<'db>(pub GreenId<'db>);
5548impl<'db> TypedSyntaxNode<'db> for OptionElseClause<'db> {
5549    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5550    type StablePtr = OptionElseClausePtr<'db>;
5551    type Green = OptionElseClauseGreen<'db>;
5552    fn missing(db: &'db dyn Database) -> Self::Green {
5553        panic!("No missing variant.");
5554    }
5555    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5556        let kind = node.kind(db);
5557        match kind {
5558            SyntaxKind::OptionElseClauseEmpty => {
5559                OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5560            }
5561            SyntaxKind::ElseClause => {
5562                OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5563            }
5564            _ => panic!(
5565                "Unexpected syntax kind {:?} when constructing {}.",
5566                kind, "OptionElseClause"
5567            ),
5568        }
5569    }
5570    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5571        let kind = node.kind(db);
5572        match kind {
5573            SyntaxKind::OptionElseClauseEmpty => {
5574                Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5575            }
5576            SyntaxKind::ElseClause => {
5577                Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5578            }
5579            _ => None,
5580        }
5581    }
5582    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5583        match self {
5584            OptionElseClause::Empty(x) => x.as_syntax_node(),
5585            OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5586        }
5587    }
5588    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5589        OptionElseClausePtr(self.as_syntax_node().long(db).stable_ptr)
5590    }
5591}
5592impl<'db> OptionElseClause<'db> {
5593    /// Checks if a kind of a variant of [OptionElseClause].
5594    pub fn is_variant(kind: SyntaxKind) -> bool {
5595        matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5596    }
5597}
5598#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5599pub struct OptionElseClauseEmpty<'db> {
5600    node: SyntaxNode<'db>,
5601}
5602impl<'db> OptionElseClauseEmpty<'db> {
5603    pub fn new_green(db: &'db dyn Database) -> OptionElseClauseEmptyGreen<'db> {
5604        let children = [];
5605        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5606        OptionElseClauseEmptyGreen(
5607            GreenNode {
5608                kind: SyntaxKind::OptionElseClauseEmpty,
5609                details: GreenNodeDetails::Node { children: children.into(), width },
5610            }
5611            .intern(db),
5612        )
5613    }
5614}
5615impl<'db> OptionElseClauseEmpty<'db> {}
5616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5617pub struct OptionElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
5618impl<'db> OptionElseClauseEmptyPtr<'db> {}
5619impl<'db> TypedStablePtr<'db> for OptionElseClauseEmptyPtr<'db> {
5620    type SyntaxNode = OptionElseClauseEmpty<'db>;
5621    fn untyped(self) -> SyntaxStablePtrId<'db> {
5622        self.0
5623    }
5624    fn lookup(&self, db: &'db dyn Database) -> OptionElseClauseEmpty<'db> {
5625        OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5626    }
5627}
5628impl<'db> From<OptionElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
5629    fn from(ptr: OptionElseClauseEmptyPtr<'db>) -> Self {
5630        ptr.untyped()
5631    }
5632}
5633#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5634pub struct OptionElseClauseEmptyGreen<'db>(pub GreenId<'db>);
5635impl<'db> TypedSyntaxNode<'db> for OptionElseClauseEmpty<'db> {
5636    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5637    type StablePtr = OptionElseClauseEmptyPtr<'db>;
5638    type Green = OptionElseClauseEmptyGreen<'db>;
5639    fn missing(db: &'db dyn Database) -> Self::Green {
5640        OptionElseClauseEmptyGreen(
5641            GreenNode {
5642                kind: SyntaxKind::OptionElseClauseEmpty,
5643                details: GreenNodeDetails::Node {
5644                    children: [].into(),
5645                    width: TextWidth::default(),
5646                },
5647            }
5648            .intern(db),
5649        )
5650    }
5651    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5652        let kind = node.kind(db);
5653        assert_eq!(
5654            kind,
5655            SyntaxKind::OptionElseClauseEmpty,
5656            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5657            kind,
5658            SyntaxKind::OptionElseClauseEmpty
5659        );
5660        Self { node }
5661    }
5662    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5663        let kind = node.kind(db);
5664        if kind == SyntaxKind::OptionElseClauseEmpty {
5665            Some(Self::from_syntax_node(db, node))
5666        } else {
5667            None
5668        }
5669    }
5670    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5671        self.node
5672    }
5673    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5674        OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5675    }
5676}
5677#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5678pub struct ExprErrorPropagate<'db> {
5679    node: SyntaxNode<'db>,
5680}
5681impl<'db> ExprErrorPropagate<'db> {
5682    pub const INDEX_EXPR: usize = 0;
5683    pub const INDEX_OP: usize = 1;
5684    pub fn new_green(
5685        db: &'db dyn Database,
5686        expr: ExprGreen<'db>,
5687        op: TerminalQuestionMarkGreen<'db>,
5688    ) -> ExprErrorPropagateGreen<'db> {
5689        let children = [expr.0, op.0];
5690        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5691        ExprErrorPropagateGreen(
5692            GreenNode {
5693                kind: SyntaxKind::ExprErrorPropagate,
5694                details: GreenNodeDetails::Node { children: children.into(), width },
5695            }
5696            .intern(db),
5697        )
5698    }
5699}
5700impl<'db> ExprErrorPropagate<'db> {
5701    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5702        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5703    }
5704    pub fn op(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
5705        TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5706    }
5707}
5708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5709pub struct ExprErrorPropagatePtr<'db>(pub SyntaxStablePtrId<'db>);
5710impl<'db> ExprErrorPropagatePtr<'db> {}
5711impl<'db> TypedStablePtr<'db> for ExprErrorPropagatePtr<'db> {
5712    type SyntaxNode = ExprErrorPropagate<'db>;
5713    fn untyped(self) -> SyntaxStablePtrId<'db> {
5714        self.0
5715    }
5716    fn lookup(&self, db: &'db dyn Database) -> ExprErrorPropagate<'db> {
5717        ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5718    }
5719}
5720impl<'db> From<ExprErrorPropagatePtr<'db>> for SyntaxStablePtrId<'db> {
5721    fn from(ptr: ExprErrorPropagatePtr<'db>) -> Self {
5722        ptr.untyped()
5723    }
5724}
5725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5726pub struct ExprErrorPropagateGreen<'db>(pub GreenId<'db>);
5727impl<'db> TypedSyntaxNode<'db> for ExprErrorPropagate<'db> {
5728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5729    type StablePtr = ExprErrorPropagatePtr<'db>;
5730    type Green = ExprErrorPropagateGreen<'db>;
5731    fn missing(db: &'db dyn Database) -> Self::Green {
5732        ExprErrorPropagateGreen(
5733            GreenNode {
5734                kind: SyntaxKind::ExprErrorPropagate,
5735                details: GreenNodeDetails::Node {
5736                    children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5737                    width: TextWidth::default(),
5738                },
5739            }
5740            .intern(db),
5741        )
5742    }
5743    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5744        let kind = node.kind(db);
5745        assert_eq!(
5746            kind,
5747            SyntaxKind::ExprErrorPropagate,
5748            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5749            kind,
5750            SyntaxKind::ExprErrorPropagate
5751        );
5752        Self { node }
5753    }
5754    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5755        let kind = node.kind(db);
5756        if kind == SyntaxKind::ExprErrorPropagate {
5757            Some(Self::from_syntax_node(db, node))
5758        } else {
5759            None
5760        }
5761    }
5762    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5763        self.node
5764    }
5765    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5766        ExprErrorPropagatePtr(self.node.stable_ptr(db))
5767    }
5768}
5769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5770pub struct ExprIndexed<'db> {
5771    node: SyntaxNode<'db>,
5772}
5773impl<'db> ExprIndexed<'db> {
5774    pub const INDEX_EXPR: usize = 0;
5775    pub const INDEX_LBRACK: usize = 1;
5776    pub const INDEX_INDEX_EXPR: usize = 2;
5777    pub const INDEX_RBRACK: usize = 3;
5778    pub fn new_green(
5779        db: &'db dyn Database,
5780        expr: ExprGreen<'db>,
5781        lbrack: TerminalLBrackGreen<'db>,
5782        index_expr: ExprGreen<'db>,
5783        rbrack: TerminalRBrackGreen<'db>,
5784    ) -> ExprIndexedGreen<'db> {
5785        let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5786        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5787        ExprIndexedGreen(
5788            GreenNode {
5789                kind: SyntaxKind::ExprIndexed,
5790                details: GreenNodeDetails::Node { children: children.into(), width },
5791            }
5792            .intern(db),
5793        )
5794    }
5795}
5796impl<'db> ExprIndexed<'db> {
5797    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5798        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5799    }
5800    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5801        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5802    }
5803    pub fn index_expr(&self, db: &'db dyn Database) -> Expr<'db> {
5804        Expr::from_syntax_node(db, self.node.get_children(db)[2])
5805    }
5806    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5807        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5808    }
5809}
5810#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5811pub struct ExprIndexedPtr<'db>(pub SyntaxStablePtrId<'db>);
5812impl<'db> ExprIndexedPtr<'db> {}
5813impl<'db> TypedStablePtr<'db> for ExprIndexedPtr<'db> {
5814    type SyntaxNode = ExprIndexed<'db>;
5815    fn untyped(self) -> SyntaxStablePtrId<'db> {
5816        self.0
5817    }
5818    fn lookup(&self, db: &'db dyn Database) -> ExprIndexed<'db> {
5819        ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5820    }
5821}
5822impl<'db> From<ExprIndexedPtr<'db>> for SyntaxStablePtrId<'db> {
5823    fn from(ptr: ExprIndexedPtr<'db>) -> Self {
5824        ptr.untyped()
5825    }
5826}
5827#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5828pub struct ExprIndexedGreen<'db>(pub GreenId<'db>);
5829impl<'db> TypedSyntaxNode<'db> for ExprIndexed<'db> {
5830    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5831    type StablePtr = ExprIndexedPtr<'db>;
5832    type Green = ExprIndexedGreen<'db>;
5833    fn missing(db: &'db dyn Database) -> Self::Green {
5834        ExprIndexedGreen(
5835            GreenNode {
5836                kind: SyntaxKind::ExprIndexed,
5837                details: GreenNodeDetails::Node {
5838                    children: [
5839                        Expr::missing(db).0,
5840                        TerminalLBrack::missing(db).0,
5841                        Expr::missing(db).0,
5842                        TerminalRBrack::missing(db).0,
5843                    ]
5844                    .into(),
5845                    width: TextWidth::default(),
5846                },
5847            }
5848            .intern(db),
5849        )
5850    }
5851    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5852        let kind = node.kind(db);
5853        assert_eq!(
5854            kind,
5855            SyntaxKind::ExprIndexed,
5856            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5857            kind,
5858            SyntaxKind::ExprIndexed
5859        );
5860        Self { node }
5861    }
5862    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5863        let kind = node.kind(db);
5864        if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5865    }
5866    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5867        self.node
5868    }
5869    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5870        ExprIndexedPtr(self.node.stable_ptr(db))
5871    }
5872}
5873#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5874pub struct ExprFixedSizeArray<'db> {
5875    node: SyntaxNode<'db>,
5876}
5877impl<'db> ExprFixedSizeArray<'db> {
5878    pub const INDEX_LBRACK: usize = 0;
5879    pub const INDEX_EXPRS: usize = 1;
5880    pub const INDEX_SIZE: usize = 2;
5881    pub const INDEX_RBRACK: usize = 3;
5882    pub fn new_green(
5883        db: &'db dyn Database,
5884        lbrack: TerminalLBrackGreen<'db>,
5885        exprs: ExprListGreen<'db>,
5886        size: OptionFixedSizeArraySizeGreen<'db>,
5887        rbrack: TerminalRBrackGreen<'db>,
5888    ) -> ExprFixedSizeArrayGreen<'db> {
5889        let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5890        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5891        ExprFixedSizeArrayGreen(
5892            GreenNode {
5893                kind: SyntaxKind::ExprFixedSizeArray,
5894                details: GreenNodeDetails::Node { children: children.into(), width },
5895            }
5896            .intern(db),
5897        )
5898    }
5899}
5900impl<'db> ExprFixedSizeArray<'db> {
5901    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5902        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5903    }
5904    pub fn exprs(&self, db: &'db dyn Database) -> ExprList<'db> {
5905        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5906    }
5907    pub fn size(&self, db: &'db dyn Database) -> OptionFixedSizeArraySize<'db> {
5908        OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5909    }
5910    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5911        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5912    }
5913}
5914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5915pub struct ExprFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
5916impl<'db> ExprFixedSizeArrayPtr<'db> {}
5917impl<'db> TypedStablePtr<'db> for ExprFixedSizeArrayPtr<'db> {
5918    type SyntaxNode = ExprFixedSizeArray<'db>;
5919    fn untyped(self) -> SyntaxStablePtrId<'db> {
5920        self.0
5921    }
5922    fn lookup(&self, db: &'db dyn Database) -> ExprFixedSizeArray<'db> {
5923        ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5924    }
5925}
5926impl<'db> From<ExprFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
5927    fn from(ptr: ExprFixedSizeArrayPtr<'db>) -> Self {
5928        ptr.untyped()
5929    }
5930}
5931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5932pub struct ExprFixedSizeArrayGreen<'db>(pub GreenId<'db>);
5933impl<'db> TypedSyntaxNode<'db> for ExprFixedSizeArray<'db> {
5934    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5935    type StablePtr = ExprFixedSizeArrayPtr<'db>;
5936    type Green = ExprFixedSizeArrayGreen<'db>;
5937    fn missing(db: &'db dyn Database) -> Self::Green {
5938        ExprFixedSizeArrayGreen(
5939            GreenNode {
5940                kind: SyntaxKind::ExprFixedSizeArray,
5941                details: GreenNodeDetails::Node {
5942                    children: [
5943                        TerminalLBrack::missing(db).0,
5944                        ExprList::missing(db).0,
5945                        OptionFixedSizeArraySize::missing(db).0,
5946                        TerminalRBrack::missing(db).0,
5947                    ]
5948                    .into(),
5949                    width: TextWidth::default(),
5950                },
5951            }
5952            .intern(db),
5953        )
5954    }
5955    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5956        let kind = node.kind(db);
5957        assert_eq!(
5958            kind,
5959            SyntaxKind::ExprFixedSizeArray,
5960            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5961            kind,
5962            SyntaxKind::ExprFixedSizeArray
5963        );
5964        Self { node }
5965    }
5966    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5967        let kind = node.kind(db);
5968        if kind == SyntaxKind::ExprFixedSizeArray {
5969            Some(Self::from_syntax_node(db, node))
5970        } else {
5971            None
5972        }
5973    }
5974    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5975        self.node
5976    }
5977    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5978        ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
5979    }
5980}
5981#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5982pub struct FixedSizeArraySize<'db> {
5983    node: SyntaxNode<'db>,
5984}
5985impl<'db> FixedSizeArraySize<'db> {
5986    pub const INDEX_SEMICOLON: usize = 0;
5987    pub const INDEX_SIZE: usize = 1;
5988    pub fn new_green(
5989        db: &'db dyn Database,
5990        semicolon: TerminalSemicolonGreen<'db>,
5991        size: ExprGreen<'db>,
5992    ) -> FixedSizeArraySizeGreen<'db> {
5993        let children = [semicolon.0, size.0];
5994        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5995        FixedSizeArraySizeGreen(
5996            GreenNode {
5997                kind: SyntaxKind::FixedSizeArraySize,
5998                details: GreenNodeDetails::Node { children: children.into(), width },
5999            }
6000            .intern(db),
6001        )
6002    }
6003}
6004impl<'db> FixedSizeArraySize<'db> {
6005    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
6006        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6007    }
6008    pub fn size(&self, db: &'db dyn Database) -> Expr<'db> {
6009        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6010    }
6011}
6012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6013pub struct FixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6014impl<'db> FixedSizeArraySizePtr<'db> {}
6015impl<'db> TypedStablePtr<'db> for FixedSizeArraySizePtr<'db> {
6016    type SyntaxNode = FixedSizeArraySize<'db>;
6017    fn untyped(self) -> SyntaxStablePtrId<'db> {
6018        self.0
6019    }
6020    fn lookup(&self, db: &'db dyn Database) -> FixedSizeArraySize<'db> {
6021        FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6022    }
6023}
6024impl<'db> From<FixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6025    fn from(ptr: FixedSizeArraySizePtr<'db>) -> Self {
6026        ptr.untyped()
6027    }
6028}
6029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6030pub struct FixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6031impl<'db> TypedSyntaxNode<'db> for FixedSizeArraySize<'db> {
6032    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6033    type StablePtr = FixedSizeArraySizePtr<'db>;
6034    type Green = FixedSizeArraySizeGreen<'db>;
6035    fn missing(db: &'db dyn Database) -> Self::Green {
6036        FixedSizeArraySizeGreen(
6037            GreenNode {
6038                kind: SyntaxKind::FixedSizeArraySize,
6039                details: GreenNodeDetails::Node {
6040                    children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6041                    width: TextWidth::default(),
6042                },
6043            }
6044            .intern(db),
6045        )
6046    }
6047    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6048        let kind = node.kind(db);
6049        assert_eq!(
6050            kind,
6051            SyntaxKind::FixedSizeArraySize,
6052            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6053            kind,
6054            SyntaxKind::FixedSizeArraySize
6055        );
6056        Self { node }
6057    }
6058    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6059        let kind = node.kind(db);
6060        if kind == SyntaxKind::FixedSizeArraySize {
6061            Some(Self::from_syntax_node(db, node))
6062        } else {
6063            None
6064        }
6065    }
6066    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6067        self.node
6068    }
6069    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6070        FixedSizeArraySizePtr(self.node.stable_ptr(db))
6071    }
6072}
6073#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6074pub enum OptionFixedSizeArraySize<'db> {
6075    Empty(OptionFixedSizeArraySizeEmpty<'db>),
6076    FixedSizeArraySize(FixedSizeArraySize<'db>),
6077}
6078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6079pub struct OptionFixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6080impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizePtr<'db> {
6081    type SyntaxNode = OptionFixedSizeArraySize<'db>;
6082    fn untyped(self) -> SyntaxStablePtrId<'db> {
6083        self.0
6084    }
6085    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6086        OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6087    }
6088}
6089impl<'db> From<OptionFixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6090    fn from(ptr: OptionFixedSizeArraySizePtr<'db>) -> Self {
6091        ptr.untyped()
6092    }
6093}
6094impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6095    fn from(value: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6096        Self(value.0)
6097    }
6098}
6099impl<'db> From<FixedSizeArraySizePtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6100    fn from(value: FixedSizeArraySizePtr<'db>) -> Self {
6101        Self(value.0)
6102    }
6103}
6104impl<'db> From<OptionFixedSizeArraySizeEmptyGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6105    fn from(value: OptionFixedSizeArraySizeEmptyGreen<'db>) -> Self {
6106        Self(value.0)
6107    }
6108}
6109impl<'db> From<FixedSizeArraySizeGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6110    fn from(value: FixedSizeArraySizeGreen<'db>) -> Self {
6111        Self(value.0)
6112    }
6113}
6114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6115pub struct OptionFixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6116impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySize<'db> {
6117    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6118    type StablePtr = OptionFixedSizeArraySizePtr<'db>;
6119    type Green = OptionFixedSizeArraySizeGreen<'db>;
6120    fn missing(db: &'db dyn Database) -> Self::Green {
6121        panic!("No missing variant.");
6122    }
6123    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6124        let kind = node.kind(db);
6125        match kind {
6126            SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6127                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6128            ),
6129            SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6130                FixedSizeArraySize::from_syntax_node(db, node),
6131            ),
6132            _ => panic!(
6133                "Unexpected syntax kind {:?} when constructing {}.",
6134                kind, "OptionFixedSizeArraySize"
6135            ),
6136        }
6137    }
6138    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6139        let kind = node.kind(db);
6140        match kind {
6141            SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6142                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6143            )),
6144            SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6145                FixedSizeArraySize::from_syntax_node(db, node),
6146            )),
6147            _ => None,
6148        }
6149    }
6150    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6151        match self {
6152            OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6153            OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6154        }
6155    }
6156    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6157        OptionFixedSizeArraySizePtr(self.as_syntax_node().long(db).stable_ptr)
6158    }
6159}
6160impl<'db> OptionFixedSizeArraySize<'db> {
6161    /// Checks if a kind of a variant of [OptionFixedSizeArraySize].
6162    pub fn is_variant(kind: SyntaxKind) -> bool {
6163        matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6164    }
6165}
6166#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6167pub struct OptionFixedSizeArraySizeEmpty<'db> {
6168    node: SyntaxNode<'db>,
6169}
6170impl<'db> OptionFixedSizeArraySizeEmpty<'db> {
6171    pub fn new_green(db: &'db dyn Database) -> OptionFixedSizeArraySizeEmptyGreen<'db> {
6172        let children = [];
6173        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6174        OptionFixedSizeArraySizeEmptyGreen(
6175            GreenNode {
6176                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6177                details: GreenNodeDetails::Node { children: children.into(), width },
6178            }
6179            .intern(db),
6180        )
6181    }
6182}
6183impl<'db> OptionFixedSizeArraySizeEmpty<'db> {}
6184#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6185pub struct OptionFixedSizeArraySizeEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6186impl<'db> OptionFixedSizeArraySizeEmptyPtr<'db> {}
6187impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizeEmptyPtr<'db> {
6188    type SyntaxNode = OptionFixedSizeArraySizeEmpty<'db>;
6189    fn untyped(self) -> SyntaxStablePtrId<'db> {
6190        self.0
6191    }
6192    fn lookup(&self, db: &'db dyn Database) -> OptionFixedSizeArraySizeEmpty<'db> {
6193        OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6194    }
6195}
6196impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6197    fn from(ptr: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6198        ptr.untyped()
6199    }
6200}
6201#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6202pub struct OptionFixedSizeArraySizeEmptyGreen<'db>(pub GreenId<'db>);
6203impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySizeEmpty<'db> {
6204    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6205    type StablePtr = OptionFixedSizeArraySizeEmptyPtr<'db>;
6206    type Green = OptionFixedSizeArraySizeEmptyGreen<'db>;
6207    fn missing(db: &'db dyn Database) -> Self::Green {
6208        OptionFixedSizeArraySizeEmptyGreen(
6209            GreenNode {
6210                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6211                details: GreenNodeDetails::Node {
6212                    children: [].into(),
6213                    width: TextWidth::default(),
6214                },
6215            }
6216            .intern(db),
6217        )
6218    }
6219    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6220        let kind = node.kind(db);
6221        assert_eq!(
6222            kind,
6223            SyntaxKind::OptionFixedSizeArraySizeEmpty,
6224            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6225            kind,
6226            SyntaxKind::OptionFixedSizeArraySizeEmpty
6227        );
6228        Self { node }
6229    }
6230    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6231        let kind = node.kind(db);
6232        if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6233            Some(Self::from_syntax_node(db, node))
6234        } else {
6235            None
6236        }
6237    }
6238    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6239        self.node
6240    }
6241    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6242        OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6243    }
6244}
6245#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6246pub struct ExprClosure<'db> {
6247    node: SyntaxNode<'db>,
6248}
6249impl<'db> ExprClosure<'db> {
6250    pub const INDEX_WRAPPER: usize = 0;
6251    pub const INDEX_RET_TY: usize = 1;
6252    pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6253    pub const INDEX_EXPR: usize = 3;
6254    pub fn new_green(
6255        db: &'db dyn Database,
6256        wrapper: ClosureParamWrapperGreen<'db>,
6257        ret_ty: OptionReturnTypeClauseGreen<'db>,
6258        optional_no_panic: OptionTerminalNoPanicGreen<'db>,
6259        expr: ExprGreen<'db>,
6260    ) -> ExprClosureGreen<'db> {
6261        let children = [wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6262        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6263        ExprClosureGreen(
6264            GreenNode {
6265                kind: SyntaxKind::ExprClosure,
6266                details: GreenNodeDetails::Node { children: children.into(), width },
6267            }
6268            .intern(db),
6269        )
6270    }
6271}
6272impl<'db> ExprClosure<'db> {
6273    pub fn wrapper(&self, db: &'db dyn Database) -> ClosureParamWrapper<'db> {
6274        ClosureParamWrapper::from_syntax_node(db, self.node.get_children(db)[0])
6275    }
6276    pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
6277        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6278    }
6279    pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
6280        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6281    }
6282    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6283        Expr::from_syntax_node(db, self.node.get_children(db)[3])
6284    }
6285}
6286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6287pub struct ExprClosurePtr<'db>(pub SyntaxStablePtrId<'db>);
6288impl<'db> ExprClosurePtr<'db> {}
6289impl<'db> TypedStablePtr<'db> for ExprClosurePtr<'db> {
6290    type SyntaxNode = ExprClosure<'db>;
6291    fn untyped(self) -> SyntaxStablePtrId<'db> {
6292        self.0
6293    }
6294    fn lookup(&self, db: &'db dyn Database) -> ExprClosure<'db> {
6295        ExprClosure::from_syntax_node(db, self.0.lookup(db))
6296    }
6297}
6298impl<'db> From<ExprClosurePtr<'db>> for SyntaxStablePtrId<'db> {
6299    fn from(ptr: ExprClosurePtr<'db>) -> Self {
6300        ptr.untyped()
6301    }
6302}
6303#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6304pub struct ExprClosureGreen<'db>(pub GreenId<'db>);
6305impl<'db> TypedSyntaxNode<'db> for ExprClosure<'db> {
6306    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6307    type StablePtr = ExprClosurePtr<'db>;
6308    type Green = ExprClosureGreen<'db>;
6309    fn missing(db: &'db dyn Database) -> Self::Green {
6310        ExprClosureGreen(
6311            GreenNode {
6312                kind: SyntaxKind::ExprClosure,
6313                details: GreenNodeDetails::Node {
6314                    children: [
6315                        ClosureParamWrapper::missing(db).0,
6316                        OptionReturnTypeClause::missing(db).0,
6317                        OptionTerminalNoPanic::missing(db).0,
6318                        Expr::missing(db).0,
6319                    ]
6320                    .into(),
6321                    width: TextWidth::default(),
6322                },
6323            }
6324            .intern(db),
6325        )
6326    }
6327    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6328        let kind = node.kind(db);
6329        assert_eq!(
6330            kind,
6331            SyntaxKind::ExprClosure,
6332            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6333            kind,
6334            SyntaxKind::ExprClosure
6335        );
6336        Self { node }
6337    }
6338    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6339        let kind = node.kind(db);
6340        if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6341    }
6342    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6343        self.node
6344    }
6345    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6346        ExprClosurePtr(self.node.stable_ptr(db))
6347    }
6348}
6349#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6350pub enum ClosureParamWrapper<'db> {
6351    Nullary(TerminalOrOr<'db>),
6352    NAry(ClosureParamWrapperNAry<'db>),
6353}
6354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6355pub struct ClosureParamWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
6356impl<'db> TypedStablePtr<'db> for ClosureParamWrapperPtr<'db> {
6357    type SyntaxNode = ClosureParamWrapper<'db>;
6358    fn untyped(self) -> SyntaxStablePtrId<'db> {
6359        self.0
6360    }
6361    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6362        ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6363    }
6364}
6365impl<'db> From<ClosureParamWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
6366    fn from(ptr: ClosureParamWrapperPtr<'db>) -> Self {
6367        ptr.untyped()
6368    }
6369}
6370impl<'db> From<TerminalOrOrPtr<'db>> for ClosureParamWrapperPtr<'db> {
6371    fn from(value: TerminalOrOrPtr<'db>) -> Self {
6372        Self(value.0)
6373    }
6374}
6375impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for ClosureParamWrapperPtr<'db> {
6376    fn from(value: ClosureParamWrapperNAryPtr<'db>) -> Self {
6377        Self(value.0)
6378    }
6379}
6380impl<'db> From<TerminalOrOrGreen<'db>> for ClosureParamWrapperGreen<'db> {
6381    fn from(value: TerminalOrOrGreen<'db>) -> Self {
6382        Self(value.0)
6383    }
6384}
6385impl<'db> From<ClosureParamWrapperNAryGreen<'db>> for ClosureParamWrapperGreen<'db> {
6386    fn from(value: ClosureParamWrapperNAryGreen<'db>) -> Self {
6387        Self(value.0)
6388    }
6389}
6390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6391pub struct ClosureParamWrapperGreen<'db>(pub GreenId<'db>);
6392impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapper<'db> {
6393    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6394    type StablePtr = ClosureParamWrapperPtr<'db>;
6395    type Green = ClosureParamWrapperGreen<'db>;
6396    fn missing(db: &'db dyn Database) -> Self::Green {
6397        panic!("No missing variant.");
6398    }
6399    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6400        let kind = node.kind(db);
6401        match kind {
6402            SyntaxKind::TerminalOrOr => {
6403                ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6404            }
6405            SyntaxKind::ClosureParamWrapperNAry => {
6406                ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6407            }
6408            _ => panic!(
6409                "Unexpected syntax kind {:?} when constructing {}.",
6410                kind, "ClosureParamWrapper"
6411            ),
6412        }
6413    }
6414    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6415        let kind = node.kind(db);
6416        match kind {
6417            SyntaxKind::TerminalOrOr => {
6418                Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6419            }
6420            SyntaxKind::ClosureParamWrapperNAry => {
6421                Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6422            }
6423            _ => None,
6424        }
6425    }
6426    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6427        match self {
6428            ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6429            ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6430        }
6431    }
6432    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6433        ClosureParamWrapperPtr(self.as_syntax_node().long(db).stable_ptr)
6434    }
6435}
6436impl<'db> ClosureParamWrapper<'db> {
6437    /// Checks if a kind of a variant of [ClosureParamWrapper].
6438    pub fn is_variant(kind: SyntaxKind) -> bool {
6439        matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6440    }
6441}
6442#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6443pub struct ClosureParamWrapperNAry<'db> {
6444    node: SyntaxNode<'db>,
6445}
6446impl<'db> ClosureParamWrapperNAry<'db> {
6447    pub const INDEX_LEFTOR: usize = 0;
6448    pub const INDEX_PARAMS: usize = 1;
6449    pub const INDEX_RIGHTOR: usize = 2;
6450    pub fn new_green(
6451        db: &'db dyn Database,
6452        leftor: TerminalOrGreen<'db>,
6453        params: ParamListGreen<'db>,
6454        rightor: TerminalOrGreen<'db>,
6455    ) -> ClosureParamWrapperNAryGreen<'db> {
6456        let children = [leftor.0, params.0, rightor.0];
6457        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6458        ClosureParamWrapperNAryGreen(
6459            GreenNode {
6460                kind: SyntaxKind::ClosureParamWrapperNAry,
6461                details: GreenNodeDetails::Node { children: children.into(), width },
6462            }
6463            .intern(db),
6464        )
6465    }
6466}
6467impl<'db> ClosureParamWrapperNAry<'db> {
6468    pub fn leftor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6469        TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6470    }
6471    pub fn params(&self, db: &'db dyn Database) -> ParamList<'db> {
6472        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6473    }
6474    pub fn rightor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6475        TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6476    }
6477}
6478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6479pub struct ClosureParamWrapperNAryPtr<'db>(pub SyntaxStablePtrId<'db>);
6480impl<'db> ClosureParamWrapperNAryPtr<'db> {}
6481impl<'db> TypedStablePtr<'db> for ClosureParamWrapperNAryPtr<'db> {
6482    type SyntaxNode = ClosureParamWrapperNAry<'db>;
6483    fn untyped(self) -> SyntaxStablePtrId<'db> {
6484        self.0
6485    }
6486    fn lookup(&self, db: &'db dyn Database) -> ClosureParamWrapperNAry<'db> {
6487        ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6488    }
6489}
6490impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for SyntaxStablePtrId<'db> {
6491    fn from(ptr: ClosureParamWrapperNAryPtr<'db>) -> Self {
6492        ptr.untyped()
6493    }
6494}
6495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6496pub struct ClosureParamWrapperNAryGreen<'db>(pub GreenId<'db>);
6497impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapperNAry<'db> {
6498    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6499    type StablePtr = ClosureParamWrapperNAryPtr<'db>;
6500    type Green = ClosureParamWrapperNAryGreen<'db>;
6501    fn missing(db: &'db dyn Database) -> Self::Green {
6502        ClosureParamWrapperNAryGreen(
6503            GreenNode {
6504                kind: SyntaxKind::ClosureParamWrapperNAry,
6505                details: GreenNodeDetails::Node {
6506                    children: [
6507                        TerminalOr::missing(db).0,
6508                        ParamList::missing(db).0,
6509                        TerminalOr::missing(db).0,
6510                    ]
6511                    .into(),
6512                    width: TextWidth::default(),
6513                },
6514            }
6515            .intern(db),
6516        )
6517    }
6518    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6519        let kind = node.kind(db);
6520        assert_eq!(
6521            kind,
6522            SyntaxKind::ClosureParamWrapperNAry,
6523            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6524            kind,
6525            SyntaxKind::ClosureParamWrapperNAry
6526        );
6527        Self { node }
6528    }
6529    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6530        let kind = node.kind(db);
6531        if kind == SyntaxKind::ClosureParamWrapperNAry {
6532            Some(Self::from_syntax_node(db, node))
6533        } else {
6534            None
6535        }
6536    }
6537    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6538        self.node
6539    }
6540    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6541        ClosureParamWrapperNAryPtr(self.node.stable_ptr(db))
6542    }
6543}
6544#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6545pub struct StructArgExpr<'db> {
6546    node: SyntaxNode<'db>,
6547}
6548impl<'db> StructArgExpr<'db> {
6549    pub const INDEX_COLON: usize = 0;
6550    pub const INDEX_EXPR: usize = 1;
6551    pub fn new_green(
6552        db: &'db dyn Database,
6553        colon: TerminalColonGreen<'db>,
6554        expr: ExprGreen<'db>,
6555    ) -> StructArgExprGreen<'db> {
6556        let children = [colon.0, expr.0];
6557        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6558        StructArgExprGreen(
6559            GreenNode {
6560                kind: SyntaxKind::StructArgExpr,
6561                details: GreenNodeDetails::Node { children: children.into(), width },
6562            }
6563            .intern(db),
6564        )
6565    }
6566}
6567impl<'db> StructArgExpr<'db> {
6568    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
6569        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6570    }
6571    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6572        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6573    }
6574}
6575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6576pub struct StructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6577impl<'db> StructArgExprPtr<'db> {}
6578impl<'db> TypedStablePtr<'db> for StructArgExprPtr<'db> {
6579    type SyntaxNode = StructArgExpr<'db>;
6580    fn untyped(self) -> SyntaxStablePtrId<'db> {
6581        self.0
6582    }
6583    fn lookup(&self, db: &'db dyn Database) -> StructArgExpr<'db> {
6584        StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6585    }
6586}
6587impl<'db> From<StructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6588    fn from(ptr: StructArgExprPtr<'db>) -> Self {
6589        ptr.untyped()
6590    }
6591}
6592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6593pub struct StructArgExprGreen<'db>(pub GreenId<'db>);
6594impl<'db> TypedSyntaxNode<'db> for StructArgExpr<'db> {
6595    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6596    type StablePtr = StructArgExprPtr<'db>;
6597    type Green = StructArgExprGreen<'db>;
6598    fn missing(db: &'db dyn Database) -> Self::Green {
6599        StructArgExprGreen(
6600            GreenNode {
6601                kind: SyntaxKind::StructArgExpr,
6602                details: GreenNodeDetails::Node {
6603                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6604                    width: TextWidth::default(),
6605                },
6606            }
6607            .intern(db),
6608        )
6609    }
6610    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6611        let kind = node.kind(db);
6612        assert_eq!(
6613            kind,
6614            SyntaxKind::StructArgExpr,
6615            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6616            kind,
6617            SyntaxKind::StructArgExpr
6618        );
6619        Self { node }
6620    }
6621    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6622        let kind = node.kind(db);
6623        if kind == SyntaxKind::StructArgExpr {
6624            Some(Self::from_syntax_node(db, node))
6625        } else {
6626            None
6627        }
6628    }
6629    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6630        self.node
6631    }
6632    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6633        StructArgExprPtr(self.node.stable_ptr(db))
6634    }
6635}
6636#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6637pub enum OptionStructArgExpr<'db> {
6638    Empty(OptionStructArgExprEmpty<'db>),
6639    StructArgExpr(StructArgExpr<'db>),
6640}
6641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6642pub struct OptionStructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6643impl<'db> TypedStablePtr<'db> for OptionStructArgExprPtr<'db> {
6644    type SyntaxNode = OptionStructArgExpr<'db>;
6645    fn untyped(self) -> SyntaxStablePtrId<'db> {
6646        self.0
6647    }
6648    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6649        OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6650    }
6651}
6652impl<'db> From<OptionStructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6653    fn from(ptr: OptionStructArgExprPtr<'db>) -> Self {
6654        ptr.untyped()
6655    }
6656}
6657impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for OptionStructArgExprPtr<'db> {
6658    fn from(value: OptionStructArgExprEmptyPtr<'db>) -> Self {
6659        Self(value.0)
6660    }
6661}
6662impl<'db> From<StructArgExprPtr<'db>> for OptionStructArgExprPtr<'db> {
6663    fn from(value: StructArgExprPtr<'db>) -> Self {
6664        Self(value.0)
6665    }
6666}
6667impl<'db> From<OptionStructArgExprEmptyGreen<'db>> for OptionStructArgExprGreen<'db> {
6668    fn from(value: OptionStructArgExprEmptyGreen<'db>) -> Self {
6669        Self(value.0)
6670    }
6671}
6672impl<'db> From<StructArgExprGreen<'db>> for OptionStructArgExprGreen<'db> {
6673    fn from(value: StructArgExprGreen<'db>) -> Self {
6674        Self(value.0)
6675    }
6676}
6677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6678pub struct OptionStructArgExprGreen<'db>(pub GreenId<'db>);
6679impl<'db> TypedSyntaxNode<'db> for OptionStructArgExpr<'db> {
6680    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6681    type StablePtr = OptionStructArgExprPtr<'db>;
6682    type Green = OptionStructArgExprGreen<'db>;
6683    fn missing(db: &'db dyn Database) -> Self::Green {
6684        panic!("No missing variant.");
6685    }
6686    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6687        let kind = node.kind(db);
6688        match kind {
6689            SyntaxKind::OptionStructArgExprEmpty => {
6690                OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6691            }
6692            SyntaxKind::StructArgExpr => {
6693                OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6694            }
6695            _ => panic!(
6696                "Unexpected syntax kind {:?} when constructing {}.",
6697                kind, "OptionStructArgExpr"
6698            ),
6699        }
6700    }
6701    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6702        let kind = node.kind(db);
6703        match kind {
6704            SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6705                OptionStructArgExprEmpty::from_syntax_node(db, node),
6706            )),
6707            SyntaxKind::StructArgExpr => {
6708                Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6709            }
6710            _ => None,
6711        }
6712    }
6713    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6714        match self {
6715            OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6716            OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6717        }
6718    }
6719    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6720        OptionStructArgExprPtr(self.as_syntax_node().long(db).stable_ptr)
6721    }
6722}
6723impl<'db> OptionStructArgExpr<'db> {
6724    /// Checks if a kind of a variant of [OptionStructArgExpr].
6725    pub fn is_variant(kind: SyntaxKind) -> bool {
6726        matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6727    }
6728}
6729#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6730pub struct OptionStructArgExprEmpty<'db> {
6731    node: SyntaxNode<'db>,
6732}
6733impl<'db> OptionStructArgExprEmpty<'db> {
6734    pub fn new_green(db: &'db dyn Database) -> OptionStructArgExprEmptyGreen<'db> {
6735        let children = [];
6736        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6737        OptionStructArgExprEmptyGreen(
6738            GreenNode {
6739                kind: SyntaxKind::OptionStructArgExprEmpty,
6740                details: GreenNodeDetails::Node { children: children.into(), width },
6741            }
6742            .intern(db),
6743        )
6744    }
6745}
6746impl<'db> OptionStructArgExprEmpty<'db> {}
6747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6748pub struct OptionStructArgExprEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6749impl<'db> OptionStructArgExprEmptyPtr<'db> {}
6750impl<'db> TypedStablePtr<'db> for OptionStructArgExprEmptyPtr<'db> {
6751    type SyntaxNode = OptionStructArgExprEmpty<'db>;
6752    fn untyped(self) -> SyntaxStablePtrId<'db> {
6753        self.0
6754    }
6755    fn lookup(&self, db: &'db dyn Database) -> OptionStructArgExprEmpty<'db> {
6756        OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6757    }
6758}
6759impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6760    fn from(ptr: OptionStructArgExprEmptyPtr<'db>) -> Self {
6761        ptr.untyped()
6762    }
6763}
6764#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6765pub struct OptionStructArgExprEmptyGreen<'db>(pub GreenId<'db>);
6766impl<'db> TypedSyntaxNode<'db> for OptionStructArgExprEmpty<'db> {
6767    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6768    type StablePtr = OptionStructArgExprEmptyPtr<'db>;
6769    type Green = OptionStructArgExprEmptyGreen<'db>;
6770    fn missing(db: &'db dyn Database) -> Self::Green {
6771        OptionStructArgExprEmptyGreen(
6772            GreenNode {
6773                kind: SyntaxKind::OptionStructArgExprEmpty,
6774                details: GreenNodeDetails::Node {
6775                    children: [].into(),
6776                    width: TextWidth::default(),
6777                },
6778            }
6779            .intern(db),
6780        )
6781    }
6782    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6783        let kind = node.kind(db);
6784        assert_eq!(
6785            kind,
6786            SyntaxKind::OptionStructArgExprEmpty,
6787            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6788            kind,
6789            SyntaxKind::OptionStructArgExprEmpty
6790        );
6791        Self { node }
6792    }
6793    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6794        let kind = node.kind(db);
6795        if kind == SyntaxKind::OptionStructArgExprEmpty {
6796            Some(Self::from_syntax_node(db, node))
6797        } else {
6798            None
6799        }
6800    }
6801    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6802        self.node
6803    }
6804    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6805        OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6806    }
6807}
6808#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6809pub struct StructArgSingle<'db> {
6810    node: SyntaxNode<'db>,
6811}
6812impl<'db> StructArgSingle<'db> {
6813    pub const INDEX_IDENTIFIER: usize = 0;
6814    pub const INDEX_ARG_EXPR: usize = 1;
6815    pub fn new_green(
6816        db: &'db dyn Database,
6817        identifier: TerminalIdentifierGreen<'db>,
6818        arg_expr: OptionStructArgExprGreen<'db>,
6819    ) -> StructArgSingleGreen<'db> {
6820        let children = [identifier.0, arg_expr.0];
6821        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6822        StructArgSingleGreen(
6823            GreenNode {
6824                kind: SyntaxKind::StructArgSingle,
6825                details: GreenNodeDetails::Node { children: children.into(), width },
6826            }
6827            .intern(db),
6828        )
6829    }
6830}
6831impl<'db> StructArgSingle<'db> {
6832    pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
6833        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6834    }
6835    pub fn arg_expr(&self, db: &'db dyn Database) -> OptionStructArgExpr<'db> {
6836        OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6837    }
6838}
6839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6840pub struct StructArgSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
6841impl<'db> StructArgSinglePtr<'db> {
6842    pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
6843        let ptr = self.0.long(db);
6844        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
6845            TerminalIdentifierGreen(key_fields[0])
6846        } else {
6847            panic!("Unexpected key field query on root.");
6848        }
6849    }
6850}
6851impl<'db> TypedStablePtr<'db> for StructArgSinglePtr<'db> {
6852    type SyntaxNode = StructArgSingle<'db>;
6853    fn untyped(self) -> SyntaxStablePtrId<'db> {
6854        self.0
6855    }
6856    fn lookup(&self, db: &'db dyn Database) -> StructArgSingle<'db> {
6857        StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6858    }
6859}
6860impl<'db> From<StructArgSinglePtr<'db>> for SyntaxStablePtrId<'db> {
6861    fn from(ptr: StructArgSinglePtr<'db>) -> Self {
6862        ptr.untyped()
6863    }
6864}
6865#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6866pub struct StructArgSingleGreen<'db>(pub GreenId<'db>);
6867impl<'db> TypedSyntaxNode<'db> for StructArgSingle<'db> {
6868    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6869    type StablePtr = StructArgSinglePtr<'db>;
6870    type Green = StructArgSingleGreen<'db>;
6871    fn missing(db: &'db dyn Database) -> Self::Green {
6872        StructArgSingleGreen(
6873            GreenNode {
6874                kind: SyntaxKind::StructArgSingle,
6875                details: GreenNodeDetails::Node {
6876                    children: [
6877                        TerminalIdentifier::missing(db).0,
6878                        OptionStructArgExpr::missing(db).0,
6879                    ]
6880                    .into(),
6881                    width: TextWidth::default(),
6882                },
6883            }
6884            .intern(db),
6885        )
6886    }
6887    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6888        let kind = node.kind(db);
6889        assert_eq!(
6890            kind,
6891            SyntaxKind::StructArgSingle,
6892            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6893            kind,
6894            SyntaxKind::StructArgSingle
6895        );
6896        Self { node }
6897    }
6898    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6899        let kind = node.kind(db);
6900        if kind == SyntaxKind::StructArgSingle {
6901            Some(Self::from_syntax_node(db, node))
6902        } else {
6903            None
6904        }
6905    }
6906    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6907        self.node
6908    }
6909    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6910        StructArgSinglePtr(self.node.stable_ptr(db))
6911    }
6912}
6913#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6914pub struct StructArgTail<'db> {
6915    node: SyntaxNode<'db>,
6916}
6917impl<'db> StructArgTail<'db> {
6918    pub const INDEX_DOTDOT: usize = 0;
6919    pub const INDEX_EXPRESSION: usize = 1;
6920    pub fn new_green(
6921        db: &'db dyn Database,
6922        dotdot: TerminalDotDotGreen<'db>,
6923        expression: ExprGreen<'db>,
6924    ) -> StructArgTailGreen<'db> {
6925        let children = [dotdot.0, expression.0];
6926        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6927        StructArgTailGreen(
6928            GreenNode {
6929                kind: SyntaxKind::StructArgTail,
6930                details: GreenNodeDetails::Node { children: children.into(), width },
6931            }
6932            .intern(db),
6933        )
6934    }
6935}
6936impl<'db> StructArgTail<'db> {
6937    pub fn dotdot(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
6938        TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
6939    }
6940    pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
6941        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6942    }
6943}
6944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6945pub struct StructArgTailPtr<'db>(pub SyntaxStablePtrId<'db>);
6946impl<'db> StructArgTailPtr<'db> {}
6947impl<'db> TypedStablePtr<'db> for StructArgTailPtr<'db> {
6948    type SyntaxNode = StructArgTail<'db>;
6949    fn untyped(self) -> SyntaxStablePtrId<'db> {
6950        self.0
6951    }
6952    fn lookup(&self, db: &'db dyn Database) -> StructArgTail<'db> {
6953        StructArgTail::from_syntax_node(db, self.0.lookup(db))
6954    }
6955}
6956impl<'db> From<StructArgTailPtr<'db>> for SyntaxStablePtrId<'db> {
6957    fn from(ptr: StructArgTailPtr<'db>) -> Self {
6958        ptr.untyped()
6959    }
6960}
6961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6962pub struct StructArgTailGreen<'db>(pub GreenId<'db>);
6963impl<'db> TypedSyntaxNode<'db> for StructArgTail<'db> {
6964    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6965    type StablePtr = StructArgTailPtr<'db>;
6966    type Green = StructArgTailGreen<'db>;
6967    fn missing(db: &'db dyn Database) -> Self::Green {
6968        StructArgTailGreen(
6969            GreenNode {
6970                kind: SyntaxKind::StructArgTail,
6971                details: GreenNodeDetails::Node {
6972                    children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
6973                    width: TextWidth::default(),
6974                },
6975            }
6976            .intern(db),
6977        )
6978    }
6979    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6980        let kind = node.kind(db);
6981        assert_eq!(
6982            kind,
6983            SyntaxKind::StructArgTail,
6984            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6985            kind,
6986            SyntaxKind::StructArgTail
6987        );
6988        Self { node }
6989    }
6990    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6991        let kind = node.kind(db);
6992        if kind == SyntaxKind::StructArgTail {
6993            Some(Self::from_syntax_node(db, node))
6994        } else {
6995            None
6996        }
6997    }
6998    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6999        self.node
7000    }
7001    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7002        StructArgTailPtr(self.node.stable_ptr(db))
7003    }
7004}
7005#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7006pub enum StructArg<'db> {
7007    StructArgSingle(StructArgSingle<'db>),
7008    StructArgTail(StructArgTail<'db>),
7009}
7010#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7011pub struct StructArgPtr<'db>(pub SyntaxStablePtrId<'db>);
7012impl<'db> TypedStablePtr<'db> for StructArgPtr<'db> {
7013    type SyntaxNode = StructArg<'db>;
7014    fn untyped(self) -> SyntaxStablePtrId<'db> {
7015        self.0
7016    }
7017    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7018        StructArg::from_syntax_node(db, self.0.lookup(db))
7019    }
7020}
7021impl<'db> From<StructArgPtr<'db>> for SyntaxStablePtrId<'db> {
7022    fn from(ptr: StructArgPtr<'db>) -> Self {
7023        ptr.untyped()
7024    }
7025}
7026impl<'db> From<StructArgSinglePtr<'db>> for StructArgPtr<'db> {
7027    fn from(value: StructArgSinglePtr<'db>) -> Self {
7028        Self(value.0)
7029    }
7030}
7031impl<'db> From<StructArgTailPtr<'db>> for StructArgPtr<'db> {
7032    fn from(value: StructArgTailPtr<'db>) -> Self {
7033        Self(value.0)
7034    }
7035}
7036impl<'db> From<StructArgSingleGreen<'db>> for StructArgGreen<'db> {
7037    fn from(value: StructArgSingleGreen<'db>) -> Self {
7038        Self(value.0)
7039    }
7040}
7041impl<'db> From<StructArgTailGreen<'db>> for StructArgGreen<'db> {
7042    fn from(value: StructArgTailGreen<'db>) -> Self {
7043        Self(value.0)
7044    }
7045}
7046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7047pub struct StructArgGreen<'db>(pub GreenId<'db>);
7048impl<'db> TypedSyntaxNode<'db> for StructArg<'db> {
7049    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7050    type StablePtr = StructArgPtr<'db>;
7051    type Green = StructArgGreen<'db>;
7052    fn missing(db: &'db dyn Database) -> Self::Green {
7053        panic!("No missing variant.");
7054    }
7055    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7056        let kind = node.kind(db);
7057        match kind {
7058            SyntaxKind::StructArgSingle => {
7059                StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7060            }
7061            SyntaxKind::StructArgTail => {
7062                StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7063            }
7064            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7065        }
7066    }
7067    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7068        let kind = node.kind(db);
7069        match kind {
7070            SyntaxKind::StructArgSingle => {
7071                Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7072            }
7073            SyntaxKind::StructArgTail => {
7074                Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7075            }
7076            _ => None,
7077        }
7078    }
7079    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7080        match self {
7081            StructArg::StructArgSingle(x) => x.as_syntax_node(),
7082            StructArg::StructArgTail(x) => x.as_syntax_node(),
7083        }
7084    }
7085    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7086        StructArgPtr(self.as_syntax_node().long(db).stable_ptr)
7087    }
7088}
7089impl<'db> StructArg<'db> {
7090    /// Checks if a kind of a variant of [StructArg].
7091    pub fn is_variant(kind: SyntaxKind) -> bool {
7092        matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7093    }
7094}
7095#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7096pub struct StructArgList<'db>(ElementList<'db, StructArg<'db>, 2>);
7097impl<'db> Deref for StructArgList<'db> {
7098    type Target = ElementList<'db, StructArg<'db>, 2>;
7099    fn deref(&self) -> &Self::Target {
7100        &self.0
7101    }
7102}
7103impl<'db> StructArgList<'db> {
7104    pub fn new_green(
7105        db: &'db dyn Database,
7106        children: &[StructArgListElementOrSeparatorGreen<'db>],
7107    ) -> StructArgListGreen<'db> {
7108        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
7109        StructArgListGreen(
7110            GreenNode {
7111                kind: SyntaxKind::StructArgList,
7112                details: GreenNodeDetails::Node {
7113                    children: children.iter().map(|x| x.id()).collect(),
7114                    width,
7115                },
7116            }
7117            .intern(db),
7118        )
7119    }
7120}
7121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7122pub struct StructArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7123impl<'db> TypedStablePtr<'db> for StructArgListPtr<'db> {
7124    type SyntaxNode = StructArgList<'db>;
7125    fn untyped(self) -> SyntaxStablePtrId<'db> {
7126        self.0
7127    }
7128    fn lookup(&self, db: &'db dyn Database) -> StructArgList<'db> {
7129        StructArgList::from_syntax_node(db, self.0.lookup(db))
7130    }
7131}
7132impl<'db> From<StructArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7133    fn from(ptr: StructArgListPtr<'db>) -> Self {
7134        ptr.untyped()
7135    }
7136}
7137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7138pub enum StructArgListElementOrSeparatorGreen<'db> {
7139    Separator(TerminalCommaGreen<'db>),
7140    Element(StructArgGreen<'db>),
7141}
7142impl<'db> From<TerminalCommaGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7143    fn from(value: TerminalCommaGreen<'db>) -> Self {
7144        StructArgListElementOrSeparatorGreen::Separator(value)
7145    }
7146}
7147impl<'db> From<StructArgGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7148    fn from(value: StructArgGreen<'db>) -> Self {
7149        StructArgListElementOrSeparatorGreen::Element(value)
7150    }
7151}
7152impl<'db> StructArgListElementOrSeparatorGreen<'db> {
7153    fn id(&self) -> GreenId<'db> {
7154        match self {
7155            StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7156            StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7157        }
7158    }
7159}
7160#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7161pub struct StructArgListGreen<'db>(pub GreenId<'db>);
7162impl<'db> TypedSyntaxNode<'db> for StructArgList<'db> {
7163    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7164    type StablePtr = StructArgListPtr<'db>;
7165    type Green = StructArgListGreen<'db>;
7166    fn missing(db: &'db dyn Database) -> Self::Green {
7167        StructArgListGreen(
7168            GreenNode {
7169                kind: SyntaxKind::StructArgList,
7170                details: GreenNodeDetails::Node {
7171                    children: [].into(),
7172                    width: TextWidth::default(),
7173                },
7174            }
7175            .intern(db),
7176        )
7177    }
7178    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7179        Self(ElementList::new(node))
7180    }
7181    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7182        if node.kind(db) == SyntaxKind::StructArgList {
7183            Some(Self(ElementList::new(node)))
7184        } else {
7185            None
7186        }
7187    }
7188    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7189        self.node
7190    }
7191    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7192        StructArgListPtr(self.node.stable_ptr(db))
7193    }
7194}
7195#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7196pub struct ArgListBraced<'db> {
7197    node: SyntaxNode<'db>,
7198}
7199impl<'db> ArgListBraced<'db> {
7200    pub const INDEX_LBRACE: usize = 0;
7201    pub const INDEX_ARGUMENTS: usize = 1;
7202    pub const INDEX_RBRACE: usize = 2;
7203    pub fn new_green(
7204        db: &'db dyn Database,
7205        lbrace: TerminalLBraceGreen<'db>,
7206        arguments: ArgListGreen<'db>,
7207        rbrace: TerminalRBraceGreen<'db>,
7208    ) -> ArgListBracedGreen<'db> {
7209        let children = [lbrace.0, arguments.0, rbrace.0];
7210        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7211        ArgListBracedGreen(
7212            GreenNode {
7213                kind: SyntaxKind::ArgListBraced,
7214                details: GreenNodeDetails::Node { children: children.into(), width },
7215            }
7216            .intern(db),
7217        )
7218    }
7219}
7220impl<'db> ArgListBraced<'db> {
7221    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7222        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7223    }
7224    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7225        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7226    }
7227    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7228        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7229    }
7230}
7231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7232pub struct ArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
7233impl<'db> ArgListBracedPtr<'db> {}
7234impl<'db> TypedStablePtr<'db> for ArgListBracedPtr<'db> {
7235    type SyntaxNode = ArgListBraced<'db>;
7236    fn untyped(self) -> SyntaxStablePtrId<'db> {
7237        self.0
7238    }
7239    fn lookup(&self, db: &'db dyn Database) -> ArgListBraced<'db> {
7240        ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7241    }
7242}
7243impl<'db> From<ArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
7244    fn from(ptr: ArgListBracedPtr<'db>) -> Self {
7245        ptr.untyped()
7246    }
7247}
7248#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7249pub struct ArgListBracedGreen<'db>(pub GreenId<'db>);
7250impl<'db> TypedSyntaxNode<'db> for ArgListBraced<'db> {
7251    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7252    type StablePtr = ArgListBracedPtr<'db>;
7253    type Green = ArgListBracedGreen<'db>;
7254    fn missing(db: &'db dyn Database) -> Self::Green {
7255        ArgListBracedGreen(
7256            GreenNode {
7257                kind: SyntaxKind::ArgListBraced,
7258                details: GreenNodeDetails::Node {
7259                    children: [
7260                        TerminalLBrace::missing(db).0,
7261                        ArgList::missing(db).0,
7262                        TerminalRBrace::missing(db).0,
7263                    ]
7264                    .into(),
7265                    width: TextWidth::default(),
7266                },
7267            }
7268            .intern(db),
7269        )
7270    }
7271    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7272        let kind = node.kind(db);
7273        assert_eq!(
7274            kind,
7275            SyntaxKind::ArgListBraced,
7276            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7277            kind,
7278            SyntaxKind::ArgListBraced
7279        );
7280        Self { node }
7281    }
7282    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7283        let kind = node.kind(db);
7284        if kind == SyntaxKind::ArgListBraced {
7285            Some(Self::from_syntax_node(db, node))
7286        } else {
7287            None
7288        }
7289    }
7290    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7291        self.node
7292    }
7293    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7294        ArgListBracedPtr(self.node.stable_ptr(db))
7295    }
7296}
7297#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7298pub struct ArgListBracketed<'db> {
7299    node: SyntaxNode<'db>,
7300}
7301impl<'db> ArgListBracketed<'db> {
7302    pub const INDEX_LBRACK: usize = 0;
7303    pub const INDEX_ARGUMENTS: usize = 1;
7304    pub const INDEX_RBRACK: usize = 2;
7305    pub fn new_green(
7306        db: &'db dyn Database,
7307        lbrack: TerminalLBrackGreen<'db>,
7308        arguments: ArgListGreen<'db>,
7309        rbrack: TerminalRBrackGreen<'db>,
7310    ) -> ArgListBracketedGreen<'db> {
7311        let children = [lbrack.0, arguments.0, rbrack.0];
7312        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7313        ArgListBracketedGreen(
7314            GreenNode {
7315                kind: SyntaxKind::ArgListBracketed,
7316                details: GreenNodeDetails::Node { children: children.into(), width },
7317            }
7318            .intern(db),
7319        )
7320    }
7321}
7322impl<'db> ArgListBracketed<'db> {
7323    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
7324        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7325    }
7326    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7327        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7328    }
7329    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
7330        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7331    }
7332}
7333#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7334pub struct ArgListBracketedPtr<'db>(pub SyntaxStablePtrId<'db>);
7335impl<'db> ArgListBracketedPtr<'db> {}
7336impl<'db> TypedStablePtr<'db> for ArgListBracketedPtr<'db> {
7337    type SyntaxNode = ArgListBracketed<'db>;
7338    fn untyped(self) -> SyntaxStablePtrId<'db> {
7339        self.0
7340    }
7341    fn lookup(&self, db: &'db dyn Database) -> ArgListBracketed<'db> {
7342        ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7343    }
7344}
7345impl<'db> From<ArgListBracketedPtr<'db>> for SyntaxStablePtrId<'db> {
7346    fn from(ptr: ArgListBracketedPtr<'db>) -> Self {
7347        ptr.untyped()
7348    }
7349}
7350#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7351pub struct ArgListBracketedGreen<'db>(pub GreenId<'db>);
7352impl<'db> TypedSyntaxNode<'db> for ArgListBracketed<'db> {
7353    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7354    type StablePtr = ArgListBracketedPtr<'db>;
7355    type Green = ArgListBracketedGreen<'db>;
7356    fn missing(db: &'db dyn Database) -> Self::Green {
7357        ArgListBracketedGreen(
7358            GreenNode {
7359                kind: SyntaxKind::ArgListBracketed,
7360                details: GreenNodeDetails::Node {
7361                    children: [
7362                        TerminalLBrack::missing(db).0,
7363                        ArgList::missing(db).0,
7364                        TerminalRBrack::missing(db).0,
7365                    ]
7366                    .into(),
7367                    width: TextWidth::default(),
7368                },
7369            }
7370            .intern(db),
7371        )
7372    }
7373    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7374        let kind = node.kind(db);
7375        assert_eq!(
7376            kind,
7377            SyntaxKind::ArgListBracketed,
7378            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7379            kind,
7380            SyntaxKind::ArgListBracketed
7381        );
7382        Self { node }
7383    }
7384    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7385        let kind = node.kind(db);
7386        if kind == SyntaxKind::ArgListBracketed {
7387            Some(Self::from_syntax_node(db, node))
7388        } else {
7389            None
7390        }
7391    }
7392    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7393        self.node
7394    }
7395    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7396        ArgListBracketedPtr(self.node.stable_ptr(db))
7397    }
7398}
7399#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7400pub enum WrappedArgList<'db> {
7401    BracketedArgList(ArgListBracketed<'db>),
7402    ParenthesizedArgList(ArgListParenthesized<'db>),
7403    BracedArgList(ArgListBraced<'db>),
7404    Missing(WrappedArgListMissing<'db>),
7405}
7406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7407pub struct WrappedArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7408impl<'db> TypedStablePtr<'db> for WrappedArgListPtr<'db> {
7409    type SyntaxNode = WrappedArgList<'db>;
7410    fn untyped(self) -> SyntaxStablePtrId<'db> {
7411        self.0
7412    }
7413    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7414        WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7415    }
7416}
7417impl<'db> From<WrappedArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7418    fn from(ptr: WrappedArgListPtr<'db>) -> Self {
7419        ptr.untyped()
7420    }
7421}
7422impl<'db> From<ArgListBracketedPtr<'db>> for WrappedArgListPtr<'db> {
7423    fn from(value: ArgListBracketedPtr<'db>) -> Self {
7424        Self(value.0)
7425    }
7426}
7427impl<'db> From<ArgListParenthesizedPtr<'db>> for WrappedArgListPtr<'db> {
7428    fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
7429        Self(value.0)
7430    }
7431}
7432impl<'db> From<ArgListBracedPtr<'db>> for WrappedArgListPtr<'db> {
7433    fn from(value: ArgListBracedPtr<'db>) -> Self {
7434        Self(value.0)
7435    }
7436}
7437impl<'db> From<WrappedArgListMissingPtr<'db>> for WrappedArgListPtr<'db> {
7438    fn from(value: WrappedArgListMissingPtr<'db>) -> Self {
7439        Self(value.0)
7440    }
7441}
7442impl<'db> From<ArgListBracketedGreen<'db>> for WrappedArgListGreen<'db> {
7443    fn from(value: ArgListBracketedGreen<'db>) -> Self {
7444        Self(value.0)
7445    }
7446}
7447impl<'db> From<ArgListParenthesizedGreen<'db>> for WrappedArgListGreen<'db> {
7448    fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
7449        Self(value.0)
7450    }
7451}
7452impl<'db> From<ArgListBracedGreen<'db>> for WrappedArgListGreen<'db> {
7453    fn from(value: ArgListBracedGreen<'db>) -> Self {
7454        Self(value.0)
7455    }
7456}
7457impl<'db> From<WrappedArgListMissingGreen<'db>> for WrappedArgListGreen<'db> {
7458    fn from(value: WrappedArgListMissingGreen<'db>) -> Self {
7459        Self(value.0)
7460    }
7461}
7462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7463pub struct WrappedArgListGreen<'db>(pub GreenId<'db>);
7464impl<'db> TypedSyntaxNode<'db> for WrappedArgList<'db> {
7465    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7466    type StablePtr = WrappedArgListPtr<'db>;
7467    type Green = WrappedArgListGreen<'db>;
7468    fn missing(db: &'db dyn Database) -> Self::Green {
7469        WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7470    }
7471    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7472        let kind = node.kind(db);
7473        match kind {
7474            SyntaxKind::ArgListBracketed => {
7475                WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7476            }
7477            SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7478                ArgListParenthesized::from_syntax_node(db, node),
7479            ),
7480            SyntaxKind::ArgListBraced => {
7481                WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7482            }
7483            SyntaxKind::WrappedArgListMissing => {
7484                WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7485            }
7486            _ => {
7487                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7488            }
7489        }
7490    }
7491    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7492        let kind = node.kind(db);
7493        match kind {
7494            SyntaxKind::ArgListBracketed => {
7495                Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7496            }
7497            SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7498                ArgListParenthesized::from_syntax_node(db, node),
7499            )),
7500            SyntaxKind::ArgListBraced => {
7501                Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7502            }
7503            SyntaxKind::WrappedArgListMissing => {
7504                Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7505            }
7506            _ => None,
7507        }
7508    }
7509    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7510        match self {
7511            WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7512            WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7513            WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7514            WrappedArgList::Missing(x) => x.as_syntax_node(),
7515        }
7516    }
7517    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7518        WrappedArgListPtr(self.as_syntax_node().long(db).stable_ptr)
7519    }
7520}
7521impl<'db> WrappedArgList<'db> {
7522    /// Checks if a kind of a variant of [WrappedArgList].
7523    pub fn is_variant(kind: SyntaxKind) -> bool {
7524        matches!(
7525            kind,
7526            SyntaxKind::ArgListBracketed
7527                | SyntaxKind::ArgListParenthesized
7528                | SyntaxKind::ArgListBraced
7529                | SyntaxKind::WrappedArgListMissing
7530        )
7531    }
7532}
7533#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7534pub struct WrappedArgListMissing<'db> {
7535    node: SyntaxNode<'db>,
7536}
7537impl<'db> WrappedArgListMissing<'db> {
7538    pub fn new_green(db: &'db dyn Database) -> WrappedArgListMissingGreen<'db> {
7539        let children = [];
7540        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7541        WrappedArgListMissingGreen(
7542            GreenNode {
7543                kind: SyntaxKind::WrappedArgListMissing,
7544                details: GreenNodeDetails::Node { children: children.into(), width },
7545            }
7546            .intern(db),
7547        )
7548    }
7549}
7550impl<'db> WrappedArgListMissing<'db> {}
7551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7552pub struct WrappedArgListMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
7553impl<'db> WrappedArgListMissingPtr<'db> {}
7554impl<'db> TypedStablePtr<'db> for WrappedArgListMissingPtr<'db> {
7555    type SyntaxNode = WrappedArgListMissing<'db>;
7556    fn untyped(self) -> SyntaxStablePtrId<'db> {
7557        self.0
7558    }
7559    fn lookup(&self, db: &'db dyn Database) -> WrappedArgListMissing<'db> {
7560        WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7561    }
7562}
7563impl<'db> From<WrappedArgListMissingPtr<'db>> for SyntaxStablePtrId<'db> {
7564    fn from(ptr: WrappedArgListMissingPtr<'db>) -> Self {
7565        ptr.untyped()
7566    }
7567}
7568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7569pub struct WrappedArgListMissingGreen<'db>(pub GreenId<'db>);
7570impl<'db> TypedSyntaxNode<'db> for WrappedArgListMissing<'db> {
7571    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7572    type StablePtr = WrappedArgListMissingPtr<'db>;
7573    type Green = WrappedArgListMissingGreen<'db>;
7574    fn missing(db: &'db dyn Database) -> Self::Green {
7575        WrappedArgListMissingGreen(
7576            GreenNode {
7577                kind: SyntaxKind::WrappedArgListMissing,
7578                details: GreenNodeDetails::Node {
7579                    children: [].into(),
7580                    width: TextWidth::default(),
7581                },
7582            }
7583            .intern(db),
7584        )
7585    }
7586    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7587        let kind = node.kind(db);
7588        assert_eq!(
7589            kind,
7590            SyntaxKind::WrappedArgListMissing,
7591            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7592            kind,
7593            SyntaxKind::WrappedArgListMissing
7594        );
7595        Self { node }
7596    }
7597    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7598        let kind = node.kind(db);
7599        if kind == SyntaxKind::WrappedArgListMissing {
7600            Some(Self::from_syntax_node(db, node))
7601        } else {
7602            None
7603        }
7604    }
7605    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7606        self.node
7607    }
7608    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7609        WrappedArgListMissingPtr(self.node.stable_ptr(db))
7610    }
7611}
7612#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7613pub enum Pattern<'db> {
7614    Underscore(TerminalUnderscore<'db>),
7615    Literal(TerminalLiteralNumber<'db>),
7616    False(TerminalFalse<'db>),
7617    True(TerminalTrue<'db>),
7618    ShortString(TerminalShortString<'db>),
7619    String(TerminalString<'db>),
7620    Identifier(PatternIdentifier<'db>),
7621    Struct(PatternStruct<'db>),
7622    Tuple(PatternTuple<'db>),
7623    Enum(PatternEnum<'db>),
7624    FixedSizeArray(PatternFixedSizeArray<'db>),
7625    Path(ExprPath<'db>),
7626}
7627#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7628pub struct PatternPtr<'db>(pub SyntaxStablePtrId<'db>);
7629impl<'db> TypedStablePtr<'db> for PatternPtr<'db> {
7630    type SyntaxNode = Pattern<'db>;
7631    fn untyped(self) -> SyntaxStablePtrId<'db> {
7632        self.0
7633    }
7634    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7635        Pattern::from_syntax_node(db, self.0.lookup(db))
7636    }
7637}
7638impl<'db> From<PatternPtr<'db>> for SyntaxStablePtrId<'db> {
7639    fn from(ptr: PatternPtr<'db>) -> Self {
7640        ptr.untyped()
7641    }
7642}
7643impl<'db> From<TerminalUnderscorePtr<'db>> for PatternPtr<'db> {
7644    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
7645        Self(value.0)
7646    }
7647}
7648impl<'db> From<TerminalLiteralNumberPtr<'db>> for PatternPtr<'db> {
7649    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
7650        Self(value.0)
7651    }
7652}
7653impl<'db> From<TerminalFalsePtr<'db>> for PatternPtr<'db> {
7654    fn from(value: TerminalFalsePtr<'db>) -> Self {
7655        Self(value.0)
7656    }
7657}
7658impl<'db> From<TerminalTruePtr<'db>> for PatternPtr<'db> {
7659    fn from(value: TerminalTruePtr<'db>) -> Self {
7660        Self(value.0)
7661    }
7662}
7663impl<'db> From<TerminalShortStringPtr<'db>> for PatternPtr<'db> {
7664    fn from(value: TerminalShortStringPtr<'db>) -> Self {
7665        Self(value.0)
7666    }
7667}
7668impl<'db> From<TerminalStringPtr<'db>> for PatternPtr<'db> {
7669    fn from(value: TerminalStringPtr<'db>) -> Self {
7670        Self(value.0)
7671    }
7672}
7673impl<'db> From<PatternIdentifierPtr<'db>> for PatternPtr<'db> {
7674    fn from(value: PatternIdentifierPtr<'db>) -> Self {
7675        Self(value.0)
7676    }
7677}
7678impl<'db> From<PatternStructPtr<'db>> for PatternPtr<'db> {
7679    fn from(value: PatternStructPtr<'db>) -> Self {
7680        Self(value.0)
7681    }
7682}
7683impl<'db> From<PatternTuplePtr<'db>> for PatternPtr<'db> {
7684    fn from(value: PatternTuplePtr<'db>) -> Self {
7685        Self(value.0)
7686    }
7687}
7688impl<'db> From<PatternEnumPtr<'db>> for PatternPtr<'db> {
7689    fn from(value: PatternEnumPtr<'db>) -> Self {
7690        Self(value.0)
7691    }
7692}
7693impl<'db> From<PatternFixedSizeArrayPtr<'db>> for PatternPtr<'db> {
7694    fn from(value: PatternFixedSizeArrayPtr<'db>) -> Self {
7695        Self(value.0)
7696    }
7697}
7698impl<'db> From<ExprPathPtr<'db>> for PatternPtr<'db> {
7699    fn from(value: ExprPathPtr<'db>) -> Self {
7700        Self(value.0)
7701    }
7702}
7703impl<'db> From<TerminalUnderscoreGreen<'db>> for PatternGreen<'db> {
7704    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
7705        Self(value.0)
7706    }
7707}
7708impl<'db> From<TerminalLiteralNumberGreen<'db>> for PatternGreen<'db> {
7709    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
7710        Self(value.0)
7711    }
7712}
7713impl<'db> From<TerminalFalseGreen<'db>> for PatternGreen<'db> {
7714    fn from(value: TerminalFalseGreen<'db>) -> Self {
7715        Self(value.0)
7716    }
7717}
7718impl<'db> From<TerminalTrueGreen<'db>> for PatternGreen<'db> {
7719    fn from(value: TerminalTrueGreen<'db>) -> Self {
7720        Self(value.0)
7721    }
7722}
7723impl<'db> From<TerminalShortStringGreen<'db>> for PatternGreen<'db> {
7724    fn from(value: TerminalShortStringGreen<'db>) -> Self {
7725        Self(value.0)
7726    }
7727}
7728impl<'db> From<TerminalStringGreen<'db>> for PatternGreen<'db> {
7729    fn from(value: TerminalStringGreen<'db>) -> Self {
7730        Self(value.0)
7731    }
7732}
7733impl<'db> From<PatternIdentifierGreen<'db>> for PatternGreen<'db> {
7734    fn from(value: PatternIdentifierGreen<'db>) -> Self {
7735        Self(value.0)
7736    }
7737}
7738impl<'db> From<PatternStructGreen<'db>> for PatternGreen<'db> {
7739    fn from(value: PatternStructGreen<'db>) -> Self {
7740        Self(value.0)
7741    }
7742}
7743impl<'db> From<PatternTupleGreen<'db>> for PatternGreen<'db> {
7744    fn from(value: PatternTupleGreen<'db>) -> Self {
7745        Self(value.0)
7746    }
7747}
7748impl<'db> From<PatternEnumGreen<'db>> for PatternGreen<'db> {
7749    fn from(value: PatternEnumGreen<'db>) -> Self {
7750        Self(value.0)
7751    }
7752}
7753impl<'db> From<PatternFixedSizeArrayGreen<'db>> for PatternGreen<'db> {
7754    fn from(value: PatternFixedSizeArrayGreen<'db>) -> Self {
7755        Self(value.0)
7756    }
7757}
7758impl<'db> From<ExprPathGreen<'db>> for PatternGreen<'db> {
7759    fn from(value: ExprPathGreen<'db>) -> Self {
7760        Self(value.0)
7761    }
7762}
7763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7764pub struct PatternGreen<'db>(pub GreenId<'db>);
7765impl<'db> TypedSyntaxNode<'db> for Pattern<'db> {
7766    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7767    type StablePtr = PatternPtr<'db>;
7768    type Green = PatternGreen<'db>;
7769    fn missing(db: &'db dyn Database) -> Self::Green {
7770        panic!("No missing variant.");
7771    }
7772    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7773        let kind = node.kind(db);
7774        match kind {
7775            SyntaxKind::TerminalUnderscore => {
7776                Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7777            }
7778            SyntaxKind::TerminalLiteralNumber => {
7779                Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7780            }
7781            SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7782            SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7783            SyntaxKind::TerminalShortString => {
7784                Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7785            }
7786            SyntaxKind::TerminalString => {
7787                Pattern::String(TerminalString::from_syntax_node(db, node))
7788            }
7789            SyntaxKind::PatternIdentifier => {
7790                Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7791            }
7792            SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7793            SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7794            SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7795            SyntaxKind::PatternFixedSizeArray => {
7796                Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7797            }
7798            SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7799            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7800        }
7801    }
7802    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7803        let kind = node.kind(db);
7804        match kind {
7805            SyntaxKind::TerminalUnderscore => {
7806                Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7807            }
7808            SyntaxKind::TerminalLiteralNumber => {
7809                Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7810            }
7811            SyntaxKind::TerminalFalse => {
7812                Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7813            }
7814            SyntaxKind::TerminalTrue => {
7815                Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7816            }
7817            SyntaxKind::TerminalShortString => {
7818                Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7819            }
7820            SyntaxKind::TerminalString => {
7821                Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7822            }
7823            SyntaxKind::PatternIdentifier => {
7824                Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7825            }
7826            SyntaxKind::PatternStruct => {
7827                Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7828            }
7829            SyntaxKind::PatternTuple => {
7830                Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7831            }
7832            SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7833            SyntaxKind::PatternFixedSizeArray => {
7834                Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7835            }
7836            SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7837            _ => None,
7838        }
7839    }
7840    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7841        match self {
7842            Pattern::Underscore(x) => x.as_syntax_node(),
7843            Pattern::Literal(x) => x.as_syntax_node(),
7844            Pattern::False(x) => x.as_syntax_node(),
7845            Pattern::True(x) => x.as_syntax_node(),
7846            Pattern::ShortString(x) => x.as_syntax_node(),
7847            Pattern::String(x) => x.as_syntax_node(),
7848            Pattern::Identifier(x) => x.as_syntax_node(),
7849            Pattern::Struct(x) => x.as_syntax_node(),
7850            Pattern::Tuple(x) => x.as_syntax_node(),
7851            Pattern::Enum(x) => x.as_syntax_node(),
7852            Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7853            Pattern::Path(x) => x.as_syntax_node(),
7854        }
7855    }
7856    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7857        PatternPtr(self.as_syntax_node().long(db).stable_ptr)
7858    }
7859}
7860impl<'db> Pattern<'db> {
7861    /// Checks if a kind of a variant of [Pattern].
7862    pub fn is_variant(kind: SyntaxKind) -> bool {
7863        matches!(
7864            kind,
7865            SyntaxKind::TerminalUnderscore
7866                | SyntaxKind::TerminalLiteralNumber
7867                | SyntaxKind::TerminalFalse
7868                | SyntaxKind::TerminalTrue
7869                | SyntaxKind::TerminalShortString
7870                | SyntaxKind::TerminalString
7871                | SyntaxKind::PatternIdentifier
7872                | SyntaxKind::PatternStruct
7873                | SyntaxKind::PatternTuple
7874                | SyntaxKind::PatternEnum
7875                | SyntaxKind::PatternFixedSizeArray
7876                | SyntaxKind::ExprPath
7877        )
7878    }
7879}
7880#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7881pub struct PatternIdentifier<'db> {
7882    node: SyntaxNode<'db>,
7883}
7884impl<'db> PatternIdentifier<'db> {
7885    pub const INDEX_MODIFIERS: usize = 0;
7886    pub const INDEX_NAME: usize = 1;
7887    pub fn new_green(
7888        db: &'db dyn Database,
7889        modifiers: ModifierListGreen<'db>,
7890        name: TerminalIdentifierGreen<'db>,
7891    ) -> PatternIdentifierGreen<'db> {
7892        let children = [modifiers.0, name.0];
7893        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7894        PatternIdentifierGreen(
7895            GreenNode {
7896                kind: SyntaxKind::PatternIdentifier,
7897                details: GreenNodeDetails::Node { children: children.into(), width },
7898            }
7899            .intern(db),
7900        )
7901    }
7902}
7903impl<'db> PatternIdentifier<'db> {
7904    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
7905        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
7906    }
7907    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
7908        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
7909    }
7910}
7911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7912pub struct PatternIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
7913impl<'db> PatternIdentifierPtr<'db> {
7914    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
7915        let ptr = self.0.long(db);
7916        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
7917            TerminalIdentifierGreen(key_fields[0])
7918        } else {
7919            panic!("Unexpected key field query on root.");
7920        }
7921    }
7922}
7923impl<'db> TypedStablePtr<'db> for PatternIdentifierPtr<'db> {
7924    type SyntaxNode = PatternIdentifier<'db>;
7925    fn untyped(self) -> SyntaxStablePtrId<'db> {
7926        self.0
7927    }
7928    fn lookup(&self, db: &'db dyn Database) -> PatternIdentifier<'db> {
7929        PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7930    }
7931}
7932impl<'db> From<PatternIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
7933    fn from(ptr: PatternIdentifierPtr<'db>) -> Self {
7934        ptr.untyped()
7935    }
7936}
7937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7938pub struct PatternIdentifierGreen<'db>(pub GreenId<'db>);
7939impl<'db> TypedSyntaxNode<'db> for PatternIdentifier<'db> {
7940    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7941    type StablePtr = PatternIdentifierPtr<'db>;
7942    type Green = PatternIdentifierGreen<'db>;
7943    fn missing(db: &'db dyn Database) -> Self::Green {
7944        PatternIdentifierGreen(
7945            GreenNode {
7946                kind: SyntaxKind::PatternIdentifier,
7947                details: GreenNodeDetails::Node {
7948                    children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
7949                        .into(),
7950                    width: TextWidth::default(),
7951                },
7952            }
7953            .intern(db),
7954        )
7955    }
7956    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7957        let kind = node.kind(db);
7958        assert_eq!(
7959            kind,
7960            SyntaxKind::PatternIdentifier,
7961            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7962            kind,
7963            SyntaxKind::PatternIdentifier
7964        );
7965        Self { node }
7966    }
7967    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7968        let kind = node.kind(db);
7969        if kind == SyntaxKind::PatternIdentifier {
7970            Some(Self::from_syntax_node(db, node))
7971        } else {
7972            None
7973        }
7974    }
7975    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7976        self.node
7977    }
7978    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7979        PatternIdentifierPtr(self.node.stable_ptr(db))
7980    }
7981}
7982#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7983pub struct PatternStruct<'db> {
7984    node: SyntaxNode<'db>,
7985}
7986impl<'db> PatternStruct<'db> {
7987    pub const INDEX_PATH: usize = 0;
7988    pub const INDEX_LBRACE: usize = 1;
7989    pub const INDEX_PARAMS: usize = 2;
7990    pub const INDEX_RBRACE: usize = 3;
7991    pub fn new_green(
7992        db: &'db dyn Database,
7993        path: ExprPathGreen<'db>,
7994        lbrace: TerminalLBraceGreen<'db>,
7995        params: PatternStructParamListGreen<'db>,
7996        rbrace: TerminalRBraceGreen<'db>,
7997    ) -> PatternStructGreen<'db> {
7998        let children = [path.0, lbrace.0, params.0, rbrace.0];
7999        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8000        PatternStructGreen(
8001            GreenNode {
8002                kind: SyntaxKind::PatternStruct,
8003                details: GreenNodeDetails::Node { children: children.into(), width },
8004            }
8005            .intern(db),
8006        )
8007    }
8008}
8009impl<'db> PatternStruct<'db> {
8010    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8011        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8012    }
8013    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
8014        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
8015    }
8016    pub fn params(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8017        PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
8018    }
8019    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
8020        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
8021    }
8022}
8023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8024pub struct PatternStructPtr<'db>(pub SyntaxStablePtrId<'db>);
8025impl<'db> PatternStructPtr<'db> {}
8026impl<'db> TypedStablePtr<'db> for PatternStructPtr<'db> {
8027    type SyntaxNode = PatternStruct<'db>;
8028    fn untyped(self) -> SyntaxStablePtrId<'db> {
8029        self.0
8030    }
8031    fn lookup(&self, db: &'db dyn Database) -> PatternStruct<'db> {
8032        PatternStruct::from_syntax_node(db, self.0.lookup(db))
8033    }
8034}
8035impl<'db> From<PatternStructPtr<'db>> for SyntaxStablePtrId<'db> {
8036    fn from(ptr: PatternStructPtr<'db>) -> Self {
8037        ptr.untyped()
8038    }
8039}
8040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8041pub struct PatternStructGreen<'db>(pub GreenId<'db>);
8042impl<'db> TypedSyntaxNode<'db> for PatternStruct<'db> {
8043    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8044    type StablePtr = PatternStructPtr<'db>;
8045    type Green = PatternStructGreen<'db>;
8046    fn missing(db: &'db dyn Database) -> Self::Green {
8047        PatternStructGreen(
8048            GreenNode {
8049                kind: SyntaxKind::PatternStruct,
8050                details: GreenNodeDetails::Node {
8051                    children: [
8052                        ExprPath::missing(db).0,
8053                        TerminalLBrace::missing(db).0,
8054                        PatternStructParamList::missing(db).0,
8055                        TerminalRBrace::missing(db).0,
8056                    ]
8057                    .into(),
8058                    width: TextWidth::default(),
8059                },
8060            }
8061            .intern(db),
8062        )
8063    }
8064    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8065        let kind = node.kind(db);
8066        assert_eq!(
8067            kind,
8068            SyntaxKind::PatternStruct,
8069            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8070            kind,
8071            SyntaxKind::PatternStruct
8072        );
8073        Self { node }
8074    }
8075    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8076        let kind = node.kind(db);
8077        if kind == SyntaxKind::PatternStruct {
8078            Some(Self::from_syntax_node(db, node))
8079        } else {
8080            None
8081        }
8082    }
8083    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8084        self.node
8085    }
8086    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8087        PatternStructPtr(self.node.stable_ptr(db))
8088    }
8089}
8090#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8091pub struct PatternStructParamList<'db>(ElementList<'db, PatternStructParam<'db>, 2>);
8092impl<'db> Deref for PatternStructParamList<'db> {
8093    type Target = ElementList<'db, PatternStructParam<'db>, 2>;
8094    fn deref(&self) -> &Self::Target {
8095        &self.0
8096    }
8097}
8098impl<'db> PatternStructParamList<'db> {
8099    pub fn new_green(
8100        db: &'db dyn Database,
8101        children: &[PatternStructParamListElementOrSeparatorGreen<'db>],
8102    ) -> PatternStructParamListGreen<'db> {
8103        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8104        PatternStructParamListGreen(
8105            GreenNode {
8106                kind: SyntaxKind::PatternStructParamList,
8107                details: GreenNodeDetails::Node {
8108                    children: children.iter().map(|x| x.id()).collect(),
8109                    width,
8110                },
8111            }
8112            .intern(db),
8113        )
8114    }
8115}
8116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8117pub struct PatternStructParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
8118impl<'db> TypedStablePtr<'db> for PatternStructParamListPtr<'db> {
8119    type SyntaxNode = PatternStructParamList<'db>;
8120    fn untyped(self) -> SyntaxStablePtrId<'db> {
8121        self.0
8122    }
8123    fn lookup(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8124        PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8125    }
8126}
8127impl<'db> From<PatternStructParamListPtr<'db>> for SyntaxStablePtrId<'db> {
8128    fn from(ptr: PatternStructParamListPtr<'db>) -> Self {
8129        ptr.untyped()
8130    }
8131}
8132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8133pub enum PatternStructParamListElementOrSeparatorGreen<'db> {
8134    Separator(TerminalCommaGreen<'db>),
8135    Element(PatternStructParamGreen<'db>),
8136}
8137impl<'db> From<TerminalCommaGreen<'db>> for PatternStructParamListElementOrSeparatorGreen<'db> {
8138    fn from(value: TerminalCommaGreen<'db>) -> Self {
8139        PatternStructParamListElementOrSeparatorGreen::Separator(value)
8140    }
8141}
8142impl<'db> From<PatternStructParamGreen<'db>>
8143    for PatternStructParamListElementOrSeparatorGreen<'db>
8144{
8145    fn from(value: PatternStructParamGreen<'db>) -> Self {
8146        PatternStructParamListElementOrSeparatorGreen::Element(value)
8147    }
8148}
8149impl<'db> PatternStructParamListElementOrSeparatorGreen<'db> {
8150    fn id(&self) -> GreenId<'db> {
8151        match self {
8152            PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8153            PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8154        }
8155    }
8156}
8157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8158pub struct PatternStructParamListGreen<'db>(pub GreenId<'db>);
8159impl<'db> TypedSyntaxNode<'db> for PatternStructParamList<'db> {
8160    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8161    type StablePtr = PatternStructParamListPtr<'db>;
8162    type Green = PatternStructParamListGreen<'db>;
8163    fn missing(db: &'db dyn Database) -> Self::Green {
8164        PatternStructParamListGreen(
8165            GreenNode {
8166                kind: SyntaxKind::PatternStructParamList,
8167                details: GreenNodeDetails::Node {
8168                    children: [].into(),
8169                    width: TextWidth::default(),
8170                },
8171            }
8172            .intern(db),
8173        )
8174    }
8175    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8176        Self(ElementList::new(node))
8177    }
8178    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8179        if node.kind(db) == SyntaxKind::PatternStructParamList {
8180            Some(Self(ElementList::new(node)))
8181        } else {
8182            None
8183        }
8184    }
8185    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8186        self.node
8187    }
8188    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8189        PatternStructParamListPtr(self.node.stable_ptr(db))
8190    }
8191}
8192#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8193pub struct PatternTuple<'db> {
8194    node: SyntaxNode<'db>,
8195}
8196impl<'db> PatternTuple<'db> {
8197    pub const INDEX_LPAREN: usize = 0;
8198    pub const INDEX_PATTERNS: usize = 1;
8199    pub const INDEX_RPAREN: usize = 2;
8200    pub fn new_green(
8201        db: &'db dyn Database,
8202        lparen: TerminalLParenGreen<'db>,
8203        patterns: PatternListGreen<'db>,
8204        rparen: TerminalRParenGreen<'db>,
8205    ) -> PatternTupleGreen<'db> {
8206        let children = [lparen.0, patterns.0, rparen.0];
8207        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8208        PatternTupleGreen(
8209            GreenNode {
8210                kind: SyntaxKind::PatternTuple,
8211                details: GreenNodeDetails::Node { children: children.into(), width },
8212            }
8213            .intern(db),
8214        )
8215    }
8216}
8217impl<'db> PatternTuple<'db> {
8218    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8219        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8220    }
8221    pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8222        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8223    }
8224    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8225        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8226    }
8227}
8228#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8229pub struct PatternTuplePtr<'db>(pub SyntaxStablePtrId<'db>);
8230impl<'db> PatternTuplePtr<'db> {}
8231impl<'db> TypedStablePtr<'db> for PatternTuplePtr<'db> {
8232    type SyntaxNode = PatternTuple<'db>;
8233    fn untyped(self) -> SyntaxStablePtrId<'db> {
8234        self.0
8235    }
8236    fn lookup(&self, db: &'db dyn Database) -> PatternTuple<'db> {
8237        PatternTuple::from_syntax_node(db, self.0.lookup(db))
8238    }
8239}
8240impl<'db> From<PatternTuplePtr<'db>> for SyntaxStablePtrId<'db> {
8241    fn from(ptr: PatternTuplePtr<'db>) -> Self {
8242        ptr.untyped()
8243    }
8244}
8245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8246pub struct PatternTupleGreen<'db>(pub GreenId<'db>);
8247impl<'db> TypedSyntaxNode<'db> for PatternTuple<'db> {
8248    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8249    type StablePtr = PatternTuplePtr<'db>;
8250    type Green = PatternTupleGreen<'db>;
8251    fn missing(db: &'db dyn Database) -> Self::Green {
8252        PatternTupleGreen(
8253            GreenNode {
8254                kind: SyntaxKind::PatternTuple,
8255                details: GreenNodeDetails::Node {
8256                    children: [
8257                        TerminalLParen::missing(db).0,
8258                        PatternList::missing(db).0,
8259                        TerminalRParen::missing(db).0,
8260                    ]
8261                    .into(),
8262                    width: TextWidth::default(),
8263                },
8264            }
8265            .intern(db),
8266        )
8267    }
8268    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8269        let kind = node.kind(db);
8270        assert_eq!(
8271            kind,
8272            SyntaxKind::PatternTuple,
8273            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8274            kind,
8275            SyntaxKind::PatternTuple
8276        );
8277        Self { node }
8278    }
8279    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8280        let kind = node.kind(db);
8281        if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8282    }
8283    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8284        self.node
8285    }
8286    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8287        PatternTuplePtr(self.node.stable_ptr(db))
8288    }
8289}
8290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8291pub struct PatternFixedSizeArray<'db> {
8292    node: SyntaxNode<'db>,
8293}
8294impl<'db> PatternFixedSizeArray<'db> {
8295    pub const INDEX_LBRACK: usize = 0;
8296    pub const INDEX_PATTERNS: usize = 1;
8297    pub const INDEX_RBRACK: usize = 2;
8298    pub fn new_green(
8299        db: &'db dyn Database,
8300        lbrack: TerminalLBrackGreen<'db>,
8301        patterns: PatternListGreen<'db>,
8302        rbrack: TerminalRBrackGreen<'db>,
8303    ) -> PatternFixedSizeArrayGreen<'db> {
8304        let children = [lbrack.0, patterns.0, rbrack.0];
8305        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8306        PatternFixedSizeArrayGreen(
8307            GreenNode {
8308                kind: SyntaxKind::PatternFixedSizeArray,
8309                details: GreenNodeDetails::Node { children: children.into(), width },
8310            }
8311            .intern(db),
8312        )
8313    }
8314}
8315impl<'db> PatternFixedSizeArray<'db> {
8316    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
8317        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8318    }
8319    pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8320        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8321    }
8322    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
8323        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8324    }
8325}
8326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8327pub struct PatternFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
8328impl<'db> PatternFixedSizeArrayPtr<'db> {}
8329impl<'db> TypedStablePtr<'db> for PatternFixedSizeArrayPtr<'db> {
8330    type SyntaxNode = PatternFixedSizeArray<'db>;
8331    fn untyped(self) -> SyntaxStablePtrId<'db> {
8332        self.0
8333    }
8334    fn lookup(&self, db: &'db dyn Database) -> PatternFixedSizeArray<'db> {
8335        PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8336    }
8337}
8338impl<'db> From<PatternFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
8339    fn from(ptr: PatternFixedSizeArrayPtr<'db>) -> Self {
8340        ptr.untyped()
8341    }
8342}
8343#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8344pub struct PatternFixedSizeArrayGreen<'db>(pub GreenId<'db>);
8345impl<'db> TypedSyntaxNode<'db> for PatternFixedSizeArray<'db> {
8346    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8347    type StablePtr = PatternFixedSizeArrayPtr<'db>;
8348    type Green = PatternFixedSizeArrayGreen<'db>;
8349    fn missing(db: &'db dyn Database) -> Self::Green {
8350        PatternFixedSizeArrayGreen(
8351            GreenNode {
8352                kind: SyntaxKind::PatternFixedSizeArray,
8353                details: GreenNodeDetails::Node {
8354                    children: [
8355                        TerminalLBrack::missing(db).0,
8356                        PatternList::missing(db).0,
8357                        TerminalRBrack::missing(db).0,
8358                    ]
8359                    .into(),
8360                    width: TextWidth::default(),
8361                },
8362            }
8363            .intern(db),
8364        )
8365    }
8366    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8367        let kind = node.kind(db);
8368        assert_eq!(
8369            kind,
8370            SyntaxKind::PatternFixedSizeArray,
8371            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8372            kind,
8373            SyntaxKind::PatternFixedSizeArray
8374        );
8375        Self { node }
8376    }
8377    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8378        let kind = node.kind(db);
8379        if kind == SyntaxKind::PatternFixedSizeArray {
8380            Some(Self::from_syntax_node(db, node))
8381        } else {
8382            None
8383        }
8384    }
8385    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8386        self.node
8387    }
8388    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8389        PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8390    }
8391}
8392#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8393pub struct PatternList<'db>(ElementList<'db, Pattern<'db>, 2>);
8394impl<'db> Deref for PatternList<'db> {
8395    type Target = ElementList<'db, Pattern<'db>, 2>;
8396    fn deref(&self) -> &Self::Target {
8397        &self.0
8398    }
8399}
8400impl<'db> PatternList<'db> {
8401    pub fn new_green(
8402        db: &'db dyn Database,
8403        children: &[PatternListElementOrSeparatorGreen<'db>],
8404    ) -> PatternListGreen<'db> {
8405        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8406        PatternListGreen(
8407            GreenNode {
8408                kind: SyntaxKind::PatternList,
8409                details: GreenNodeDetails::Node {
8410                    children: children.iter().map(|x| x.id()).collect(),
8411                    width,
8412                },
8413            }
8414            .intern(db),
8415        )
8416    }
8417}
8418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8419pub struct PatternListPtr<'db>(pub SyntaxStablePtrId<'db>);
8420impl<'db> TypedStablePtr<'db> for PatternListPtr<'db> {
8421    type SyntaxNode = PatternList<'db>;
8422    fn untyped(self) -> SyntaxStablePtrId<'db> {
8423        self.0
8424    }
8425    fn lookup(&self, db: &'db dyn Database) -> PatternList<'db> {
8426        PatternList::from_syntax_node(db, self.0.lookup(db))
8427    }
8428}
8429impl<'db> From<PatternListPtr<'db>> for SyntaxStablePtrId<'db> {
8430    fn from(ptr: PatternListPtr<'db>) -> Self {
8431        ptr.untyped()
8432    }
8433}
8434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8435pub enum PatternListElementOrSeparatorGreen<'db> {
8436    Separator(TerminalCommaGreen<'db>),
8437    Element(PatternGreen<'db>),
8438}
8439impl<'db> From<TerminalCommaGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8440    fn from(value: TerminalCommaGreen<'db>) -> Self {
8441        PatternListElementOrSeparatorGreen::Separator(value)
8442    }
8443}
8444impl<'db> From<PatternGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8445    fn from(value: PatternGreen<'db>) -> Self {
8446        PatternListElementOrSeparatorGreen::Element(value)
8447    }
8448}
8449impl<'db> PatternListElementOrSeparatorGreen<'db> {
8450    fn id(&self) -> GreenId<'db> {
8451        match self {
8452            PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8453            PatternListElementOrSeparatorGreen::Element(green) => green.0,
8454        }
8455    }
8456}
8457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8458pub struct PatternListGreen<'db>(pub GreenId<'db>);
8459impl<'db> TypedSyntaxNode<'db> for PatternList<'db> {
8460    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8461    type StablePtr = PatternListPtr<'db>;
8462    type Green = PatternListGreen<'db>;
8463    fn missing(db: &'db dyn Database) -> Self::Green {
8464        PatternListGreen(
8465            GreenNode {
8466                kind: SyntaxKind::PatternList,
8467                details: GreenNodeDetails::Node {
8468                    children: [].into(),
8469                    width: TextWidth::default(),
8470                },
8471            }
8472            .intern(db),
8473        )
8474    }
8475    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8476        Self(ElementList::new(node))
8477    }
8478    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8479        if node.kind(db) == SyntaxKind::PatternList {
8480            Some(Self(ElementList::new(node)))
8481        } else {
8482            None
8483        }
8484    }
8485    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8486        self.node
8487    }
8488    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8489        PatternListPtr(self.node.stable_ptr(db))
8490    }
8491}
8492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8493pub struct PatternListOr<'db>(ElementList<'db, Pattern<'db>, 2>);
8494impl<'db> Deref for PatternListOr<'db> {
8495    type Target = ElementList<'db, Pattern<'db>, 2>;
8496    fn deref(&self) -> &Self::Target {
8497        &self.0
8498    }
8499}
8500impl<'db> PatternListOr<'db> {
8501    pub fn new_green(
8502        db: &'db dyn Database,
8503        children: &[PatternListOrElementOrSeparatorGreen<'db>],
8504    ) -> PatternListOrGreen<'db> {
8505        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8506        PatternListOrGreen(
8507            GreenNode {
8508                kind: SyntaxKind::PatternListOr,
8509                details: GreenNodeDetails::Node {
8510                    children: children.iter().map(|x| x.id()).collect(),
8511                    width,
8512                },
8513            }
8514            .intern(db),
8515        )
8516    }
8517}
8518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8519pub struct PatternListOrPtr<'db>(pub SyntaxStablePtrId<'db>);
8520impl<'db> TypedStablePtr<'db> for PatternListOrPtr<'db> {
8521    type SyntaxNode = PatternListOr<'db>;
8522    fn untyped(self) -> SyntaxStablePtrId<'db> {
8523        self.0
8524    }
8525    fn lookup(&self, db: &'db dyn Database) -> PatternListOr<'db> {
8526        PatternListOr::from_syntax_node(db, self.0.lookup(db))
8527    }
8528}
8529impl<'db> From<PatternListOrPtr<'db>> for SyntaxStablePtrId<'db> {
8530    fn from(ptr: PatternListOrPtr<'db>) -> Self {
8531        ptr.untyped()
8532    }
8533}
8534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8535pub enum PatternListOrElementOrSeparatorGreen<'db> {
8536    Separator(TerminalOrGreen<'db>),
8537    Element(PatternGreen<'db>),
8538}
8539impl<'db> From<TerminalOrGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8540    fn from(value: TerminalOrGreen<'db>) -> Self {
8541        PatternListOrElementOrSeparatorGreen::Separator(value)
8542    }
8543}
8544impl<'db> From<PatternGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8545    fn from(value: PatternGreen<'db>) -> Self {
8546        PatternListOrElementOrSeparatorGreen::Element(value)
8547    }
8548}
8549impl<'db> PatternListOrElementOrSeparatorGreen<'db> {
8550    fn id(&self) -> GreenId<'db> {
8551        match self {
8552            PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8553            PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8554        }
8555    }
8556}
8557#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8558pub struct PatternListOrGreen<'db>(pub GreenId<'db>);
8559impl<'db> TypedSyntaxNode<'db> for PatternListOr<'db> {
8560    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8561    type StablePtr = PatternListOrPtr<'db>;
8562    type Green = PatternListOrGreen<'db>;
8563    fn missing(db: &'db dyn Database) -> Self::Green {
8564        PatternListOrGreen(
8565            GreenNode {
8566                kind: SyntaxKind::PatternListOr,
8567                details: GreenNodeDetails::Node {
8568                    children: [].into(),
8569                    width: TextWidth::default(),
8570                },
8571            }
8572            .intern(db),
8573        )
8574    }
8575    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8576        Self(ElementList::new(node))
8577    }
8578    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8579        if node.kind(db) == SyntaxKind::PatternListOr {
8580            Some(Self(ElementList::new(node)))
8581        } else {
8582            None
8583        }
8584    }
8585    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8586        self.node
8587    }
8588    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8589        PatternListOrPtr(self.node.stable_ptr(db))
8590    }
8591}
8592#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8593pub enum PatternStructParam<'db> {
8594    Single(PatternIdentifier<'db>),
8595    WithExpr(PatternStructParamWithExpr<'db>),
8596    Tail(TerminalDotDot<'db>),
8597}
8598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8599pub struct PatternStructParamPtr<'db>(pub SyntaxStablePtrId<'db>);
8600impl<'db> TypedStablePtr<'db> for PatternStructParamPtr<'db> {
8601    type SyntaxNode = PatternStructParam<'db>;
8602    fn untyped(self) -> SyntaxStablePtrId<'db> {
8603        self.0
8604    }
8605    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8606        PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8607    }
8608}
8609impl<'db> From<PatternStructParamPtr<'db>> for SyntaxStablePtrId<'db> {
8610    fn from(ptr: PatternStructParamPtr<'db>) -> Self {
8611        ptr.untyped()
8612    }
8613}
8614impl<'db> From<PatternIdentifierPtr<'db>> for PatternStructParamPtr<'db> {
8615    fn from(value: PatternIdentifierPtr<'db>) -> Self {
8616        Self(value.0)
8617    }
8618}
8619impl<'db> From<PatternStructParamWithExprPtr<'db>> for PatternStructParamPtr<'db> {
8620    fn from(value: PatternStructParamWithExprPtr<'db>) -> Self {
8621        Self(value.0)
8622    }
8623}
8624impl<'db> From<TerminalDotDotPtr<'db>> for PatternStructParamPtr<'db> {
8625    fn from(value: TerminalDotDotPtr<'db>) -> Self {
8626        Self(value.0)
8627    }
8628}
8629impl<'db> From<PatternIdentifierGreen<'db>> for PatternStructParamGreen<'db> {
8630    fn from(value: PatternIdentifierGreen<'db>) -> Self {
8631        Self(value.0)
8632    }
8633}
8634impl<'db> From<PatternStructParamWithExprGreen<'db>> for PatternStructParamGreen<'db> {
8635    fn from(value: PatternStructParamWithExprGreen<'db>) -> Self {
8636        Self(value.0)
8637    }
8638}
8639impl<'db> From<TerminalDotDotGreen<'db>> for PatternStructParamGreen<'db> {
8640    fn from(value: TerminalDotDotGreen<'db>) -> Self {
8641        Self(value.0)
8642    }
8643}
8644#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8645pub struct PatternStructParamGreen<'db>(pub GreenId<'db>);
8646impl<'db> TypedSyntaxNode<'db> for PatternStructParam<'db> {
8647    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8648    type StablePtr = PatternStructParamPtr<'db>;
8649    type Green = PatternStructParamGreen<'db>;
8650    fn missing(db: &'db dyn Database) -> Self::Green {
8651        panic!("No missing variant.");
8652    }
8653    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8654        let kind = node.kind(db);
8655        match kind {
8656            SyntaxKind::PatternIdentifier => {
8657                PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8658            }
8659            SyntaxKind::PatternStructParamWithExpr => {
8660                PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8661            }
8662            SyntaxKind::TerminalDotDot => {
8663                PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8664            }
8665            _ => panic!(
8666                "Unexpected syntax kind {:?} when constructing {}.",
8667                kind, "PatternStructParam"
8668            ),
8669        }
8670    }
8671    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8672        let kind = node.kind(db);
8673        match kind {
8674            SyntaxKind::PatternIdentifier => {
8675                Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8676            }
8677            SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8678                PatternStructParamWithExpr::from_syntax_node(db, node),
8679            )),
8680            SyntaxKind::TerminalDotDot => {
8681                Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8682            }
8683            _ => None,
8684        }
8685    }
8686    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8687        match self {
8688            PatternStructParam::Single(x) => x.as_syntax_node(),
8689            PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8690            PatternStructParam::Tail(x) => x.as_syntax_node(),
8691        }
8692    }
8693    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8694        PatternStructParamPtr(self.as_syntax_node().long(db).stable_ptr)
8695    }
8696}
8697impl<'db> PatternStructParam<'db> {
8698    /// Checks if a kind of a variant of [PatternStructParam].
8699    pub fn is_variant(kind: SyntaxKind) -> bool {
8700        matches!(
8701            kind,
8702            SyntaxKind::PatternIdentifier
8703                | SyntaxKind::PatternStructParamWithExpr
8704                | SyntaxKind::TerminalDotDot
8705        )
8706    }
8707}
8708#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8709pub struct PatternStructParamWithExpr<'db> {
8710    node: SyntaxNode<'db>,
8711}
8712impl<'db> PatternStructParamWithExpr<'db> {
8713    pub const INDEX_MODIFIERS: usize = 0;
8714    pub const INDEX_NAME: usize = 1;
8715    pub const INDEX_COLON: usize = 2;
8716    pub const INDEX_PATTERN: usize = 3;
8717    pub fn new_green(
8718        db: &'db dyn Database,
8719        modifiers: ModifierListGreen<'db>,
8720        name: TerminalIdentifierGreen<'db>,
8721        colon: TerminalColonGreen<'db>,
8722        pattern: PatternGreen<'db>,
8723    ) -> PatternStructParamWithExprGreen<'db> {
8724        let children = [modifiers.0, name.0, colon.0, pattern.0];
8725        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8726        PatternStructParamWithExprGreen(
8727            GreenNode {
8728                kind: SyntaxKind::PatternStructParamWithExpr,
8729                details: GreenNodeDetails::Node { children: children.into(), width },
8730            }
8731            .intern(db),
8732        )
8733    }
8734}
8735impl<'db> PatternStructParamWithExpr<'db> {
8736    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
8737        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8738    }
8739    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
8740        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8741    }
8742    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
8743        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8744    }
8745    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8746        Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8747    }
8748}
8749#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8750pub struct PatternStructParamWithExprPtr<'db>(pub SyntaxStablePtrId<'db>);
8751impl<'db> PatternStructParamWithExprPtr<'db> {}
8752impl<'db> TypedStablePtr<'db> for PatternStructParamWithExprPtr<'db> {
8753    type SyntaxNode = PatternStructParamWithExpr<'db>;
8754    fn untyped(self) -> SyntaxStablePtrId<'db> {
8755        self.0
8756    }
8757    fn lookup(&self, db: &'db dyn Database) -> PatternStructParamWithExpr<'db> {
8758        PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8759    }
8760}
8761impl<'db> From<PatternStructParamWithExprPtr<'db>> for SyntaxStablePtrId<'db> {
8762    fn from(ptr: PatternStructParamWithExprPtr<'db>) -> Self {
8763        ptr.untyped()
8764    }
8765}
8766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8767pub struct PatternStructParamWithExprGreen<'db>(pub GreenId<'db>);
8768impl<'db> TypedSyntaxNode<'db> for PatternStructParamWithExpr<'db> {
8769    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8770    type StablePtr = PatternStructParamWithExprPtr<'db>;
8771    type Green = PatternStructParamWithExprGreen<'db>;
8772    fn missing(db: &'db dyn Database) -> Self::Green {
8773        PatternStructParamWithExprGreen(
8774            GreenNode {
8775                kind: SyntaxKind::PatternStructParamWithExpr,
8776                details: GreenNodeDetails::Node {
8777                    children: [
8778                        ModifierList::missing(db).0,
8779                        TerminalIdentifier::missing(db).0,
8780                        TerminalColon::missing(db).0,
8781                        Pattern::missing(db).0,
8782                    ]
8783                    .into(),
8784                    width: TextWidth::default(),
8785                },
8786            }
8787            .intern(db),
8788        )
8789    }
8790    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8791        let kind = node.kind(db);
8792        assert_eq!(
8793            kind,
8794            SyntaxKind::PatternStructParamWithExpr,
8795            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8796            kind,
8797            SyntaxKind::PatternStructParamWithExpr
8798        );
8799        Self { node }
8800    }
8801    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8802        let kind = node.kind(db);
8803        if kind == SyntaxKind::PatternStructParamWithExpr {
8804            Some(Self::from_syntax_node(db, node))
8805        } else {
8806            None
8807        }
8808    }
8809    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8810        self.node
8811    }
8812    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8813        PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8814    }
8815}
8816#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8817pub struct PatternEnum<'db> {
8818    node: SyntaxNode<'db>,
8819}
8820impl<'db> PatternEnum<'db> {
8821    pub const INDEX_PATH: usize = 0;
8822    pub const INDEX_PATTERN: usize = 1;
8823    pub fn new_green(
8824        db: &'db dyn Database,
8825        path: ExprPathGreen<'db>,
8826        pattern: OptionPatternEnumInnerPatternGreen<'db>,
8827    ) -> PatternEnumGreen<'db> {
8828        let children = [path.0, pattern.0];
8829        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8830        PatternEnumGreen(
8831            GreenNode {
8832                kind: SyntaxKind::PatternEnum,
8833                details: GreenNodeDetails::Node { children: children.into(), width },
8834            }
8835            .intern(db),
8836        )
8837    }
8838}
8839impl<'db> PatternEnum<'db> {
8840    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8841        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8842    }
8843    pub fn pattern(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPattern<'db> {
8844        OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8845    }
8846}
8847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8848pub struct PatternEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
8849impl<'db> PatternEnumPtr<'db> {}
8850impl<'db> TypedStablePtr<'db> for PatternEnumPtr<'db> {
8851    type SyntaxNode = PatternEnum<'db>;
8852    fn untyped(self) -> SyntaxStablePtrId<'db> {
8853        self.0
8854    }
8855    fn lookup(&self, db: &'db dyn Database) -> PatternEnum<'db> {
8856        PatternEnum::from_syntax_node(db, self.0.lookup(db))
8857    }
8858}
8859impl<'db> From<PatternEnumPtr<'db>> for SyntaxStablePtrId<'db> {
8860    fn from(ptr: PatternEnumPtr<'db>) -> Self {
8861        ptr.untyped()
8862    }
8863}
8864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8865pub struct PatternEnumGreen<'db>(pub GreenId<'db>);
8866impl<'db> TypedSyntaxNode<'db> for PatternEnum<'db> {
8867    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8868    type StablePtr = PatternEnumPtr<'db>;
8869    type Green = PatternEnumGreen<'db>;
8870    fn missing(db: &'db dyn Database) -> Self::Green {
8871        PatternEnumGreen(
8872            GreenNode {
8873                kind: SyntaxKind::PatternEnum,
8874                details: GreenNodeDetails::Node {
8875                    children: [
8876                        ExprPath::missing(db).0,
8877                        OptionPatternEnumInnerPattern::missing(db).0,
8878                    ]
8879                    .into(),
8880                    width: TextWidth::default(),
8881                },
8882            }
8883            .intern(db),
8884        )
8885    }
8886    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8887        let kind = node.kind(db);
8888        assert_eq!(
8889            kind,
8890            SyntaxKind::PatternEnum,
8891            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8892            kind,
8893            SyntaxKind::PatternEnum
8894        );
8895        Self { node }
8896    }
8897    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8898        let kind = node.kind(db);
8899        if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8900    }
8901    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8902        self.node
8903    }
8904    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8905        PatternEnumPtr(self.node.stable_ptr(db))
8906    }
8907}
8908#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8909pub struct PatternEnumInnerPattern<'db> {
8910    node: SyntaxNode<'db>,
8911}
8912impl<'db> PatternEnumInnerPattern<'db> {
8913    pub const INDEX_LPAREN: usize = 0;
8914    pub const INDEX_PATTERN: usize = 1;
8915    pub const INDEX_RPAREN: usize = 2;
8916    pub fn new_green(
8917        db: &'db dyn Database,
8918        lparen: TerminalLParenGreen<'db>,
8919        pattern: PatternGreen<'db>,
8920        rparen: TerminalRParenGreen<'db>,
8921    ) -> PatternEnumInnerPatternGreen<'db> {
8922        let children = [lparen.0, pattern.0, rparen.0];
8923        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8924        PatternEnumInnerPatternGreen(
8925            GreenNode {
8926                kind: SyntaxKind::PatternEnumInnerPattern,
8927                details: GreenNodeDetails::Node { children: children.into(), width },
8928            }
8929            .intern(db),
8930        )
8931    }
8932}
8933impl<'db> PatternEnumInnerPattern<'db> {
8934    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8935        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8936    }
8937    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8938        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
8939    }
8940    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8941        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8942    }
8943}
8944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8945pub struct PatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8946impl<'db> PatternEnumInnerPatternPtr<'db> {}
8947impl<'db> TypedStablePtr<'db> for PatternEnumInnerPatternPtr<'db> {
8948    type SyntaxNode = PatternEnumInnerPattern<'db>;
8949    fn untyped(self) -> SyntaxStablePtrId<'db> {
8950        self.0
8951    }
8952    fn lookup(&self, db: &'db dyn Database) -> PatternEnumInnerPattern<'db> {
8953        PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8954    }
8955}
8956impl<'db> From<PatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8957    fn from(ptr: PatternEnumInnerPatternPtr<'db>) -> Self {
8958        ptr.untyped()
8959    }
8960}
8961#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8962pub struct PatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8963impl<'db> TypedSyntaxNode<'db> for PatternEnumInnerPattern<'db> {
8964    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
8965    type StablePtr = PatternEnumInnerPatternPtr<'db>;
8966    type Green = PatternEnumInnerPatternGreen<'db>;
8967    fn missing(db: &'db dyn Database) -> Self::Green {
8968        PatternEnumInnerPatternGreen(
8969            GreenNode {
8970                kind: SyntaxKind::PatternEnumInnerPattern,
8971                details: GreenNodeDetails::Node {
8972                    children: [
8973                        TerminalLParen::missing(db).0,
8974                        Pattern::missing(db).0,
8975                        TerminalRParen::missing(db).0,
8976                    ]
8977                    .into(),
8978                    width: TextWidth::default(),
8979                },
8980            }
8981            .intern(db),
8982        )
8983    }
8984    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8985        let kind = node.kind(db);
8986        assert_eq!(
8987            kind,
8988            SyntaxKind::PatternEnumInnerPattern,
8989            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8990            kind,
8991            SyntaxKind::PatternEnumInnerPattern
8992        );
8993        Self { node }
8994    }
8995    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8996        let kind = node.kind(db);
8997        if kind == SyntaxKind::PatternEnumInnerPattern {
8998            Some(Self::from_syntax_node(db, node))
8999        } else {
9000            None
9001        }
9002    }
9003    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9004        self.node
9005    }
9006    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9007        PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
9008    }
9009}
9010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9011pub enum OptionPatternEnumInnerPattern<'db> {
9012    Empty(OptionPatternEnumInnerPatternEmpty<'db>),
9013    PatternEnumInnerPattern(PatternEnumInnerPattern<'db>),
9014}
9015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9016pub struct OptionPatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
9017impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternPtr<'db> {
9018    type SyntaxNode = OptionPatternEnumInnerPattern<'db>;
9019    fn untyped(self) -> SyntaxStablePtrId<'db> {
9020        self.0
9021    }
9022    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9023        OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9024    }
9025}
9026impl<'db> From<OptionPatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
9027    fn from(ptr: OptionPatternEnumInnerPatternPtr<'db>) -> Self {
9028        ptr.untyped()
9029    }
9030}
9031impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>>
9032    for OptionPatternEnumInnerPatternPtr<'db>
9033{
9034    fn from(value: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9035        Self(value.0)
9036    }
9037}
9038impl<'db> From<PatternEnumInnerPatternPtr<'db>> for OptionPatternEnumInnerPatternPtr<'db> {
9039    fn from(value: PatternEnumInnerPatternPtr<'db>) -> Self {
9040        Self(value.0)
9041    }
9042}
9043impl<'db> From<OptionPatternEnumInnerPatternEmptyGreen<'db>>
9044    for OptionPatternEnumInnerPatternGreen<'db>
9045{
9046    fn from(value: OptionPatternEnumInnerPatternEmptyGreen<'db>) -> Self {
9047        Self(value.0)
9048    }
9049}
9050impl<'db> From<PatternEnumInnerPatternGreen<'db>> for OptionPatternEnumInnerPatternGreen<'db> {
9051    fn from(value: PatternEnumInnerPatternGreen<'db>) -> Self {
9052        Self(value.0)
9053    }
9054}
9055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9056pub struct OptionPatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
9057impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPattern<'db> {
9058    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9059    type StablePtr = OptionPatternEnumInnerPatternPtr<'db>;
9060    type Green = OptionPatternEnumInnerPatternGreen<'db>;
9061    fn missing(db: &'db dyn Database) -> Self::Green {
9062        panic!("No missing variant.");
9063    }
9064    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9065        let kind = node.kind(db);
9066        match kind {
9067            SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9068                OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9069            ),
9070            SyntaxKind::PatternEnumInnerPattern => {
9071                OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9072                    PatternEnumInnerPattern::from_syntax_node(db, node),
9073                )
9074            }
9075            _ => panic!(
9076                "Unexpected syntax kind {:?} when constructing {}.",
9077                kind, "OptionPatternEnumInnerPattern"
9078            ),
9079        }
9080    }
9081    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9082        let kind = node.kind(db);
9083        match kind {
9084            SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9085                Some(OptionPatternEnumInnerPattern::Empty(
9086                    OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9087                ))
9088            }
9089            SyntaxKind::PatternEnumInnerPattern => {
9090                Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9091                    PatternEnumInnerPattern::from_syntax_node(db, node),
9092                ))
9093            }
9094            _ => None,
9095        }
9096    }
9097    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9098        match self {
9099            OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9100            OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9101        }
9102    }
9103    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9104        OptionPatternEnumInnerPatternPtr(self.as_syntax_node().long(db).stable_ptr)
9105    }
9106}
9107impl<'db> OptionPatternEnumInnerPattern<'db> {
9108    /// Checks if a kind of a variant of [OptionPatternEnumInnerPattern].
9109    pub fn is_variant(kind: SyntaxKind) -> bool {
9110        matches!(
9111            kind,
9112            SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9113        )
9114    }
9115}
9116#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9117pub struct OptionPatternEnumInnerPatternEmpty<'db> {
9118    node: SyntaxNode<'db>,
9119}
9120impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {
9121    pub fn new_green(db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmptyGreen<'db> {
9122        let children = [];
9123        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9124        OptionPatternEnumInnerPatternEmptyGreen(
9125            GreenNode {
9126                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9127                details: GreenNodeDetails::Node { children: children.into(), width },
9128            }
9129            .intern(db),
9130        )
9131    }
9132}
9133impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {}
9134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9135pub struct OptionPatternEnumInnerPatternEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9136impl<'db> OptionPatternEnumInnerPatternEmptyPtr<'db> {}
9137impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternEmptyPtr<'db> {
9138    type SyntaxNode = OptionPatternEnumInnerPatternEmpty<'db>;
9139    fn untyped(self) -> SyntaxStablePtrId<'db> {
9140        self.0
9141    }
9142    fn lookup(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmpty<'db> {
9143        OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9144    }
9145}
9146impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9147    fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9148        ptr.untyped()
9149    }
9150}
9151#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9152pub struct OptionPatternEnumInnerPatternEmptyGreen<'db>(pub GreenId<'db>);
9153impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPatternEmpty<'db> {
9154    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9155    type StablePtr = OptionPatternEnumInnerPatternEmptyPtr<'db>;
9156    type Green = OptionPatternEnumInnerPatternEmptyGreen<'db>;
9157    fn missing(db: &'db dyn Database) -> Self::Green {
9158        OptionPatternEnumInnerPatternEmptyGreen(
9159            GreenNode {
9160                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9161                details: GreenNodeDetails::Node {
9162                    children: [].into(),
9163                    width: TextWidth::default(),
9164                },
9165            }
9166            .intern(db),
9167        )
9168    }
9169    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9170        let kind = node.kind(db);
9171        assert_eq!(
9172            kind,
9173            SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9174            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9175            kind,
9176            SyntaxKind::OptionPatternEnumInnerPatternEmpty
9177        );
9178        Self { node }
9179    }
9180    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9181        let kind = node.kind(db);
9182        if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9183            Some(Self::from_syntax_node(db, node))
9184        } else {
9185            None
9186        }
9187    }
9188    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9189        self.node
9190    }
9191    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9192        OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9193    }
9194}
9195#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9196pub struct TypeClause<'db> {
9197    node: SyntaxNode<'db>,
9198}
9199impl<'db> TypeClause<'db> {
9200    pub const INDEX_COLON: usize = 0;
9201    pub const INDEX_TY: usize = 1;
9202    pub fn new_green(
9203        db: &'db dyn Database,
9204        colon: TerminalColonGreen<'db>,
9205        ty: ExprGreen<'db>,
9206    ) -> TypeClauseGreen<'db> {
9207        let children = [colon.0, ty.0];
9208        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9209        TypeClauseGreen(
9210            GreenNode {
9211                kind: SyntaxKind::TypeClause,
9212                details: GreenNodeDetails::Node { children: children.into(), width },
9213            }
9214            .intern(db),
9215        )
9216    }
9217}
9218impl<'db> TypeClause<'db> {
9219    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
9220        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9221    }
9222    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9223        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9224    }
9225}
9226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9227pub struct TypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9228impl<'db> TypeClausePtr<'db> {}
9229impl<'db> TypedStablePtr<'db> for TypeClausePtr<'db> {
9230    type SyntaxNode = TypeClause<'db>;
9231    fn untyped(self) -> SyntaxStablePtrId<'db> {
9232        self.0
9233    }
9234    fn lookup(&self, db: &'db dyn Database) -> TypeClause<'db> {
9235        TypeClause::from_syntax_node(db, self.0.lookup(db))
9236    }
9237}
9238impl<'db> From<TypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9239    fn from(ptr: TypeClausePtr<'db>) -> Self {
9240        ptr.untyped()
9241    }
9242}
9243#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9244pub struct TypeClauseGreen<'db>(pub GreenId<'db>);
9245impl<'db> TypedSyntaxNode<'db> for TypeClause<'db> {
9246    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9247    type StablePtr = TypeClausePtr<'db>;
9248    type Green = TypeClauseGreen<'db>;
9249    fn missing(db: &'db dyn Database) -> Self::Green {
9250        TypeClauseGreen(
9251            GreenNode {
9252                kind: SyntaxKind::TypeClause,
9253                details: GreenNodeDetails::Node {
9254                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9255                    width: TextWidth::default(),
9256                },
9257            }
9258            .intern(db),
9259        )
9260    }
9261    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9262        let kind = node.kind(db);
9263        assert_eq!(
9264            kind,
9265            SyntaxKind::TypeClause,
9266            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9267            kind,
9268            SyntaxKind::TypeClause
9269        );
9270        Self { node }
9271    }
9272    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9273        let kind = node.kind(db);
9274        if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9275    }
9276    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9277        self.node
9278    }
9279    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9280        TypeClausePtr(self.node.stable_ptr(db))
9281    }
9282}
9283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9284pub enum OptionTypeClause<'db> {
9285    Empty(OptionTypeClauseEmpty<'db>),
9286    TypeClause(TypeClause<'db>),
9287}
9288#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9289pub struct OptionTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9290impl<'db> TypedStablePtr<'db> for OptionTypeClausePtr<'db> {
9291    type SyntaxNode = OptionTypeClause<'db>;
9292    fn untyped(self) -> SyntaxStablePtrId<'db> {
9293        self.0
9294    }
9295    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9296        OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9297    }
9298}
9299impl<'db> From<OptionTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9300    fn from(ptr: OptionTypeClausePtr<'db>) -> Self {
9301        ptr.untyped()
9302    }
9303}
9304impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for OptionTypeClausePtr<'db> {
9305    fn from(value: OptionTypeClauseEmptyPtr<'db>) -> Self {
9306        Self(value.0)
9307    }
9308}
9309impl<'db> From<TypeClausePtr<'db>> for OptionTypeClausePtr<'db> {
9310    fn from(value: TypeClausePtr<'db>) -> Self {
9311        Self(value.0)
9312    }
9313}
9314impl<'db> From<OptionTypeClauseEmptyGreen<'db>> for OptionTypeClauseGreen<'db> {
9315    fn from(value: OptionTypeClauseEmptyGreen<'db>) -> Self {
9316        Self(value.0)
9317    }
9318}
9319impl<'db> From<TypeClauseGreen<'db>> for OptionTypeClauseGreen<'db> {
9320    fn from(value: TypeClauseGreen<'db>) -> Self {
9321        Self(value.0)
9322    }
9323}
9324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9325pub struct OptionTypeClauseGreen<'db>(pub GreenId<'db>);
9326impl<'db> TypedSyntaxNode<'db> for OptionTypeClause<'db> {
9327    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9328    type StablePtr = OptionTypeClausePtr<'db>;
9329    type Green = OptionTypeClauseGreen<'db>;
9330    fn missing(db: &'db dyn Database) -> Self::Green {
9331        panic!("No missing variant.");
9332    }
9333    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9334        let kind = node.kind(db);
9335        match kind {
9336            SyntaxKind::OptionTypeClauseEmpty => {
9337                OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9338            }
9339            SyntaxKind::TypeClause => {
9340                OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9341            }
9342            _ => panic!(
9343                "Unexpected syntax kind {:?} when constructing {}.",
9344                kind, "OptionTypeClause"
9345            ),
9346        }
9347    }
9348    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9349        let kind = node.kind(db);
9350        match kind {
9351            SyntaxKind::OptionTypeClauseEmpty => {
9352                Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9353            }
9354            SyntaxKind::TypeClause => {
9355                Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9356            }
9357            _ => None,
9358        }
9359    }
9360    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9361        match self {
9362            OptionTypeClause::Empty(x) => x.as_syntax_node(),
9363            OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9364        }
9365    }
9366    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9367        OptionTypeClausePtr(self.as_syntax_node().long(db).stable_ptr)
9368    }
9369}
9370impl<'db> OptionTypeClause<'db> {
9371    /// Checks if a kind of a variant of [OptionTypeClause].
9372    pub fn is_variant(kind: SyntaxKind) -> bool {
9373        matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9374    }
9375}
9376#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9377pub struct OptionTypeClauseEmpty<'db> {
9378    node: SyntaxNode<'db>,
9379}
9380impl<'db> OptionTypeClauseEmpty<'db> {
9381    pub fn new_green(db: &'db dyn Database) -> OptionTypeClauseEmptyGreen<'db> {
9382        let children = [];
9383        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9384        OptionTypeClauseEmptyGreen(
9385            GreenNode {
9386                kind: SyntaxKind::OptionTypeClauseEmpty,
9387                details: GreenNodeDetails::Node { children: children.into(), width },
9388            }
9389            .intern(db),
9390        )
9391    }
9392}
9393impl<'db> OptionTypeClauseEmpty<'db> {}
9394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9395pub struct OptionTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9396impl<'db> OptionTypeClauseEmptyPtr<'db> {}
9397impl<'db> TypedStablePtr<'db> for OptionTypeClauseEmptyPtr<'db> {
9398    type SyntaxNode = OptionTypeClauseEmpty<'db>;
9399    fn untyped(self) -> SyntaxStablePtrId<'db> {
9400        self.0
9401    }
9402    fn lookup(&self, db: &'db dyn Database) -> OptionTypeClauseEmpty<'db> {
9403        OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9404    }
9405}
9406impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9407    fn from(ptr: OptionTypeClauseEmptyPtr<'db>) -> Self {
9408        ptr.untyped()
9409    }
9410}
9411#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9412pub struct OptionTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9413impl<'db> TypedSyntaxNode<'db> for OptionTypeClauseEmpty<'db> {
9414    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9415    type StablePtr = OptionTypeClauseEmptyPtr<'db>;
9416    type Green = OptionTypeClauseEmptyGreen<'db>;
9417    fn missing(db: &'db dyn Database) -> Self::Green {
9418        OptionTypeClauseEmptyGreen(
9419            GreenNode {
9420                kind: SyntaxKind::OptionTypeClauseEmpty,
9421                details: GreenNodeDetails::Node {
9422                    children: [].into(),
9423                    width: TextWidth::default(),
9424                },
9425            }
9426            .intern(db),
9427        )
9428    }
9429    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9430        let kind = node.kind(db);
9431        assert_eq!(
9432            kind,
9433            SyntaxKind::OptionTypeClauseEmpty,
9434            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9435            kind,
9436            SyntaxKind::OptionTypeClauseEmpty
9437        );
9438        Self { node }
9439    }
9440    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9441        let kind = node.kind(db);
9442        if kind == SyntaxKind::OptionTypeClauseEmpty {
9443            Some(Self::from_syntax_node(db, node))
9444        } else {
9445            None
9446        }
9447    }
9448    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9449        self.node
9450    }
9451    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9452        OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9453    }
9454}
9455#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9456pub struct ReturnTypeClause<'db> {
9457    node: SyntaxNode<'db>,
9458}
9459impl<'db> ReturnTypeClause<'db> {
9460    pub const INDEX_ARROW: usize = 0;
9461    pub const INDEX_TY: usize = 1;
9462    pub fn new_green(
9463        db: &'db dyn Database,
9464        arrow: TerminalArrowGreen<'db>,
9465        ty: ExprGreen<'db>,
9466    ) -> ReturnTypeClauseGreen<'db> {
9467        let children = [arrow.0, ty.0];
9468        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9469        ReturnTypeClauseGreen(
9470            GreenNode {
9471                kind: SyntaxKind::ReturnTypeClause,
9472                details: GreenNodeDetails::Node { children: children.into(), width },
9473            }
9474            .intern(db),
9475        )
9476    }
9477}
9478impl<'db> ReturnTypeClause<'db> {
9479    pub fn arrow(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
9480        TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9481    }
9482    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9483        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9484    }
9485}
9486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9487pub struct ReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9488impl<'db> ReturnTypeClausePtr<'db> {}
9489impl<'db> TypedStablePtr<'db> for ReturnTypeClausePtr<'db> {
9490    type SyntaxNode = ReturnTypeClause<'db>;
9491    fn untyped(self) -> SyntaxStablePtrId<'db> {
9492        self.0
9493    }
9494    fn lookup(&self, db: &'db dyn Database) -> ReturnTypeClause<'db> {
9495        ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9496    }
9497}
9498impl<'db> From<ReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9499    fn from(ptr: ReturnTypeClausePtr<'db>) -> Self {
9500        ptr.untyped()
9501    }
9502}
9503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9504pub struct ReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9505impl<'db> TypedSyntaxNode<'db> for ReturnTypeClause<'db> {
9506    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9507    type StablePtr = ReturnTypeClausePtr<'db>;
9508    type Green = ReturnTypeClauseGreen<'db>;
9509    fn missing(db: &'db dyn Database) -> Self::Green {
9510        ReturnTypeClauseGreen(
9511            GreenNode {
9512                kind: SyntaxKind::ReturnTypeClause,
9513                details: GreenNodeDetails::Node {
9514                    children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9515                    width: TextWidth::default(),
9516                },
9517            }
9518            .intern(db),
9519        )
9520    }
9521    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9522        let kind = node.kind(db);
9523        assert_eq!(
9524            kind,
9525            SyntaxKind::ReturnTypeClause,
9526            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9527            kind,
9528            SyntaxKind::ReturnTypeClause
9529        );
9530        Self { node }
9531    }
9532    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9533        let kind = node.kind(db);
9534        if kind == SyntaxKind::ReturnTypeClause {
9535            Some(Self::from_syntax_node(db, node))
9536        } else {
9537            None
9538        }
9539    }
9540    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9541        self.node
9542    }
9543    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9544        ReturnTypeClausePtr(self.node.stable_ptr(db))
9545    }
9546}
9547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9548pub enum OptionReturnTypeClause<'db> {
9549    Empty(OptionReturnTypeClauseEmpty<'db>),
9550    ReturnTypeClause(ReturnTypeClause<'db>),
9551}
9552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9553pub struct OptionReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9554impl<'db> TypedStablePtr<'db> for OptionReturnTypeClausePtr<'db> {
9555    type SyntaxNode = OptionReturnTypeClause<'db>;
9556    fn untyped(self) -> SyntaxStablePtrId<'db> {
9557        self.0
9558    }
9559    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9560        OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9561    }
9562}
9563impl<'db> From<OptionReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9564    fn from(ptr: OptionReturnTypeClausePtr<'db>) -> Self {
9565        ptr.untyped()
9566    }
9567}
9568impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for OptionReturnTypeClausePtr<'db> {
9569    fn from(value: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9570        Self(value.0)
9571    }
9572}
9573impl<'db> From<ReturnTypeClausePtr<'db>> for OptionReturnTypeClausePtr<'db> {
9574    fn from(value: ReturnTypeClausePtr<'db>) -> Self {
9575        Self(value.0)
9576    }
9577}
9578impl<'db> From<OptionReturnTypeClauseEmptyGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9579    fn from(value: OptionReturnTypeClauseEmptyGreen<'db>) -> Self {
9580        Self(value.0)
9581    }
9582}
9583impl<'db> From<ReturnTypeClauseGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9584    fn from(value: ReturnTypeClauseGreen<'db>) -> Self {
9585        Self(value.0)
9586    }
9587}
9588#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9589pub struct OptionReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9590impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClause<'db> {
9591    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9592    type StablePtr = OptionReturnTypeClausePtr<'db>;
9593    type Green = OptionReturnTypeClauseGreen<'db>;
9594    fn missing(db: &'db dyn Database) -> Self::Green {
9595        panic!("No missing variant.");
9596    }
9597    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9598        let kind = node.kind(db);
9599        match kind {
9600            SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9601                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9602            ),
9603            SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9604                ReturnTypeClause::from_syntax_node(db, node),
9605            ),
9606            _ => panic!(
9607                "Unexpected syntax kind {:?} when constructing {}.",
9608                kind, "OptionReturnTypeClause"
9609            ),
9610        }
9611    }
9612    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9613        let kind = node.kind(db);
9614        match kind {
9615            SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9616                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9617            )),
9618            SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9619                ReturnTypeClause::from_syntax_node(db, node),
9620            )),
9621            _ => None,
9622        }
9623    }
9624    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9625        match self {
9626            OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9627            OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9628        }
9629    }
9630    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9631        OptionReturnTypeClausePtr(self.as_syntax_node().long(db).stable_ptr)
9632    }
9633}
9634impl<'db> OptionReturnTypeClause<'db> {
9635    /// Checks if a kind of a variant of [OptionReturnTypeClause].
9636    pub fn is_variant(kind: SyntaxKind) -> bool {
9637        matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9638    }
9639}
9640#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9641pub struct OptionReturnTypeClauseEmpty<'db> {
9642    node: SyntaxNode<'db>,
9643}
9644impl<'db> OptionReturnTypeClauseEmpty<'db> {
9645    pub fn new_green(db: &'db dyn Database) -> OptionReturnTypeClauseEmptyGreen<'db> {
9646        let children = [];
9647        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9648        OptionReturnTypeClauseEmptyGreen(
9649            GreenNode {
9650                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9651                details: GreenNodeDetails::Node { children: children.into(), width },
9652            }
9653            .intern(db),
9654        )
9655    }
9656}
9657impl<'db> OptionReturnTypeClauseEmpty<'db> {}
9658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9659pub struct OptionReturnTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9660impl<'db> OptionReturnTypeClauseEmptyPtr<'db> {}
9661impl<'db> TypedStablePtr<'db> for OptionReturnTypeClauseEmptyPtr<'db> {
9662    type SyntaxNode = OptionReturnTypeClauseEmpty<'db>;
9663    fn untyped(self) -> SyntaxStablePtrId<'db> {
9664        self.0
9665    }
9666    fn lookup(&self, db: &'db dyn Database) -> OptionReturnTypeClauseEmpty<'db> {
9667        OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9668    }
9669}
9670impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9671    fn from(ptr: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9672        ptr.untyped()
9673    }
9674}
9675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9676pub struct OptionReturnTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9677impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClauseEmpty<'db> {
9678    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9679    type StablePtr = OptionReturnTypeClauseEmptyPtr<'db>;
9680    type Green = OptionReturnTypeClauseEmptyGreen<'db>;
9681    fn missing(db: &'db dyn Database) -> Self::Green {
9682        OptionReturnTypeClauseEmptyGreen(
9683            GreenNode {
9684                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9685                details: GreenNodeDetails::Node {
9686                    children: [].into(),
9687                    width: TextWidth::default(),
9688                },
9689            }
9690            .intern(db),
9691        )
9692    }
9693    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9694        let kind = node.kind(db);
9695        assert_eq!(
9696            kind,
9697            SyntaxKind::OptionReturnTypeClauseEmpty,
9698            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9699            kind,
9700            SyntaxKind::OptionReturnTypeClauseEmpty
9701        );
9702        Self { node }
9703    }
9704    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9705        let kind = node.kind(db);
9706        if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9707            Some(Self::from_syntax_node(db, node))
9708        } else {
9709            None
9710        }
9711    }
9712    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9713        self.node
9714    }
9715    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9716        OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9717    }
9718}
9719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9720pub enum Statement<'db> {
9721    Let(StatementLet<'db>),
9722    Expr(StatementExpr<'db>),
9723    Continue(StatementContinue<'db>),
9724    Return(StatementReturn<'db>),
9725    Break(StatementBreak<'db>),
9726    Item(StatementItem<'db>),
9727    Missing(StatementMissing<'db>),
9728}
9729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9730pub struct StatementPtr<'db>(pub SyntaxStablePtrId<'db>);
9731impl<'db> TypedStablePtr<'db> for StatementPtr<'db> {
9732    type SyntaxNode = Statement<'db>;
9733    fn untyped(self) -> SyntaxStablePtrId<'db> {
9734        self.0
9735    }
9736    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9737        Statement::from_syntax_node(db, self.0.lookup(db))
9738    }
9739}
9740impl<'db> From<StatementPtr<'db>> for SyntaxStablePtrId<'db> {
9741    fn from(ptr: StatementPtr<'db>) -> Self {
9742        ptr.untyped()
9743    }
9744}
9745impl<'db> From<StatementLetPtr<'db>> for StatementPtr<'db> {
9746    fn from(value: StatementLetPtr<'db>) -> Self {
9747        Self(value.0)
9748    }
9749}
9750impl<'db> From<StatementExprPtr<'db>> for StatementPtr<'db> {
9751    fn from(value: StatementExprPtr<'db>) -> Self {
9752        Self(value.0)
9753    }
9754}
9755impl<'db> From<StatementContinuePtr<'db>> for StatementPtr<'db> {
9756    fn from(value: StatementContinuePtr<'db>) -> Self {
9757        Self(value.0)
9758    }
9759}
9760impl<'db> From<StatementReturnPtr<'db>> for StatementPtr<'db> {
9761    fn from(value: StatementReturnPtr<'db>) -> Self {
9762        Self(value.0)
9763    }
9764}
9765impl<'db> From<StatementBreakPtr<'db>> for StatementPtr<'db> {
9766    fn from(value: StatementBreakPtr<'db>) -> Self {
9767        Self(value.0)
9768    }
9769}
9770impl<'db> From<StatementItemPtr<'db>> for StatementPtr<'db> {
9771    fn from(value: StatementItemPtr<'db>) -> Self {
9772        Self(value.0)
9773    }
9774}
9775impl<'db> From<StatementMissingPtr<'db>> for StatementPtr<'db> {
9776    fn from(value: StatementMissingPtr<'db>) -> Self {
9777        Self(value.0)
9778    }
9779}
9780impl<'db> From<StatementLetGreen<'db>> for StatementGreen<'db> {
9781    fn from(value: StatementLetGreen<'db>) -> Self {
9782        Self(value.0)
9783    }
9784}
9785impl<'db> From<StatementExprGreen<'db>> for StatementGreen<'db> {
9786    fn from(value: StatementExprGreen<'db>) -> Self {
9787        Self(value.0)
9788    }
9789}
9790impl<'db> From<StatementContinueGreen<'db>> for StatementGreen<'db> {
9791    fn from(value: StatementContinueGreen<'db>) -> Self {
9792        Self(value.0)
9793    }
9794}
9795impl<'db> From<StatementReturnGreen<'db>> for StatementGreen<'db> {
9796    fn from(value: StatementReturnGreen<'db>) -> Self {
9797        Self(value.0)
9798    }
9799}
9800impl<'db> From<StatementBreakGreen<'db>> for StatementGreen<'db> {
9801    fn from(value: StatementBreakGreen<'db>) -> Self {
9802        Self(value.0)
9803    }
9804}
9805impl<'db> From<StatementItemGreen<'db>> for StatementGreen<'db> {
9806    fn from(value: StatementItemGreen<'db>) -> Self {
9807        Self(value.0)
9808    }
9809}
9810impl<'db> From<StatementMissingGreen<'db>> for StatementGreen<'db> {
9811    fn from(value: StatementMissingGreen<'db>) -> Self {
9812        Self(value.0)
9813    }
9814}
9815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9816pub struct StatementGreen<'db>(pub GreenId<'db>);
9817impl<'db> TypedSyntaxNode<'db> for Statement<'db> {
9818    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9819    type StablePtr = StatementPtr<'db>;
9820    type Green = StatementGreen<'db>;
9821    fn missing(db: &'db dyn Database) -> Self::Green {
9822        StatementGreen(StatementMissing::missing(db).0)
9823    }
9824    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9825        let kind = node.kind(db);
9826        match kind {
9827            SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9828            SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9829            SyntaxKind::StatementContinue => {
9830                Statement::Continue(StatementContinue::from_syntax_node(db, node))
9831            }
9832            SyntaxKind::StatementReturn => {
9833                Statement::Return(StatementReturn::from_syntax_node(db, node))
9834            }
9835            SyntaxKind::StatementBreak => {
9836                Statement::Break(StatementBreak::from_syntax_node(db, node))
9837            }
9838            SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9839            SyntaxKind::StatementMissing => {
9840                Statement::Missing(StatementMissing::from_syntax_node(db, node))
9841            }
9842            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9843        }
9844    }
9845    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9846        let kind = node.kind(db);
9847        match kind {
9848            SyntaxKind::StatementLet => {
9849                Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9850            }
9851            SyntaxKind::StatementExpr => {
9852                Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9853            }
9854            SyntaxKind::StatementContinue => {
9855                Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9856            }
9857            SyntaxKind::StatementReturn => {
9858                Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9859            }
9860            SyntaxKind::StatementBreak => {
9861                Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9862            }
9863            SyntaxKind::StatementItem => {
9864                Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9865            }
9866            SyntaxKind::StatementMissing => {
9867                Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9868            }
9869            _ => None,
9870        }
9871    }
9872    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9873        match self {
9874            Statement::Let(x) => x.as_syntax_node(),
9875            Statement::Expr(x) => x.as_syntax_node(),
9876            Statement::Continue(x) => x.as_syntax_node(),
9877            Statement::Return(x) => x.as_syntax_node(),
9878            Statement::Break(x) => x.as_syntax_node(),
9879            Statement::Item(x) => x.as_syntax_node(),
9880            Statement::Missing(x) => x.as_syntax_node(),
9881        }
9882    }
9883    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9884        StatementPtr(self.as_syntax_node().long(db).stable_ptr)
9885    }
9886}
9887impl<'db> Statement<'db> {
9888    /// Checks if a kind of a variant of [Statement].
9889    pub fn is_variant(kind: SyntaxKind) -> bool {
9890        matches!(
9891            kind,
9892            SyntaxKind::StatementLet
9893                | SyntaxKind::StatementExpr
9894                | SyntaxKind::StatementContinue
9895                | SyntaxKind::StatementReturn
9896                | SyntaxKind::StatementBreak
9897                | SyntaxKind::StatementItem
9898                | SyntaxKind::StatementMissing
9899        )
9900    }
9901}
9902#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9903pub struct StatementList<'db>(ElementList<'db, Statement<'db>, 1>);
9904impl<'db> Deref for StatementList<'db> {
9905    type Target = ElementList<'db, Statement<'db>, 1>;
9906    fn deref(&self) -> &Self::Target {
9907        &self.0
9908    }
9909}
9910impl<'db> StatementList<'db> {
9911    pub fn new_green(
9912        db: &'db dyn Database,
9913        children: &[StatementGreen<'db>],
9914    ) -> StatementListGreen<'db> {
9915        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
9916        StatementListGreen(
9917            GreenNode {
9918                kind: SyntaxKind::StatementList,
9919                details: GreenNodeDetails::Node {
9920                    children: children.iter().map(|x| x.0).collect(),
9921                    width,
9922                },
9923            }
9924            .intern(db),
9925        )
9926    }
9927}
9928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9929pub struct StatementListPtr<'db>(pub SyntaxStablePtrId<'db>);
9930impl<'db> TypedStablePtr<'db> for StatementListPtr<'db> {
9931    type SyntaxNode = StatementList<'db>;
9932    fn untyped(self) -> SyntaxStablePtrId<'db> {
9933        self.0
9934    }
9935    fn lookup(&self, db: &'db dyn Database) -> StatementList<'db> {
9936        StatementList::from_syntax_node(db, self.0.lookup(db))
9937    }
9938}
9939impl<'db> From<StatementListPtr<'db>> for SyntaxStablePtrId<'db> {
9940    fn from(ptr: StatementListPtr<'db>) -> Self {
9941        ptr.untyped()
9942    }
9943}
9944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9945pub struct StatementListGreen<'db>(pub GreenId<'db>);
9946impl<'db> TypedSyntaxNode<'db> for StatementList<'db> {
9947    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
9948    type StablePtr = StatementListPtr<'db>;
9949    type Green = StatementListGreen<'db>;
9950    fn missing(db: &'db dyn Database) -> Self::Green {
9951        StatementListGreen(
9952            GreenNode {
9953                kind: SyntaxKind::StatementList,
9954                details: GreenNodeDetails::Node {
9955                    children: [].into(),
9956                    width: TextWidth::default(),
9957                },
9958            }
9959            .intern(db),
9960        )
9961    }
9962    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9963        Self(ElementList::new(node))
9964    }
9965    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9966        if node.kind(db) == SyntaxKind::StatementList {
9967            Some(Self(ElementList::new(node)))
9968        } else {
9969            None
9970        }
9971    }
9972    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9973        self.node
9974    }
9975    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9976        StatementListPtr(self.node.stable_ptr(db))
9977    }
9978}
9979#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9980pub struct StatementMissing<'db> {
9981    node: SyntaxNode<'db>,
9982}
9983impl<'db> StatementMissing<'db> {
9984    pub fn new_green(db: &'db dyn Database) -> StatementMissingGreen<'db> {
9985        let children = [];
9986        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9987        StatementMissingGreen(
9988            GreenNode {
9989                kind: SyntaxKind::StatementMissing,
9990                details: GreenNodeDetails::Node { children: children.into(), width },
9991            }
9992            .intern(db),
9993        )
9994    }
9995}
9996impl<'db> StatementMissing<'db> {}
9997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9998pub struct StatementMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
9999impl<'db> StatementMissingPtr<'db> {}
10000impl<'db> TypedStablePtr<'db> for StatementMissingPtr<'db> {
10001    type SyntaxNode = StatementMissing<'db>;
10002    fn untyped(self) -> SyntaxStablePtrId<'db> {
10003        self.0
10004    }
10005    fn lookup(&self, db: &'db dyn Database) -> StatementMissing<'db> {
10006        StatementMissing::from_syntax_node(db, self.0.lookup(db))
10007    }
10008}
10009impl<'db> From<StatementMissingPtr<'db>> for SyntaxStablePtrId<'db> {
10010    fn from(ptr: StatementMissingPtr<'db>) -> Self {
10011        ptr.untyped()
10012    }
10013}
10014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10015pub struct StatementMissingGreen<'db>(pub GreenId<'db>);
10016impl<'db> TypedSyntaxNode<'db> for StatementMissing<'db> {
10017    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10018    type StablePtr = StatementMissingPtr<'db>;
10019    type Green = StatementMissingGreen<'db>;
10020    fn missing(db: &'db dyn Database) -> Self::Green {
10021        StatementMissingGreen(
10022            GreenNode {
10023                kind: SyntaxKind::StatementMissing,
10024                details: GreenNodeDetails::Node {
10025                    children: [].into(),
10026                    width: TextWidth::default(),
10027                },
10028            }
10029            .intern(db),
10030        )
10031    }
10032    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10033        let kind = node.kind(db);
10034        assert_eq!(
10035            kind,
10036            SyntaxKind::StatementMissing,
10037            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10038            kind,
10039            SyntaxKind::StatementMissing
10040        );
10041        Self { node }
10042    }
10043    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10044        let kind = node.kind(db);
10045        if kind == SyntaxKind::StatementMissing {
10046            Some(Self::from_syntax_node(db, node))
10047        } else {
10048            None
10049        }
10050    }
10051    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10052        self.node
10053    }
10054    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10055        StatementMissingPtr(self.node.stable_ptr(db))
10056    }
10057}
10058#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10059pub struct StatementLet<'db> {
10060    node: SyntaxNode<'db>,
10061}
10062impl<'db> StatementLet<'db> {
10063    pub const INDEX_ATTRIBUTES: usize = 0;
10064    pub const INDEX_LET_KW: usize = 1;
10065    pub const INDEX_PATTERN: usize = 2;
10066    pub const INDEX_TYPE_CLAUSE: usize = 3;
10067    pub const INDEX_EQ: usize = 4;
10068    pub const INDEX_RHS: usize = 5;
10069    pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
10070    pub const INDEX_SEMICOLON: usize = 7;
10071    pub fn new_green(
10072        db: &'db dyn Database,
10073        attributes: AttributeListGreen<'db>,
10074        let_kw: TerminalLetGreen<'db>,
10075        pattern: PatternGreen<'db>,
10076        type_clause: OptionTypeClauseGreen<'db>,
10077        eq: TerminalEqGreen<'db>,
10078        rhs: ExprGreen<'db>,
10079        let_else_clause: OptionLetElseClauseGreen<'db>,
10080        semicolon: TerminalSemicolonGreen<'db>,
10081    ) -> StatementLetGreen<'db> {
10082        let children = [
10083            attributes.0,
10084            let_kw.0,
10085            pattern.0,
10086            type_clause.0,
10087            eq.0,
10088            rhs.0,
10089            let_else_clause.0,
10090            semicolon.0,
10091        ];
10092        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10093        StatementLetGreen(
10094            GreenNode {
10095                kind: SyntaxKind::StatementLet,
10096                details: GreenNodeDetails::Node { children: children.into(), width },
10097            }
10098            .intern(db),
10099        )
10100    }
10101}
10102impl<'db> StatementLet<'db> {
10103    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10104        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10105    }
10106    pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
10107        TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10108    }
10109    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
10110        Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10111    }
10112    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
10113        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10114    }
10115    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
10116        TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10117    }
10118    pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
10119        Expr::from_syntax_node(db, self.node.get_children(db)[5])
10120    }
10121    pub fn let_else_clause(&self, db: &'db dyn Database) -> OptionLetElseClause<'db> {
10122        OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10123    }
10124    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10125        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10126    }
10127}
10128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10129pub struct StatementLetPtr<'db>(pub SyntaxStablePtrId<'db>);
10130impl<'db> StatementLetPtr<'db> {
10131    pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
10132        let ptr = self.0.long(db);
10133        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
10134            PatternGreen(key_fields[0])
10135        } else {
10136            panic!("Unexpected key field query on root.");
10137        }
10138    }
10139}
10140impl<'db> TypedStablePtr<'db> for StatementLetPtr<'db> {
10141    type SyntaxNode = StatementLet<'db>;
10142    fn untyped(self) -> SyntaxStablePtrId<'db> {
10143        self.0
10144    }
10145    fn lookup(&self, db: &'db dyn Database) -> StatementLet<'db> {
10146        StatementLet::from_syntax_node(db, self.0.lookup(db))
10147    }
10148}
10149impl<'db> From<StatementLetPtr<'db>> for SyntaxStablePtrId<'db> {
10150    fn from(ptr: StatementLetPtr<'db>) -> Self {
10151        ptr.untyped()
10152    }
10153}
10154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10155pub struct StatementLetGreen<'db>(pub GreenId<'db>);
10156impl<'db> TypedSyntaxNode<'db> for StatementLet<'db> {
10157    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10158    type StablePtr = StatementLetPtr<'db>;
10159    type Green = StatementLetGreen<'db>;
10160    fn missing(db: &'db dyn Database) -> Self::Green {
10161        StatementLetGreen(
10162            GreenNode {
10163                kind: SyntaxKind::StatementLet,
10164                details: GreenNodeDetails::Node {
10165                    children: [
10166                        AttributeList::missing(db).0,
10167                        TerminalLet::missing(db).0,
10168                        Pattern::missing(db).0,
10169                        OptionTypeClause::missing(db).0,
10170                        TerminalEq::missing(db).0,
10171                        Expr::missing(db).0,
10172                        OptionLetElseClause::missing(db).0,
10173                        TerminalSemicolon::missing(db).0,
10174                    ]
10175                    .into(),
10176                    width: TextWidth::default(),
10177                },
10178            }
10179            .intern(db),
10180        )
10181    }
10182    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10183        let kind = node.kind(db);
10184        assert_eq!(
10185            kind,
10186            SyntaxKind::StatementLet,
10187            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10188            kind,
10189            SyntaxKind::StatementLet
10190        );
10191        Self { node }
10192    }
10193    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10194        let kind = node.kind(db);
10195        if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10196    }
10197    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10198        self.node
10199    }
10200    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10201        StatementLetPtr(self.node.stable_ptr(db))
10202    }
10203}
10204#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10205pub struct LetElseClause<'db> {
10206    node: SyntaxNode<'db>,
10207}
10208impl<'db> LetElseClause<'db> {
10209    pub const INDEX_ELSE_KW: usize = 0;
10210    pub const INDEX_ELSE_BLOCK: usize = 1;
10211    pub fn new_green(
10212        db: &'db dyn Database,
10213        else_kw: TerminalElseGreen<'db>,
10214        else_block: ExprBlockGreen<'db>,
10215    ) -> LetElseClauseGreen<'db> {
10216        let children = [else_kw.0, else_block.0];
10217        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10218        LetElseClauseGreen(
10219            GreenNode {
10220                kind: SyntaxKind::LetElseClause,
10221                details: GreenNodeDetails::Node { children: children.into(), width },
10222            }
10223            .intern(db),
10224        )
10225    }
10226}
10227impl<'db> LetElseClause<'db> {
10228    pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
10229        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10230    }
10231    pub fn else_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
10232        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10233    }
10234}
10235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10236pub struct LetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10237impl<'db> LetElseClausePtr<'db> {}
10238impl<'db> TypedStablePtr<'db> for LetElseClausePtr<'db> {
10239    type SyntaxNode = LetElseClause<'db>;
10240    fn untyped(self) -> SyntaxStablePtrId<'db> {
10241        self.0
10242    }
10243    fn lookup(&self, db: &'db dyn Database) -> LetElseClause<'db> {
10244        LetElseClause::from_syntax_node(db, self.0.lookup(db))
10245    }
10246}
10247impl<'db> From<LetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10248    fn from(ptr: LetElseClausePtr<'db>) -> Self {
10249        ptr.untyped()
10250    }
10251}
10252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10253pub struct LetElseClauseGreen<'db>(pub GreenId<'db>);
10254impl<'db> TypedSyntaxNode<'db> for LetElseClause<'db> {
10255    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10256    type StablePtr = LetElseClausePtr<'db>;
10257    type Green = LetElseClauseGreen<'db>;
10258    fn missing(db: &'db dyn Database) -> Self::Green {
10259        LetElseClauseGreen(
10260            GreenNode {
10261                kind: SyntaxKind::LetElseClause,
10262                details: GreenNodeDetails::Node {
10263                    children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10264                    width: TextWidth::default(),
10265                },
10266            }
10267            .intern(db),
10268        )
10269    }
10270    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10271        let kind = node.kind(db);
10272        assert_eq!(
10273            kind,
10274            SyntaxKind::LetElseClause,
10275            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10276            kind,
10277            SyntaxKind::LetElseClause
10278        );
10279        Self { node }
10280    }
10281    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10282        let kind = node.kind(db);
10283        if kind == SyntaxKind::LetElseClause {
10284            Some(Self::from_syntax_node(db, node))
10285        } else {
10286            None
10287        }
10288    }
10289    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10290        self.node
10291    }
10292    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10293        LetElseClausePtr(self.node.stable_ptr(db))
10294    }
10295}
10296#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10297pub enum OptionLetElseClause<'db> {
10298    Empty(OptionLetElseClauseEmpty<'db>),
10299    LetElseClause(LetElseClause<'db>),
10300}
10301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10302pub struct OptionLetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10303impl<'db> TypedStablePtr<'db> for OptionLetElseClausePtr<'db> {
10304    type SyntaxNode = OptionLetElseClause<'db>;
10305    fn untyped(self) -> SyntaxStablePtrId<'db> {
10306        self.0
10307    }
10308    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10309        OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10310    }
10311}
10312impl<'db> From<OptionLetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10313    fn from(ptr: OptionLetElseClausePtr<'db>) -> Self {
10314        ptr.untyped()
10315    }
10316}
10317impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for OptionLetElseClausePtr<'db> {
10318    fn from(value: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10319        Self(value.0)
10320    }
10321}
10322impl<'db> From<LetElseClausePtr<'db>> for OptionLetElseClausePtr<'db> {
10323    fn from(value: LetElseClausePtr<'db>) -> Self {
10324        Self(value.0)
10325    }
10326}
10327impl<'db> From<OptionLetElseClauseEmptyGreen<'db>> for OptionLetElseClauseGreen<'db> {
10328    fn from(value: OptionLetElseClauseEmptyGreen<'db>) -> Self {
10329        Self(value.0)
10330    }
10331}
10332impl<'db> From<LetElseClauseGreen<'db>> for OptionLetElseClauseGreen<'db> {
10333    fn from(value: LetElseClauseGreen<'db>) -> Self {
10334        Self(value.0)
10335    }
10336}
10337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10338pub struct OptionLetElseClauseGreen<'db>(pub GreenId<'db>);
10339impl<'db> TypedSyntaxNode<'db> for OptionLetElseClause<'db> {
10340    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10341    type StablePtr = OptionLetElseClausePtr<'db>;
10342    type Green = OptionLetElseClauseGreen<'db>;
10343    fn missing(db: &'db dyn Database) -> Self::Green {
10344        panic!("No missing variant.");
10345    }
10346    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10347        let kind = node.kind(db);
10348        match kind {
10349            SyntaxKind::OptionLetElseClauseEmpty => {
10350                OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10351            }
10352            SyntaxKind::LetElseClause => {
10353                OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10354            }
10355            _ => panic!(
10356                "Unexpected syntax kind {:?} when constructing {}.",
10357                kind, "OptionLetElseClause"
10358            ),
10359        }
10360    }
10361    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10362        let kind = node.kind(db);
10363        match kind {
10364            SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10365                OptionLetElseClauseEmpty::from_syntax_node(db, node),
10366            )),
10367            SyntaxKind::LetElseClause => {
10368                Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10369            }
10370            _ => None,
10371        }
10372    }
10373    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10374        match self {
10375            OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10376            OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10377        }
10378    }
10379    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10380        OptionLetElseClausePtr(self.as_syntax_node().long(db).stable_ptr)
10381    }
10382}
10383impl<'db> OptionLetElseClause<'db> {
10384    /// Checks if a kind of a variant of [OptionLetElseClause].
10385    pub fn is_variant(kind: SyntaxKind) -> bool {
10386        matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10387    }
10388}
10389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10390pub struct OptionLetElseClauseEmpty<'db> {
10391    node: SyntaxNode<'db>,
10392}
10393impl<'db> OptionLetElseClauseEmpty<'db> {
10394    pub fn new_green(db: &'db dyn Database) -> OptionLetElseClauseEmptyGreen<'db> {
10395        let children = [];
10396        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10397        OptionLetElseClauseEmptyGreen(
10398            GreenNode {
10399                kind: SyntaxKind::OptionLetElseClauseEmpty,
10400                details: GreenNodeDetails::Node { children: children.into(), width },
10401            }
10402            .intern(db),
10403        )
10404    }
10405}
10406impl<'db> OptionLetElseClauseEmpty<'db> {}
10407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10408pub struct OptionLetElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10409impl<'db> OptionLetElseClauseEmptyPtr<'db> {}
10410impl<'db> TypedStablePtr<'db> for OptionLetElseClauseEmptyPtr<'db> {
10411    type SyntaxNode = OptionLetElseClauseEmpty<'db>;
10412    fn untyped(self) -> SyntaxStablePtrId<'db> {
10413        self.0
10414    }
10415    fn lookup(&self, db: &'db dyn Database) -> OptionLetElseClauseEmpty<'db> {
10416        OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10417    }
10418}
10419impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10420    fn from(ptr: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10421        ptr.untyped()
10422    }
10423}
10424#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10425pub struct OptionLetElseClauseEmptyGreen<'db>(pub GreenId<'db>);
10426impl<'db> TypedSyntaxNode<'db> for OptionLetElseClauseEmpty<'db> {
10427    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10428    type StablePtr = OptionLetElseClauseEmptyPtr<'db>;
10429    type Green = OptionLetElseClauseEmptyGreen<'db>;
10430    fn missing(db: &'db dyn Database) -> Self::Green {
10431        OptionLetElseClauseEmptyGreen(
10432            GreenNode {
10433                kind: SyntaxKind::OptionLetElseClauseEmpty,
10434                details: GreenNodeDetails::Node {
10435                    children: [].into(),
10436                    width: TextWidth::default(),
10437                },
10438            }
10439            .intern(db),
10440        )
10441    }
10442    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10443        let kind = node.kind(db);
10444        assert_eq!(
10445            kind,
10446            SyntaxKind::OptionLetElseClauseEmpty,
10447            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10448            kind,
10449            SyntaxKind::OptionLetElseClauseEmpty
10450        );
10451        Self { node }
10452    }
10453    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10454        let kind = node.kind(db);
10455        if kind == SyntaxKind::OptionLetElseClauseEmpty {
10456            Some(Self::from_syntax_node(db, node))
10457        } else {
10458            None
10459        }
10460    }
10461    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10462        self.node
10463    }
10464    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10465        OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10466    }
10467}
10468#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10469pub enum OptionTerminalSemicolon<'db> {
10470    Empty(OptionTerminalSemicolonEmpty<'db>),
10471    TerminalSemicolon(TerminalSemicolon<'db>),
10472}
10473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10474pub struct OptionTerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
10475impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonPtr<'db> {
10476    type SyntaxNode = OptionTerminalSemicolon<'db>;
10477    fn untyped(self) -> SyntaxStablePtrId<'db> {
10478        self.0
10479    }
10480    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10481        OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10482    }
10483}
10484impl<'db> From<OptionTerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
10485    fn from(ptr: OptionTerminalSemicolonPtr<'db>) -> Self {
10486        ptr.untyped()
10487    }
10488}
10489impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10490    fn from(value: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10491        Self(value.0)
10492    }
10493}
10494impl<'db> From<TerminalSemicolonPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10495    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
10496        Self(value.0)
10497    }
10498}
10499impl<'db> From<OptionTerminalSemicolonEmptyGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10500    fn from(value: OptionTerminalSemicolonEmptyGreen<'db>) -> Self {
10501        Self(value.0)
10502    }
10503}
10504impl<'db> From<TerminalSemicolonGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10505    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
10506        Self(value.0)
10507    }
10508}
10509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10510pub struct OptionTerminalSemicolonGreen<'db>(pub GreenId<'db>);
10511impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolon<'db> {
10512    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10513    type StablePtr = OptionTerminalSemicolonPtr<'db>;
10514    type Green = OptionTerminalSemicolonGreen<'db>;
10515    fn missing(db: &'db dyn Database) -> Self::Green {
10516        panic!("No missing variant.");
10517    }
10518    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10519        let kind = node.kind(db);
10520        match kind {
10521            SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10522                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10523            ),
10524            SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10525                TerminalSemicolon::from_syntax_node(db, node),
10526            ),
10527            _ => panic!(
10528                "Unexpected syntax kind {:?} when constructing {}.",
10529                kind, "OptionTerminalSemicolon"
10530            ),
10531        }
10532    }
10533    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10534        let kind = node.kind(db);
10535        match kind {
10536            SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10537                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10538            )),
10539            SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10540                TerminalSemicolon::from_syntax_node(db, node),
10541            )),
10542            _ => None,
10543        }
10544    }
10545    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10546        match self {
10547            OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10548            OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10549        }
10550    }
10551    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10552        OptionTerminalSemicolonPtr(self.as_syntax_node().long(db).stable_ptr)
10553    }
10554}
10555impl<'db> OptionTerminalSemicolon<'db> {
10556    /// Checks if a kind of a variant of [OptionTerminalSemicolon].
10557    pub fn is_variant(kind: SyntaxKind) -> bool {
10558        matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10559    }
10560}
10561#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10562pub struct OptionTerminalSemicolonEmpty<'db> {
10563    node: SyntaxNode<'db>,
10564}
10565impl<'db> OptionTerminalSemicolonEmpty<'db> {
10566    pub fn new_green(db: &'db dyn Database) -> OptionTerminalSemicolonEmptyGreen<'db> {
10567        let children = [];
10568        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10569        OptionTerminalSemicolonEmptyGreen(
10570            GreenNode {
10571                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10572                details: GreenNodeDetails::Node { children: children.into(), width },
10573            }
10574            .intern(db),
10575        )
10576    }
10577}
10578impl<'db> OptionTerminalSemicolonEmpty<'db> {}
10579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10580pub struct OptionTerminalSemicolonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10581impl<'db> OptionTerminalSemicolonEmptyPtr<'db> {}
10582impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonEmptyPtr<'db> {
10583    type SyntaxNode = OptionTerminalSemicolonEmpty<'db>;
10584    fn untyped(self) -> SyntaxStablePtrId<'db> {
10585        self.0
10586    }
10587    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalSemicolonEmpty<'db> {
10588        OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10589    }
10590}
10591impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10592    fn from(ptr: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10593        ptr.untyped()
10594    }
10595}
10596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10597pub struct OptionTerminalSemicolonEmptyGreen<'db>(pub GreenId<'db>);
10598impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolonEmpty<'db> {
10599    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10600    type StablePtr = OptionTerminalSemicolonEmptyPtr<'db>;
10601    type Green = OptionTerminalSemicolonEmptyGreen<'db>;
10602    fn missing(db: &'db dyn Database) -> Self::Green {
10603        OptionTerminalSemicolonEmptyGreen(
10604            GreenNode {
10605                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10606                details: GreenNodeDetails::Node {
10607                    children: [].into(),
10608                    width: TextWidth::default(),
10609                },
10610            }
10611            .intern(db),
10612        )
10613    }
10614    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10615        let kind = node.kind(db);
10616        assert_eq!(
10617            kind,
10618            SyntaxKind::OptionTerminalSemicolonEmpty,
10619            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10620            kind,
10621            SyntaxKind::OptionTerminalSemicolonEmpty
10622        );
10623        Self { node }
10624    }
10625    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10626        let kind = node.kind(db);
10627        if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10628            Some(Self::from_syntax_node(db, node))
10629        } else {
10630            None
10631        }
10632    }
10633    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10634        self.node
10635    }
10636    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10637        OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10638    }
10639}
10640#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10641pub struct StatementExpr<'db> {
10642    node: SyntaxNode<'db>,
10643}
10644impl<'db> StatementExpr<'db> {
10645    pub const INDEX_ATTRIBUTES: usize = 0;
10646    pub const INDEX_EXPR: usize = 1;
10647    pub const INDEX_SEMICOLON: usize = 2;
10648    pub fn new_green(
10649        db: &'db dyn Database,
10650        attributes: AttributeListGreen<'db>,
10651        expr: ExprGreen<'db>,
10652        semicolon: OptionTerminalSemicolonGreen<'db>,
10653    ) -> StatementExprGreen<'db> {
10654        let children = [attributes.0, expr.0, semicolon.0];
10655        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10656        StatementExprGreen(
10657            GreenNode {
10658                kind: SyntaxKind::StatementExpr,
10659                details: GreenNodeDetails::Node { children: children.into(), width },
10660            }
10661            .intern(db),
10662        )
10663    }
10664}
10665impl<'db> StatementExpr<'db> {
10666    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10667        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10668    }
10669    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10670        Expr::from_syntax_node(db, self.node.get_children(db)[1])
10671    }
10672    pub fn semicolon(&self, db: &'db dyn Database) -> OptionTerminalSemicolon<'db> {
10673        OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10674    }
10675}
10676#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10677pub struct StatementExprPtr<'db>(pub SyntaxStablePtrId<'db>);
10678impl<'db> StatementExprPtr<'db> {}
10679impl<'db> TypedStablePtr<'db> for StatementExprPtr<'db> {
10680    type SyntaxNode = StatementExpr<'db>;
10681    fn untyped(self) -> SyntaxStablePtrId<'db> {
10682        self.0
10683    }
10684    fn lookup(&self, db: &'db dyn Database) -> StatementExpr<'db> {
10685        StatementExpr::from_syntax_node(db, self.0.lookup(db))
10686    }
10687}
10688impl<'db> From<StatementExprPtr<'db>> for SyntaxStablePtrId<'db> {
10689    fn from(ptr: StatementExprPtr<'db>) -> Self {
10690        ptr.untyped()
10691    }
10692}
10693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10694pub struct StatementExprGreen<'db>(pub GreenId<'db>);
10695impl<'db> TypedSyntaxNode<'db> for StatementExpr<'db> {
10696    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10697    type StablePtr = StatementExprPtr<'db>;
10698    type Green = StatementExprGreen<'db>;
10699    fn missing(db: &'db dyn Database) -> Self::Green {
10700        StatementExprGreen(
10701            GreenNode {
10702                kind: SyntaxKind::StatementExpr,
10703                details: GreenNodeDetails::Node {
10704                    children: [
10705                        AttributeList::missing(db).0,
10706                        Expr::missing(db).0,
10707                        OptionTerminalSemicolon::missing(db).0,
10708                    ]
10709                    .into(),
10710                    width: TextWidth::default(),
10711                },
10712            }
10713            .intern(db),
10714        )
10715    }
10716    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10717        let kind = node.kind(db);
10718        assert_eq!(
10719            kind,
10720            SyntaxKind::StatementExpr,
10721            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10722            kind,
10723            SyntaxKind::StatementExpr
10724        );
10725        Self { node }
10726    }
10727    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10728        let kind = node.kind(db);
10729        if kind == SyntaxKind::StatementExpr {
10730            Some(Self::from_syntax_node(db, node))
10731        } else {
10732            None
10733        }
10734    }
10735    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10736        self.node
10737    }
10738    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10739        StatementExprPtr(self.node.stable_ptr(db))
10740    }
10741}
10742#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10743pub struct StatementContinue<'db> {
10744    node: SyntaxNode<'db>,
10745}
10746impl<'db> StatementContinue<'db> {
10747    pub const INDEX_ATTRIBUTES: usize = 0;
10748    pub const INDEX_CONTINUE_KW: usize = 1;
10749    pub const INDEX_SEMICOLON: usize = 2;
10750    pub fn new_green(
10751        db: &'db dyn Database,
10752        attributes: AttributeListGreen<'db>,
10753        continue_kw: TerminalContinueGreen<'db>,
10754        semicolon: TerminalSemicolonGreen<'db>,
10755    ) -> StatementContinueGreen<'db> {
10756        let children = [attributes.0, continue_kw.0, semicolon.0];
10757        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10758        StatementContinueGreen(
10759            GreenNode {
10760                kind: SyntaxKind::StatementContinue,
10761                details: GreenNodeDetails::Node { children: children.into(), width },
10762            }
10763            .intern(db),
10764        )
10765    }
10766}
10767impl<'db> StatementContinue<'db> {
10768    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10769        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10770    }
10771    pub fn continue_kw(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
10772        TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10773    }
10774    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10775        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10776    }
10777}
10778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10779pub struct StatementContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
10780impl<'db> StatementContinuePtr<'db> {}
10781impl<'db> TypedStablePtr<'db> for StatementContinuePtr<'db> {
10782    type SyntaxNode = StatementContinue<'db>;
10783    fn untyped(self) -> SyntaxStablePtrId<'db> {
10784        self.0
10785    }
10786    fn lookup(&self, db: &'db dyn Database) -> StatementContinue<'db> {
10787        StatementContinue::from_syntax_node(db, self.0.lookup(db))
10788    }
10789}
10790impl<'db> From<StatementContinuePtr<'db>> for SyntaxStablePtrId<'db> {
10791    fn from(ptr: StatementContinuePtr<'db>) -> Self {
10792        ptr.untyped()
10793    }
10794}
10795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10796pub struct StatementContinueGreen<'db>(pub GreenId<'db>);
10797impl<'db> TypedSyntaxNode<'db> for StatementContinue<'db> {
10798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10799    type StablePtr = StatementContinuePtr<'db>;
10800    type Green = StatementContinueGreen<'db>;
10801    fn missing(db: &'db dyn Database) -> Self::Green {
10802        StatementContinueGreen(
10803            GreenNode {
10804                kind: SyntaxKind::StatementContinue,
10805                details: GreenNodeDetails::Node {
10806                    children: [
10807                        AttributeList::missing(db).0,
10808                        TerminalContinue::missing(db).0,
10809                        TerminalSemicolon::missing(db).0,
10810                    ]
10811                    .into(),
10812                    width: TextWidth::default(),
10813                },
10814            }
10815            .intern(db),
10816        )
10817    }
10818    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10819        let kind = node.kind(db);
10820        assert_eq!(
10821            kind,
10822            SyntaxKind::StatementContinue,
10823            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10824            kind,
10825            SyntaxKind::StatementContinue
10826        );
10827        Self { node }
10828    }
10829    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10830        let kind = node.kind(db);
10831        if kind == SyntaxKind::StatementContinue {
10832            Some(Self::from_syntax_node(db, node))
10833        } else {
10834            None
10835        }
10836    }
10837    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10838        self.node
10839    }
10840    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10841        StatementContinuePtr(self.node.stable_ptr(db))
10842    }
10843}
10844#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10845pub struct ExprClause<'db> {
10846    node: SyntaxNode<'db>,
10847}
10848impl<'db> ExprClause<'db> {
10849    pub const INDEX_EXPR: usize = 0;
10850    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ExprClauseGreen<'db> {
10851        let children = [expr.0];
10852        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10853        ExprClauseGreen(
10854            GreenNode {
10855                kind: SyntaxKind::ExprClause,
10856                details: GreenNodeDetails::Node { children: children.into(), width },
10857            }
10858            .intern(db),
10859        )
10860    }
10861}
10862impl<'db> ExprClause<'db> {
10863    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10864        Expr::from_syntax_node(db, self.node.get_children(db)[0])
10865    }
10866}
10867#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10868pub struct ExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10869impl<'db> ExprClausePtr<'db> {}
10870impl<'db> TypedStablePtr<'db> for ExprClausePtr<'db> {
10871    type SyntaxNode = ExprClause<'db>;
10872    fn untyped(self) -> SyntaxStablePtrId<'db> {
10873        self.0
10874    }
10875    fn lookup(&self, db: &'db dyn Database) -> ExprClause<'db> {
10876        ExprClause::from_syntax_node(db, self.0.lookup(db))
10877    }
10878}
10879impl<'db> From<ExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10880    fn from(ptr: ExprClausePtr<'db>) -> Self {
10881        ptr.untyped()
10882    }
10883}
10884#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10885pub struct ExprClauseGreen<'db>(pub GreenId<'db>);
10886impl<'db> TypedSyntaxNode<'db> for ExprClause<'db> {
10887    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10888    type StablePtr = ExprClausePtr<'db>;
10889    type Green = ExprClauseGreen<'db>;
10890    fn missing(db: &'db dyn Database) -> Self::Green {
10891        ExprClauseGreen(
10892            GreenNode {
10893                kind: SyntaxKind::ExprClause,
10894                details: GreenNodeDetails::Node {
10895                    children: [Expr::missing(db).0].into(),
10896                    width: TextWidth::default(),
10897                },
10898            }
10899            .intern(db),
10900        )
10901    }
10902    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10903        let kind = node.kind(db);
10904        assert_eq!(
10905            kind,
10906            SyntaxKind::ExprClause,
10907            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10908            kind,
10909            SyntaxKind::ExprClause
10910        );
10911        Self { node }
10912    }
10913    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10914        let kind = node.kind(db);
10915        if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10916    }
10917    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10918        self.node
10919    }
10920    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10921        ExprClausePtr(self.node.stable_ptr(db))
10922    }
10923}
10924#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10925pub enum OptionExprClause<'db> {
10926    Empty(OptionExprClauseEmpty<'db>),
10927    ExprClause(ExprClause<'db>),
10928}
10929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10930pub struct OptionExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10931impl<'db> TypedStablePtr<'db> for OptionExprClausePtr<'db> {
10932    type SyntaxNode = OptionExprClause<'db>;
10933    fn untyped(self) -> SyntaxStablePtrId<'db> {
10934        self.0
10935    }
10936    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10937        OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10938    }
10939}
10940impl<'db> From<OptionExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10941    fn from(ptr: OptionExprClausePtr<'db>) -> Self {
10942        ptr.untyped()
10943    }
10944}
10945impl<'db> From<OptionExprClauseEmptyPtr<'db>> for OptionExprClausePtr<'db> {
10946    fn from(value: OptionExprClauseEmptyPtr<'db>) -> Self {
10947        Self(value.0)
10948    }
10949}
10950impl<'db> From<ExprClausePtr<'db>> for OptionExprClausePtr<'db> {
10951    fn from(value: ExprClausePtr<'db>) -> Self {
10952        Self(value.0)
10953    }
10954}
10955impl<'db> From<OptionExprClauseEmptyGreen<'db>> for OptionExprClauseGreen<'db> {
10956    fn from(value: OptionExprClauseEmptyGreen<'db>) -> Self {
10957        Self(value.0)
10958    }
10959}
10960impl<'db> From<ExprClauseGreen<'db>> for OptionExprClauseGreen<'db> {
10961    fn from(value: ExprClauseGreen<'db>) -> Self {
10962        Self(value.0)
10963    }
10964}
10965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10966pub struct OptionExprClauseGreen<'db>(pub GreenId<'db>);
10967impl<'db> TypedSyntaxNode<'db> for OptionExprClause<'db> {
10968    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10969    type StablePtr = OptionExprClausePtr<'db>;
10970    type Green = OptionExprClauseGreen<'db>;
10971    fn missing(db: &'db dyn Database) -> Self::Green {
10972        panic!("No missing variant.");
10973    }
10974    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10975        let kind = node.kind(db);
10976        match kind {
10977            SyntaxKind::OptionExprClauseEmpty => {
10978                OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10979            }
10980            SyntaxKind::ExprClause => {
10981                OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10982            }
10983            _ => panic!(
10984                "Unexpected syntax kind {:?} when constructing {}.",
10985                kind, "OptionExprClause"
10986            ),
10987        }
10988    }
10989    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10990        let kind = node.kind(db);
10991        match kind {
10992            SyntaxKind::OptionExprClauseEmpty => {
10993                Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10994            }
10995            SyntaxKind::ExprClause => {
10996                Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10997            }
10998            _ => None,
10999        }
11000    }
11001    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11002        match self {
11003            OptionExprClause::Empty(x) => x.as_syntax_node(),
11004            OptionExprClause::ExprClause(x) => x.as_syntax_node(),
11005        }
11006    }
11007    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11008        OptionExprClausePtr(self.as_syntax_node().long(db).stable_ptr)
11009    }
11010}
11011impl<'db> OptionExprClause<'db> {
11012    /// Checks if a kind of a variant of [OptionExprClause].
11013    pub fn is_variant(kind: SyntaxKind) -> bool {
11014        matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
11015    }
11016}
11017#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11018pub struct OptionExprClauseEmpty<'db> {
11019    node: SyntaxNode<'db>,
11020}
11021impl<'db> OptionExprClauseEmpty<'db> {
11022    pub fn new_green(db: &'db dyn Database) -> OptionExprClauseEmptyGreen<'db> {
11023        let children = [];
11024        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11025        OptionExprClauseEmptyGreen(
11026            GreenNode {
11027                kind: SyntaxKind::OptionExprClauseEmpty,
11028                details: GreenNodeDetails::Node { children: children.into(), width },
11029            }
11030            .intern(db),
11031        )
11032    }
11033}
11034impl<'db> OptionExprClauseEmpty<'db> {}
11035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11036pub struct OptionExprClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
11037impl<'db> OptionExprClauseEmptyPtr<'db> {}
11038impl<'db> TypedStablePtr<'db> for OptionExprClauseEmptyPtr<'db> {
11039    type SyntaxNode = OptionExprClauseEmpty<'db>;
11040    fn untyped(self) -> SyntaxStablePtrId<'db> {
11041        self.0
11042    }
11043    fn lookup(&self, db: &'db dyn Database) -> OptionExprClauseEmpty<'db> {
11044        OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11045    }
11046}
11047impl<'db> From<OptionExprClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
11048    fn from(ptr: OptionExprClauseEmptyPtr<'db>) -> Self {
11049        ptr.untyped()
11050    }
11051}
11052#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11053pub struct OptionExprClauseEmptyGreen<'db>(pub GreenId<'db>);
11054impl<'db> TypedSyntaxNode<'db> for OptionExprClauseEmpty<'db> {
11055    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
11056    type StablePtr = OptionExprClauseEmptyPtr<'db>;
11057    type Green = OptionExprClauseEmptyGreen<'db>;
11058    fn missing(db: &'db dyn Database) -> Self::Green {
11059        OptionExprClauseEmptyGreen(
11060            GreenNode {
11061                kind: SyntaxKind::OptionExprClauseEmpty,
11062                details: GreenNodeDetails::Node {
11063                    children: [].into(),
11064                    width: TextWidth::default(),
11065                },
11066            }
11067            .intern(db),
11068        )
11069    }
11070    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11071        let kind = node.kind(db);
11072        assert_eq!(
11073            kind,
11074            SyntaxKind::OptionExprClauseEmpty,
11075            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11076            kind,
11077            SyntaxKind::OptionExprClauseEmpty
11078        );
11079        Self { node }
11080    }
11081    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11082        let kind = node.kind(db);
11083        if kind == SyntaxKind::OptionExprClauseEmpty {
11084            Some(Self::from_syntax_node(db, node))
11085        } else {
11086            None
11087        }
11088    }
11089    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11090        self.node
11091    }
11092    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11093        OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11094    }
11095}
11096#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11097pub struct StatementReturn<'db> {
11098    node: SyntaxNode<'db>,
11099}
11100impl<'db> StatementReturn<'db> {
11101    pub const INDEX_ATTRIBUTES: usize = 0;
11102    pub const INDEX_RETURN_KW: usize = 1;
11103    pub const INDEX_EXPR_CLAUSE: usize = 2;
11104    pub const INDEX_SEMICOLON: usize = 3;
11105    pub fn new_green(
11106        db: &'db dyn Database,
11107        attributes: AttributeListGreen<'db>,
11108        return_kw: TerminalReturnGreen<'db>,
11109        expr_clause: OptionExprClauseGreen<'db>,
11110        semicolon: TerminalSemicolonGreen<'db>,
11111    ) -> StatementReturnGreen<'db> {
11112        let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11113        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11114        StatementReturnGreen(
11115            GreenNode {
11116                kind: SyntaxKind::StatementReturn,
11117                details: GreenNodeDetails::Node { children: children.into(), width },
11118            }
11119            .intern(db),
11120        )
11121    }
11122}
11123impl<'db> StatementReturn<'db> {
11124    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11125        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11126    }
11127    pub fn return_kw(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
11128        TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11129    }
11130    pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11131        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11132    }
11133    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11134        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11135    }
11136}
11137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11138pub struct StatementReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
11139impl<'db> StatementReturnPtr<'db> {}
11140impl<'db> TypedStablePtr<'db> for StatementReturnPtr<'db> {
11141    type SyntaxNode = StatementReturn<'db>;
11142    fn untyped(self) -> SyntaxStablePtrId<'db> {
11143        self.0
11144    }
11145    fn lookup(&self, db: &'db dyn Database) -> StatementReturn<'db> {
11146        StatementReturn::from_syntax_node(db, self.0.lookup(db))
11147    }
11148}
11149impl<'db> From<StatementReturnPtr<'db>> for SyntaxStablePtrId<'db> {
11150    fn from(ptr: StatementReturnPtr<'db>) -> Self {
11151        ptr.untyped()
11152    }
11153}
11154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11155pub struct StatementReturnGreen<'db>(pub GreenId<'db>);
11156impl<'db> TypedSyntaxNode<'db> for StatementReturn<'db> {
11157    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11158    type StablePtr = StatementReturnPtr<'db>;
11159    type Green = StatementReturnGreen<'db>;
11160    fn missing(db: &'db dyn Database) -> Self::Green {
11161        StatementReturnGreen(
11162            GreenNode {
11163                kind: SyntaxKind::StatementReturn,
11164                details: GreenNodeDetails::Node {
11165                    children: [
11166                        AttributeList::missing(db).0,
11167                        TerminalReturn::missing(db).0,
11168                        OptionExprClause::missing(db).0,
11169                        TerminalSemicolon::missing(db).0,
11170                    ]
11171                    .into(),
11172                    width: TextWidth::default(),
11173                },
11174            }
11175            .intern(db),
11176        )
11177    }
11178    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11179        let kind = node.kind(db);
11180        assert_eq!(
11181            kind,
11182            SyntaxKind::StatementReturn,
11183            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11184            kind,
11185            SyntaxKind::StatementReturn
11186        );
11187        Self { node }
11188    }
11189    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11190        let kind = node.kind(db);
11191        if kind == SyntaxKind::StatementReturn {
11192            Some(Self::from_syntax_node(db, node))
11193        } else {
11194            None
11195        }
11196    }
11197    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11198        self.node
11199    }
11200    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11201        StatementReturnPtr(self.node.stable_ptr(db))
11202    }
11203}
11204#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11205pub struct StatementBreak<'db> {
11206    node: SyntaxNode<'db>,
11207}
11208impl<'db> StatementBreak<'db> {
11209    pub const INDEX_ATTRIBUTES: usize = 0;
11210    pub const INDEX_BREAK_KW: usize = 1;
11211    pub const INDEX_EXPR_CLAUSE: usize = 2;
11212    pub const INDEX_SEMICOLON: usize = 3;
11213    pub fn new_green(
11214        db: &'db dyn Database,
11215        attributes: AttributeListGreen<'db>,
11216        break_kw: TerminalBreakGreen<'db>,
11217        expr_clause: OptionExprClauseGreen<'db>,
11218        semicolon: TerminalSemicolonGreen<'db>,
11219    ) -> StatementBreakGreen<'db> {
11220        let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11221        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11222        StatementBreakGreen(
11223            GreenNode {
11224                kind: SyntaxKind::StatementBreak,
11225                details: GreenNodeDetails::Node { children: children.into(), width },
11226            }
11227            .intern(db),
11228        )
11229    }
11230}
11231impl<'db> StatementBreak<'db> {
11232    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11233        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11234    }
11235    pub fn break_kw(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
11236        TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11237    }
11238    pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11239        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11240    }
11241    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11242        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11243    }
11244}
11245#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11246pub struct StatementBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
11247impl<'db> StatementBreakPtr<'db> {}
11248impl<'db> TypedStablePtr<'db> for StatementBreakPtr<'db> {
11249    type SyntaxNode = StatementBreak<'db>;
11250    fn untyped(self) -> SyntaxStablePtrId<'db> {
11251        self.0
11252    }
11253    fn lookup(&self, db: &'db dyn Database) -> StatementBreak<'db> {
11254        StatementBreak::from_syntax_node(db, self.0.lookup(db))
11255    }
11256}
11257impl<'db> From<StatementBreakPtr<'db>> for SyntaxStablePtrId<'db> {
11258    fn from(ptr: StatementBreakPtr<'db>) -> Self {
11259        ptr.untyped()
11260    }
11261}
11262#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11263pub struct StatementBreakGreen<'db>(pub GreenId<'db>);
11264impl<'db> TypedSyntaxNode<'db> for StatementBreak<'db> {
11265    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11266    type StablePtr = StatementBreakPtr<'db>;
11267    type Green = StatementBreakGreen<'db>;
11268    fn missing(db: &'db dyn Database) -> Self::Green {
11269        StatementBreakGreen(
11270            GreenNode {
11271                kind: SyntaxKind::StatementBreak,
11272                details: GreenNodeDetails::Node {
11273                    children: [
11274                        AttributeList::missing(db).0,
11275                        TerminalBreak::missing(db).0,
11276                        OptionExprClause::missing(db).0,
11277                        TerminalSemicolon::missing(db).0,
11278                    ]
11279                    .into(),
11280                    width: TextWidth::default(),
11281                },
11282            }
11283            .intern(db),
11284        )
11285    }
11286    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11287        let kind = node.kind(db);
11288        assert_eq!(
11289            kind,
11290            SyntaxKind::StatementBreak,
11291            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11292            kind,
11293            SyntaxKind::StatementBreak
11294        );
11295        Self { node }
11296    }
11297    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11298        let kind = node.kind(db);
11299        if kind == SyntaxKind::StatementBreak {
11300            Some(Self::from_syntax_node(db, node))
11301        } else {
11302            None
11303        }
11304    }
11305    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11306        self.node
11307    }
11308    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11309        StatementBreakPtr(self.node.stable_ptr(db))
11310    }
11311}
11312#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11313pub struct StatementItem<'db> {
11314    node: SyntaxNode<'db>,
11315}
11316impl<'db> StatementItem<'db> {
11317    pub const INDEX_ITEM: usize = 0;
11318    pub fn new_green(db: &'db dyn Database, item: ModuleItemGreen<'db>) -> StatementItemGreen<'db> {
11319        let children = [item.0];
11320        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11321        StatementItemGreen(
11322            GreenNode {
11323                kind: SyntaxKind::StatementItem,
11324                details: GreenNodeDetails::Node { children: children.into(), width },
11325            }
11326            .intern(db),
11327        )
11328    }
11329}
11330impl<'db> StatementItem<'db> {
11331    pub fn item(&self, db: &'db dyn Database) -> ModuleItem<'db> {
11332        ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11333    }
11334}
11335#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11336pub struct StatementItemPtr<'db>(pub SyntaxStablePtrId<'db>);
11337impl<'db> StatementItemPtr<'db> {}
11338impl<'db> TypedStablePtr<'db> for StatementItemPtr<'db> {
11339    type SyntaxNode = StatementItem<'db>;
11340    fn untyped(self) -> SyntaxStablePtrId<'db> {
11341        self.0
11342    }
11343    fn lookup(&self, db: &'db dyn Database) -> StatementItem<'db> {
11344        StatementItem::from_syntax_node(db, self.0.lookup(db))
11345    }
11346}
11347impl<'db> From<StatementItemPtr<'db>> for SyntaxStablePtrId<'db> {
11348    fn from(ptr: StatementItemPtr<'db>) -> Self {
11349        ptr.untyped()
11350    }
11351}
11352#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11353pub struct StatementItemGreen<'db>(pub GreenId<'db>);
11354impl<'db> TypedSyntaxNode<'db> for StatementItem<'db> {
11355    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11356    type StablePtr = StatementItemPtr<'db>;
11357    type Green = StatementItemGreen<'db>;
11358    fn missing(db: &'db dyn Database) -> Self::Green {
11359        StatementItemGreen(
11360            GreenNode {
11361                kind: SyntaxKind::StatementItem,
11362                details: GreenNodeDetails::Node {
11363                    children: [ModuleItem::missing(db).0].into(),
11364                    width: TextWidth::default(),
11365                },
11366            }
11367            .intern(db),
11368        )
11369    }
11370    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11371        let kind = node.kind(db);
11372        assert_eq!(
11373            kind,
11374            SyntaxKind::StatementItem,
11375            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11376            kind,
11377            SyntaxKind::StatementItem
11378        );
11379        Self { node }
11380    }
11381    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11382        let kind = node.kind(db);
11383        if kind == SyntaxKind::StatementItem {
11384            Some(Self::from_syntax_node(db, node))
11385        } else {
11386            None
11387        }
11388    }
11389    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11390        self.node
11391    }
11392    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11393        StatementItemPtr(self.node.stable_ptr(db))
11394    }
11395}
11396#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11397pub struct Param<'db> {
11398    node: SyntaxNode<'db>,
11399}
11400impl<'db> Param<'db> {
11401    pub const INDEX_MODIFIERS: usize = 0;
11402    pub const INDEX_NAME: usize = 1;
11403    pub const INDEX_TYPE_CLAUSE: usize = 2;
11404    pub fn new_green(
11405        db: &'db dyn Database,
11406        modifiers: ModifierListGreen<'db>,
11407        name: TerminalIdentifierGreen<'db>,
11408        type_clause: OptionTypeClauseGreen<'db>,
11409    ) -> ParamGreen<'db> {
11410        let children = [modifiers.0, name.0, type_clause.0];
11411        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11412        ParamGreen(
11413            GreenNode {
11414                kind: SyntaxKind::Param,
11415                details: GreenNodeDetails::Node { children: children.into(), width },
11416            }
11417            .intern(db),
11418        )
11419    }
11420}
11421impl<'db> Param<'db> {
11422    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
11423        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11424    }
11425    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
11426        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11427    }
11428    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
11429        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11430    }
11431}
11432#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11433pub struct ParamPtr<'db>(pub SyntaxStablePtrId<'db>);
11434impl<'db> ParamPtr<'db> {
11435    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
11436        let ptr = self.0.long(db);
11437        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
11438            TerminalIdentifierGreen(key_fields[0])
11439        } else {
11440            panic!("Unexpected key field query on root.");
11441        }
11442    }
11443}
11444impl<'db> TypedStablePtr<'db> for ParamPtr<'db> {
11445    type SyntaxNode = Param<'db>;
11446    fn untyped(self) -> SyntaxStablePtrId<'db> {
11447        self.0
11448    }
11449    fn lookup(&self, db: &'db dyn Database) -> Param<'db> {
11450        Param::from_syntax_node(db, self.0.lookup(db))
11451    }
11452}
11453impl<'db> From<ParamPtr<'db>> for SyntaxStablePtrId<'db> {
11454    fn from(ptr: ParamPtr<'db>) -> Self {
11455        ptr.untyped()
11456    }
11457}
11458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11459pub struct ParamGreen<'db>(pub GreenId<'db>);
11460impl<'db> TypedSyntaxNode<'db> for Param<'db> {
11461    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11462    type StablePtr = ParamPtr<'db>;
11463    type Green = ParamGreen<'db>;
11464    fn missing(db: &'db dyn Database) -> Self::Green {
11465        ParamGreen(
11466            GreenNode {
11467                kind: SyntaxKind::Param,
11468                details: GreenNodeDetails::Node {
11469                    children: [
11470                        ModifierList::missing(db).0,
11471                        TerminalIdentifier::missing(db).0,
11472                        OptionTypeClause::missing(db).0,
11473                    ]
11474                    .into(),
11475                    width: TextWidth::default(),
11476                },
11477            }
11478            .intern(db),
11479        )
11480    }
11481    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11482        let kind = node.kind(db);
11483        assert_eq!(
11484            kind,
11485            SyntaxKind::Param,
11486            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11487            kind,
11488            SyntaxKind::Param
11489        );
11490        Self { node }
11491    }
11492    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11493        let kind = node.kind(db);
11494        if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11495    }
11496    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11497        self.node
11498    }
11499    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11500        ParamPtr(self.node.stable_ptr(db))
11501    }
11502}
11503#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11504pub struct ModifierList<'db>(ElementList<'db, Modifier<'db>, 1>);
11505impl<'db> Deref for ModifierList<'db> {
11506    type Target = ElementList<'db, Modifier<'db>, 1>;
11507    fn deref(&self) -> &Self::Target {
11508        &self.0
11509    }
11510}
11511impl<'db> ModifierList<'db> {
11512    pub fn new_green(
11513        db: &'db dyn Database,
11514        children: &[ModifierGreen<'db>],
11515    ) -> ModifierListGreen<'db> {
11516        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
11517        ModifierListGreen(
11518            GreenNode {
11519                kind: SyntaxKind::ModifierList,
11520                details: GreenNodeDetails::Node {
11521                    children: children.iter().map(|x| x.0).collect(),
11522                    width,
11523                },
11524            }
11525            .intern(db),
11526        )
11527    }
11528}
11529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11530pub struct ModifierListPtr<'db>(pub SyntaxStablePtrId<'db>);
11531impl<'db> TypedStablePtr<'db> for ModifierListPtr<'db> {
11532    type SyntaxNode = ModifierList<'db>;
11533    fn untyped(self) -> SyntaxStablePtrId<'db> {
11534        self.0
11535    }
11536    fn lookup(&self, db: &'db dyn Database) -> ModifierList<'db> {
11537        ModifierList::from_syntax_node(db, self.0.lookup(db))
11538    }
11539}
11540impl<'db> From<ModifierListPtr<'db>> for SyntaxStablePtrId<'db> {
11541    fn from(ptr: ModifierListPtr<'db>) -> Self {
11542        ptr.untyped()
11543    }
11544}
11545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11546pub struct ModifierListGreen<'db>(pub GreenId<'db>);
11547impl<'db> TypedSyntaxNode<'db> for ModifierList<'db> {
11548    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11549    type StablePtr = ModifierListPtr<'db>;
11550    type Green = ModifierListGreen<'db>;
11551    fn missing(db: &'db dyn Database) -> Self::Green {
11552        ModifierListGreen(
11553            GreenNode {
11554                kind: SyntaxKind::ModifierList,
11555                details: GreenNodeDetails::Node {
11556                    children: [].into(),
11557                    width: TextWidth::default(),
11558                },
11559            }
11560            .intern(db),
11561        )
11562    }
11563    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11564        Self(ElementList::new(node))
11565    }
11566    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11567        if node.kind(db) == SyntaxKind::ModifierList {
11568            Some(Self(ElementList::new(node)))
11569        } else {
11570            None
11571        }
11572    }
11573    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11574        self.node
11575    }
11576    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11577        ModifierListPtr(self.node.stable_ptr(db))
11578    }
11579}
11580#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11581pub enum Modifier<'db> {
11582    Ref(TerminalRef<'db>),
11583    Mut(TerminalMut<'db>),
11584}
11585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11586pub struct ModifierPtr<'db>(pub SyntaxStablePtrId<'db>);
11587impl<'db> TypedStablePtr<'db> for ModifierPtr<'db> {
11588    type SyntaxNode = Modifier<'db>;
11589    fn untyped(self) -> SyntaxStablePtrId<'db> {
11590        self.0
11591    }
11592    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11593        Modifier::from_syntax_node(db, self.0.lookup(db))
11594    }
11595}
11596impl<'db> From<ModifierPtr<'db>> for SyntaxStablePtrId<'db> {
11597    fn from(ptr: ModifierPtr<'db>) -> Self {
11598        ptr.untyped()
11599    }
11600}
11601impl<'db> From<TerminalRefPtr<'db>> for ModifierPtr<'db> {
11602    fn from(value: TerminalRefPtr<'db>) -> Self {
11603        Self(value.0)
11604    }
11605}
11606impl<'db> From<TerminalMutPtr<'db>> for ModifierPtr<'db> {
11607    fn from(value: TerminalMutPtr<'db>) -> Self {
11608        Self(value.0)
11609    }
11610}
11611impl<'db> From<TerminalRefGreen<'db>> for ModifierGreen<'db> {
11612    fn from(value: TerminalRefGreen<'db>) -> Self {
11613        Self(value.0)
11614    }
11615}
11616impl<'db> From<TerminalMutGreen<'db>> for ModifierGreen<'db> {
11617    fn from(value: TerminalMutGreen<'db>) -> Self {
11618        Self(value.0)
11619    }
11620}
11621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11622pub struct ModifierGreen<'db>(pub GreenId<'db>);
11623impl<'db> TypedSyntaxNode<'db> for Modifier<'db> {
11624    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11625    type StablePtr = ModifierPtr<'db>;
11626    type Green = ModifierGreen<'db>;
11627    fn missing(db: &'db dyn Database) -> Self::Green {
11628        panic!("No missing variant.");
11629    }
11630    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11631        let kind = node.kind(db);
11632        match kind {
11633            SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11634            SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11635            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11636        }
11637    }
11638    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11639        let kind = node.kind(db);
11640        match kind {
11641            SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11642            SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11643            _ => None,
11644        }
11645    }
11646    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11647        match self {
11648            Modifier::Ref(x) => x.as_syntax_node(),
11649            Modifier::Mut(x) => x.as_syntax_node(),
11650        }
11651    }
11652    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11653        ModifierPtr(self.as_syntax_node().long(db).stable_ptr)
11654    }
11655}
11656impl<'db> Modifier<'db> {
11657    /// Checks if a kind of a variant of [Modifier].
11658    pub fn is_variant(kind: SyntaxKind) -> bool {
11659        matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11660    }
11661}
11662#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11663pub struct ParamList<'db>(ElementList<'db, Param<'db>, 2>);
11664impl<'db> Deref for ParamList<'db> {
11665    type Target = ElementList<'db, Param<'db>, 2>;
11666    fn deref(&self) -> &Self::Target {
11667        &self.0
11668    }
11669}
11670impl<'db> ParamList<'db> {
11671    pub fn new_green(
11672        db: &'db dyn Database,
11673        children: &[ParamListElementOrSeparatorGreen<'db>],
11674    ) -> ParamListGreen<'db> {
11675        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11676        ParamListGreen(
11677            GreenNode {
11678                kind: SyntaxKind::ParamList,
11679                details: GreenNodeDetails::Node {
11680                    children: children.iter().map(|x| x.id()).collect(),
11681                    width,
11682                },
11683            }
11684            .intern(db),
11685        )
11686    }
11687}
11688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11689pub struct ParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
11690impl<'db> TypedStablePtr<'db> for ParamListPtr<'db> {
11691    type SyntaxNode = ParamList<'db>;
11692    fn untyped(self) -> SyntaxStablePtrId<'db> {
11693        self.0
11694    }
11695    fn lookup(&self, db: &'db dyn Database) -> ParamList<'db> {
11696        ParamList::from_syntax_node(db, self.0.lookup(db))
11697    }
11698}
11699impl<'db> From<ParamListPtr<'db>> for SyntaxStablePtrId<'db> {
11700    fn from(ptr: ParamListPtr<'db>) -> Self {
11701        ptr.untyped()
11702    }
11703}
11704#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11705pub enum ParamListElementOrSeparatorGreen<'db> {
11706    Separator(TerminalCommaGreen<'db>),
11707    Element(ParamGreen<'db>),
11708}
11709impl<'db> From<TerminalCommaGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11710    fn from(value: TerminalCommaGreen<'db>) -> Self {
11711        ParamListElementOrSeparatorGreen::Separator(value)
11712    }
11713}
11714impl<'db> From<ParamGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11715    fn from(value: ParamGreen<'db>) -> Self {
11716        ParamListElementOrSeparatorGreen::Element(value)
11717    }
11718}
11719impl<'db> ParamListElementOrSeparatorGreen<'db> {
11720    fn id(&self) -> GreenId<'db> {
11721        match self {
11722            ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11723            ParamListElementOrSeparatorGreen::Element(green) => green.0,
11724        }
11725    }
11726}
11727#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11728pub struct ParamListGreen<'db>(pub GreenId<'db>);
11729impl<'db> TypedSyntaxNode<'db> for ParamList<'db> {
11730    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11731    type StablePtr = ParamListPtr<'db>;
11732    type Green = ParamListGreen<'db>;
11733    fn missing(db: &'db dyn Database) -> Self::Green {
11734        ParamListGreen(
11735            GreenNode {
11736                kind: SyntaxKind::ParamList,
11737                details: GreenNodeDetails::Node {
11738                    children: [].into(),
11739                    width: TextWidth::default(),
11740                },
11741            }
11742            .intern(db),
11743        )
11744    }
11745    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11746        Self(ElementList::new(node))
11747    }
11748    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11749        if node.kind(db) == SyntaxKind::ParamList {
11750            Some(Self(ElementList::new(node)))
11751        } else {
11752            None
11753        }
11754    }
11755    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11756        self.node
11757    }
11758    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11759        ParamListPtr(self.node.stable_ptr(db))
11760    }
11761}
11762#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11763pub struct ImplicitsClause<'db> {
11764    node: SyntaxNode<'db>,
11765}
11766impl<'db> ImplicitsClause<'db> {
11767    pub const INDEX_IMPLICITS_KW: usize = 0;
11768    pub const INDEX_LPAREN: usize = 1;
11769    pub const INDEX_IMPLICITS: usize = 2;
11770    pub const INDEX_RPAREN: usize = 3;
11771    pub fn new_green(
11772        db: &'db dyn Database,
11773        implicits_kw: TerminalImplicitsGreen<'db>,
11774        lparen: TerminalLParenGreen<'db>,
11775        implicits: ImplicitsListGreen<'db>,
11776        rparen: TerminalRParenGreen<'db>,
11777    ) -> ImplicitsClauseGreen<'db> {
11778        let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11779        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11780        ImplicitsClauseGreen(
11781            GreenNode {
11782                kind: SyntaxKind::ImplicitsClause,
11783                details: GreenNodeDetails::Node { children: children.into(), width },
11784            }
11785            .intern(db),
11786        )
11787    }
11788}
11789impl<'db> ImplicitsClause<'db> {
11790    pub fn implicits_kw(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
11791        TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11792    }
11793    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
11794        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11795    }
11796    pub fn implicits(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11797        ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11798    }
11799    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
11800        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11801    }
11802}
11803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11804pub struct ImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11805impl<'db> ImplicitsClausePtr<'db> {}
11806impl<'db> TypedStablePtr<'db> for ImplicitsClausePtr<'db> {
11807    type SyntaxNode = ImplicitsClause<'db>;
11808    fn untyped(self) -> SyntaxStablePtrId<'db> {
11809        self.0
11810    }
11811    fn lookup(&self, db: &'db dyn Database) -> ImplicitsClause<'db> {
11812        ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11813    }
11814}
11815impl<'db> From<ImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11816    fn from(ptr: ImplicitsClausePtr<'db>) -> Self {
11817        ptr.untyped()
11818    }
11819}
11820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11821pub struct ImplicitsClauseGreen<'db>(pub GreenId<'db>);
11822impl<'db> TypedSyntaxNode<'db> for ImplicitsClause<'db> {
11823    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11824    type StablePtr = ImplicitsClausePtr<'db>;
11825    type Green = ImplicitsClauseGreen<'db>;
11826    fn missing(db: &'db dyn Database) -> Self::Green {
11827        ImplicitsClauseGreen(
11828            GreenNode {
11829                kind: SyntaxKind::ImplicitsClause,
11830                details: GreenNodeDetails::Node {
11831                    children: [
11832                        TerminalImplicits::missing(db).0,
11833                        TerminalLParen::missing(db).0,
11834                        ImplicitsList::missing(db).0,
11835                        TerminalRParen::missing(db).0,
11836                    ]
11837                    .into(),
11838                    width: TextWidth::default(),
11839                },
11840            }
11841            .intern(db),
11842        )
11843    }
11844    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11845        let kind = node.kind(db);
11846        assert_eq!(
11847            kind,
11848            SyntaxKind::ImplicitsClause,
11849            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11850            kind,
11851            SyntaxKind::ImplicitsClause
11852        );
11853        Self { node }
11854    }
11855    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11856        let kind = node.kind(db);
11857        if kind == SyntaxKind::ImplicitsClause {
11858            Some(Self::from_syntax_node(db, node))
11859        } else {
11860            None
11861        }
11862    }
11863    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11864        self.node
11865    }
11866    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11867        ImplicitsClausePtr(self.node.stable_ptr(db))
11868    }
11869}
11870#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11871pub struct ImplicitsList<'db>(ElementList<'db, ExprPath<'db>, 2>);
11872impl<'db> Deref for ImplicitsList<'db> {
11873    type Target = ElementList<'db, ExprPath<'db>, 2>;
11874    fn deref(&self) -> &Self::Target {
11875        &self.0
11876    }
11877}
11878impl<'db> ImplicitsList<'db> {
11879    pub fn new_green(
11880        db: &'db dyn Database,
11881        children: &[ImplicitsListElementOrSeparatorGreen<'db>],
11882    ) -> ImplicitsListGreen<'db> {
11883        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11884        ImplicitsListGreen(
11885            GreenNode {
11886                kind: SyntaxKind::ImplicitsList,
11887                details: GreenNodeDetails::Node {
11888                    children: children.iter().map(|x| x.id()).collect(),
11889                    width,
11890                },
11891            }
11892            .intern(db),
11893        )
11894    }
11895}
11896#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11897pub struct ImplicitsListPtr<'db>(pub SyntaxStablePtrId<'db>);
11898impl<'db> TypedStablePtr<'db> for ImplicitsListPtr<'db> {
11899    type SyntaxNode = ImplicitsList<'db>;
11900    fn untyped(self) -> SyntaxStablePtrId<'db> {
11901        self.0
11902    }
11903    fn lookup(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11904        ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11905    }
11906}
11907impl<'db> From<ImplicitsListPtr<'db>> for SyntaxStablePtrId<'db> {
11908    fn from(ptr: ImplicitsListPtr<'db>) -> Self {
11909        ptr.untyped()
11910    }
11911}
11912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11913pub enum ImplicitsListElementOrSeparatorGreen<'db> {
11914    Separator(TerminalCommaGreen<'db>),
11915    Element(ExprPathGreen<'db>),
11916}
11917impl<'db> From<TerminalCommaGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11918    fn from(value: TerminalCommaGreen<'db>) -> Self {
11919        ImplicitsListElementOrSeparatorGreen::Separator(value)
11920    }
11921}
11922impl<'db> From<ExprPathGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11923    fn from(value: ExprPathGreen<'db>) -> Self {
11924        ImplicitsListElementOrSeparatorGreen::Element(value)
11925    }
11926}
11927impl<'db> ImplicitsListElementOrSeparatorGreen<'db> {
11928    fn id(&self) -> GreenId<'db> {
11929        match self {
11930            ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11931            ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11932        }
11933    }
11934}
11935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11936pub struct ImplicitsListGreen<'db>(pub GreenId<'db>);
11937impl<'db> TypedSyntaxNode<'db> for ImplicitsList<'db> {
11938    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11939    type StablePtr = ImplicitsListPtr<'db>;
11940    type Green = ImplicitsListGreen<'db>;
11941    fn missing(db: &'db dyn Database) -> Self::Green {
11942        ImplicitsListGreen(
11943            GreenNode {
11944                kind: SyntaxKind::ImplicitsList,
11945                details: GreenNodeDetails::Node {
11946                    children: [].into(),
11947                    width: TextWidth::default(),
11948                },
11949            }
11950            .intern(db),
11951        )
11952    }
11953    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11954        Self(ElementList::new(node))
11955    }
11956    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11957        if node.kind(db) == SyntaxKind::ImplicitsList {
11958            Some(Self(ElementList::new(node)))
11959        } else {
11960            None
11961        }
11962    }
11963    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11964        self.node
11965    }
11966    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11967        ImplicitsListPtr(self.node.stable_ptr(db))
11968    }
11969}
11970#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11971pub enum OptionImplicitsClause<'db> {
11972    Empty(OptionImplicitsClauseEmpty<'db>),
11973    ImplicitsClause(ImplicitsClause<'db>),
11974}
11975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11976pub struct OptionImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11977impl<'db> TypedStablePtr<'db> for OptionImplicitsClausePtr<'db> {
11978    type SyntaxNode = OptionImplicitsClause<'db>;
11979    fn untyped(self) -> SyntaxStablePtrId<'db> {
11980        self.0
11981    }
11982    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11983        OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11984    }
11985}
11986impl<'db> From<OptionImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11987    fn from(ptr: OptionImplicitsClausePtr<'db>) -> Self {
11988        ptr.untyped()
11989    }
11990}
11991impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for OptionImplicitsClausePtr<'db> {
11992    fn from(value: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
11993        Self(value.0)
11994    }
11995}
11996impl<'db> From<ImplicitsClausePtr<'db>> for OptionImplicitsClausePtr<'db> {
11997    fn from(value: ImplicitsClausePtr<'db>) -> Self {
11998        Self(value.0)
11999    }
12000}
12001impl<'db> From<OptionImplicitsClauseEmptyGreen<'db>> for OptionImplicitsClauseGreen<'db> {
12002    fn from(value: OptionImplicitsClauseEmptyGreen<'db>) -> Self {
12003        Self(value.0)
12004    }
12005}
12006impl<'db> From<ImplicitsClauseGreen<'db>> for OptionImplicitsClauseGreen<'db> {
12007    fn from(value: ImplicitsClauseGreen<'db>) -> Self {
12008        Self(value.0)
12009    }
12010}
12011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12012pub struct OptionImplicitsClauseGreen<'db>(pub GreenId<'db>);
12013impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClause<'db> {
12014    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12015    type StablePtr = OptionImplicitsClausePtr<'db>;
12016    type Green = OptionImplicitsClauseGreen<'db>;
12017    fn missing(db: &'db dyn Database) -> Self::Green {
12018        panic!("No missing variant.");
12019    }
12020    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12021        let kind = node.kind(db);
12022        match kind {
12023            SyntaxKind::OptionImplicitsClauseEmpty => {
12024                OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
12025            }
12026            SyntaxKind::ImplicitsClause => {
12027                OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
12028            }
12029            _ => panic!(
12030                "Unexpected syntax kind {:?} when constructing {}.",
12031                kind, "OptionImplicitsClause"
12032            ),
12033        }
12034    }
12035    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12036        let kind = node.kind(db);
12037        match kind {
12038            SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
12039                OptionImplicitsClauseEmpty::from_syntax_node(db, node),
12040            )),
12041            SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
12042                ImplicitsClause::from_syntax_node(db, node),
12043            )),
12044            _ => None,
12045        }
12046    }
12047    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12048        match self {
12049            OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
12050            OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
12051        }
12052    }
12053    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12054        OptionImplicitsClausePtr(self.as_syntax_node().long(db).stable_ptr)
12055    }
12056}
12057impl<'db> OptionImplicitsClause<'db> {
12058    /// Checks if a kind of a variant of [OptionImplicitsClause].
12059    pub fn is_variant(kind: SyntaxKind) -> bool {
12060        matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
12061    }
12062}
12063#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12064pub struct OptionImplicitsClauseEmpty<'db> {
12065    node: SyntaxNode<'db>,
12066}
12067impl<'db> OptionImplicitsClauseEmpty<'db> {
12068    pub fn new_green(db: &'db dyn Database) -> OptionImplicitsClauseEmptyGreen<'db> {
12069        let children = [];
12070        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12071        OptionImplicitsClauseEmptyGreen(
12072            GreenNode {
12073                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12074                details: GreenNodeDetails::Node { children: children.into(), width },
12075            }
12076            .intern(db),
12077        )
12078    }
12079}
12080impl<'db> OptionImplicitsClauseEmpty<'db> {}
12081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12082pub struct OptionImplicitsClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12083impl<'db> OptionImplicitsClauseEmptyPtr<'db> {}
12084impl<'db> TypedStablePtr<'db> for OptionImplicitsClauseEmptyPtr<'db> {
12085    type SyntaxNode = OptionImplicitsClauseEmpty<'db>;
12086    fn untyped(self) -> SyntaxStablePtrId<'db> {
12087        self.0
12088    }
12089    fn lookup(&self, db: &'db dyn Database) -> OptionImplicitsClauseEmpty<'db> {
12090        OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12091    }
12092}
12093impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12094    fn from(ptr: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
12095        ptr.untyped()
12096    }
12097}
12098#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12099pub struct OptionImplicitsClauseEmptyGreen<'db>(pub GreenId<'db>);
12100impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClauseEmpty<'db> {
12101    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12102    type StablePtr = OptionImplicitsClauseEmptyPtr<'db>;
12103    type Green = OptionImplicitsClauseEmptyGreen<'db>;
12104    fn missing(db: &'db dyn Database) -> Self::Green {
12105        OptionImplicitsClauseEmptyGreen(
12106            GreenNode {
12107                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12108                details: GreenNodeDetails::Node {
12109                    children: [].into(),
12110                    width: TextWidth::default(),
12111                },
12112            }
12113            .intern(db),
12114        )
12115    }
12116    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12117        let kind = node.kind(db);
12118        assert_eq!(
12119            kind,
12120            SyntaxKind::OptionImplicitsClauseEmpty,
12121            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12122            kind,
12123            SyntaxKind::OptionImplicitsClauseEmpty
12124        );
12125        Self { node }
12126    }
12127    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12128        let kind = node.kind(db);
12129        if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12130            Some(Self::from_syntax_node(db, node))
12131        } else {
12132            None
12133        }
12134    }
12135    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12136        self.node
12137    }
12138    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12139        OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12140    }
12141}
12142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12143pub enum OptionTerminalNoPanic<'db> {
12144    Empty(OptionTerminalNoPanicEmpty<'db>),
12145    TerminalNoPanic(TerminalNoPanic<'db>),
12146}
12147#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12148pub struct OptionTerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
12149impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicPtr<'db> {
12150    type SyntaxNode = OptionTerminalNoPanic<'db>;
12151    fn untyped(self) -> SyntaxStablePtrId<'db> {
12152        self.0
12153    }
12154    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12155        OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12156    }
12157}
12158impl<'db> From<OptionTerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
12159    fn from(ptr: OptionTerminalNoPanicPtr<'db>) -> Self {
12160        ptr.untyped()
12161    }
12162}
12163impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12164    fn from(value: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12165        Self(value.0)
12166    }
12167}
12168impl<'db> From<TerminalNoPanicPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12169    fn from(value: TerminalNoPanicPtr<'db>) -> Self {
12170        Self(value.0)
12171    }
12172}
12173impl<'db> From<OptionTerminalNoPanicEmptyGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12174    fn from(value: OptionTerminalNoPanicEmptyGreen<'db>) -> Self {
12175        Self(value.0)
12176    }
12177}
12178impl<'db> From<TerminalNoPanicGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12179    fn from(value: TerminalNoPanicGreen<'db>) -> Self {
12180        Self(value.0)
12181    }
12182}
12183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12184pub struct OptionTerminalNoPanicGreen<'db>(pub GreenId<'db>);
12185impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanic<'db> {
12186    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12187    type StablePtr = OptionTerminalNoPanicPtr<'db>;
12188    type Green = OptionTerminalNoPanicGreen<'db>;
12189    fn missing(db: &'db dyn Database) -> Self::Green {
12190        panic!("No missing variant.");
12191    }
12192    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12193        let kind = node.kind(db);
12194        match kind {
12195            SyntaxKind::OptionTerminalNoPanicEmpty => {
12196                OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12197            }
12198            SyntaxKind::TerminalNoPanic => {
12199                OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12200            }
12201            _ => panic!(
12202                "Unexpected syntax kind {:?} when constructing {}.",
12203                kind, "OptionTerminalNoPanic"
12204            ),
12205        }
12206    }
12207    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12208        let kind = node.kind(db);
12209        match kind {
12210            SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12211                OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12212            )),
12213            SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12214                TerminalNoPanic::from_syntax_node(db, node),
12215            )),
12216            _ => None,
12217        }
12218    }
12219    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12220        match self {
12221            OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12222            OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12223        }
12224    }
12225    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12226        OptionTerminalNoPanicPtr(self.as_syntax_node().long(db).stable_ptr)
12227    }
12228}
12229impl<'db> OptionTerminalNoPanic<'db> {
12230    /// Checks if a kind of a variant of [OptionTerminalNoPanic].
12231    pub fn is_variant(kind: SyntaxKind) -> bool {
12232        matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12233    }
12234}
12235#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12236pub struct OptionTerminalNoPanicEmpty<'db> {
12237    node: SyntaxNode<'db>,
12238}
12239impl<'db> OptionTerminalNoPanicEmpty<'db> {
12240    pub fn new_green(db: &'db dyn Database) -> OptionTerminalNoPanicEmptyGreen<'db> {
12241        let children = [];
12242        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12243        OptionTerminalNoPanicEmptyGreen(
12244            GreenNode {
12245                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12246                details: GreenNodeDetails::Node { children: children.into(), width },
12247            }
12248            .intern(db),
12249        )
12250    }
12251}
12252impl<'db> OptionTerminalNoPanicEmpty<'db> {}
12253#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12254pub struct OptionTerminalNoPanicEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12255impl<'db> OptionTerminalNoPanicEmptyPtr<'db> {}
12256impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicEmptyPtr<'db> {
12257    type SyntaxNode = OptionTerminalNoPanicEmpty<'db>;
12258    fn untyped(self) -> SyntaxStablePtrId<'db> {
12259        self.0
12260    }
12261    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalNoPanicEmpty<'db> {
12262        OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12263    }
12264}
12265impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12266    fn from(ptr: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12267        ptr.untyped()
12268    }
12269}
12270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12271pub struct OptionTerminalNoPanicEmptyGreen<'db>(pub GreenId<'db>);
12272impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanicEmpty<'db> {
12273    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12274    type StablePtr = OptionTerminalNoPanicEmptyPtr<'db>;
12275    type Green = OptionTerminalNoPanicEmptyGreen<'db>;
12276    fn missing(db: &'db dyn Database) -> Self::Green {
12277        OptionTerminalNoPanicEmptyGreen(
12278            GreenNode {
12279                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12280                details: GreenNodeDetails::Node {
12281                    children: [].into(),
12282                    width: TextWidth::default(),
12283                },
12284            }
12285            .intern(db),
12286        )
12287    }
12288    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12289        let kind = node.kind(db);
12290        assert_eq!(
12291            kind,
12292            SyntaxKind::OptionTerminalNoPanicEmpty,
12293            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12294            kind,
12295            SyntaxKind::OptionTerminalNoPanicEmpty
12296        );
12297        Self { node }
12298    }
12299    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12300        let kind = node.kind(db);
12301        if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12302            Some(Self::from_syntax_node(db, node))
12303        } else {
12304            None
12305        }
12306    }
12307    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12308        self.node
12309    }
12310    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12311        OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12312    }
12313}
12314#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12315pub enum OptionTerminalConst<'db> {
12316    Empty(OptionTerminalConstEmpty<'db>),
12317    TerminalConst(TerminalConst<'db>),
12318}
12319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12320pub struct OptionTerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
12321impl<'db> TypedStablePtr<'db> for OptionTerminalConstPtr<'db> {
12322    type SyntaxNode = OptionTerminalConst<'db>;
12323    fn untyped(self) -> SyntaxStablePtrId<'db> {
12324        self.0
12325    }
12326    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12327        OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12328    }
12329}
12330impl<'db> From<OptionTerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
12331    fn from(ptr: OptionTerminalConstPtr<'db>) -> Self {
12332        ptr.untyped()
12333    }
12334}
12335impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for OptionTerminalConstPtr<'db> {
12336    fn from(value: OptionTerminalConstEmptyPtr<'db>) -> Self {
12337        Self(value.0)
12338    }
12339}
12340impl<'db> From<TerminalConstPtr<'db>> for OptionTerminalConstPtr<'db> {
12341    fn from(value: TerminalConstPtr<'db>) -> Self {
12342        Self(value.0)
12343    }
12344}
12345impl<'db> From<OptionTerminalConstEmptyGreen<'db>> for OptionTerminalConstGreen<'db> {
12346    fn from(value: OptionTerminalConstEmptyGreen<'db>) -> Self {
12347        Self(value.0)
12348    }
12349}
12350impl<'db> From<TerminalConstGreen<'db>> for OptionTerminalConstGreen<'db> {
12351    fn from(value: TerminalConstGreen<'db>) -> Self {
12352        Self(value.0)
12353    }
12354}
12355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12356pub struct OptionTerminalConstGreen<'db>(pub GreenId<'db>);
12357impl<'db> TypedSyntaxNode<'db> for OptionTerminalConst<'db> {
12358    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12359    type StablePtr = OptionTerminalConstPtr<'db>;
12360    type Green = OptionTerminalConstGreen<'db>;
12361    fn missing(db: &'db dyn Database) -> Self::Green {
12362        panic!("No missing variant.");
12363    }
12364    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12365        let kind = node.kind(db);
12366        match kind {
12367            SyntaxKind::OptionTerminalConstEmpty => {
12368                OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12369            }
12370            SyntaxKind::TerminalConst => {
12371                OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12372            }
12373            _ => panic!(
12374                "Unexpected syntax kind {:?} when constructing {}.",
12375                kind, "OptionTerminalConst"
12376            ),
12377        }
12378    }
12379    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12380        let kind = node.kind(db);
12381        match kind {
12382            SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12383                OptionTerminalConstEmpty::from_syntax_node(db, node),
12384            )),
12385            SyntaxKind::TerminalConst => {
12386                Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12387            }
12388            _ => None,
12389        }
12390    }
12391    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12392        match self {
12393            OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12394            OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12395        }
12396    }
12397    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12398        OptionTerminalConstPtr(self.as_syntax_node().long(db).stable_ptr)
12399    }
12400}
12401impl<'db> OptionTerminalConst<'db> {
12402    /// Checks if a kind of a variant of [OptionTerminalConst].
12403    pub fn is_variant(kind: SyntaxKind) -> bool {
12404        matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12405    }
12406}
12407#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12408pub struct OptionTerminalConstEmpty<'db> {
12409    node: SyntaxNode<'db>,
12410}
12411impl<'db> OptionTerminalConstEmpty<'db> {
12412    pub fn new_green(db: &'db dyn Database) -> OptionTerminalConstEmptyGreen<'db> {
12413        let children = [];
12414        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12415        OptionTerminalConstEmptyGreen(
12416            GreenNode {
12417                kind: SyntaxKind::OptionTerminalConstEmpty,
12418                details: GreenNodeDetails::Node { children: children.into(), width },
12419            }
12420            .intern(db),
12421        )
12422    }
12423}
12424impl<'db> OptionTerminalConstEmpty<'db> {}
12425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12426pub struct OptionTerminalConstEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12427impl<'db> OptionTerminalConstEmptyPtr<'db> {}
12428impl<'db> TypedStablePtr<'db> for OptionTerminalConstEmptyPtr<'db> {
12429    type SyntaxNode = OptionTerminalConstEmpty<'db>;
12430    fn untyped(self) -> SyntaxStablePtrId<'db> {
12431        self.0
12432    }
12433    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalConstEmpty<'db> {
12434        OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12435    }
12436}
12437impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12438    fn from(ptr: OptionTerminalConstEmptyPtr<'db>) -> Self {
12439        ptr.untyped()
12440    }
12441}
12442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12443pub struct OptionTerminalConstEmptyGreen<'db>(pub GreenId<'db>);
12444impl<'db> TypedSyntaxNode<'db> for OptionTerminalConstEmpty<'db> {
12445    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12446    type StablePtr = OptionTerminalConstEmptyPtr<'db>;
12447    type Green = OptionTerminalConstEmptyGreen<'db>;
12448    fn missing(db: &'db dyn Database) -> Self::Green {
12449        OptionTerminalConstEmptyGreen(
12450            GreenNode {
12451                kind: SyntaxKind::OptionTerminalConstEmpty,
12452                details: GreenNodeDetails::Node {
12453                    children: [].into(),
12454                    width: TextWidth::default(),
12455                },
12456            }
12457            .intern(db),
12458        )
12459    }
12460    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12461        let kind = node.kind(db);
12462        assert_eq!(
12463            kind,
12464            SyntaxKind::OptionTerminalConstEmpty,
12465            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12466            kind,
12467            SyntaxKind::OptionTerminalConstEmpty
12468        );
12469        Self { node }
12470    }
12471    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12472        let kind = node.kind(db);
12473        if kind == SyntaxKind::OptionTerminalConstEmpty {
12474            Some(Self::from_syntax_node(db, node))
12475        } else {
12476            None
12477        }
12478    }
12479    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12480        self.node
12481    }
12482    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12483        OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12484    }
12485}
12486#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12487pub struct FunctionSignature<'db> {
12488    node: SyntaxNode<'db>,
12489}
12490impl<'db> FunctionSignature<'db> {
12491    pub const INDEX_LPAREN: usize = 0;
12492    pub const INDEX_PARAMETERS: usize = 1;
12493    pub const INDEX_RPAREN: usize = 2;
12494    pub const INDEX_RET_TY: usize = 3;
12495    pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12496    pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12497    pub fn new_green(
12498        db: &'db dyn Database,
12499        lparen: TerminalLParenGreen<'db>,
12500        parameters: ParamListGreen<'db>,
12501        rparen: TerminalRParenGreen<'db>,
12502        ret_ty: OptionReturnTypeClauseGreen<'db>,
12503        implicits_clause: OptionImplicitsClauseGreen<'db>,
12504        optional_no_panic: OptionTerminalNoPanicGreen<'db>,
12505    ) -> FunctionSignatureGreen<'db> {
12506        let children =
12507            [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12508        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12509        FunctionSignatureGreen(
12510            GreenNode {
12511                kind: SyntaxKind::FunctionSignature,
12512                details: GreenNodeDetails::Node { children: children.into(), width },
12513            }
12514            .intern(db),
12515        )
12516    }
12517}
12518impl<'db> FunctionSignature<'db> {
12519    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
12520        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12521    }
12522    pub fn parameters(&self, db: &'db dyn Database) -> ParamList<'db> {
12523        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12524    }
12525    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
12526        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12527    }
12528    pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
12529        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12530    }
12531    pub fn implicits_clause(&self, db: &'db dyn Database) -> OptionImplicitsClause<'db> {
12532        OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12533    }
12534    pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
12535        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12536    }
12537}
12538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12539pub struct FunctionSignaturePtr<'db>(pub SyntaxStablePtrId<'db>);
12540impl<'db> FunctionSignaturePtr<'db> {}
12541impl<'db> TypedStablePtr<'db> for FunctionSignaturePtr<'db> {
12542    type SyntaxNode = FunctionSignature<'db>;
12543    fn untyped(self) -> SyntaxStablePtrId<'db> {
12544        self.0
12545    }
12546    fn lookup(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
12547        FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12548    }
12549}
12550impl<'db> From<FunctionSignaturePtr<'db>> for SyntaxStablePtrId<'db> {
12551    fn from(ptr: FunctionSignaturePtr<'db>) -> Self {
12552        ptr.untyped()
12553    }
12554}
12555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12556pub struct FunctionSignatureGreen<'db>(pub GreenId<'db>);
12557impl<'db> TypedSyntaxNode<'db> for FunctionSignature<'db> {
12558    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12559    type StablePtr = FunctionSignaturePtr<'db>;
12560    type Green = FunctionSignatureGreen<'db>;
12561    fn missing(db: &'db dyn Database) -> Self::Green {
12562        FunctionSignatureGreen(
12563            GreenNode {
12564                kind: SyntaxKind::FunctionSignature,
12565                details: GreenNodeDetails::Node {
12566                    children: [
12567                        TerminalLParen::missing(db).0,
12568                        ParamList::missing(db).0,
12569                        TerminalRParen::missing(db).0,
12570                        OptionReturnTypeClause::missing(db).0,
12571                        OptionImplicitsClause::missing(db).0,
12572                        OptionTerminalNoPanic::missing(db).0,
12573                    ]
12574                    .into(),
12575                    width: TextWidth::default(),
12576                },
12577            }
12578            .intern(db),
12579        )
12580    }
12581    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12582        let kind = node.kind(db);
12583        assert_eq!(
12584            kind,
12585            SyntaxKind::FunctionSignature,
12586            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12587            kind,
12588            SyntaxKind::FunctionSignature
12589        );
12590        Self { node }
12591    }
12592    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12593        let kind = node.kind(db);
12594        if kind == SyntaxKind::FunctionSignature {
12595            Some(Self::from_syntax_node(db, node))
12596        } else {
12597            None
12598        }
12599    }
12600    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12601        self.node
12602    }
12603    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12604        FunctionSignaturePtr(self.node.stable_ptr(db))
12605    }
12606}
12607#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12608pub struct Member<'db> {
12609    node: SyntaxNode<'db>,
12610}
12611impl<'db> Member<'db> {
12612    pub const INDEX_ATTRIBUTES: usize = 0;
12613    pub const INDEX_VISIBILITY: usize = 1;
12614    pub const INDEX_NAME: usize = 2;
12615    pub const INDEX_TYPE_CLAUSE: usize = 3;
12616    pub fn new_green(
12617        db: &'db dyn Database,
12618        attributes: AttributeListGreen<'db>,
12619        visibility: VisibilityGreen<'db>,
12620        name: TerminalIdentifierGreen<'db>,
12621        type_clause: TypeClauseGreen<'db>,
12622    ) -> MemberGreen<'db> {
12623        let children = [attributes.0, visibility.0, name.0, type_clause.0];
12624        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12625        MemberGreen(
12626            GreenNode {
12627                kind: SyntaxKind::Member,
12628                details: GreenNodeDetails::Node { children: children.into(), width },
12629            }
12630            .intern(db),
12631        )
12632    }
12633}
12634impl<'db> Member<'db> {
12635    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12636        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12637    }
12638    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
12639        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12640    }
12641    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12642        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12643    }
12644    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
12645        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12646    }
12647}
12648#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12649pub struct MemberPtr<'db>(pub SyntaxStablePtrId<'db>);
12650impl<'db> MemberPtr<'db> {
12651    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12652        let ptr = self.0.long(db);
12653        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12654            TerminalIdentifierGreen(key_fields[0])
12655        } else {
12656            panic!("Unexpected key field query on root.");
12657        }
12658    }
12659}
12660impl<'db> TypedStablePtr<'db> for MemberPtr<'db> {
12661    type SyntaxNode = Member<'db>;
12662    fn untyped(self) -> SyntaxStablePtrId<'db> {
12663        self.0
12664    }
12665    fn lookup(&self, db: &'db dyn Database) -> Member<'db> {
12666        Member::from_syntax_node(db, self.0.lookup(db))
12667    }
12668}
12669impl<'db> From<MemberPtr<'db>> for SyntaxStablePtrId<'db> {
12670    fn from(ptr: MemberPtr<'db>) -> Self {
12671        ptr.untyped()
12672    }
12673}
12674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12675pub struct MemberGreen<'db>(pub GreenId<'db>);
12676impl<'db> TypedSyntaxNode<'db> for Member<'db> {
12677    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12678    type StablePtr = MemberPtr<'db>;
12679    type Green = MemberGreen<'db>;
12680    fn missing(db: &'db dyn Database) -> Self::Green {
12681        MemberGreen(
12682            GreenNode {
12683                kind: SyntaxKind::Member,
12684                details: GreenNodeDetails::Node {
12685                    children: [
12686                        AttributeList::missing(db).0,
12687                        Visibility::missing(db).0,
12688                        TerminalIdentifier::missing(db).0,
12689                        TypeClause::missing(db).0,
12690                    ]
12691                    .into(),
12692                    width: TextWidth::default(),
12693                },
12694            }
12695            .intern(db),
12696        )
12697    }
12698    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12699        let kind = node.kind(db);
12700        assert_eq!(
12701            kind,
12702            SyntaxKind::Member,
12703            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12704            kind,
12705            SyntaxKind::Member
12706        );
12707        Self { node }
12708    }
12709    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12710        let kind = node.kind(db);
12711        if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12712    }
12713    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12714        self.node
12715    }
12716    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12717        MemberPtr(self.node.stable_ptr(db))
12718    }
12719}
12720#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12721pub struct MemberList<'db>(ElementList<'db, Member<'db>, 2>);
12722impl<'db> Deref for MemberList<'db> {
12723    type Target = ElementList<'db, Member<'db>, 2>;
12724    fn deref(&self) -> &Self::Target {
12725        &self.0
12726    }
12727}
12728impl<'db> MemberList<'db> {
12729    pub fn new_green(
12730        db: &'db dyn Database,
12731        children: &[MemberListElementOrSeparatorGreen<'db>],
12732    ) -> MemberListGreen<'db> {
12733        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12734        MemberListGreen(
12735            GreenNode {
12736                kind: SyntaxKind::MemberList,
12737                details: GreenNodeDetails::Node {
12738                    children: children.iter().map(|x| x.id()).collect(),
12739                    width,
12740                },
12741            }
12742            .intern(db),
12743        )
12744    }
12745}
12746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12747pub struct MemberListPtr<'db>(pub SyntaxStablePtrId<'db>);
12748impl<'db> TypedStablePtr<'db> for MemberListPtr<'db> {
12749    type SyntaxNode = MemberList<'db>;
12750    fn untyped(self) -> SyntaxStablePtrId<'db> {
12751        self.0
12752    }
12753    fn lookup(&self, db: &'db dyn Database) -> MemberList<'db> {
12754        MemberList::from_syntax_node(db, self.0.lookup(db))
12755    }
12756}
12757impl<'db> From<MemberListPtr<'db>> for SyntaxStablePtrId<'db> {
12758    fn from(ptr: MemberListPtr<'db>) -> Self {
12759        ptr.untyped()
12760    }
12761}
12762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12763pub enum MemberListElementOrSeparatorGreen<'db> {
12764    Separator(TerminalCommaGreen<'db>),
12765    Element(MemberGreen<'db>),
12766}
12767impl<'db> From<TerminalCommaGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12768    fn from(value: TerminalCommaGreen<'db>) -> Self {
12769        MemberListElementOrSeparatorGreen::Separator(value)
12770    }
12771}
12772impl<'db> From<MemberGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12773    fn from(value: MemberGreen<'db>) -> Self {
12774        MemberListElementOrSeparatorGreen::Element(value)
12775    }
12776}
12777impl<'db> MemberListElementOrSeparatorGreen<'db> {
12778    fn id(&self) -> GreenId<'db> {
12779        match self {
12780            MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12781            MemberListElementOrSeparatorGreen::Element(green) => green.0,
12782        }
12783    }
12784}
12785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12786pub struct MemberListGreen<'db>(pub GreenId<'db>);
12787impl<'db> TypedSyntaxNode<'db> for MemberList<'db> {
12788    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12789    type StablePtr = MemberListPtr<'db>;
12790    type Green = MemberListGreen<'db>;
12791    fn missing(db: &'db dyn Database) -> Self::Green {
12792        MemberListGreen(
12793            GreenNode {
12794                kind: SyntaxKind::MemberList,
12795                details: GreenNodeDetails::Node {
12796                    children: [].into(),
12797                    width: TextWidth::default(),
12798                },
12799            }
12800            .intern(db),
12801        )
12802    }
12803    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12804        Self(ElementList::new(node))
12805    }
12806    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12807        if node.kind(db) == SyntaxKind::MemberList {
12808            Some(Self(ElementList::new(node)))
12809        } else {
12810            None
12811        }
12812    }
12813    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12814        self.node
12815    }
12816    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12817        MemberListPtr(self.node.stable_ptr(db))
12818    }
12819}
12820#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12821pub struct Variant<'db> {
12822    node: SyntaxNode<'db>,
12823}
12824impl<'db> Variant<'db> {
12825    pub const INDEX_ATTRIBUTES: usize = 0;
12826    pub const INDEX_NAME: usize = 1;
12827    pub const INDEX_TYPE_CLAUSE: usize = 2;
12828    pub fn new_green(
12829        db: &'db dyn Database,
12830        attributes: AttributeListGreen<'db>,
12831        name: TerminalIdentifierGreen<'db>,
12832        type_clause: OptionTypeClauseGreen<'db>,
12833    ) -> VariantGreen<'db> {
12834        let children = [attributes.0, name.0, type_clause.0];
12835        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12836        VariantGreen(
12837            GreenNode {
12838                kind: SyntaxKind::Variant,
12839                details: GreenNodeDetails::Node { children: children.into(), width },
12840            }
12841            .intern(db),
12842        )
12843    }
12844}
12845impl<'db> Variant<'db> {
12846    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12847        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12848    }
12849    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12850        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12851    }
12852    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
12853        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12854    }
12855}
12856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12857pub struct VariantPtr<'db>(pub SyntaxStablePtrId<'db>);
12858impl<'db> VariantPtr<'db> {
12859    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12860        let ptr = self.0.long(db);
12861        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
12862            TerminalIdentifierGreen(key_fields[0])
12863        } else {
12864            panic!("Unexpected key field query on root.");
12865        }
12866    }
12867}
12868impl<'db> TypedStablePtr<'db> for VariantPtr<'db> {
12869    type SyntaxNode = Variant<'db>;
12870    fn untyped(self) -> SyntaxStablePtrId<'db> {
12871        self.0
12872    }
12873    fn lookup(&self, db: &'db dyn Database) -> Variant<'db> {
12874        Variant::from_syntax_node(db, self.0.lookup(db))
12875    }
12876}
12877impl<'db> From<VariantPtr<'db>> for SyntaxStablePtrId<'db> {
12878    fn from(ptr: VariantPtr<'db>) -> Self {
12879        ptr.untyped()
12880    }
12881}
12882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12883pub struct VariantGreen<'db>(pub GreenId<'db>);
12884impl<'db> TypedSyntaxNode<'db> for Variant<'db> {
12885    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12886    type StablePtr = VariantPtr<'db>;
12887    type Green = VariantGreen<'db>;
12888    fn missing(db: &'db dyn Database) -> Self::Green {
12889        VariantGreen(
12890            GreenNode {
12891                kind: SyntaxKind::Variant,
12892                details: GreenNodeDetails::Node {
12893                    children: [
12894                        AttributeList::missing(db).0,
12895                        TerminalIdentifier::missing(db).0,
12896                        OptionTypeClause::missing(db).0,
12897                    ]
12898                    .into(),
12899                    width: TextWidth::default(),
12900                },
12901            }
12902            .intern(db),
12903        )
12904    }
12905    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12906        let kind = node.kind(db);
12907        assert_eq!(
12908            kind,
12909            SyntaxKind::Variant,
12910            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12911            kind,
12912            SyntaxKind::Variant
12913        );
12914        Self { node }
12915    }
12916    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12917        let kind = node.kind(db);
12918        if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12919    }
12920    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12921        self.node
12922    }
12923    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12924        VariantPtr(self.node.stable_ptr(db))
12925    }
12926}
12927#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12928pub struct VariantList<'db>(ElementList<'db, Variant<'db>, 2>);
12929impl<'db> Deref for VariantList<'db> {
12930    type Target = ElementList<'db, Variant<'db>, 2>;
12931    fn deref(&self) -> &Self::Target {
12932        &self.0
12933    }
12934}
12935impl<'db> VariantList<'db> {
12936    pub fn new_green(
12937        db: &'db dyn Database,
12938        children: &[VariantListElementOrSeparatorGreen<'db>],
12939    ) -> VariantListGreen<'db> {
12940        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12941        VariantListGreen(
12942            GreenNode {
12943                kind: SyntaxKind::VariantList,
12944                details: GreenNodeDetails::Node {
12945                    children: children.iter().map(|x| x.id()).collect(),
12946                    width,
12947                },
12948            }
12949            .intern(db),
12950        )
12951    }
12952}
12953#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12954pub struct VariantListPtr<'db>(pub SyntaxStablePtrId<'db>);
12955impl<'db> TypedStablePtr<'db> for VariantListPtr<'db> {
12956    type SyntaxNode = VariantList<'db>;
12957    fn untyped(self) -> SyntaxStablePtrId<'db> {
12958        self.0
12959    }
12960    fn lookup(&self, db: &'db dyn Database) -> VariantList<'db> {
12961        VariantList::from_syntax_node(db, self.0.lookup(db))
12962    }
12963}
12964impl<'db> From<VariantListPtr<'db>> for SyntaxStablePtrId<'db> {
12965    fn from(ptr: VariantListPtr<'db>) -> Self {
12966        ptr.untyped()
12967    }
12968}
12969#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12970pub enum VariantListElementOrSeparatorGreen<'db> {
12971    Separator(TerminalCommaGreen<'db>),
12972    Element(VariantGreen<'db>),
12973}
12974impl<'db> From<TerminalCommaGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12975    fn from(value: TerminalCommaGreen<'db>) -> Self {
12976        VariantListElementOrSeparatorGreen::Separator(value)
12977    }
12978}
12979impl<'db> From<VariantGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12980    fn from(value: VariantGreen<'db>) -> Self {
12981        VariantListElementOrSeparatorGreen::Element(value)
12982    }
12983}
12984impl<'db> VariantListElementOrSeparatorGreen<'db> {
12985    fn id(&self) -> GreenId<'db> {
12986        match self {
12987            VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12988            VariantListElementOrSeparatorGreen::Element(green) => green.0,
12989        }
12990    }
12991}
12992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12993pub struct VariantListGreen<'db>(pub GreenId<'db>);
12994impl<'db> TypedSyntaxNode<'db> for VariantList<'db> {
12995    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12996    type StablePtr = VariantListPtr<'db>;
12997    type Green = VariantListGreen<'db>;
12998    fn missing(db: &'db dyn Database) -> Self::Green {
12999        VariantListGreen(
13000            GreenNode {
13001                kind: SyntaxKind::VariantList,
13002                details: GreenNodeDetails::Node {
13003                    children: [].into(),
13004                    width: TextWidth::default(),
13005                },
13006            }
13007            .intern(db),
13008        )
13009    }
13010    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13011        Self(ElementList::new(node))
13012    }
13013    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13014        if node.kind(db) == SyntaxKind::VariantList {
13015            Some(Self(ElementList::new(node)))
13016        } else {
13017            None
13018        }
13019    }
13020    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13021        self.node
13022    }
13023    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13024        VariantListPtr(self.node.stable_ptr(db))
13025    }
13026}
13027#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13028pub enum ModuleItem<'db> {
13029    Constant(ItemConstant<'db>),
13030    Module(ItemModule<'db>),
13031    Use(ItemUse<'db>),
13032    FreeFunction(FunctionWithBody<'db>),
13033    ExternFunction(ItemExternFunction<'db>),
13034    ExternType(ItemExternType<'db>),
13035    Trait(ItemTrait<'db>),
13036    Impl(ItemImpl<'db>),
13037    ImplAlias(ItemImplAlias<'db>),
13038    Struct(ItemStruct<'db>),
13039    Enum(ItemEnum<'db>),
13040    TypeAlias(ItemTypeAlias<'db>),
13041    InlineMacro(ItemInlineMacro<'db>),
13042    MacroDeclaration(ItemMacroDeclaration<'db>),
13043    HeaderDoc(ItemHeaderDoc<'db>),
13044    Missing(ModuleItemMissing<'db>),
13045}
13046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13047pub struct ModuleItemPtr<'db>(pub SyntaxStablePtrId<'db>);
13048impl<'db> TypedStablePtr<'db> for ModuleItemPtr<'db> {
13049    type SyntaxNode = ModuleItem<'db>;
13050    fn untyped(self) -> SyntaxStablePtrId<'db> {
13051        self.0
13052    }
13053    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13054        ModuleItem::from_syntax_node(db, self.0.lookup(db))
13055    }
13056}
13057impl<'db> From<ModuleItemPtr<'db>> for SyntaxStablePtrId<'db> {
13058    fn from(ptr: ModuleItemPtr<'db>) -> Self {
13059        ptr.untyped()
13060    }
13061}
13062impl<'db> From<ItemConstantPtr<'db>> for ModuleItemPtr<'db> {
13063    fn from(value: ItemConstantPtr<'db>) -> Self {
13064        Self(value.0)
13065    }
13066}
13067impl<'db> From<ItemModulePtr<'db>> for ModuleItemPtr<'db> {
13068    fn from(value: ItemModulePtr<'db>) -> Self {
13069        Self(value.0)
13070    }
13071}
13072impl<'db> From<ItemUsePtr<'db>> for ModuleItemPtr<'db> {
13073    fn from(value: ItemUsePtr<'db>) -> Self {
13074        Self(value.0)
13075    }
13076}
13077impl<'db> From<FunctionWithBodyPtr<'db>> for ModuleItemPtr<'db> {
13078    fn from(value: FunctionWithBodyPtr<'db>) -> Self {
13079        Self(value.0)
13080    }
13081}
13082impl<'db> From<ItemExternFunctionPtr<'db>> for ModuleItemPtr<'db> {
13083    fn from(value: ItemExternFunctionPtr<'db>) -> Self {
13084        Self(value.0)
13085    }
13086}
13087impl<'db> From<ItemExternTypePtr<'db>> for ModuleItemPtr<'db> {
13088    fn from(value: ItemExternTypePtr<'db>) -> Self {
13089        Self(value.0)
13090    }
13091}
13092impl<'db> From<ItemTraitPtr<'db>> for ModuleItemPtr<'db> {
13093    fn from(value: ItemTraitPtr<'db>) -> Self {
13094        Self(value.0)
13095    }
13096}
13097impl<'db> From<ItemImplPtr<'db>> for ModuleItemPtr<'db> {
13098    fn from(value: ItemImplPtr<'db>) -> Self {
13099        Self(value.0)
13100    }
13101}
13102impl<'db> From<ItemImplAliasPtr<'db>> for ModuleItemPtr<'db> {
13103    fn from(value: ItemImplAliasPtr<'db>) -> Self {
13104        Self(value.0)
13105    }
13106}
13107impl<'db> From<ItemStructPtr<'db>> for ModuleItemPtr<'db> {
13108    fn from(value: ItemStructPtr<'db>) -> Self {
13109        Self(value.0)
13110    }
13111}
13112impl<'db> From<ItemEnumPtr<'db>> for ModuleItemPtr<'db> {
13113    fn from(value: ItemEnumPtr<'db>) -> Self {
13114        Self(value.0)
13115    }
13116}
13117impl<'db> From<ItemTypeAliasPtr<'db>> for ModuleItemPtr<'db> {
13118    fn from(value: ItemTypeAliasPtr<'db>) -> Self {
13119        Self(value.0)
13120    }
13121}
13122impl<'db> From<ItemInlineMacroPtr<'db>> for ModuleItemPtr<'db> {
13123    fn from(value: ItemInlineMacroPtr<'db>) -> Self {
13124        Self(value.0)
13125    }
13126}
13127impl<'db> From<ItemMacroDeclarationPtr<'db>> for ModuleItemPtr<'db> {
13128    fn from(value: ItemMacroDeclarationPtr<'db>) -> Self {
13129        Self(value.0)
13130    }
13131}
13132impl<'db> From<ItemHeaderDocPtr<'db>> for ModuleItemPtr<'db> {
13133    fn from(value: ItemHeaderDocPtr<'db>) -> Self {
13134        Self(value.0)
13135    }
13136}
13137impl<'db> From<ModuleItemMissingPtr<'db>> for ModuleItemPtr<'db> {
13138    fn from(value: ModuleItemMissingPtr<'db>) -> Self {
13139        Self(value.0)
13140    }
13141}
13142impl<'db> From<ItemConstantGreen<'db>> for ModuleItemGreen<'db> {
13143    fn from(value: ItemConstantGreen<'db>) -> Self {
13144        Self(value.0)
13145    }
13146}
13147impl<'db> From<ItemModuleGreen<'db>> for ModuleItemGreen<'db> {
13148    fn from(value: ItemModuleGreen<'db>) -> Self {
13149        Self(value.0)
13150    }
13151}
13152impl<'db> From<ItemUseGreen<'db>> for ModuleItemGreen<'db> {
13153    fn from(value: ItemUseGreen<'db>) -> Self {
13154        Self(value.0)
13155    }
13156}
13157impl<'db> From<FunctionWithBodyGreen<'db>> for ModuleItemGreen<'db> {
13158    fn from(value: FunctionWithBodyGreen<'db>) -> Self {
13159        Self(value.0)
13160    }
13161}
13162impl<'db> From<ItemExternFunctionGreen<'db>> for ModuleItemGreen<'db> {
13163    fn from(value: ItemExternFunctionGreen<'db>) -> Self {
13164        Self(value.0)
13165    }
13166}
13167impl<'db> From<ItemExternTypeGreen<'db>> for ModuleItemGreen<'db> {
13168    fn from(value: ItemExternTypeGreen<'db>) -> Self {
13169        Self(value.0)
13170    }
13171}
13172impl<'db> From<ItemTraitGreen<'db>> for ModuleItemGreen<'db> {
13173    fn from(value: ItemTraitGreen<'db>) -> Self {
13174        Self(value.0)
13175    }
13176}
13177impl<'db> From<ItemImplGreen<'db>> for ModuleItemGreen<'db> {
13178    fn from(value: ItemImplGreen<'db>) -> Self {
13179        Self(value.0)
13180    }
13181}
13182impl<'db> From<ItemImplAliasGreen<'db>> for ModuleItemGreen<'db> {
13183    fn from(value: ItemImplAliasGreen<'db>) -> Self {
13184        Self(value.0)
13185    }
13186}
13187impl<'db> From<ItemStructGreen<'db>> for ModuleItemGreen<'db> {
13188    fn from(value: ItemStructGreen<'db>) -> Self {
13189        Self(value.0)
13190    }
13191}
13192impl<'db> From<ItemEnumGreen<'db>> for ModuleItemGreen<'db> {
13193    fn from(value: ItemEnumGreen<'db>) -> Self {
13194        Self(value.0)
13195    }
13196}
13197impl<'db> From<ItemTypeAliasGreen<'db>> for ModuleItemGreen<'db> {
13198    fn from(value: ItemTypeAliasGreen<'db>) -> Self {
13199        Self(value.0)
13200    }
13201}
13202impl<'db> From<ItemInlineMacroGreen<'db>> for ModuleItemGreen<'db> {
13203    fn from(value: ItemInlineMacroGreen<'db>) -> Self {
13204        Self(value.0)
13205    }
13206}
13207impl<'db> From<ItemMacroDeclarationGreen<'db>> for ModuleItemGreen<'db> {
13208    fn from(value: ItemMacroDeclarationGreen<'db>) -> Self {
13209        Self(value.0)
13210    }
13211}
13212impl<'db> From<ItemHeaderDocGreen<'db>> for ModuleItemGreen<'db> {
13213    fn from(value: ItemHeaderDocGreen<'db>) -> Self {
13214        Self(value.0)
13215    }
13216}
13217impl<'db> From<ModuleItemMissingGreen<'db>> for ModuleItemGreen<'db> {
13218    fn from(value: ModuleItemMissingGreen<'db>) -> Self {
13219        Self(value.0)
13220    }
13221}
13222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13223pub struct ModuleItemGreen<'db>(pub GreenId<'db>);
13224impl<'db> TypedSyntaxNode<'db> for ModuleItem<'db> {
13225    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13226    type StablePtr = ModuleItemPtr<'db>;
13227    type Green = ModuleItemGreen<'db>;
13228    fn missing(db: &'db dyn Database) -> Self::Green {
13229        ModuleItemGreen(ModuleItemMissing::missing(db).0)
13230    }
13231    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13232        let kind = node.kind(db);
13233        match kind {
13234            SyntaxKind::ItemConstant => {
13235                ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13236            }
13237            SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13238            SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13239            SyntaxKind::FunctionWithBody => {
13240                ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13241            }
13242            SyntaxKind::ItemExternFunction => {
13243                ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13244            }
13245            SyntaxKind::ItemExternType => {
13246                ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13247            }
13248            SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13249            SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13250            SyntaxKind::ItemImplAlias => {
13251                ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13252            }
13253            SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13254            SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13255            SyntaxKind::ItemTypeAlias => {
13256                ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13257            }
13258            SyntaxKind::ItemInlineMacro => {
13259                ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13260            }
13261            SyntaxKind::ItemMacroDeclaration => {
13262                ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13263            }
13264            SyntaxKind::ItemHeaderDoc => {
13265                ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13266            }
13267            SyntaxKind::ModuleItemMissing => {
13268                ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13269            }
13270            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13271        }
13272    }
13273    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13274        let kind = node.kind(db);
13275        match kind {
13276            SyntaxKind::ItemConstant => {
13277                Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13278            }
13279            SyntaxKind::ItemModule => {
13280                Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13281            }
13282            SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13283            SyntaxKind::FunctionWithBody => {
13284                Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13285            }
13286            SyntaxKind::ItemExternFunction => {
13287                Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13288            }
13289            SyntaxKind::ItemExternType => {
13290                Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13291            }
13292            SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13293            SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13294            SyntaxKind::ItemImplAlias => {
13295                Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13296            }
13297            SyntaxKind::ItemStruct => {
13298                Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13299            }
13300            SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13301            SyntaxKind::ItemTypeAlias => {
13302                Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13303            }
13304            SyntaxKind::ItemInlineMacro => {
13305                Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13306            }
13307            SyntaxKind::ItemMacroDeclaration => {
13308                Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13309            }
13310            SyntaxKind::ItemHeaderDoc => {
13311                Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13312            }
13313            SyntaxKind::ModuleItemMissing => {
13314                Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13315            }
13316            _ => None,
13317        }
13318    }
13319    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13320        match self {
13321            ModuleItem::Constant(x) => x.as_syntax_node(),
13322            ModuleItem::Module(x) => x.as_syntax_node(),
13323            ModuleItem::Use(x) => x.as_syntax_node(),
13324            ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13325            ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13326            ModuleItem::ExternType(x) => x.as_syntax_node(),
13327            ModuleItem::Trait(x) => x.as_syntax_node(),
13328            ModuleItem::Impl(x) => x.as_syntax_node(),
13329            ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13330            ModuleItem::Struct(x) => x.as_syntax_node(),
13331            ModuleItem::Enum(x) => x.as_syntax_node(),
13332            ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13333            ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13334            ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13335            ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13336            ModuleItem::Missing(x) => x.as_syntax_node(),
13337        }
13338    }
13339    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13340        ModuleItemPtr(self.as_syntax_node().long(db).stable_ptr)
13341    }
13342}
13343impl<'db> ModuleItem<'db> {
13344    /// Checks if a kind of a variant of [ModuleItem].
13345    pub fn is_variant(kind: SyntaxKind) -> bool {
13346        matches!(
13347            kind,
13348            SyntaxKind::ItemConstant
13349                | SyntaxKind::ItemModule
13350                | SyntaxKind::ItemUse
13351                | SyntaxKind::FunctionWithBody
13352                | SyntaxKind::ItemExternFunction
13353                | SyntaxKind::ItemExternType
13354                | SyntaxKind::ItemTrait
13355                | SyntaxKind::ItemImpl
13356                | SyntaxKind::ItemImplAlias
13357                | SyntaxKind::ItemStruct
13358                | SyntaxKind::ItemEnum
13359                | SyntaxKind::ItemTypeAlias
13360                | SyntaxKind::ItemInlineMacro
13361                | SyntaxKind::ItemMacroDeclaration
13362                | SyntaxKind::ItemHeaderDoc
13363                | SyntaxKind::ModuleItemMissing
13364        )
13365    }
13366}
13367#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13368pub struct ModuleItemList<'db>(ElementList<'db, ModuleItem<'db>, 1>);
13369impl<'db> Deref for ModuleItemList<'db> {
13370    type Target = ElementList<'db, ModuleItem<'db>, 1>;
13371    fn deref(&self) -> &Self::Target {
13372        &self.0
13373    }
13374}
13375impl<'db> ModuleItemList<'db> {
13376    pub fn new_green(
13377        db: &'db dyn Database,
13378        children: &[ModuleItemGreen<'db>],
13379    ) -> ModuleItemListGreen<'db> {
13380        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13381        ModuleItemListGreen(
13382            GreenNode {
13383                kind: SyntaxKind::ModuleItemList,
13384                details: GreenNodeDetails::Node {
13385                    children: children.iter().map(|x| x.0).collect(),
13386                    width,
13387                },
13388            }
13389            .intern(db),
13390        )
13391    }
13392}
13393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13394pub struct ModuleItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
13395impl<'db> TypedStablePtr<'db> for ModuleItemListPtr<'db> {
13396    type SyntaxNode = ModuleItemList<'db>;
13397    fn untyped(self) -> SyntaxStablePtrId<'db> {
13398        self.0
13399    }
13400    fn lookup(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
13401        ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13402    }
13403}
13404impl<'db> From<ModuleItemListPtr<'db>> for SyntaxStablePtrId<'db> {
13405    fn from(ptr: ModuleItemListPtr<'db>) -> Self {
13406        ptr.untyped()
13407    }
13408}
13409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13410pub struct ModuleItemListGreen<'db>(pub GreenId<'db>);
13411impl<'db> TypedSyntaxNode<'db> for ModuleItemList<'db> {
13412    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13413    type StablePtr = ModuleItemListPtr<'db>;
13414    type Green = ModuleItemListGreen<'db>;
13415    fn missing(db: &'db dyn Database) -> Self::Green {
13416        ModuleItemListGreen(
13417            GreenNode {
13418                kind: SyntaxKind::ModuleItemList,
13419                details: GreenNodeDetails::Node {
13420                    children: [].into(),
13421                    width: TextWidth::default(),
13422                },
13423            }
13424            .intern(db),
13425        )
13426    }
13427    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13428        Self(ElementList::new(node))
13429    }
13430    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13431        if node.kind(db) == SyntaxKind::ModuleItemList {
13432            Some(Self(ElementList::new(node)))
13433        } else {
13434            None
13435        }
13436    }
13437    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13438        self.node
13439    }
13440    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13441        ModuleItemListPtr(self.node.stable_ptr(db))
13442    }
13443}
13444#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13445pub struct ModuleItemMissing<'db> {
13446    node: SyntaxNode<'db>,
13447}
13448impl<'db> ModuleItemMissing<'db> {
13449    pub fn new_green(db: &'db dyn Database) -> ModuleItemMissingGreen<'db> {
13450        let children = [];
13451        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13452        ModuleItemMissingGreen(
13453            GreenNode {
13454                kind: SyntaxKind::ModuleItemMissing,
13455                details: GreenNodeDetails::Node { children: children.into(), width },
13456            }
13457            .intern(db),
13458        )
13459    }
13460}
13461impl<'db> ModuleItemMissing<'db> {}
13462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13463pub struct ModuleItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
13464impl<'db> ModuleItemMissingPtr<'db> {}
13465impl<'db> TypedStablePtr<'db> for ModuleItemMissingPtr<'db> {
13466    type SyntaxNode = ModuleItemMissing<'db>;
13467    fn untyped(self) -> SyntaxStablePtrId<'db> {
13468        self.0
13469    }
13470    fn lookup(&self, db: &'db dyn Database) -> ModuleItemMissing<'db> {
13471        ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13472    }
13473}
13474impl<'db> From<ModuleItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
13475    fn from(ptr: ModuleItemMissingPtr<'db>) -> Self {
13476        ptr.untyped()
13477    }
13478}
13479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13480pub struct ModuleItemMissingGreen<'db>(pub GreenId<'db>);
13481impl<'db> TypedSyntaxNode<'db> for ModuleItemMissing<'db> {
13482    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13483    type StablePtr = ModuleItemMissingPtr<'db>;
13484    type Green = ModuleItemMissingGreen<'db>;
13485    fn missing(db: &'db dyn Database) -> Self::Green {
13486        ModuleItemMissingGreen(
13487            GreenNode {
13488                kind: SyntaxKind::ModuleItemMissing,
13489                details: GreenNodeDetails::Node {
13490                    children: [].into(),
13491                    width: TextWidth::default(),
13492                },
13493            }
13494            .intern(db),
13495        )
13496    }
13497    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13498        let kind = node.kind(db);
13499        assert_eq!(
13500            kind,
13501            SyntaxKind::ModuleItemMissing,
13502            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13503            kind,
13504            SyntaxKind::ModuleItemMissing
13505        );
13506        Self { node }
13507    }
13508    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13509        let kind = node.kind(db);
13510        if kind == SyntaxKind::ModuleItemMissing {
13511            Some(Self::from_syntax_node(db, node))
13512        } else {
13513            None
13514        }
13515    }
13516    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13517        self.node
13518    }
13519    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13520        ModuleItemMissingPtr(self.node.stable_ptr(db))
13521    }
13522}
13523#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13524pub struct Attribute<'db> {
13525    node: SyntaxNode<'db>,
13526}
13527impl<'db> Attribute<'db> {
13528    pub const INDEX_HASH: usize = 0;
13529    pub const INDEX_LBRACK: usize = 1;
13530    pub const INDEX_ATTR: usize = 2;
13531    pub const INDEX_ARGUMENTS: usize = 3;
13532    pub const INDEX_RBRACK: usize = 4;
13533    pub fn new_green(
13534        db: &'db dyn Database,
13535        hash: TerminalHashGreen<'db>,
13536        lbrack: TerminalLBrackGreen<'db>,
13537        attr: ExprPathGreen<'db>,
13538        arguments: OptionArgListParenthesizedGreen<'db>,
13539        rbrack: TerminalRBrackGreen<'db>,
13540    ) -> AttributeGreen<'db> {
13541        let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13542        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13543        AttributeGreen(
13544            GreenNode {
13545                kind: SyntaxKind::Attribute,
13546                details: GreenNodeDetails::Node { children: children.into(), width },
13547            }
13548            .intern(db),
13549        )
13550    }
13551}
13552impl<'db> Attribute<'db> {
13553    pub fn hash(&self, db: &'db dyn Database) -> TerminalHash<'db> {
13554        TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13555    }
13556    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
13557        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13558    }
13559    pub fn attr(&self, db: &'db dyn Database) -> ExprPath<'db> {
13560        ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13561    }
13562    pub fn arguments(&self, db: &'db dyn Database) -> OptionArgListParenthesized<'db> {
13563        OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13564    }
13565    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
13566        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13567    }
13568}
13569#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13570pub struct AttributePtr<'db>(pub SyntaxStablePtrId<'db>);
13571impl<'db> AttributePtr<'db> {}
13572impl<'db> TypedStablePtr<'db> for AttributePtr<'db> {
13573    type SyntaxNode = Attribute<'db>;
13574    fn untyped(self) -> SyntaxStablePtrId<'db> {
13575        self.0
13576    }
13577    fn lookup(&self, db: &'db dyn Database) -> Attribute<'db> {
13578        Attribute::from_syntax_node(db, self.0.lookup(db))
13579    }
13580}
13581impl<'db> From<AttributePtr<'db>> for SyntaxStablePtrId<'db> {
13582    fn from(ptr: AttributePtr<'db>) -> Self {
13583        ptr.untyped()
13584    }
13585}
13586#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13587pub struct AttributeGreen<'db>(pub GreenId<'db>);
13588impl<'db> TypedSyntaxNode<'db> for Attribute<'db> {
13589    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13590    type StablePtr = AttributePtr<'db>;
13591    type Green = AttributeGreen<'db>;
13592    fn missing(db: &'db dyn Database) -> Self::Green {
13593        AttributeGreen(
13594            GreenNode {
13595                kind: SyntaxKind::Attribute,
13596                details: GreenNodeDetails::Node {
13597                    children: [
13598                        TerminalHash::missing(db).0,
13599                        TerminalLBrack::missing(db).0,
13600                        ExprPath::missing(db).0,
13601                        OptionArgListParenthesized::missing(db).0,
13602                        TerminalRBrack::missing(db).0,
13603                    ]
13604                    .into(),
13605                    width: TextWidth::default(),
13606                },
13607            }
13608            .intern(db),
13609        )
13610    }
13611    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13612        let kind = node.kind(db);
13613        assert_eq!(
13614            kind,
13615            SyntaxKind::Attribute,
13616            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13617            kind,
13618            SyntaxKind::Attribute
13619        );
13620        Self { node }
13621    }
13622    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13623        let kind = node.kind(db);
13624        if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13625    }
13626    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13627        self.node
13628    }
13629    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13630        AttributePtr(self.node.stable_ptr(db))
13631    }
13632}
13633#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13634pub struct AttributeList<'db>(ElementList<'db, Attribute<'db>, 1>);
13635impl<'db> Deref for AttributeList<'db> {
13636    type Target = ElementList<'db, Attribute<'db>, 1>;
13637    fn deref(&self) -> &Self::Target {
13638        &self.0
13639    }
13640}
13641impl<'db> AttributeList<'db> {
13642    pub fn new_green(
13643        db: &'db dyn Database,
13644        children: &[AttributeGreen<'db>],
13645    ) -> AttributeListGreen<'db> {
13646        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13647        AttributeListGreen(
13648            GreenNode {
13649                kind: SyntaxKind::AttributeList,
13650                details: GreenNodeDetails::Node {
13651                    children: children.iter().map(|x| x.0).collect(),
13652                    width,
13653                },
13654            }
13655            .intern(db),
13656        )
13657    }
13658}
13659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13660pub struct AttributeListPtr<'db>(pub SyntaxStablePtrId<'db>);
13661impl<'db> TypedStablePtr<'db> for AttributeListPtr<'db> {
13662    type SyntaxNode = AttributeList<'db>;
13663    fn untyped(self) -> SyntaxStablePtrId<'db> {
13664        self.0
13665    }
13666    fn lookup(&self, db: &'db dyn Database) -> AttributeList<'db> {
13667        AttributeList::from_syntax_node(db, self.0.lookup(db))
13668    }
13669}
13670impl<'db> From<AttributeListPtr<'db>> for SyntaxStablePtrId<'db> {
13671    fn from(ptr: AttributeListPtr<'db>) -> Self {
13672        ptr.untyped()
13673    }
13674}
13675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13676pub struct AttributeListGreen<'db>(pub GreenId<'db>);
13677impl<'db> TypedSyntaxNode<'db> for AttributeList<'db> {
13678    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13679    type StablePtr = AttributeListPtr<'db>;
13680    type Green = AttributeListGreen<'db>;
13681    fn missing(db: &'db dyn Database) -> Self::Green {
13682        AttributeListGreen(
13683            GreenNode {
13684                kind: SyntaxKind::AttributeList,
13685                details: GreenNodeDetails::Node {
13686                    children: [].into(),
13687                    width: TextWidth::default(),
13688                },
13689            }
13690            .intern(db),
13691        )
13692    }
13693    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13694        Self(ElementList::new(node))
13695    }
13696    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13697        if node.kind(db) == SyntaxKind::AttributeList {
13698            Some(Self(ElementList::new(node)))
13699        } else {
13700            None
13701        }
13702    }
13703    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13704        self.node
13705    }
13706    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13707        AttributeListPtr(self.node.stable_ptr(db))
13708    }
13709}
13710#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13711pub struct VisibilityDefault<'db> {
13712    node: SyntaxNode<'db>,
13713}
13714impl<'db> VisibilityDefault<'db> {
13715    pub fn new_green(db: &'db dyn Database) -> VisibilityDefaultGreen<'db> {
13716        let children = [];
13717        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13718        VisibilityDefaultGreen(
13719            GreenNode {
13720                kind: SyntaxKind::VisibilityDefault,
13721                details: GreenNodeDetails::Node { children: children.into(), width },
13722            }
13723            .intern(db),
13724        )
13725    }
13726}
13727impl<'db> VisibilityDefault<'db> {}
13728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13729pub struct VisibilityDefaultPtr<'db>(pub SyntaxStablePtrId<'db>);
13730impl<'db> VisibilityDefaultPtr<'db> {}
13731impl<'db> TypedStablePtr<'db> for VisibilityDefaultPtr<'db> {
13732    type SyntaxNode = VisibilityDefault<'db>;
13733    fn untyped(self) -> SyntaxStablePtrId<'db> {
13734        self.0
13735    }
13736    fn lookup(&self, db: &'db dyn Database) -> VisibilityDefault<'db> {
13737        VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13738    }
13739}
13740impl<'db> From<VisibilityDefaultPtr<'db>> for SyntaxStablePtrId<'db> {
13741    fn from(ptr: VisibilityDefaultPtr<'db>) -> Self {
13742        ptr.untyped()
13743    }
13744}
13745#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13746pub struct VisibilityDefaultGreen<'db>(pub GreenId<'db>);
13747impl<'db> TypedSyntaxNode<'db> for VisibilityDefault<'db> {
13748    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13749    type StablePtr = VisibilityDefaultPtr<'db>;
13750    type Green = VisibilityDefaultGreen<'db>;
13751    fn missing(db: &'db dyn Database) -> Self::Green {
13752        VisibilityDefaultGreen(
13753            GreenNode {
13754                kind: SyntaxKind::VisibilityDefault,
13755                details: GreenNodeDetails::Node {
13756                    children: [].into(),
13757                    width: TextWidth::default(),
13758                },
13759            }
13760            .intern(db),
13761        )
13762    }
13763    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13764        let kind = node.kind(db);
13765        assert_eq!(
13766            kind,
13767            SyntaxKind::VisibilityDefault,
13768            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13769            kind,
13770            SyntaxKind::VisibilityDefault
13771        );
13772        Self { node }
13773    }
13774    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13775        let kind = node.kind(db);
13776        if kind == SyntaxKind::VisibilityDefault {
13777            Some(Self::from_syntax_node(db, node))
13778        } else {
13779            None
13780        }
13781    }
13782    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13783        self.node
13784    }
13785    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13786        VisibilityDefaultPtr(self.node.stable_ptr(db))
13787    }
13788}
13789#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13790pub struct VisibilityPubArgumentClause<'db> {
13791    node: SyntaxNode<'db>,
13792}
13793impl<'db> VisibilityPubArgumentClause<'db> {
13794    pub const INDEX_LPAREN: usize = 0;
13795    pub const INDEX_ARGUMENT: usize = 1;
13796    pub const INDEX_RPAREN: usize = 2;
13797    pub fn new_green(
13798        db: &'db dyn Database,
13799        lparen: TerminalLParenGreen<'db>,
13800        argument: TerminalIdentifierGreen<'db>,
13801        rparen: TerminalRParenGreen<'db>,
13802    ) -> VisibilityPubArgumentClauseGreen<'db> {
13803        let children = [lparen.0, argument.0, rparen.0];
13804        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13805        VisibilityPubArgumentClauseGreen(
13806            GreenNode {
13807                kind: SyntaxKind::VisibilityPubArgumentClause,
13808                details: GreenNodeDetails::Node { children: children.into(), width },
13809            }
13810            .intern(db),
13811        )
13812    }
13813}
13814impl<'db> VisibilityPubArgumentClause<'db> {
13815    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
13816        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13817    }
13818    pub fn argument(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
13819        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13820    }
13821    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
13822        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13823    }
13824}
13825#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13826pub struct VisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13827impl<'db> VisibilityPubArgumentClausePtr<'db> {}
13828impl<'db> TypedStablePtr<'db> for VisibilityPubArgumentClausePtr<'db> {
13829    type SyntaxNode = VisibilityPubArgumentClause<'db>;
13830    fn untyped(self) -> SyntaxStablePtrId<'db> {
13831        self.0
13832    }
13833    fn lookup(&self, db: &'db dyn Database) -> VisibilityPubArgumentClause<'db> {
13834        VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13835    }
13836}
13837impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13838    fn from(ptr: VisibilityPubArgumentClausePtr<'db>) -> Self {
13839        ptr.untyped()
13840    }
13841}
13842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13843pub struct VisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13844impl<'db> TypedSyntaxNode<'db> for VisibilityPubArgumentClause<'db> {
13845    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13846    type StablePtr = VisibilityPubArgumentClausePtr<'db>;
13847    type Green = VisibilityPubArgumentClauseGreen<'db>;
13848    fn missing(db: &'db dyn Database) -> Self::Green {
13849        VisibilityPubArgumentClauseGreen(
13850            GreenNode {
13851                kind: SyntaxKind::VisibilityPubArgumentClause,
13852                details: GreenNodeDetails::Node {
13853                    children: [
13854                        TerminalLParen::missing(db).0,
13855                        TerminalIdentifier::missing(db).0,
13856                        TerminalRParen::missing(db).0,
13857                    ]
13858                    .into(),
13859                    width: TextWidth::default(),
13860                },
13861            }
13862            .intern(db),
13863        )
13864    }
13865    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13866        let kind = node.kind(db);
13867        assert_eq!(
13868            kind,
13869            SyntaxKind::VisibilityPubArgumentClause,
13870            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13871            kind,
13872            SyntaxKind::VisibilityPubArgumentClause
13873        );
13874        Self { node }
13875    }
13876    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13877        let kind = node.kind(db);
13878        if kind == SyntaxKind::VisibilityPubArgumentClause {
13879            Some(Self::from_syntax_node(db, node))
13880        } else {
13881            None
13882        }
13883    }
13884    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13885        self.node
13886    }
13887    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13888        VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13889    }
13890}
13891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13892pub enum OptionVisibilityPubArgumentClause<'db> {
13893    Empty(OptionVisibilityPubArgumentClauseEmpty<'db>),
13894    VisibilityPubArgumentClause(VisibilityPubArgumentClause<'db>),
13895}
13896#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13897pub struct OptionVisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13898impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClausePtr<'db> {
13899    type SyntaxNode = OptionVisibilityPubArgumentClause<'db>;
13900    fn untyped(self) -> SyntaxStablePtrId<'db> {
13901        self.0
13902    }
13903    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13904        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13905    }
13906}
13907impl<'db> From<OptionVisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13908    fn from(ptr: OptionVisibilityPubArgumentClausePtr<'db>) -> Self {
13909        ptr.untyped()
13910    }
13911}
13912impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>>
13913    for OptionVisibilityPubArgumentClausePtr<'db>
13914{
13915    fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13916        Self(value.0)
13917    }
13918}
13919impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for OptionVisibilityPubArgumentClausePtr<'db> {
13920    fn from(value: VisibilityPubArgumentClausePtr<'db>) -> Self {
13921        Self(value.0)
13922    }
13923}
13924impl<'db> From<OptionVisibilityPubArgumentClauseEmptyGreen<'db>>
13925    for OptionVisibilityPubArgumentClauseGreen<'db>
13926{
13927    fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen<'db>) -> Self {
13928        Self(value.0)
13929    }
13930}
13931impl<'db> From<VisibilityPubArgumentClauseGreen<'db>>
13932    for OptionVisibilityPubArgumentClauseGreen<'db>
13933{
13934    fn from(value: VisibilityPubArgumentClauseGreen<'db>) -> Self {
13935        Self(value.0)
13936    }
13937}
13938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13939pub struct OptionVisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13940impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClause<'db> {
13941    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13942    type StablePtr = OptionVisibilityPubArgumentClausePtr<'db>;
13943    type Green = OptionVisibilityPubArgumentClauseGreen<'db>;
13944    fn missing(db: &'db dyn Database) -> Self::Green {
13945        panic!("No missing variant.");
13946    }
13947    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13948        let kind = node.kind(db);
13949        match kind {
13950            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13951                OptionVisibilityPubArgumentClause::Empty(
13952                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13953                )
13954            }
13955            SyntaxKind::VisibilityPubArgumentClause => {
13956                OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13957                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13958                )
13959            }
13960            _ => panic!(
13961                "Unexpected syntax kind {:?} when constructing {}.",
13962                kind, "OptionVisibilityPubArgumentClause"
13963            ),
13964        }
13965    }
13966    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13967        let kind = node.kind(db);
13968        match kind {
13969            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13970                Some(OptionVisibilityPubArgumentClause::Empty(
13971                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13972                ))
13973            }
13974            SyntaxKind::VisibilityPubArgumentClause => {
13975                Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13976                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13977                ))
13978            }
13979            _ => None,
13980        }
13981    }
13982    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13983        match self {
13984            OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13985            OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13986        }
13987    }
13988    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13989        OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().long(db).stable_ptr)
13990    }
13991}
13992impl<'db> OptionVisibilityPubArgumentClause<'db> {
13993    /// Checks if a kind of a variant of [OptionVisibilityPubArgumentClause].
13994    pub fn is_variant(kind: SyntaxKind) -> bool {
13995        matches!(
13996            kind,
13997            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13998                | SyntaxKind::VisibilityPubArgumentClause
13999        )
14000    }
14001}
14002#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14003pub struct OptionVisibilityPubArgumentClauseEmpty<'db> {
14004    node: SyntaxNode<'db>,
14005}
14006impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {
14007    pub fn new_green(db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmptyGreen<'db> {
14008        let children = [];
14009        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14010        OptionVisibilityPubArgumentClauseEmptyGreen(
14011            GreenNode {
14012                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14013                details: GreenNodeDetails::Node { children: children.into(), width },
14014            }
14015            .intern(db),
14016        )
14017    }
14018}
14019impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {}
14020#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14021pub struct OptionVisibilityPubArgumentClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
14022impl<'db> OptionVisibilityPubArgumentClauseEmptyPtr<'db> {}
14023impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClauseEmptyPtr<'db> {
14024    type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty<'db>;
14025    fn untyped(self) -> SyntaxStablePtrId<'db> {
14026        self.0
14027    }
14028    fn lookup(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmpty<'db> {
14029        OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
14030    }
14031}
14032impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
14033    fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
14034        ptr.untyped()
14035    }
14036}
14037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14038pub struct OptionVisibilityPubArgumentClauseEmptyGreen<'db>(pub GreenId<'db>);
14039impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClauseEmpty<'db> {
14040    const OPTIONAL_KIND: Option<SyntaxKind> =
14041        Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
14042    type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr<'db>;
14043    type Green = OptionVisibilityPubArgumentClauseEmptyGreen<'db>;
14044    fn missing(db: &'db dyn Database) -> Self::Green {
14045        OptionVisibilityPubArgumentClauseEmptyGreen(
14046            GreenNode {
14047                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14048                details: GreenNodeDetails::Node {
14049                    children: [].into(),
14050                    width: TextWidth::default(),
14051                },
14052            }
14053            .intern(db),
14054        )
14055    }
14056    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14057        let kind = node.kind(db);
14058        assert_eq!(
14059            kind,
14060            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14061            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14062            kind,
14063            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14064        );
14065        Self { node }
14066    }
14067    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14068        let kind = node.kind(db);
14069        if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14070            Some(Self::from_syntax_node(db, node))
14071        } else {
14072            None
14073        }
14074    }
14075    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14076        self.node
14077    }
14078    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14079        OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
14080    }
14081}
14082#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14083pub struct VisibilityPub<'db> {
14084    node: SyntaxNode<'db>,
14085}
14086impl<'db> VisibilityPub<'db> {
14087    pub const INDEX_PUB_KW: usize = 0;
14088    pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14089    pub fn new_green(
14090        db: &'db dyn Database,
14091        pub_kw: TerminalPubGreen<'db>,
14092        argument_clause: OptionVisibilityPubArgumentClauseGreen<'db>,
14093    ) -> VisibilityPubGreen<'db> {
14094        let children = [pub_kw.0, argument_clause.0];
14095        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14096        VisibilityPubGreen(
14097            GreenNode {
14098                kind: SyntaxKind::VisibilityPub,
14099                details: GreenNodeDetails::Node { children: children.into(), width },
14100            }
14101            .intern(db),
14102        )
14103    }
14104}
14105impl<'db> VisibilityPub<'db> {
14106    pub fn pub_kw(&self, db: &'db dyn Database) -> TerminalPub<'db> {
14107        TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14108    }
14109    pub fn argument_clause(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClause<'db> {
14110        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14111    }
14112}
14113#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14114pub struct VisibilityPubPtr<'db>(pub SyntaxStablePtrId<'db>);
14115impl<'db> VisibilityPubPtr<'db> {}
14116impl<'db> TypedStablePtr<'db> for VisibilityPubPtr<'db> {
14117    type SyntaxNode = VisibilityPub<'db>;
14118    fn untyped(self) -> SyntaxStablePtrId<'db> {
14119        self.0
14120    }
14121    fn lookup(&self, db: &'db dyn Database) -> VisibilityPub<'db> {
14122        VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14123    }
14124}
14125impl<'db> From<VisibilityPubPtr<'db>> for SyntaxStablePtrId<'db> {
14126    fn from(ptr: VisibilityPubPtr<'db>) -> Self {
14127        ptr.untyped()
14128    }
14129}
14130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14131pub struct VisibilityPubGreen<'db>(pub GreenId<'db>);
14132impl<'db> TypedSyntaxNode<'db> for VisibilityPub<'db> {
14133    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14134    type StablePtr = VisibilityPubPtr<'db>;
14135    type Green = VisibilityPubGreen<'db>;
14136    fn missing(db: &'db dyn Database) -> Self::Green {
14137        VisibilityPubGreen(
14138            GreenNode {
14139                kind: SyntaxKind::VisibilityPub,
14140                details: GreenNodeDetails::Node {
14141                    children: [
14142                        TerminalPub::missing(db).0,
14143                        OptionVisibilityPubArgumentClause::missing(db).0,
14144                    ]
14145                    .into(),
14146                    width: TextWidth::default(),
14147                },
14148            }
14149            .intern(db),
14150        )
14151    }
14152    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14153        let kind = node.kind(db);
14154        assert_eq!(
14155            kind,
14156            SyntaxKind::VisibilityPub,
14157            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14158            kind,
14159            SyntaxKind::VisibilityPub
14160        );
14161        Self { node }
14162    }
14163    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14164        let kind = node.kind(db);
14165        if kind == SyntaxKind::VisibilityPub {
14166            Some(Self::from_syntax_node(db, node))
14167        } else {
14168            None
14169        }
14170    }
14171    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14172        self.node
14173    }
14174    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14175        VisibilityPubPtr(self.node.stable_ptr(db))
14176    }
14177}
14178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14179pub enum Visibility<'db> {
14180    Default(VisibilityDefault<'db>),
14181    Pub(VisibilityPub<'db>),
14182}
14183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14184pub struct VisibilityPtr<'db>(pub SyntaxStablePtrId<'db>);
14185impl<'db> TypedStablePtr<'db> for VisibilityPtr<'db> {
14186    type SyntaxNode = Visibility<'db>;
14187    fn untyped(self) -> SyntaxStablePtrId<'db> {
14188        self.0
14189    }
14190    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14191        Visibility::from_syntax_node(db, self.0.lookup(db))
14192    }
14193}
14194impl<'db> From<VisibilityPtr<'db>> for SyntaxStablePtrId<'db> {
14195    fn from(ptr: VisibilityPtr<'db>) -> Self {
14196        ptr.untyped()
14197    }
14198}
14199impl<'db> From<VisibilityDefaultPtr<'db>> for VisibilityPtr<'db> {
14200    fn from(value: VisibilityDefaultPtr<'db>) -> Self {
14201        Self(value.0)
14202    }
14203}
14204impl<'db> From<VisibilityPubPtr<'db>> for VisibilityPtr<'db> {
14205    fn from(value: VisibilityPubPtr<'db>) -> Self {
14206        Self(value.0)
14207    }
14208}
14209impl<'db> From<VisibilityDefaultGreen<'db>> for VisibilityGreen<'db> {
14210    fn from(value: VisibilityDefaultGreen<'db>) -> Self {
14211        Self(value.0)
14212    }
14213}
14214impl<'db> From<VisibilityPubGreen<'db>> for VisibilityGreen<'db> {
14215    fn from(value: VisibilityPubGreen<'db>) -> Self {
14216        Self(value.0)
14217    }
14218}
14219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14220pub struct VisibilityGreen<'db>(pub GreenId<'db>);
14221impl<'db> TypedSyntaxNode<'db> for Visibility<'db> {
14222    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14223    type StablePtr = VisibilityPtr<'db>;
14224    type Green = VisibilityGreen<'db>;
14225    fn missing(db: &'db dyn Database) -> Self::Green {
14226        panic!("No missing variant.");
14227    }
14228    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14229        let kind = node.kind(db);
14230        match kind {
14231            SyntaxKind::VisibilityDefault => {
14232                Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14233            }
14234            SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14235            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14236        }
14237    }
14238    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14239        let kind = node.kind(db);
14240        match kind {
14241            SyntaxKind::VisibilityDefault => {
14242                Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14243            }
14244            SyntaxKind::VisibilityPub => {
14245                Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14246            }
14247            _ => None,
14248        }
14249    }
14250    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14251        match self {
14252            Visibility::Default(x) => x.as_syntax_node(),
14253            Visibility::Pub(x) => x.as_syntax_node(),
14254        }
14255    }
14256    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14257        VisibilityPtr(self.as_syntax_node().long(db).stable_ptr)
14258    }
14259}
14260impl<'db> Visibility<'db> {
14261    /// Checks if a kind of a variant of [Visibility].
14262    pub fn is_variant(kind: SyntaxKind) -> bool {
14263        matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14264    }
14265}
14266#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14267pub struct ItemModule<'db> {
14268    node: SyntaxNode<'db>,
14269}
14270impl<'db> ItemModule<'db> {
14271    pub const INDEX_ATTRIBUTES: usize = 0;
14272    pub const INDEX_VISIBILITY: usize = 1;
14273    pub const INDEX_MODULE_KW: usize = 2;
14274    pub const INDEX_NAME: usize = 3;
14275    pub const INDEX_BODY: usize = 4;
14276    pub fn new_green(
14277        db: &'db dyn Database,
14278        attributes: AttributeListGreen<'db>,
14279        visibility: VisibilityGreen<'db>,
14280        module_kw: TerminalModuleGreen<'db>,
14281        name: TerminalIdentifierGreen<'db>,
14282        body: MaybeModuleBodyGreen<'db>,
14283    ) -> ItemModuleGreen<'db> {
14284        let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14285        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14286        ItemModuleGreen(
14287            GreenNode {
14288                kind: SyntaxKind::ItemModule,
14289                details: GreenNodeDetails::Node { children: children.into(), width },
14290            }
14291            .intern(db),
14292        )
14293    }
14294}
14295impl<'db> ItemModule<'db> {
14296    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14297        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14298    }
14299    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14300        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14301    }
14302    pub fn module_kw(&self, db: &'db dyn Database) -> TerminalModule<'db> {
14303        TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14304    }
14305    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14306        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14307    }
14308    pub fn body(&self, db: &'db dyn Database) -> MaybeModuleBody<'db> {
14309        MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14310    }
14311}
14312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14313pub struct ItemModulePtr<'db>(pub SyntaxStablePtrId<'db>);
14314impl<'db> ItemModulePtr<'db> {
14315    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14316        let ptr = self.0.long(db);
14317        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14318            TerminalIdentifierGreen(key_fields[0])
14319        } else {
14320            panic!("Unexpected key field query on root.");
14321        }
14322    }
14323}
14324impl<'db> TypedStablePtr<'db> for ItemModulePtr<'db> {
14325    type SyntaxNode = ItemModule<'db>;
14326    fn untyped(self) -> SyntaxStablePtrId<'db> {
14327        self.0
14328    }
14329    fn lookup(&self, db: &'db dyn Database) -> ItemModule<'db> {
14330        ItemModule::from_syntax_node(db, self.0.lookup(db))
14331    }
14332}
14333impl<'db> From<ItemModulePtr<'db>> for SyntaxStablePtrId<'db> {
14334    fn from(ptr: ItemModulePtr<'db>) -> Self {
14335        ptr.untyped()
14336    }
14337}
14338#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14339pub struct ItemModuleGreen<'db>(pub GreenId<'db>);
14340impl<'db> TypedSyntaxNode<'db> for ItemModule<'db> {
14341    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14342    type StablePtr = ItemModulePtr<'db>;
14343    type Green = ItemModuleGreen<'db>;
14344    fn missing(db: &'db dyn Database) -> Self::Green {
14345        ItemModuleGreen(
14346            GreenNode {
14347                kind: SyntaxKind::ItemModule,
14348                details: GreenNodeDetails::Node {
14349                    children: [
14350                        AttributeList::missing(db).0,
14351                        Visibility::missing(db).0,
14352                        TerminalModule::missing(db).0,
14353                        TerminalIdentifier::missing(db).0,
14354                        MaybeModuleBody::missing(db).0,
14355                    ]
14356                    .into(),
14357                    width: TextWidth::default(),
14358                },
14359            }
14360            .intern(db),
14361        )
14362    }
14363    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14364        let kind = node.kind(db);
14365        assert_eq!(
14366            kind,
14367            SyntaxKind::ItemModule,
14368            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14369            kind,
14370            SyntaxKind::ItemModule
14371        );
14372        Self { node }
14373    }
14374    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14375        let kind = node.kind(db);
14376        if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14377    }
14378    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14379        self.node
14380    }
14381    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14382        ItemModulePtr(self.node.stable_ptr(db))
14383    }
14384}
14385#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14386pub enum MaybeModuleBody<'db> {
14387    Some(ModuleBody<'db>),
14388    None(TerminalSemicolon<'db>),
14389}
14390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14391pub struct MaybeModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14392impl<'db> TypedStablePtr<'db> for MaybeModuleBodyPtr<'db> {
14393    type SyntaxNode = MaybeModuleBody<'db>;
14394    fn untyped(self) -> SyntaxStablePtrId<'db> {
14395        self.0
14396    }
14397    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14398        MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14399    }
14400}
14401impl<'db> From<MaybeModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14402    fn from(ptr: MaybeModuleBodyPtr<'db>) -> Self {
14403        ptr.untyped()
14404    }
14405}
14406impl<'db> From<ModuleBodyPtr<'db>> for MaybeModuleBodyPtr<'db> {
14407    fn from(value: ModuleBodyPtr<'db>) -> Self {
14408        Self(value.0)
14409    }
14410}
14411impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeModuleBodyPtr<'db> {
14412    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
14413        Self(value.0)
14414    }
14415}
14416impl<'db> From<ModuleBodyGreen<'db>> for MaybeModuleBodyGreen<'db> {
14417    fn from(value: ModuleBodyGreen<'db>) -> Self {
14418        Self(value.0)
14419    }
14420}
14421impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeModuleBodyGreen<'db> {
14422    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
14423        Self(value.0)
14424    }
14425}
14426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14427pub struct MaybeModuleBodyGreen<'db>(pub GreenId<'db>);
14428impl<'db> TypedSyntaxNode<'db> for MaybeModuleBody<'db> {
14429    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14430    type StablePtr = MaybeModuleBodyPtr<'db>;
14431    type Green = MaybeModuleBodyGreen<'db>;
14432    fn missing(db: &'db dyn Database) -> Self::Green {
14433        panic!("No missing variant.");
14434    }
14435    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14436        let kind = node.kind(db);
14437        match kind {
14438            SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14439            SyntaxKind::TerminalSemicolon => {
14440                MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14441            }
14442            _ => {
14443                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14444            }
14445        }
14446    }
14447    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14448        let kind = node.kind(db);
14449        match kind {
14450            SyntaxKind::ModuleBody => {
14451                Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14452            }
14453            SyntaxKind::TerminalSemicolon => {
14454                Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14455            }
14456            _ => None,
14457        }
14458    }
14459    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14460        match self {
14461            MaybeModuleBody::Some(x) => x.as_syntax_node(),
14462            MaybeModuleBody::None(x) => x.as_syntax_node(),
14463        }
14464    }
14465    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14466        MaybeModuleBodyPtr(self.as_syntax_node().long(db).stable_ptr)
14467    }
14468}
14469impl<'db> MaybeModuleBody<'db> {
14470    /// Checks if a kind of a variant of [MaybeModuleBody].
14471    pub fn is_variant(kind: SyntaxKind) -> bool {
14472        matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14473    }
14474}
14475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14476pub struct ModuleBody<'db> {
14477    node: SyntaxNode<'db>,
14478}
14479impl<'db> ModuleBody<'db> {
14480    pub const INDEX_LBRACE: usize = 0;
14481    pub const INDEX_ITEMS: usize = 1;
14482    pub const INDEX_RBRACE: usize = 2;
14483    pub fn new_green(
14484        db: &'db dyn Database,
14485        lbrace: TerminalLBraceGreen<'db>,
14486        items: ModuleItemListGreen<'db>,
14487        rbrace: TerminalRBraceGreen<'db>,
14488    ) -> ModuleBodyGreen<'db> {
14489        let children = [lbrace.0, items.0, rbrace.0];
14490        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14491        ModuleBodyGreen(
14492            GreenNode {
14493                kind: SyntaxKind::ModuleBody,
14494                details: GreenNodeDetails::Node { children: children.into(), width },
14495            }
14496            .intern(db),
14497        )
14498    }
14499}
14500impl<'db> ModuleBody<'db> {
14501    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
14502        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14503    }
14504    pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
14505        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14506    }
14507    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
14508        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14509    }
14510}
14511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14512pub struct ModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14513impl<'db> ModuleBodyPtr<'db> {}
14514impl<'db> TypedStablePtr<'db> for ModuleBodyPtr<'db> {
14515    type SyntaxNode = ModuleBody<'db>;
14516    fn untyped(self) -> SyntaxStablePtrId<'db> {
14517        self.0
14518    }
14519    fn lookup(&self, db: &'db dyn Database) -> ModuleBody<'db> {
14520        ModuleBody::from_syntax_node(db, self.0.lookup(db))
14521    }
14522}
14523impl<'db> From<ModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14524    fn from(ptr: ModuleBodyPtr<'db>) -> Self {
14525        ptr.untyped()
14526    }
14527}
14528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14529pub struct ModuleBodyGreen<'db>(pub GreenId<'db>);
14530impl<'db> TypedSyntaxNode<'db> for ModuleBody<'db> {
14531    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14532    type StablePtr = ModuleBodyPtr<'db>;
14533    type Green = ModuleBodyGreen<'db>;
14534    fn missing(db: &'db dyn Database) -> Self::Green {
14535        ModuleBodyGreen(
14536            GreenNode {
14537                kind: SyntaxKind::ModuleBody,
14538                details: GreenNodeDetails::Node {
14539                    children: [
14540                        TerminalLBrace::missing(db).0,
14541                        ModuleItemList::missing(db).0,
14542                        TerminalRBrace::missing(db).0,
14543                    ]
14544                    .into(),
14545                    width: TextWidth::default(),
14546                },
14547            }
14548            .intern(db),
14549        )
14550    }
14551    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14552        let kind = node.kind(db);
14553        assert_eq!(
14554            kind,
14555            SyntaxKind::ModuleBody,
14556            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14557            kind,
14558            SyntaxKind::ModuleBody
14559        );
14560        Self { node }
14561    }
14562    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14563        let kind = node.kind(db);
14564        if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14565    }
14566    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14567        self.node
14568    }
14569    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14570        ModuleBodyPtr(self.node.stable_ptr(db))
14571    }
14572}
14573#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14574pub struct FunctionDeclaration<'db> {
14575    node: SyntaxNode<'db>,
14576}
14577impl<'db> FunctionDeclaration<'db> {
14578    pub const INDEX_OPTIONAL_CONST: usize = 0;
14579    pub const INDEX_FUNCTION_KW: usize = 1;
14580    pub const INDEX_NAME: usize = 2;
14581    pub const INDEX_GENERIC_PARAMS: usize = 3;
14582    pub const INDEX_SIGNATURE: usize = 4;
14583    pub fn new_green(
14584        db: &'db dyn Database,
14585        optional_const: OptionTerminalConstGreen<'db>,
14586        function_kw: TerminalFunctionGreen<'db>,
14587        name: TerminalIdentifierGreen<'db>,
14588        generic_params: OptionWrappedGenericParamListGreen<'db>,
14589        signature: FunctionSignatureGreen<'db>,
14590    ) -> FunctionDeclarationGreen<'db> {
14591        let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14592        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14593        FunctionDeclarationGreen(
14594            GreenNode {
14595                kind: SyntaxKind::FunctionDeclaration,
14596                details: GreenNodeDetails::Node { children: children.into(), width },
14597            }
14598            .intern(db),
14599        )
14600    }
14601}
14602impl<'db> FunctionDeclaration<'db> {
14603    pub fn optional_const(&self, db: &'db dyn Database) -> OptionTerminalConst<'db> {
14604        OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14605    }
14606    pub fn function_kw(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
14607        TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14608    }
14609    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14610        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14611    }
14612    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
14613        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14614    }
14615    pub fn signature(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
14616        FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14617    }
14618}
14619#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14620pub struct FunctionDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
14621impl<'db> FunctionDeclarationPtr<'db> {
14622    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14623        let ptr = self.0.long(db);
14624        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14625            TerminalIdentifierGreen(key_fields[0])
14626        } else {
14627            panic!("Unexpected key field query on root.");
14628        }
14629    }
14630}
14631impl<'db> TypedStablePtr<'db> for FunctionDeclarationPtr<'db> {
14632    type SyntaxNode = FunctionDeclaration<'db>;
14633    fn untyped(self) -> SyntaxStablePtrId<'db> {
14634        self.0
14635    }
14636    fn lookup(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14637        FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14638    }
14639}
14640impl<'db> From<FunctionDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
14641    fn from(ptr: FunctionDeclarationPtr<'db>) -> Self {
14642        ptr.untyped()
14643    }
14644}
14645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14646pub struct FunctionDeclarationGreen<'db>(pub GreenId<'db>);
14647impl<'db> TypedSyntaxNode<'db> for FunctionDeclaration<'db> {
14648    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14649    type StablePtr = FunctionDeclarationPtr<'db>;
14650    type Green = FunctionDeclarationGreen<'db>;
14651    fn missing(db: &'db dyn Database) -> Self::Green {
14652        FunctionDeclarationGreen(
14653            GreenNode {
14654                kind: SyntaxKind::FunctionDeclaration,
14655                details: GreenNodeDetails::Node {
14656                    children: [
14657                        OptionTerminalConst::missing(db).0,
14658                        TerminalFunction::missing(db).0,
14659                        TerminalIdentifier::missing(db).0,
14660                        OptionWrappedGenericParamList::missing(db).0,
14661                        FunctionSignature::missing(db).0,
14662                    ]
14663                    .into(),
14664                    width: TextWidth::default(),
14665                },
14666            }
14667            .intern(db),
14668        )
14669    }
14670    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14671        let kind = node.kind(db);
14672        assert_eq!(
14673            kind,
14674            SyntaxKind::FunctionDeclaration,
14675            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14676            kind,
14677            SyntaxKind::FunctionDeclaration
14678        );
14679        Self { node }
14680    }
14681    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14682        let kind = node.kind(db);
14683        if kind == SyntaxKind::FunctionDeclaration {
14684            Some(Self::from_syntax_node(db, node))
14685        } else {
14686            None
14687        }
14688    }
14689    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14690        self.node
14691    }
14692    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14693        FunctionDeclarationPtr(self.node.stable_ptr(db))
14694    }
14695}
14696#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14697pub struct ItemConstant<'db> {
14698    node: SyntaxNode<'db>,
14699}
14700impl<'db> ItemConstant<'db> {
14701    pub const INDEX_ATTRIBUTES: usize = 0;
14702    pub const INDEX_VISIBILITY: usize = 1;
14703    pub const INDEX_CONST_KW: usize = 2;
14704    pub const INDEX_NAME: usize = 3;
14705    pub const INDEX_TYPE_CLAUSE: usize = 4;
14706    pub const INDEX_EQ: usize = 5;
14707    pub const INDEX_VALUE: usize = 6;
14708    pub const INDEX_SEMICOLON: usize = 7;
14709    pub fn new_green(
14710        db: &'db dyn Database,
14711        attributes: AttributeListGreen<'db>,
14712        visibility: VisibilityGreen<'db>,
14713        const_kw: TerminalConstGreen<'db>,
14714        name: TerminalIdentifierGreen<'db>,
14715        type_clause: TypeClauseGreen<'db>,
14716        eq: TerminalEqGreen<'db>,
14717        value: ExprGreen<'db>,
14718        semicolon: TerminalSemicolonGreen<'db>,
14719    ) -> ItemConstantGreen<'db> {
14720        let children = [
14721            attributes.0,
14722            visibility.0,
14723            const_kw.0,
14724            name.0,
14725            type_clause.0,
14726            eq.0,
14727            value.0,
14728            semicolon.0,
14729        ];
14730        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14731        ItemConstantGreen(
14732            GreenNode {
14733                kind: SyntaxKind::ItemConstant,
14734                details: GreenNodeDetails::Node { children: children.into(), width },
14735            }
14736            .intern(db),
14737        )
14738    }
14739}
14740impl<'db> ItemConstant<'db> {
14741    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14742        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14743    }
14744    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14745        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14746    }
14747    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
14748        TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14749    }
14750    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14751        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14752    }
14753    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
14754        TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14755    }
14756    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
14757        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14758    }
14759    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
14760        Expr::from_syntax_node(db, self.node.get_children(db)[6])
14761    }
14762    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14763        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14764    }
14765}
14766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14767pub struct ItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
14768impl<'db> ItemConstantPtr<'db> {
14769    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14770        let ptr = self.0.long(db);
14771        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14772            TerminalIdentifierGreen(key_fields[0])
14773        } else {
14774            panic!("Unexpected key field query on root.");
14775        }
14776    }
14777}
14778impl<'db> TypedStablePtr<'db> for ItemConstantPtr<'db> {
14779    type SyntaxNode = ItemConstant<'db>;
14780    fn untyped(self) -> SyntaxStablePtrId<'db> {
14781        self.0
14782    }
14783    fn lookup(&self, db: &'db dyn Database) -> ItemConstant<'db> {
14784        ItemConstant::from_syntax_node(db, self.0.lookup(db))
14785    }
14786}
14787impl<'db> From<ItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
14788    fn from(ptr: ItemConstantPtr<'db>) -> Self {
14789        ptr.untyped()
14790    }
14791}
14792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14793pub struct ItemConstantGreen<'db>(pub GreenId<'db>);
14794impl<'db> TypedSyntaxNode<'db> for ItemConstant<'db> {
14795    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14796    type StablePtr = ItemConstantPtr<'db>;
14797    type Green = ItemConstantGreen<'db>;
14798    fn missing(db: &'db dyn Database) -> Self::Green {
14799        ItemConstantGreen(
14800            GreenNode {
14801                kind: SyntaxKind::ItemConstant,
14802                details: GreenNodeDetails::Node {
14803                    children: [
14804                        AttributeList::missing(db).0,
14805                        Visibility::missing(db).0,
14806                        TerminalConst::missing(db).0,
14807                        TerminalIdentifier::missing(db).0,
14808                        TypeClause::missing(db).0,
14809                        TerminalEq::missing(db).0,
14810                        Expr::missing(db).0,
14811                        TerminalSemicolon::missing(db).0,
14812                    ]
14813                    .into(),
14814                    width: TextWidth::default(),
14815                },
14816            }
14817            .intern(db),
14818        )
14819    }
14820    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14821        let kind = node.kind(db);
14822        assert_eq!(
14823            kind,
14824            SyntaxKind::ItemConstant,
14825            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14826            kind,
14827            SyntaxKind::ItemConstant
14828        );
14829        Self { node }
14830    }
14831    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14832        let kind = node.kind(db);
14833        if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14834    }
14835    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14836        self.node
14837    }
14838    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14839        ItemConstantPtr(self.node.stable_ptr(db))
14840    }
14841}
14842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14843pub struct FunctionWithBody<'db> {
14844    node: SyntaxNode<'db>,
14845}
14846impl<'db> FunctionWithBody<'db> {
14847    pub const INDEX_ATTRIBUTES: usize = 0;
14848    pub const INDEX_VISIBILITY: usize = 1;
14849    pub const INDEX_DECLARATION: usize = 2;
14850    pub const INDEX_BODY: usize = 3;
14851    pub fn new_green(
14852        db: &'db dyn Database,
14853        attributes: AttributeListGreen<'db>,
14854        visibility: VisibilityGreen<'db>,
14855        declaration: FunctionDeclarationGreen<'db>,
14856        body: ExprBlockGreen<'db>,
14857    ) -> FunctionWithBodyGreen<'db> {
14858        let children = [attributes.0, visibility.0, declaration.0, body.0];
14859        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14860        FunctionWithBodyGreen(
14861            GreenNode {
14862                kind: SyntaxKind::FunctionWithBody,
14863                details: GreenNodeDetails::Node { children: children.into(), width },
14864            }
14865            .intern(db),
14866        )
14867    }
14868}
14869impl<'db> FunctionWithBody<'db> {
14870    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14871        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14872    }
14873    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14874        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14875    }
14876    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14877        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14878    }
14879    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
14880        ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14881    }
14882}
14883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14884pub struct FunctionWithBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14885impl<'db> FunctionWithBodyPtr<'db> {
14886    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14887        let ptr = self.0.long(db);
14888        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
14889            FunctionDeclarationGreen(key_fields[0])
14890        } else {
14891            panic!("Unexpected key field query on root.");
14892        }
14893    }
14894}
14895impl<'db> TypedStablePtr<'db> for FunctionWithBodyPtr<'db> {
14896    type SyntaxNode = FunctionWithBody<'db>;
14897    fn untyped(self) -> SyntaxStablePtrId<'db> {
14898        self.0
14899    }
14900    fn lookup(&self, db: &'db dyn Database) -> FunctionWithBody<'db> {
14901        FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14902    }
14903}
14904impl<'db> From<FunctionWithBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14905    fn from(ptr: FunctionWithBodyPtr<'db>) -> Self {
14906        ptr.untyped()
14907    }
14908}
14909#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14910pub struct FunctionWithBodyGreen<'db>(pub GreenId<'db>);
14911impl<'db> TypedSyntaxNode<'db> for FunctionWithBody<'db> {
14912    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14913    type StablePtr = FunctionWithBodyPtr<'db>;
14914    type Green = FunctionWithBodyGreen<'db>;
14915    fn missing(db: &'db dyn Database) -> Self::Green {
14916        FunctionWithBodyGreen(
14917            GreenNode {
14918                kind: SyntaxKind::FunctionWithBody,
14919                details: GreenNodeDetails::Node {
14920                    children: [
14921                        AttributeList::missing(db).0,
14922                        Visibility::missing(db).0,
14923                        FunctionDeclaration::missing(db).0,
14924                        ExprBlock::missing(db).0,
14925                    ]
14926                    .into(),
14927                    width: TextWidth::default(),
14928                },
14929            }
14930            .intern(db),
14931        )
14932    }
14933    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14934        let kind = node.kind(db);
14935        assert_eq!(
14936            kind,
14937            SyntaxKind::FunctionWithBody,
14938            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14939            kind,
14940            SyntaxKind::FunctionWithBody
14941        );
14942        Self { node }
14943    }
14944    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14945        let kind = node.kind(db);
14946        if kind == SyntaxKind::FunctionWithBody {
14947            Some(Self::from_syntax_node(db, node))
14948        } else {
14949            None
14950        }
14951    }
14952    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14953        self.node
14954    }
14955    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14956        FunctionWithBodyPtr(self.node.stable_ptr(db))
14957    }
14958}
14959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14960pub struct ItemExternFunction<'db> {
14961    node: SyntaxNode<'db>,
14962}
14963impl<'db> ItemExternFunction<'db> {
14964    pub const INDEX_ATTRIBUTES: usize = 0;
14965    pub const INDEX_VISIBILITY: usize = 1;
14966    pub const INDEX_EXTERN_KW: usize = 2;
14967    pub const INDEX_DECLARATION: usize = 3;
14968    pub const INDEX_SEMICOLON: usize = 4;
14969    pub fn new_green(
14970        db: &'db dyn Database,
14971        attributes: AttributeListGreen<'db>,
14972        visibility: VisibilityGreen<'db>,
14973        extern_kw: TerminalExternGreen<'db>,
14974        declaration: FunctionDeclarationGreen<'db>,
14975        semicolon: TerminalSemicolonGreen<'db>,
14976    ) -> ItemExternFunctionGreen<'db> {
14977        let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14978        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14979        ItemExternFunctionGreen(
14980            GreenNode {
14981                kind: SyntaxKind::ItemExternFunction,
14982                details: GreenNodeDetails::Node { children: children.into(), width },
14983            }
14984            .intern(db),
14985        )
14986    }
14987}
14988impl<'db> ItemExternFunction<'db> {
14989    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14990        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14991    }
14992    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14993        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14994    }
14995    pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
14996        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
14997    }
14998    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14999        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
15000    }
15001    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15002        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15003    }
15004}
15005#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15006pub struct ItemExternFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15007impl<'db> ItemExternFunctionPtr<'db> {
15008    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15009        let ptr = self.0.long(db);
15010        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15011            FunctionDeclarationGreen(key_fields[0])
15012        } else {
15013            panic!("Unexpected key field query on root.");
15014        }
15015    }
15016}
15017impl<'db> TypedStablePtr<'db> for ItemExternFunctionPtr<'db> {
15018    type SyntaxNode = ItemExternFunction<'db>;
15019    fn untyped(self) -> SyntaxStablePtrId<'db> {
15020        self.0
15021    }
15022    fn lookup(&self, db: &'db dyn Database) -> ItemExternFunction<'db> {
15023        ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
15024    }
15025}
15026impl<'db> From<ItemExternFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15027    fn from(ptr: ItemExternFunctionPtr<'db>) -> Self {
15028        ptr.untyped()
15029    }
15030}
15031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15032pub struct ItemExternFunctionGreen<'db>(pub GreenId<'db>);
15033impl<'db> TypedSyntaxNode<'db> for ItemExternFunction<'db> {
15034    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
15035    type StablePtr = ItemExternFunctionPtr<'db>;
15036    type Green = ItemExternFunctionGreen<'db>;
15037    fn missing(db: &'db dyn Database) -> Self::Green {
15038        ItemExternFunctionGreen(
15039            GreenNode {
15040                kind: SyntaxKind::ItemExternFunction,
15041                details: GreenNodeDetails::Node {
15042                    children: [
15043                        AttributeList::missing(db).0,
15044                        Visibility::missing(db).0,
15045                        TerminalExtern::missing(db).0,
15046                        FunctionDeclaration::missing(db).0,
15047                        TerminalSemicolon::missing(db).0,
15048                    ]
15049                    .into(),
15050                    width: TextWidth::default(),
15051                },
15052            }
15053            .intern(db),
15054        )
15055    }
15056    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15057        let kind = node.kind(db);
15058        assert_eq!(
15059            kind,
15060            SyntaxKind::ItemExternFunction,
15061            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15062            kind,
15063            SyntaxKind::ItemExternFunction
15064        );
15065        Self { node }
15066    }
15067    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15068        let kind = node.kind(db);
15069        if kind == SyntaxKind::ItemExternFunction {
15070            Some(Self::from_syntax_node(db, node))
15071        } else {
15072            None
15073        }
15074    }
15075    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15076        self.node
15077    }
15078    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15079        ItemExternFunctionPtr(self.node.stable_ptr(db))
15080    }
15081}
15082#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15083pub struct ItemExternType<'db> {
15084    node: SyntaxNode<'db>,
15085}
15086impl<'db> ItemExternType<'db> {
15087    pub const INDEX_ATTRIBUTES: usize = 0;
15088    pub const INDEX_VISIBILITY: usize = 1;
15089    pub const INDEX_EXTERN_KW: usize = 2;
15090    pub const INDEX_TYPE_KW: usize = 3;
15091    pub const INDEX_NAME: usize = 4;
15092    pub const INDEX_GENERIC_PARAMS: usize = 5;
15093    pub const INDEX_SEMICOLON: usize = 6;
15094    pub fn new_green(
15095        db: &'db dyn Database,
15096        attributes: AttributeListGreen<'db>,
15097        visibility: VisibilityGreen<'db>,
15098        extern_kw: TerminalExternGreen<'db>,
15099        type_kw: TerminalTypeGreen<'db>,
15100        name: TerminalIdentifierGreen<'db>,
15101        generic_params: OptionWrappedGenericParamListGreen<'db>,
15102        semicolon: TerminalSemicolonGreen<'db>,
15103    ) -> ItemExternTypeGreen<'db> {
15104        let children = [
15105            attributes.0,
15106            visibility.0,
15107            extern_kw.0,
15108            type_kw.0,
15109            name.0,
15110            generic_params.0,
15111            semicolon.0,
15112        ];
15113        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15114        ItemExternTypeGreen(
15115            GreenNode {
15116                kind: SyntaxKind::ItemExternType,
15117                details: GreenNodeDetails::Node { children: children.into(), width },
15118            }
15119            .intern(db),
15120        )
15121    }
15122}
15123impl<'db> ItemExternType<'db> {
15124    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15125        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15126    }
15127    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15128        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15129    }
15130    pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
15131        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15132    }
15133    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15134        TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15135    }
15136    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15137        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15138    }
15139    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15140        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15141    }
15142    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15143        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15144    }
15145}
15146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15147pub struct ItemExternTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15148impl<'db> ItemExternTypePtr<'db> {
15149    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15150        let ptr = self.0.long(db);
15151        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15152            TerminalIdentifierGreen(key_fields[0])
15153        } else {
15154            panic!("Unexpected key field query on root.");
15155        }
15156    }
15157}
15158impl<'db> TypedStablePtr<'db> for ItemExternTypePtr<'db> {
15159    type SyntaxNode = ItemExternType<'db>;
15160    fn untyped(self) -> SyntaxStablePtrId<'db> {
15161        self.0
15162    }
15163    fn lookup(&self, db: &'db dyn Database) -> ItemExternType<'db> {
15164        ItemExternType::from_syntax_node(db, self.0.lookup(db))
15165    }
15166}
15167impl<'db> From<ItemExternTypePtr<'db>> for SyntaxStablePtrId<'db> {
15168    fn from(ptr: ItemExternTypePtr<'db>) -> Self {
15169        ptr.untyped()
15170    }
15171}
15172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15173pub struct ItemExternTypeGreen<'db>(pub GreenId<'db>);
15174impl<'db> TypedSyntaxNode<'db> for ItemExternType<'db> {
15175    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15176    type StablePtr = ItemExternTypePtr<'db>;
15177    type Green = ItemExternTypeGreen<'db>;
15178    fn missing(db: &'db dyn Database) -> Self::Green {
15179        ItemExternTypeGreen(
15180            GreenNode {
15181                kind: SyntaxKind::ItemExternType,
15182                details: GreenNodeDetails::Node {
15183                    children: [
15184                        AttributeList::missing(db).0,
15185                        Visibility::missing(db).0,
15186                        TerminalExtern::missing(db).0,
15187                        TerminalType::missing(db).0,
15188                        TerminalIdentifier::missing(db).0,
15189                        OptionWrappedGenericParamList::missing(db).0,
15190                        TerminalSemicolon::missing(db).0,
15191                    ]
15192                    .into(),
15193                    width: TextWidth::default(),
15194                },
15195            }
15196            .intern(db),
15197        )
15198    }
15199    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15200        let kind = node.kind(db);
15201        assert_eq!(
15202            kind,
15203            SyntaxKind::ItemExternType,
15204            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15205            kind,
15206            SyntaxKind::ItemExternType
15207        );
15208        Self { node }
15209    }
15210    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15211        let kind = node.kind(db);
15212        if kind == SyntaxKind::ItemExternType {
15213            Some(Self::from_syntax_node(db, node))
15214        } else {
15215            None
15216        }
15217    }
15218    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15219        self.node
15220    }
15221    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15222        ItemExternTypePtr(self.node.stable_ptr(db))
15223    }
15224}
15225#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15226pub struct ItemTrait<'db> {
15227    node: SyntaxNode<'db>,
15228}
15229impl<'db> ItemTrait<'db> {
15230    pub const INDEX_ATTRIBUTES: usize = 0;
15231    pub const INDEX_VISIBILITY: usize = 1;
15232    pub const INDEX_TRAIT_KW: usize = 2;
15233    pub const INDEX_NAME: usize = 3;
15234    pub const INDEX_GENERIC_PARAMS: usize = 4;
15235    pub const INDEX_BODY: usize = 5;
15236    pub fn new_green(
15237        db: &'db dyn Database,
15238        attributes: AttributeListGreen<'db>,
15239        visibility: VisibilityGreen<'db>,
15240        trait_kw: TerminalTraitGreen<'db>,
15241        name: TerminalIdentifierGreen<'db>,
15242        generic_params: OptionWrappedGenericParamListGreen<'db>,
15243        body: MaybeTraitBodyGreen<'db>,
15244    ) -> ItemTraitGreen<'db> {
15245        let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15246        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15247        ItemTraitGreen(
15248            GreenNode {
15249                kind: SyntaxKind::ItemTrait,
15250                details: GreenNodeDetails::Node { children: children.into(), width },
15251            }
15252            .intern(db),
15253        )
15254    }
15255}
15256impl<'db> ItemTrait<'db> {
15257    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15258        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15259    }
15260    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15261        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15262    }
15263    pub fn trait_kw(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
15264        TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15265    }
15266    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15267        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15268    }
15269    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15270        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15271    }
15272    pub fn body(&self, db: &'db dyn Database) -> MaybeTraitBody<'db> {
15273        MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15274    }
15275}
15276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15277pub struct ItemTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
15278impl<'db> ItemTraitPtr<'db> {
15279    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15280        let ptr = self.0.long(db);
15281        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15282            TerminalIdentifierGreen(key_fields[0])
15283        } else {
15284            panic!("Unexpected key field query on root.");
15285        }
15286    }
15287}
15288impl<'db> TypedStablePtr<'db> for ItemTraitPtr<'db> {
15289    type SyntaxNode = ItemTrait<'db>;
15290    fn untyped(self) -> SyntaxStablePtrId<'db> {
15291        self.0
15292    }
15293    fn lookup(&self, db: &'db dyn Database) -> ItemTrait<'db> {
15294        ItemTrait::from_syntax_node(db, self.0.lookup(db))
15295    }
15296}
15297impl<'db> From<ItemTraitPtr<'db>> for SyntaxStablePtrId<'db> {
15298    fn from(ptr: ItemTraitPtr<'db>) -> Self {
15299        ptr.untyped()
15300    }
15301}
15302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15303pub struct ItemTraitGreen<'db>(pub GreenId<'db>);
15304impl<'db> TypedSyntaxNode<'db> for ItemTrait<'db> {
15305    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15306    type StablePtr = ItemTraitPtr<'db>;
15307    type Green = ItemTraitGreen<'db>;
15308    fn missing(db: &'db dyn Database) -> Self::Green {
15309        ItemTraitGreen(
15310            GreenNode {
15311                kind: SyntaxKind::ItemTrait,
15312                details: GreenNodeDetails::Node {
15313                    children: [
15314                        AttributeList::missing(db).0,
15315                        Visibility::missing(db).0,
15316                        TerminalTrait::missing(db).0,
15317                        TerminalIdentifier::missing(db).0,
15318                        OptionWrappedGenericParamList::missing(db).0,
15319                        MaybeTraitBody::missing(db).0,
15320                    ]
15321                    .into(),
15322                    width: TextWidth::default(),
15323                },
15324            }
15325            .intern(db),
15326        )
15327    }
15328    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15329        let kind = node.kind(db);
15330        assert_eq!(
15331            kind,
15332            SyntaxKind::ItemTrait,
15333            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15334            kind,
15335            SyntaxKind::ItemTrait
15336        );
15337        Self { node }
15338    }
15339    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15340        let kind = node.kind(db);
15341        if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15342    }
15343    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15344        self.node
15345    }
15346    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15347        ItemTraitPtr(self.node.stable_ptr(db))
15348    }
15349}
15350#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15351pub enum MaybeTraitBody<'db> {
15352    Some(TraitBody<'db>),
15353    None(TerminalSemicolon<'db>),
15354}
15355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15356pub struct MaybeTraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15357impl<'db> TypedStablePtr<'db> for MaybeTraitBodyPtr<'db> {
15358    type SyntaxNode = MaybeTraitBody<'db>;
15359    fn untyped(self) -> SyntaxStablePtrId<'db> {
15360        self.0
15361    }
15362    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15363        MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15364    }
15365}
15366impl<'db> From<MaybeTraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15367    fn from(ptr: MaybeTraitBodyPtr<'db>) -> Self {
15368        ptr.untyped()
15369    }
15370}
15371impl<'db> From<TraitBodyPtr<'db>> for MaybeTraitBodyPtr<'db> {
15372    fn from(value: TraitBodyPtr<'db>) -> Self {
15373        Self(value.0)
15374    }
15375}
15376impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitBodyPtr<'db> {
15377    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
15378        Self(value.0)
15379    }
15380}
15381impl<'db> From<TraitBodyGreen<'db>> for MaybeTraitBodyGreen<'db> {
15382    fn from(value: TraitBodyGreen<'db>) -> Self {
15383        Self(value.0)
15384    }
15385}
15386impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitBodyGreen<'db> {
15387    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
15388        Self(value.0)
15389    }
15390}
15391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15392pub struct MaybeTraitBodyGreen<'db>(pub GreenId<'db>);
15393impl<'db> TypedSyntaxNode<'db> for MaybeTraitBody<'db> {
15394    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15395    type StablePtr = MaybeTraitBodyPtr<'db>;
15396    type Green = MaybeTraitBodyGreen<'db>;
15397    fn missing(db: &'db dyn Database) -> Self::Green {
15398        panic!("No missing variant.");
15399    }
15400    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15401        let kind = node.kind(db);
15402        match kind {
15403            SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15404            SyntaxKind::TerminalSemicolon => {
15405                MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15406            }
15407            _ => {
15408                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15409            }
15410        }
15411    }
15412    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15413        let kind = node.kind(db);
15414        match kind {
15415            SyntaxKind::TraitBody => {
15416                Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15417            }
15418            SyntaxKind::TerminalSemicolon => {
15419                Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15420            }
15421            _ => None,
15422        }
15423    }
15424    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15425        match self {
15426            MaybeTraitBody::Some(x) => x.as_syntax_node(),
15427            MaybeTraitBody::None(x) => x.as_syntax_node(),
15428        }
15429    }
15430    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15431        MaybeTraitBodyPtr(self.as_syntax_node().long(db).stable_ptr)
15432    }
15433}
15434impl<'db> MaybeTraitBody<'db> {
15435    /// Checks if a kind of a variant of [MaybeTraitBody].
15436    pub fn is_variant(kind: SyntaxKind) -> bool {
15437        matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15438    }
15439}
15440#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15441pub struct TraitBody<'db> {
15442    node: SyntaxNode<'db>,
15443}
15444impl<'db> TraitBody<'db> {
15445    pub const INDEX_LBRACE: usize = 0;
15446    pub const INDEX_ITEMS: usize = 1;
15447    pub const INDEX_RBRACE: usize = 2;
15448    pub fn new_green(
15449        db: &'db dyn Database,
15450        lbrace: TerminalLBraceGreen<'db>,
15451        items: TraitItemListGreen<'db>,
15452        rbrace: TerminalRBraceGreen<'db>,
15453    ) -> TraitBodyGreen<'db> {
15454        let children = [lbrace.0, items.0, rbrace.0];
15455        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15456        TraitBodyGreen(
15457            GreenNode {
15458                kind: SyntaxKind::TraitBody,
15459                details: GreenNodeDetails::Node { children: children.into(), width },
15460            }
15461            .intern(db),
15462        )
15463    }
15464}
15465impl<'db> TraitBody<'db> {
15466    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
15467        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15468    }
15469    pub fn items(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15470        TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15471    }
15472    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
15473        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15474    }
15475}
15476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15477pub struct TraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15478impl<'db> TraitBodyPtr<'db> {}
15479impl<'db> TypedStablePtr<'db> for TraitBodyPtr<'db> {
15480    type SyntaxNode = TraitBody<'db>;
15481    fn untyped(self) -> SyntaxStablePtrId<'db> {
15482        self.0
15483    }
15484    fn lookup(&self, db: &'db dyn Database) -> TraitBody<'db> {
15485        TraitBody::from_syntax_node(db, self.0.lookup(db))
15486    }
15487}
15488impl<'db> From<TraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15489    fn from(ptr: TraitBodyPtr<'db>) -> Self {
15490        ptr.untyped()
15491    }
15492}
15493#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15494pub struct TraitBodyGreen<'db>(pub GreenId<'db>);
15495impl<'db> TypedSyntaxNode<'db> for TraitBody<'db> {
15496    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15497    type StablePtr = TraitBodyPtr<'db>;
15498    type Green = TraitBodyGreen<'db>;
15499    fn missing(db: &'db dyn Database) -> Self::Green {
15500        TraitBodyGreen(
15501            GreenNode {
15502                kind: SyntaxKind::TraitBody,
15503                details: GreenNodeDetails::Node {
15504                    children: [
15505                        TerminalLBrace::missing(db).0,
15506                        TraitItemList::missing(db).0,
15507                        TerminalRBrace::missing(db).0,
15508                    ]
15509                    .into(),
15510                    width: TextWidth::default(),
15511                },
15512            }
15513            .intern(db),
15514        )
15515    }
15516    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15517        let kind = node.kind(db);
15518        assert_eq!(
15519            kind,
15520            SyntaxKind::TraitBody,
15521            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15522            kind,
15523            SyntaxKind::TraitBody
15524        );
15525        Self { node }
15526    }
15527    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15528        let kind = node.kind(db);
15529        if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15530    }
15531    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15532        self.node
15533    }
15534    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15535        TraitBodyPtr(self.node.stable_ptr(db))
15536    }
15537}
15538#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15539pub struct TraitItemList<'db>(ElementList<'db, TraitItem<'db>, 1>);
15540impl<'db> Deref for TraitItemList<'db> {
15541    type Target = ElementList<'db, TraitItem<'db>, 1>;
15542    fn deref(&self) -> &Self::Target {
15543        &self.0
15544    }
15545}
15546impl<'db> TraitItemList<'db> {
15547    pub fn new_green(
15548        db: &'db dyn Database,
15549        children: &[TraitItemGreen<'db>],
15550    ) -> TraitItemListGreen<'db> {
15551        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
15552        TraitItemListGreen(
15553            GreenNode {
15554                kind: SyntaxKind::TraitItemList,
15555                details: GreenNodeDetails::Node {
15556                    children: children.iter().map(|x| x.0).collect(),
15557                    width,
15558                },
15559            }
15560            .intern(db),
15561        )
15562    }
15563}
15564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15565pub struct TraitItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
15566impl<'db> TypedStablePtr<'db> for TraitItemListPtr<'db> {
15567    type SyntaxNode = TraitItemList<'db>;
15568    fn untyped(self) -> SyntaxStablePtrId<'db> {
15569        self.0
15570    }
15571    fn lookup(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15572        TraitItemList::from_syntax_node(db, self.0.lookup(db))
15573    }
15574}
15575impl<'db> From<TraitItemListPtr<'db>> for SyntaxStablePtrId<'db> {
15576    fn from(ptr: TraitItemListPtr<'db>) -> Self {
15577        ptr.untyped()
15578    }
15579}
15580#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15581pub struct TraitItemListGreen<'db>(pub GreenId<'db>);
15582impl<'db> TypedSyntaxNode<'db> for TraitItemList<'db> {
15583    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15584    type StablePtr = TraitItemListPtr<'db>;
15585    type Green = TraitItemListGreen<'db>;
15586    fn missing(db: &'db dyn Database) -> Self::Green {
15587        TraitItemListGreen(
15588            GreenNode {
15589                kind: SyntaxKind::TraitItemList,
15590                details: GreenNodeDetails::Node {
15591                    children: [].into(),
15592                    width: TextWidth::default(),
15593                },
15594            }
15595            .intern(db),
15596        )
15597    }
15598    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15599        Self(ElementList::new(node))
15600    }
15601    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15602        if node.kind(db) == SyntaxKind::TraitItemList {
15603            Some(Self(ElementList::new(node)))
15604        } else {
15605            None
15606        }
15607    }
15608    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15609        self.node
15610    }
15611    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15612        TraitItemListPtr(self.node.stable_ptr(db))
15613    }
15614}
15615#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15616pub enum TraitItem<'db> {
15617    Function(TraitItemFunction<'db>),
15618    Type(TraitItemType<'db>),
15619    Constant(TraitItemConstant<'db>),
15620    Impl(TraitItemImpl<'db>),
15621    Missing(TraitItemMissing<'db>),
15622}
15623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15624pub struct TraitItemPtr<'db>(pub SyntaxStablePtrId<'db>);
15625impl<'db> TypedStablePtr<'db> for TraitItemPtr<'db> {
15626    type SyntaxNode = TraitItem<'db>;
15627    fn untyped(self) -> SyntaxStablePtrId<'db> {
15628        self.0
15629    }
15630    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15631        TraitItem::from_syntax_node(db, self.0.lookup(db))
15632    }
15633}
15634impl<'db> From<TraitItemPtr<'db>> for SyntaxStablePtrId<'db> {
15635    fn from(ptr: TraitItemPtr<'db>) -> Self {
15636        ptr.untyped()
15637    }
15638}
15639impl<'db> From<TraitItemFunctionPtr<'db>> for TraitItemPtr<'db> {
15640    fn from(value: TraitItemFunctionPtr<'db>) -> Self {
15641        Self(value.0)
15642    }
15643}
15644impl<'db> From<TraitItemTypePtr<'db>> for TraitItemPtr<'db> {
15645    fn from(value: TraitItemTypePtr<'db>) -> Self {
15646        Self(value.0)
15647    }
15648}
15649impl<'db> From<TraitItemConstantPtr<'db>> for TraitItemPtr<'db> {
15650    fn from(value: TraitItemConstantPtr<'db>) -> Self {
15651        Self(value.0)
15652    }
15653}
15654impl<'db> From<TraitItemImplPtr<'db>> for TraitItemPtr<'db> {
15655    fn from(value: TraitItemImplPtr<'db>) -> Self {
15656        Self(value.0)
15657    }
15658}
15659impl<'db> From<TraitItemMissingPtr<'db>> for TraitItemPtr<'db> {
15660    fn from(value: TraitItemMissingPtr<'db>) -> Self {
15661        Self(value.0)
15662    }
15663}
15664impl<'db> From<TraitItemFunctionGreen<'db>> for TraitItemGreen<'db> {
15665    fn from(value: TraitItemFunctionGreen<'db>) -> Self {
15666        Self(value.0)
15667    }
15668}
15669impl<'db> From<TraitItemTypeGreen<'db>> for TraitItemGreen<'db> {
15670    fn from(value: TraitItemTypeGreen<'db>) -> Self {
15671        Self(value.0)
15672    }
15673}
15674impl<'db> From<TraitItemConstantGreen<'db>> for TraitItemGreen<'db> {
15675    fn from(value: TraitItemConstantGreen<'db>) -> Self {
15676        Self(value.0)
15677    }
15678}
15679impl<'db> From<TraitItemImplGreen<'db>> for TraitItemGreen<'db> {
15680    fn from(value: TraitItemImplGreen<'db>) -> Self {
15681        Self(value.0)
15682    }
15683}
15684impl<'db> From<TraitItemMissingGreen<'db>> for TraitItemGreen<'db> {
15685    fn from(value: TraitItemMissingGreen<'db>) -> Self {
15686        Self(value.0)
15687    }
15688}
15689#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15690pub struct TraitItemGreen<'db>(pub GreenId<'db>);
15691impl<'db> TypedSyntaxNode<'db> for TraitItem<'db> {
15692    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15693    type StablePtr = TraitItemPtr<'db>;
15694    type Green = TraitItemGreen<'db>;
15695    fn missing(db: &'db dyn Database) -> Self::Green {
15696        TraitItemGreen(TraitItemMissing::missing(db).0)
15697    }
15698    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15699        let kind = node.kind(db);
15700        match kind {
15701            SyntaxKind::TraitItemFunction => {
15702                TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15703            }
15704            SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15705            SyntaxKind::TraitItemConstant => {
15706                TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15707            }
15708            SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15709            SyntaxKind::TraitItemMissing => {
15710                TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15711            }
15712            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15713        }
15714    }
15715    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15716        let kind = node.kind(db);
15717        match kind {
15718            SyntaxKind::TraitItemFunction => {
15719                Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15720            }
15721            SyntaxKind::TraitItemType => {
15722                Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15723            }
15724            SyntaxKind::TraitItemConstant => {
15725                Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15726            }
15727            SyntaxKind::TraitItemImpl => {
15728                Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15729            }
15730            SyntaxKind::TraitItemMissing => {
15731                Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15732            }
15733            _ => None,
15734        }
15735    }
15736    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15737        match self {
15738            TraitItem::Function(x) => x.as_syntax_node(),
15739            TraitItem::Type(x) => x.as_syntax_node(),
15740            TraitItem::Constant(x) => x.as_syntax_node(),
15741            TraitItem::Impl(x) => x.as_syntax_node(),
15742            TraitItem::Missing(x) => x.as_syntax_node(),
15743        }
15744    }
15745    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15746        TraitItemPtr(self.as_syntax_node().long(db).stable_ptr)
15747    }
15748}
15749impl<'db> TraitItem<'db> {
15750    /// Checks if a kind of a variant of [TraitItem].
15751    pub fn is_variant(kind: SyntaxKind) -> bool {
15752        matches!(
15753            kind,
15754            SyntaxKind::TraitItemFunction
15755                | SyntaxKind::TraitItemType
15756                | SyntaxKind::TraitItemConstant
15757                | SyntaxKind::TraitItemImpl
15758                | SyntaxKind::TraitItemMissing
15759        )
15760    }
15761}
15762#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15763pub struct TraitItemMissing<'db> {
15764    node: SyntaxNode<'db>,
15765}
15766impl<'db> TraitItemMissing<'db> {
15767    pub fn new_green(db: &'db dyn Database) -> TraitItemMissingGreen<'db> {
15768        let children = [];
15769        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15770        TraitItemMissingGreen(
15771            GreenNode {
15772                kind: SyntaxKind::TraitItemMissing,
15773                details: GreenNodeDetails::Node { children: children.into(), width },
15774            }
15775            .intern(db),
15776        )
15777    }
15778}
15779impl<'db> TraitItemMissing<'db> {}
15780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15781pub struct TraitItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
15782impl<'db> TraitItemMissingPtr<'db> {}
15783impl<'db> TypedStablePtr<'db> for TraitItemMissingPtr<'db> {
15784    type SyntaxNode = TraitItemMissing<'db>;
15785    fn untyped(self) -> SyntaxStablePtrId<'db> {
15786        self.0
15787    }
15788    fn lookup(&self, db: &'db dyn Database) -> TraitItemMissing<'db> {
15789        TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15790    }
15791}
15792impl<'db> From<TraitItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
15793    fn from(ptr: TraitItemMissingPtr<'db>) -> Self {
15794        ptr.untyped()
15795    }
15796}
15797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15798pub struct TraitItemMissingGreen<'db>(pub GreenId<'db>);
15799impl<'db> TypedSyntaxNode<'db> for TraitItemMissing<'db> {
15800    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15801    type StablePtr = TraitItemMissingPtr<'db>;
15802    type Green = TraitItemMissingGreen<'db>;
15803    fn missing(db: &'db dyn Database) -> Self::Green {
15804        TraitItemMissingGreen(
15805            GreenNode {
15806                kind: SyntaxKind::TraitItemMissing,
15807                details: GreenNodeDetails::Node {
15808                    children: [].into(),
15809                    width: TextWidth::default(),
15810                },
15811            }
15812            .intern(db),
15813        )
15814    }
15815    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15816        let kind = node.kind(db);
15817        assert_eq!(
15818            kind,
15819            SyntaxKind::TraitItemMissing,
15820            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15821            kind,
15822            SyntaxKind::TraitItemMissing
15823        );
15824        Self { node }
15825    }
15826    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15827        let kind = node.kind(db);
15828        if kind == SyntaxKind::TraitItemMissing {
15829            Some(Self::from_syntax_node(db, node))
15830        } else {
15831            None
15832        }
15833    }
15834    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15835        self.node
15836    }
15837    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15838        TraitItemMissingPtr(self.node.stable_ptr(db))
15839    }
15840}
15841#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15842pub struct TraitItemFunction<'db> {
15843    node: SyntaxNode<'db>,
15844}
15845impl<'db> TraitItemFunction<'db> {
15846    pub const INDEX_ATTRIBUTES: usize = 0;
15847    pub const INDEX_DECLARATION: usize = 1;
15848    pub const INDEX_BODY: usize = 2;
15849    pub fn new_green(
15850        db: &'db dyn Database,
15851        attributes: AttributeListGreen<'db>,
15852        declaration: FunctionDeclarationGreen<'db>,
15853        body: MaybeTraitFunctionBodyGreen<'db>,
15854    ) -> TraitItemFunctionGreen<'db> {
15855        let children = [attributes.0, declaration.0, body.0];
15856        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15857        TraitItemFunctionGreen(
15858            GreenNode {
15859                kind: SyntaxKind::TraitItemFunction,
15860                details: GreenNodeDetails::Node { children: children.into(), width },
15861            }
15862            .intern(db),
15863        )
15864    }
15865}
15866impl<'db> TraitItemFunction<'db> {
15867    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15868        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15869    }
15870    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
15871        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15872    }
15873    pub fn body(&self, db: &'db dyn Database) -> MaybeTraitFunctionBody<'db> {
15874        MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15875    }
15876}
15877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15878pub struct TraitItemFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15879impl<'db> TraitItemFunctionPtr<'db> {
15880    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15881        let ptr = self.0.long(db);
15882        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
15883            FunctionDeclarationGreen(key_fields[0])
15884        } else {
15885            panic!("Unexpected key field query on root.");
15886        }
15887    }
15888}
15889impl<'db> TypedStablePtr<'db> for TraitItemFunctionPtr<'db> {
15890    type SyntaxNode = TraitItemFunction<'db>;
15891    fn untyped(self) -> SyntaxStablePtrId<'db> {
15892        self.0
15893    }
15894    fn lookup(&self, db: &'db dyn Database) -> TraitItemFunction<'db> {
15895        TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15896    }
15897}
15898impl<'db> From<TraitItemFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15899    fn from(ptr: TraitItemFunctionPtr<'db>) -> Self {
15900        ptr.untyped()
15901    }
15902}
15903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15904pub struct TraitItemFunctionGreen<'db>(pub GreenId<'db>);
15905impl<'db> TypedSyntaxNode<'db> for TraitItemFunction<'db> {
15906    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15907    type StablePtr = TraitItemFunctionPtr<'db>;
15908    type Green = TraitItemFunctionGreen<'db>;
15909    fn missing(db: &'db dyn Database) -> Self::Green {
15910        TraitItemFunctionGreen(
15911            GreenNode {
15912                kind: SyntaxKind::TraitItemFunction,
15913                details: GreenNodeDetails::Node {
15914                    children: [
15915                        AttributeList::missing(db).0,
15916                        FunctionDeclaration::missing(db).0,
15917                        MaybeTraitFunctionBody::missing(db).0,
15918                    ]
15919                    .into(),
15920                    width: TextWidth::default(),
15921                },
15922            }
15923            .intern(db),
15924        )
15925    }
15926    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15927        let kind = node.kind(db);
15928        assert_eq!(
15929            kind,
15930            SyntaxKind::TraitItemFunction,
15931            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15932            kind,
15933            SyntaxKind::TraitItemFunction
15934        );
15935        Self { node }
15936    }
15937    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15938        let kind = node.kind(db);
15939        if kind == SyntaxKind::TraitItemFunction {
15940            Some(Self::from_syntax_node(db, node))
15941        } else {
15942            None
15943        }
15944    }
15945    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15946        self.node
15947    }
15948    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15949        TraitItemFunctionPtr(self.node.stable_ptr(db))
15950    }
15951}
15952#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15953pub struct TraitItemType<'db> {
15954    node: SyntaxNode<'db>,
15955}
15956impl<'db> TraitItemType<'db> {
15957    pub const INDEX_ATTRIBUTES: usize = 0;
15958    pub const INDEX_TYPE_KW: usize = 1;
15959    pub const INDEX_NAME: usize = 2;
15960    pub const INDEX_GENERIC_PARAMS: usize = 3;
15961    pub const INDEX_SEMICOLON: usize = 4;
15962    pub fn new_green(
15963        db: &'db dyn Database,
15964        attributes: AttributeListGreen<'db>,
15965        type_kw: TerminalTypeGreen<'db>,
15966        name: TerminalIdentifierGreen<'db>,
15967        generic_params: OptionWrappedGenericParamListGreen<'db>,
15968        semicolon: TerminalSemicolonGreen<'db>,
15969    ) -> TraitItemTypeGreen<'db> {
15970        let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
15971        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15972        TraitItemTypeGreen(
15973            GreenNode {
15974                kind: SyntaxKind::TraitItemType,
15975                details: GreenNodeDetails::Node { children: children.into(), width },
15976            }
15977            .intern(db),
15978        )
15979    }
15980}
15981impl<'db> TraitItemType<'db> {
15982    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15983        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15984    }
15985    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15986        TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
15987    }
15988    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15989        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15990    }
15991    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15992        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
15993    }
15994    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15995        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15996    }
15997}
15998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15999pub struct TraitItemTypePtr<'db>(pub SyntaxStablePtrId<'db>);
16000impl<'db> TraitItemTypePtr<'db> {
16001    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16002        let ptr = self.0.long(db);
16003        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16004            TerminalIdentifierGreen(key_fields[0])
16005        } else {
16006            panic!("Unexpected key field query on root.");
16007        }
16008    }
16009}
16010impl<'db> TypedStablePtr<'db> for TraitItemTypePtr<'db> {
16011    type SyntaxNode = TraitItemType<'db>;
16012    fn untyped(self) -> SyntaxStablePtrId<'db> {
16013        self.0
16014    }
16015    fn lookup(&self, db: &'db dyn Database) -> TraitItemType<'db> {
16016        TraitItemType::from_syntax_node(db, self.0.lookup(db))
16017    }
16018}
16019impl<'db> From<TraitItemTypePtr<'db>> for SyntaxStablePtrId<'db> {
16020    fn from(ptr: TraitItemTypePtr<'db>) -> Self {
16021        ptr.untyped()
16022    }
16023}
16024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16025pub struct TraitItemTypeGreen<'db>(pub GreenId<'db>);
16026impl<'db> TypedSyntaxNode<'db> for TraitItemType<'db> {
16027    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
16028    type StablePtr = TraitItemTypePtr<'db>;
16029    type Green = TraitItemTypeGreen<'db>;
16030    fn missing(db: &'db dyn Database) -> Self::Green {
16031        TraitItemTypeGreen(
16032            GreenNode {
16033                kind: SyntaxKind::TraitItemType,
16034                details: GreenNodeDetails::Node {
16035                    children: [
16036                        AttributeList::missing(db).0,
16037                        TerminalType::missing(db).0,
16038                        TerminalIdentifier::missing(db).0,
16039                        OptionWrappedGenericParamList::missing(db).0,
16040                        TerminalSemicolon::missing(db).0,
16041                    ]
16042                    .into(),
16043                    width: TextWidth::default(),
16044                },
16045            }
16046            .intern(db),
16047        )
16048    }
16049    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16050        let kind = node.kind(db);
16051        assert_eq!(
16052            kind,
16053            SyntaxKind::TraitItemType,
16054            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16055            kind,
16056            SyntaxKind::TraitItemType
16057        );
16058        Self { node }
16059    }
16060    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16061        let kind = node.kind(db);
16062        if kind == SyntaxKind::TraitItemType {
16063            Some(Self::from_syntax_node(db, node))
16064        } else {
16065            None
16066        }
16067    }
16068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16069        self.node
16070    }
16071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16072        TraitItemTypePtr(self.node.stable_ptr(db))
16073    }
16074}
16075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16076pub struct TraitItemConstant<'db> {
16077    node: SyntaxNode<'db>,
16078}
16079impl<'db> TraitItemConstant<'db> {
16080    pub const INDEX_ATTRIBUTES: usize = 0;
16081    pub const INDEX_CONST_KW: usize = 1;
16082    pub const INDEX_NAME: usize = 2;
16083    pub const INDEX_TYPE_CLAUSE: usize = 3;
16084    pub const INDEX_SEMICOLON: usize = 4;
16085    pub fn new_green(
16086        db: &'db dyn Database,
16087        attributes: AttributeListGreen<'db>,
16088        const_kw: TerminalConstGreen<'db>,
16089        name: TerminalIdentifierGreen<'db>,
16090        type_clause: TypeClauseGreen<'db>,
16091        semicolon: TerminalSemicolonGreen<'db>,
16092    ) -> TraitItemConstantGreen<'db> {
16093        let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16094        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16095        TraitItemConstantGreen(
16096            GreenNode {
16097                kind: SyntaxKind::TraitItemConstant,
16098                details: GreenNodeDetails::Node { children: children.into(), width },
16099            }
16100            .intern(db),
16101        )
16102    }
16103}
16104impl<'db> TraitItemConstant<'db> {
16105    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16106        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16107    }
16108    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
16109        TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
16110    }
16111    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16112        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16113    }
16114    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
16115        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
16116    }
16117    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16118        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
16119    }
16120}
16121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16122pub struct TraitItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
16123impl<'db> TraitItemConstantPtr<'db> {
16124    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16125        let ptr = self.0.long(db);
16126        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16127            TerminalIdentifierGreen(key_fields[0])
16128        } else {
16129            panic!("Unexpected key field query on root.");
16130        }
16131    }
16132}
16133impl<'db> TypedStablePtr<'db> for TraitItemConstantPtr<'db> {
16134    type SyntaxNode = TraitItemConstant<'db>;
16135    fn untyped(self) -> SyntaxStablePtrId<'db> {
16136        self.0
16137    }
16138    fn lookup(&self, db: &'db dyn Database) -> TraitItemConstant<'db> {
16139        TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16140    }
16141}
16142impl<'db> From<TraitItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
16143    fn from(ptr: TraitItemConstantPtr<'db>) -> Self {
16144        ptr.untyped()
16145    }
16146}
16147#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16148pub struct TraitItemConstantGreen<'db>(pub GreenId<'db>);
16149impl<'db> TypedSyntaxNode<'db> for TraitItemConstant<'db> {
16150    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16151    type StablePtr = TraitItemConstantPtr<'db>;
16152    type Green = TraitItemConstantGreen<'db>;
16153    fn missing(db: &'db dyn Database) -> Self::Green {
16154        TraitItemConstantGreen(
16155            GreenNode {
16156                kind: SyntaxKind::TraitItemConstant,
16157                details: GreenNodeDetails::Node {
16158                    children: [
16159                        AttributeList::missing(db).0,
16160                        TerminalConst::missing(db).0,
16161                        TerminalIdentifier::missing(db).0,
16162                        TypeClause::missing(db).0,
16163                        TerminalSemicolon::missing(db).0,
16164                    ]
16165                    .into(),
16166                    width: TextWidth::default(),
16167                },
16168            }
16169            .intern(db),
16170        )
16171    }
16172    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16173        let kind = node.kind(db);
16174        assert_eq!(
16175            kind,
16176            SyntaxKind::TraitItemConstant,
16177            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16178            kind,
16179            SyntaxKind::TraitItemConstant
16180        );
16181        Self { node }
16182    }
16183    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16184        let kind = node.kind(db);
16185        if kind == SyntaxKind::TraitItemConstant {
16186            Some(Self::from_syntax_node(db, node))
16187        } else {
16188            None
16189        }
16190    }
16191    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16192        self.node
16193    }
16194    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16195        TraitItemConstantPtr(self.node.stable_ptr(db))
16196    }
16197}
16198#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16199pub struct TraitItemImpl<'db> {
16200    node: SyntaxNode<'db>,
16201}
16202impl<'db> TraitItemImpl<'db> {
16203    pub const INDEX_ATTRIBUTES: usize = 0;
16204    pub const INDEX_IMPL_KW: usize = 1;
16205    pub const INDEX_NAME: usize = 2;
16206    pub const INDEX_COLON: usize = 3;
16207    pub const INDEX_TRAIT_PATH: usize = 4;
16208    pub const INDEX_SEMICOLON: usize = 5;
16209    pub fn new_green(
16210        db: &'db dyn Database,
16211        attributes: AttributeListGreen<'db>,
16212        impl_kw: TerminalImplGreen<'db>,
16213        name: TerminalIdentifierGreen<'db>,
16214        colon: TerminalColonGreen<'db>,
16215        trait_path: ExprPathGreen<'db>,
16216        semicolon: TerminalSemicolonGreen<'db>,
16217    ) -> TraitItemImplGreen<'db> {
16218        let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16219        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16220        TraitItemImplGreen(
16221            GreenNode {
16222                kind: SyntaxKind::TraitItemImpl,
16223                details: GreenNodeDetails::Node { children: children.into(), width },
16224            }
16225            .intern(db),
16226        )
16227    }
16228}
16229impl<'db> TraitItemImpl<'db> {
16230    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16231        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16232    }
16233    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16234        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16235    }
16236    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16237        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16238    }
16239    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
16240        TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16241    }
16242    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16243        ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16244    }
16245    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16246        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16247    }
16248}
16249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16250pub struct TraitItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16251impl<'db> TraitItemImplPtr<'db> {
16252    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16253        let ptr = self.0.long(db);
16254        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16255            TerminalIdentifierGreen(key_fields[0])
16256        } else {
16257            panic!("Unexpected key field query on root.");
16258        }
16259    }
16260}
16261impl<'db> TypedStablePtr<'db> for TraitItemImplPtr<'db> {
16262    type SyntaxNode = TraitItemImpl<'db>;
16263    fn untyped(self) -> SyntaxStablePtrId<'db> {
16264        self.0
16265    }
16266    fn lookup(&self, db: &'db dyn Database) -> TraitItemImpl<'db> {
16267        TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16268    }
16269}
16270impl<'db> From<TraitItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16271    fn from(ptr: TraitItemImplPtr<'db>) -> Self {
16272        ptr.untyped()
16273    }
16274}
16275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16276pub struct TraitItemImplGreen<'db>(pub GreenId<'db>);
16277impl<'db> TypedSyntaxNode<'db> for TraitItemImpl<'db> {
16278    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16279    type StablePtr = TraitItemImplPtr<'db>;
16280    type Green = TraitItemImplGreen<'db>;
16281    fn missing(db: &'db dyn Database) -> Self::Green {
16282        TraitItemImplGreen(
16283            GreenNode {
16284                kind: SyntaxKind::TraitItemImpl,
16285                details: GreenNodeDetails::Node {
16286                    children: [
16287                        AttributeList::missing(db).0,
16288                        TerminalImpl::missing(db).0,
16289                        TerminalIdentifier::missing(db).0,
16290                        TerminalColon::missing(db).0,
16291                        ExprPath::missing(db).0,
16292                        TerminalSemicolon::missing(db).0,
16293                    ]
16294                    .into(),
16295                    width: TextWidth::default(),
16296                },
16297            }
16298            .intern(db),
16299        )
16300    }
16301    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16302        let kind = node.kind(db);
16303        assert_eq!(
16304            kind,
16305            SyntaxKind::TraitItemImpl,
16306            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16307            kind,
16308            SyntaxKind::TraitItemImpl
16309        );
16310        Self { node }
16311    }
16312    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16313        let kind = node.kind(db);
16314        if kind == SyntaxKind::TraitItemImpl {
16315            Some(Self::from_syntax_node(db, node))
16316        } else {
16317            None
16318        }
16319    }
16320    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16321        self.node
16322    }
16323    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16324        TraitItemImplPtr(self.node.stable_ptr(db))
16325    }
16326}
16327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16328pub enum MaybeTraitFunctionBody<'db> {
16329    Some(ExprBlock<'db>),
16330    None(TerminalSemicolon<'db>),
16331}
16332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16333pub struct MaybeTraitFunctionBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16334impl<'db> TypedStablePtr<'db> for MaybeTraitFunctionBodyPtr<'db> {
16335    type SyntaxNode = MaybeTraitFunctionBody<'db>;
16336    fn untyped(self) -> SyntaxStablePtrId<'db> {
16337        self.0
16338    }
16339    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16340        MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16341    }
16342}
16343impl<'db> From<MaybeTraitFunctionBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16344    fn from(ptr: MaybeTraitFunctionBodyPtr<'db>) -> Self {
16345        ptr.untyped()
16346    }
16347}
16348impl<'db> From<ExprBlockPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16349    fn from(value: ExprBlockPtr<'db>) -> Self {
16350        Self(value.0)
16351    }
16352}
16353impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16354    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16355        Self(value.0)
16356    }
16357}
16358impl<'db> From<ExprBlockGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16359    fn from(value: ExprBlockGreen<'db>) -> Self {
16360        Self(value.0)
16361    }
16362}
16363impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16364    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16365        Self(value.0)
16366    }
16367}
16368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16369pub struct MaybeTraitFunctionBodyGreen<'db>(pub GreenId<'db>);
16370impl<'db> TypedSyntaxNode<'db> for MaybeTraitFunctionBody<'db> {
16371    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16372    type StablePtr = MaybeTraitFunctionBodyPtr<'db>;
16373    type Green = MaybeTraitFunctionBodyGreen<'db>;
16374    fn missing(db: &'db dyn Database) -> Self::Green {
16375        panic!("No missing variant.");
16376    }
16377    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16378        let kind = node.kind(db);
16379        match kind {
16380            SyntaxKind::ExprBlock => {
16381                MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16382            }
16383            SyntaxKind::TerminalSemicolon => {
16384                MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16385            }
16386            _ => panic!(
16387                "Unexpected syntax kind {:?} when constructing {}.",
16388                kind, "MaybeTraitFunctionBody"
16389            ),
16390        }
16391    }
16392    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16393        let kind = node.kind(db);
16394        match kind {
16395            SyntaxKind::ExprBlock => {
16396                Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16397            }
16398            SyntaxKind::TerminalSemicolon => {
16399                Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16400            }
16401            _ => None,
16402        }
16403    }
16404    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16405        match self {
16406            MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16407            MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16408        }
16409    }
16410    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16411        MaybeTraitFunctionBodyPtr(self.as_syntax_node().long(db).stable_ptr)
16412    }
16413}
16414impl<'db> MaybeTraitFunctionBody<'db> {
16415    /// Checks if a kind of a variant of [MaybeTraitFunctionBody].
16416    pub fn is_variant(kind: SyntaxKind) -> bool {
16417        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16418    }
16419}
16420#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16421pub struct ItemImpl<'db> {
16422    node: SyntaxNode<'db>,
16423}
16424impl<'db> ItemImpl<'db> {
16425    pub const INDEX_ATTRIBUTES: usize = 0;
16426    pub const INDEX_VISIBILITY: usize = 1;
16427    pub const INDEX_IMPL_KW: usize = 2;
16428    pub const INDEX_NAME: usize = 3;
16429    pub const INDEX_GENERIC_PARAMS: usize = 4;
16430    pub const INDEX_OF_KW: usize = 5;
16431    pub const INDEX_TRAIT_PATH: usize = 6;
16432    pub const INDEX_BODY: usize = 7;
16433    pub fn new_green(
16434        db: &'db dyn Database,
16435        attributes: AttributeListGreen<'db>,
16436        visibility: VisibilityGreen<'db>,
16437        impl_kw: TerminalImplGreen<'db>,
16438        name: TerminalIdentifierGreen<'db>,
16439        generic_params: OptionWrappedGenericParamListGreen<'db>,
16440        of_kw: TerminalOfGreen<'db>,
16441        trait_path: ExprPathGreen<'db>,
16442        body: MaybeImplBodyGreen<'db>,
16443    ) -> ItemImplGreen<'db> {
16444        let children = [
16445            attributes.0,
16446            visibility.0,
16447            impl_kw.0,
16448            name.0,
16449            generic_params.0,
16450            of_kw.0,
16451            trait_path.0,
16452            body.0,
16453        ];
16454        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16455        ItemImplGreen(
16456            GreenNode {
16457                kind: SyntaxKind::ItemImpl,
16458                details: GreenNodeDetails::Node { children: children.into(), width },
16459            }
16460            .intern(db),
16461        )
16462    }
16463}
16464impl<'db> ItemImpl<'db> {
16465    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16466        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16467    }
16468    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
16469        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16470    }
16471    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16472        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16473    }
16474    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16475        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16476    }
16477    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
16478        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16479    }
16480    pub fn of_kw(&self, db: &'db dyn Database) -> TerminalOf<'db> {
16481        TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16482    }
16483    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16484        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16485    }
16486    pub fn body(&self, db: &'db dyn Database) -> MaybeImplBody<'db> {
16487        MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16488    }
16489}
16490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16491pub struct ItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16492impl<'db> ItemImplPtr<'db> {
16493    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16494        let ptr = self.0.long(db);
16495        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
16496            TerminalIdentifierGreen(key_fields[0])
16497        } else {
16498            panic!("Unexpected key field query on root.");
16499        }
16500    }
16501}
16502impl<'db> TypedStablePtr<'db> for ItemImplPtr<'db> {
16503    type SyntaxNode = ItemImpl<'db>;
16504    fn untyped(self) -> SyntaxStablePtrId<'db> {
16505        self.0
16506    }
16507    fn lookup(&self, db: &'db dyn Database) -> ItemImpl<'db> {
16508        ItemImpl::from_syntax_node(db, self.0.lookup(db))
16509    }
16510}
16511impl<'db> From<ItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16512    fn from(ptr: ItemImplPtr<'db>) -> Self {
16513        ptr.untyped()
16514    }
16515}
16516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16517pub struct ItemImplGreen<'db>(pub GreenId<'db>);
16518impl<'db> TypedSyntaxNode<'db> for ItemImpl<'db> {
16519    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16520    type StablePtr = ItemImplPtr<'db>;
16521    type Green = ItemImplGreen<'db>;
16522    fn missing(db: &'db dyn Database) -> Self::Green {
16523        ItemImplGreen(
16524            GreenNode {
16525                kind: SyntaxKind::ItemImpl,
16526                details: GreenNodeDetails::Node {
16527                    children: [
16528                        AttributeList::missing(db).0,
16529                        Visibility::missing(db).0,
16530                        TerminalImpl::missing(db).0,
16531                        TerminalIdentifier::missing(db).0,
16532                        OptionWrappedGenericParamList::missing(db).0,
16533                        TerminalOf::missing(db).0,
16534                        ExprPath::missing(db).0,
16535                        MaybeImplBody::missing(db).0,
16536                    ]
16537                    .into(),
16538                    width: TextWidth::default(),
16539                },
16540            }
16541            .intern(db),
16542        )
16543    }
16544    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16545        let kind = node.kind(db);
16546        assert_eq!(
16547            kind,
16548            SyntaxKind::ItemImpl,
16549            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16550            kind,
16551            SyntaxKind::ItemImpl
16552        );
16553        Self { node }
16554    }
16555    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16556        let kind = node.kind(db);
16557        if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16558    }
16559    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16560        self.node
16561    }
16562    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16563        ItemImplPtr(self.node.stable_ptr(db))
16564    }
16565}
16566#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16567pub struct ItemHeaderDoc<'db> {
16568    node: SyntaxNode<'db>,
16569}
16570impl<'db> ItemHeaderDoc<'db> {
16571    pub const INDEX_EMPTY: usize = 0;
16572    pub fn new_green(
16573        db: &'db dyn Database,
16574        empty: TerminalEmptyGreen<'db>,
16575    ) -> ItemHeaderDocGreen<'db> {
16576        let children = [empty.0];
16577        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16578        ItemHeaderDocGreen(
16579            GreenNode {
16580                kind: SyntaxKind::ItemHeaderDoc,
16581                details: GreenNodeDetails::Node { children: children.into(), width },
16582            }
16583            .intern(db),
16584        )
16585    }
16586}
16587impl<'db> ItemHeaderDoc<'db> {
16588    pub fn empty(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
16589        TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16590    }
16591}
16592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16593pub struct ItemHeaderDocPtr<'db>(pub SyntaxStablePtrId<'db>);
16594impl<'db> ItemHeaderDocPtr<'db> {}
16595impl<'db> TypedStablePtr<'db> for ItemHeaderDocPtr<'db> {
16596    type SyntaxNode = ItemHeaderDoc<'db>;
16597    fn untyped(self) -> SyntaxStablePtrId<'db> {
16598        self.0
16599    }
16600    fn lookup(&self, db: &'db dyn Database) -> ItemHeaderDoc<'db> {
16601        ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16602    }
16603}
16604impl<'db> From<ItemHeaderDocPtr<'db>> for SyntaxStablePtrId<'db> {
16605    fn from(ptr: ItemHeaderDocPtr<'db>) -> Self {
16606        ptr.untyped()
16607    }
16608}
16609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16610pub struct ItemHeaderDocGreen<'db>(pub GreenId<'db>);
16611impl<'db> TypedSyntaxNode<'db> for ItemHeaderDoc<'db> {
16612    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16613    type StablePtr = ItemHeaderDocPtr<'db>;
16614    type Green = ItemHeaderDocGreen<'db>;
16615    fn missing(db: &'db dyn Database) -> Self::Green {
16616        ItemHeaderDocGreen(
16617            GreenNode {
16618                kind: SyntaxKind::ItemHeaderDoc,
16619                details: GreenNodeDetails::Node {
16620                    children: [TerminalEmpty::missing(db).0].into(),
16621                    width: TextWidth::default(),
16622                },
16623            }
16624            .intern(db),
16625        )
16626    }
16627    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16628        let kind = node.kind(db);
16629        assert_eq!(
16630            kind,
16631            SyntaxKind::ItemHeaderDoc,
16632            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16633            kind,
16634            SyntaxKind::ItemHeaderDoc
16635        );
16636        Self { node }
16637    }
16638    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16639        let kind = node.kind(db);
16640        if kind == SyntaxKind::ItemHeaderDoc {
16641            Some(Self::from_syntax_node(db, node))
16642        } else {
16643            None
16644        }
16645    }
16646    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16647        self.node
16648    }
16649    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16650        ItemHeaderDocPtr(self.node.stable_ptr(db))
16651    }
16652}
16653#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16654pub enum MaybeImplBody<'db> {
16655    Some(ImplBody<'db>),
16656    None(TerminalSemicolon<'db>),
16657}
16658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16659pub struct MaybeImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16660impl<'db> TypedStablePtr<'db> for MaybeImplBodyPtr<'db> {
16661    type SyntaxNode = MaybeImplBody<'db>;
16662    fn untyped(self) -> SyntaxStablePtrId<'db> {
16663        self.0
16664    }
16665    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16666        MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16667    }
16668}
16669impl<'db> From<MaybeImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16670    fn from(ptr: MaybeImplBodyPtr<'db>) -> Self {
16671        ptr.untyped()
16672    }
16673}
16674impl<'db> From<ImplBodyPtr<'db>> for MaybeImplBodyPtr<'db> {
16675    fn from(value: ImplBodyPtr<'db>) -> Self {
16676        Self(value.0)
16677    }
16678}
16679impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeImplBodyPtr<'db> {
16680    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16681        Self(value.0)
16682    }
16683}
16684impl<'db> From<ImplBodyGreen<'db>> for MaybeImplBodyGreen<'db> {
16685    fn from(value: ImplBodyGreen<'db>) -> Self {
16686        Self(value.0)
16687    }
16688}
16689impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeImplBodyGreen<'db> {
16690    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16691        Self(value.0)
16692    }
16693}
16694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16695pub struct MaybeImplBodyGreen<'db>(pub GreenId<'db>);
16696impl<'db> TypedSyntaxNode<'db> for MaybeImplBody<'db> {
16697    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16698    type StablePtr = MaybeImplBodyPtr<'db>;
16699    type Green = MaybeImplBodyGreen<'db>;
16700    fn missing(db: &'db dyn Database) -> Self::Green {
16701        panic!("No missing variant.");
16702    }
16703    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16704        let kind = node.kind(db);
16705        match kind {
16706            SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16707            SyntaxKind::TerminalSemicolon => {
16708                MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16709            }
16710            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16711        }
16712    }
16713    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16714        let kind = node.kind(db);
16715        match kind {
16716            SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16717            SyntaxKind::TerminalSemicolon => {
16718                Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16719            }
16720            _ => None,
16721        }
16722    }
16723    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16724        match self {
16725            MaybeImplBody::Some(x) => x.as_syntax_node(),
16726            MaybeImplBody::None(x) => x.as_syntax_node(),
16727        }
16728    }
16729    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16730        MaybeImplBodyPtr(self.as_syntax_node().long(db).stable_ptr)
16731    }
16732}
16733impl<'db> MaybeImplBody<'db> {
16734    /// Checks if a kind of a variant of [MaybeImplBody].
16735    pub fn is_variant(kind: SyntaxKind) -> bool {
16736        matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16737    }
16738}
16739#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16740pub struct ImplBody<'db> {
16741    node: SyntaxNode<'db>,
16742}
16743impl<'db> ImplBody<'db> {
16744    pub const INDEX_LBRACE: usize = 0;
16745    pub const INDEX_ITEMS: usize = 1;
16746    pub const INDEX_RBRACE: usize = 2;
16747    pub fn new_green(
16748        db: &'db dyn Database,
16749        lbrace: TerminalLBraceGreen<'db>,
16750        items: ImplItemListGreen<'db>,
16751        rbrace: TerminalRBraceGreen<'db>,
16752    ) -> ImplBodyGreen<'db> {
16753        let children = [lbrace.0, items.0, rbrace.0];
16754        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16755        ImplBodyGreen(
16756            GreenNode {
16757                kind: SyntaxKind::ImplBody,
16758                details: GreenNodeDetails::Node { children: children.into(), width },
16759            }
16760            .intern(db),
16761        )
16762    }
16763}
16764impl<'db> ImplBody<'db> {
16765    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
16766        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16767    }
16768    pub fn items(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16769        ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16770    }
16771    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
16772        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16773    }
16774}
16775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16776pub struct ImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16777impl<'db> ImplBodyPtr<'db> {}
16778impl<'db> TypedStablePtr<'db> for ImplBodyPtr<'db> {
16779    type SyntaxNode = ImplBody<'db>;
16780    fn untyped(self) -> SyntaxStablePtrId<'db> {
16781        self.0
16782    }
16783    fn lookup(&self, db: &'db dyn Database) -> ImplBody<'db> {
16784        ImplBody::from_syntax_node(db, self.0.lookup(db))
16785    }
16786}
16787impl<'db> From<ImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16788    fn from(ptr: ImplBodyPtr<'db>) -> Self {
16789        ptr.untyped()
16790    }
16791}
16792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16793pub struct ImplBodyGreen<'db>(pub GreenId<'db>);
16794impl<'db> TypedSyntaxNode<'db> for ImplBody<'db> {
16795    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16796    type StablePtr = ImplBodyPtr<'db>;
16797    type Green = ImplBodyGreen<'db>;
16798    fn missing(db: &'db dyn Database) -> Self::Green {
16799        ImplBodyGreen(
16800            GreenNode {
16801                kind: SyntaxKind::ImplBody,
16802                details: GreenNodeDetails::Node {
16803                    children: [
16804                        TerminalLBrace::missing(db).0,
16805                        ImplItemList::missing(db).0,
16806                        TerminalRBrace::missing(db).0,
16807                    ]
16808                    .into(),
16809                    width: TextWidth::default(),
16810                },
16811            }
16812            .intern(db),
16813        )
16814    }
16815    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16816        let kind = node.kind(db);
16817        assert_eq!(
16818            kind,
16819            SyntaxKind::ImplBody,
16820            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16821            kind,
16822            SyntaxKind::ImplBody
16823        );
16824        Self { node }
16825    }
16826    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16827        let kind = node.kind(db);
16828        if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16829    }
16830    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16831        self.node
16832    }
16833    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16834        ImplBodyPtr(self.node.stable_ptr(db))
16835    }
16836}
16837#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16838pub struct ImplItemList<'db>(ElementList<'db, ImplItem<'db>, 1>);
16839impl<'db> Deref for ImplItemList<'db> {
16840    type Target = ElementList<'db, ImplItem<'db>, 1>;
16841    fn deref(&self) -> &Self::Target {
16842        &self.0
16843    }
16844}
16845impl<'db> ImplItemList<'db> {
16846    pub fn new_green(
16847        db: &'db dyn Database,
16848        children: &[ImplItemGreen<'db>],
16849    ) -> ImplItemListGreen<'db> {
16850        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
16851        ImplItemListGreen(
16852            GreenNode {
16853                kind: SyntaxKind::ImplItemList,
16854                details: GreenNodeDetails::Node {
16855                    children: children.iter().map(|x| x.0).collect(),
16856                    width,
16857                },
16858            }
16859            .intern(db),
16860        )
16861    }
16862}
16863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16864pub struct ImplItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
16865impl<'db> TypedStablePtr<'db> for ImplItemListPtr<'db> {
16866    type SyntaxNode = ImplItemList<'db>;
16867    fn untyped(self) -> SyntaxStablePtrId<'db> {
16868        self.0
16869    }
16870    fn lookup(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16871        ImplItemList::from_syntax_node(db, self.0.lookup(db))
16872    }
16873}
16874impl<'db> From<ImplItemListPtr<'db>> for SyntaxStablePtrId<'db> {
16875    fn from(ptr: ImplItemListPtr<'db>) -> Self {
16876        ptr.untyped()
16877    }
16878}
16879#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16880pub struct ImplItemListGreen<'db>(pub GreenId<'db>);
16881impl<'db> TypedSyntaxNode<'db> for ImplItemList<'db> {
16882    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16883    type StablePtr = ImplItemListPtr<'db>;
16884    type Green = ImplItemListGreen<'db>;
16885    fn missing(db: &'db dyn Database) -> Self::Green {
16886        ImplItemListGreen(
16887            GreenNode {
16888                kind: SyntaxKind::ImplItemList,
16889                details: GreenNodeDetails::Node {
16890                    children: [].into(),
16891                    width: TextWidth::default(),
16892                },
16893            }
16894            .intern(db),
16895        )
16896    }
16897    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16898        Self(ElementList::new(node))
16899    }
16900    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16901        if node.kind(db) == SyntaxKind::ImplItemList {
16902            Some(Self(ElementList::new(node)))
16903        } else {
16904            None
16905        }
16906    }
16907    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16908        self.node
16909    }
16910    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16911        ImplItemListPtr(self.node.stable_ptr(db))
16912    }
16913}
16914#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16915pub enum ImplItem<'db> {
16916    Function(FunctionWithBody<'db>),
16917    Type(ItemTypeAlias<'db>),
16918    Constant(ItemConstant<'db>),
16919    Impl(ItemImplAlias<'db>),
16920    Module(ItemModule<'db>),
16921    Use(ItemUse<'db>),
16922    ExternFunction(ItemExternFunction<'db>),
16923    ExternType(ItemExternType<'db>),
16924    Trait(ItemTrait<'db>),
16925    Struct(ItemStruct<'db>),
16926    Enum(ItemEnum<'db>),
16927    Missing(ImplItemMissing<'db>),
16928}
16929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16930pub struct ImplItemPtr<'db>(pub SyntaxStablePtrId<'db>);
16931impl<'db> TypedStablePtr<'db> for ImplItemPtr<'db> {
16932    type SyntaxNode = ImplItem<'db>;
16933    fn untyped(self) -> SyntaxStablePtrId<'db> {
16934        self.0
16935    }
16936    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16937        ImplItem::from_syntax_node(db, self.0.lookup(db))
16938    }
16939}
16940impl<'db> From<ImplItemPtr<'db>> for SyntaxStablePtrId<'db> {
16941    fn from(ptr: ImplItemPtr<'db>) -> Self {
16942        ptr.untyped()
16943    }
16944}
16945impl<'db> From<FunctionWithBodyPtr<'db>> for ImplItemPtr<'db> {
16946    fn from(value: FunctionWithBodyPtr<'db>) -> Self {
16947        Self(value.0)
16948    }
16949}
16950impl<'db> From<ItemTypeAliasPtr<'db>> for ImplItemPtr<'db> {
16951    fn from(value: ItemTypeAliasPtr<'db>) -> Self {
16952        Self(value.0)
16953    }
16954}
16955impl<'db> From<ItemConstantPtr<'db>> for ImplItemPtr<'db> {
16956    fn from(value: ItemConstantPtr<'db>) -> Self {
16957        Self(value.0)
16958    }
16959}
16960impl<'db> From<ItemImplAliasPtr<'db>> for ImplItemPtr<'db> {
16961    fn from(value: ItemImplAliasPtr<'db>) -> Self {
16962        Self(value.0)
16963    }
16964}
16965impl<'db> From<ItemModulePtr<'db>> for ImplItemPtr<'db> {
16966    fn from(value: ItemModulePtr<'db>) -> Self {
16967        Self(value.0)
16968    }
16969}
16970impl<'db> From<ItemUsePtr<'db>> for ImplItemPtr<'db> {
16971    fn from(value: ItemUsePtr<'db>) -> Self {
16972        Self(value.0)
16973    }
16974}
16975impl<'db> From<ItemExternFunctionPtr<'db>> for ImplItemPtr<'db> {
16976    fn from(value: ItemExternFunctionPtr<'db>) -> Self {
16977        Self(value.0)
16978    }
16979}
16980impl<'db> From<ItemExternTypePtr<'db>> for ImplItemPtr<'db> {
16981    fn from(value: ItemExternTypePtr<'db>) -> Self {
16982        Self(value.0)
16983    }
16984}
16985impl<'db> From<ItemTraitPtr<'db>> for ImplItemPtr<'db> {
16986    fn from(value: ItemTraitPtr<'db>) -> Self {
16987        Self(value.0)
16988    }
16989}
16990impl<'db> From<ItemStructPtr<'db>> for ImplItemPtr<'db> {
16991    fn from(value: ItemStructPtr<'db>) -> Self {
16992        Self(value.0)
16993    }
16994}
16995impl<'db> From<ItemEnumPtr<'db>> for ImplItemPtr<'db> {
16996    fn from(value: ItemEnumPtr<'db>) -> Self {
16997        Self(value.0)
16998    }
16999}
17000impl<'db> From<ImplItemMissingPtr<'db>> for ImplItemPtr<'db> {
17001    fn from(value: ImplItemMissingPtr<'db>) -> Self {
17002        Self(value.0)
17003    }
17004}
17005impl<'db> From<FunctionWithBodyGreen<'db>> for ImplItemGreen<'db> {
17006    fn from(value: FunctionWithBodyGreen<'db>) -> Self {
17007        Self(value.0)
17008    }
17009}
17010impl<'db> From<ItemTypeAliasGreen<'db>> for ImplItemGreen<'db> {
17011    fn from(value: ItemTypeAliasGreen<'db>) -> Self {
17012        Self(value.0)
17013    }
17014}
17015impl<'db> From<ItemConstantGreen<'db>> for ImplItemGreen<'db> {
17016    fn from(value: ItemConstantGreen<'db>) -> Self {
17017        Self(value.0)
17018    }
17019}
17020impl<'db> From<ItemImplAliasGreen<'db>> for ImplItemGreen<'db> {
17021    fn from(value: ItemImplAliasGreen<'db>) -> Self {
17022        Self(value.0)
17023    }
17024}
17025impl<'db> From<ItemModuleGreen<'db>> for ImplItemGreen<'db> {
17026    fn from(value: ItemModuleGreen<'db>) -> Self {
17027        Self(value.0)
17028    }
17029}
17030impl<'db> From<ItemUseGreen<'db>> for ImplItemGreen<'db> {
17031    fn from(value: ItemUseGreen<'db>) -> Self {
17032        Self(value.0)
17033    }
17034}
17035impl<'db> From<ItemExternFunctionGreen<'db>> for ImplItemGreen<'db> {
17036    fn from(value: ItemExternFunctionGreen<'db>) -> Self {
17037        Self(value.0)
17038    }
17039}
17040impl<'db> From<ItemExternTypeGreen<'db>> for ImplItemGreen<'db> {
17041    fn from(value: ItemExternTypeGreen<'db>) -> Self {
17042        Self(value.0)
17043    }
17044}
17045impl<'db> From<ItemTraitGreen<'db>> for ImplItemGreen<'db> {
17046    fn from(value: ItemTraitGreen<'db>) -> Self {
17047        Self(value.0)
17048    }
17049}
17050impl<'db> From<ItemStructGreen<'db>> for ImplItemGreen<'db> {
17051    fn from(value: ItemStructGreen<'db>) -> Self {
17052        Self(value.0)
17053    }
17054}
17055impl<'db> From<ItemEnumGreen<'db>> for ImplItemGreen<'db> {
17056    fn from(value: ItemEnumGreen<'db>) -> Self {
17057        Self(value.0)
17058    }
17059}
17060impl<'db> From<ImplItemMissingGreen<'db>> for ImplItemGreen<'db> {
17061    fn from(value: ImplItemMissingGreen<'db>) -> Self {
17062        Self(value.0)
17063    }
17064}
17065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17066pub struct ImplItemGreen<'db>(pub GreenId<'db>);
17067impl<'db> TypedSyntaxNode<'db> for ImplItem<'db> {
17068    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17069    type StablePtr = ImplItemPtr<'db>;
17070    type Green = ImplItemGreen<'db>;
17071    fn missing(db: &'db dyn Database) -> Self::Green {
17072        ImplItemGreen(ImplItemMissing::missing(db).0)
17073    }
17074    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17075        let kind = node.kind(db);
17076        match kind {
17077            SyntaxKind::FunctionWithBody => {
17078                ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
17079            }
17080            SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17081            SyntaxKind::ItemConstant => {
17082                ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17083            }
17084            SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17085            SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17086            SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17087            SyntaxKind::ItemExternFunction => {
17088                ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17089            }
17090            SyntaxKind::ItemExternType => {
17091                ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17092            }
17093            SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17094            SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17095            SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17096            SyntaxKind::ImplItemMissing => {
17097                ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17098            }
17099            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17100        }
17101    }
17102    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17103        let kind = node.kind(db);
17104        match kind {
17105            SyntaxKind::FunctionWithBody => {
17106                Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17107            }
17108            SyntaxKind::ItemTypeAlias => {
17109                Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17110            }
17111            SyntaxKind::ItemConstant => {
17112                Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17113            }
17114            SyntaxKind::ItemImplAlias => {
17115                Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17116            }
17117            SyntaxKind::ItemModule => {
17118                Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17119            }
17120            SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17121            SyntaxKind::ItemExternFunction => {
17122                Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17123            }
17124            SyntaxKind::ItemExternType => {
17125                Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17126            }
17127            SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17128            SyntaxKind::ItemStruct => {
17129                Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17130            }
17131            SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17132            SyntaxKind::ImplItemMissing => {
17133                Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17134            }
17135            _ => None,
17136        }
17137    }
17138    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17139        match self {
17140            ImplItem::Function(x) => x.as_syntax_node(),
17141            ImplItem::Type(x) => x.as_syntax_node(),
17142            ImplItem::Constant(x) => x.as_syntax_node(),
17143            ImplItem::Impl(x) => x.as_syntax_node(),
17144            ImplItem::Module(x) => x.as_syntax_node(),
17145            ImplItem::Use(x) => x.as_syntax_node(),
17146            ImplItem::ExternFunction(x) => x.as_syntax_node(),
17147            ImplItem::ExternType(x) => x.as_syntax_node(),
17148            ImplItem::Trait(x) => x.as_syntax_node(),
17149            ImplItem::Struct(x) => x.as_syntax_node(),
17150            ImplItem::Enum(x) => x.as_syntax_node(),
17151            ImplItem::Missing(x) => x.as_syntax_node(),
17152        }
17153    }
17154    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17155        ImplItemPtr(self.as_syntax_node().long(db).stable_ptr)
17156    }
17157}
17158impl<'db> ImplItem<'db> {
17159    /// Checks if a kind of a variant of [ImplItem].
17160    pub fn is_variant(kind: SyntaxKind) -> bool {
17161        matches!(
17162            kind,
17163            SyntaxKind::FunctionWithBody
17164                | SyntaxKind::ItemTypeAlias
17165                | SyntaxKind::ItemConstant
17166                | SyntaxKind::ItemImplAlias
17167                | SyntaxKind::ItemModule
17168                | SyntaxKind::ItemUse
17169                | SyntaxKind::ItemExternFunction
17170                | SyntaxKind::ItemExternType
17171                | SyntaxKind::ItemTrait
17172                | SyntaxKind::ItemStruct
17173                | SyntaxKind::ItemEnum
17174                | SyntaxKind::ImplItemMissing
17175        )
17176    }
17177}
17178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17179pub struct ImplItemMissing<'db> {
17180    node: SyntaxNode<'db>,
17181}
17182impl<'db> ImplItemMissing<'db> {
17183    pub fn new_green(db: &'db dyn Database) -> ImplItemMissingGreen<'db> {
17184        let children = [];
17185        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17186        ImplItemMissingGreen(
17187            GreenNode {
17188                kind: SyntaxKind::ImplItemMissing,
17189                details: GreenNodeDetails::Node { children: children.into(), width },
17190            }
17191            .intern(db),
17192        )
17193    }
17194}
17195impl<'db> ImplItemMissing<'db> {}
17196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17197pub struct ImplItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
17198impl<'db> ImplItemMissingPtr<'db> {}
17199impl<'db> TypedStablePtr<'db> for ImplItemMissingPtr<'db> {
17200    type SyntaxNode = ImplItemMissing<'db>;
17201    fn untyped(self) -> SyntaxStablePtrId<'db> {
17202        self.0
17203    }
17204    fn lookup(&self, db: &'db dyn Database) -> ImplItemMissing<'db> {
17205        ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17206    }
17207}
17208impl<'db> From<ImplItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
17209    fn from(ptr: ImplItemMissingPtr<'db>) -> Self {
17210        ptr.untyped()
17211    }
17212}
17213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17214pub struct ImplItemMissingGreen<'db>(pub GreenId<'db>);
17215impl<'db> TypedSyntaxNode<'db> for ImplItemMissing<'db> {
17216    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17217    type StablePtr = ImplItemMissingPtr<'db>;
17218    type Green = ImplItemMissingGreen<'db>;
17219    fn missing(db: &'db dyn Database) -> Self::Green {
17220        ImplItemMissingGreen(
17221            GreenNode {
17222                kind: SyntaxKind::ImplItemMissing,
17223                details: GreenNodeDetails::Node {
17224                    children: [].into(),
17225                    width: TextWidth::default(),
17226                },
17227            }
17228            .intern(db),
17229        )
17230    }
17231    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17232        let kind = node.kind(db);
17233        assert_eq!(
17234            kind,
17235            SyntaxKind::ImplItemMissing,
17236            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17237            kind,
17238            SyntaxKind::ImplItemMissing
17239        );
17240        Self { node }
17241    }
17242    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17243        let kind = node.kind(db);
17244        if kind == SyntaxKind::ImplItemMissing {
17245            Some(Self::from_syntax_node(db, node))
17246        } else {
17247            None
17248        }
17249    }
17250    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17251        self.node
17252    }
17253    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17254        ImplItemMissingPtr(self.node.stable_ptr(db))
17255    }
17256}
17257#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17258pub struct ItemImplAlias<'db> {
17259    node: SyntaxNode<'db>,
17260}
17261impl<'db> ItemImplAlias<'db> {
17262    pub const INDEX_ATTRIBUTES: usize = 0;
17263    pub const INDEX_VISIBILITY: usize = 1;
17264    pub const INDEX_IMPL_KW: usize = 2;
17265    pub const INDEX_NAME: usize = 3;
17266    pub const INDEX_GENERIC_PARAMS: usize = 4;
17267    pub const INDEX_EQ: usize = 5;
17268    pub const INDEX_IMPL_PATH: usize = 6;
17269    pub const INDEX_SEMICOLON: usize = 7;
17270    pub fn new_green(
17271        db: &'db dyn Database,
17272        attributes: AttributeListGreen<'db>,
17273        visibility: VisibilityGreen<'db>,
17274        impl_kw: TerminalImplGreen<'db>,
17275        name: TerminalIdentifierGreen<'db>,
17276        generic_params: OptionWrappedGenericParamListGreen<'db>,
17277        eq: TerminalEqGreen<'db>,
17278        impl_path: ExprPathGreen<'db>,
17279        semicolon: TerminalSemicolonGreen<'db>,
17280    ) -> ItemImplAliasGreen<'db> {
17281        let children = [
17282            attributes.0,
17283            visibility.0,
17284            impl_kw.0,
17285            name.0,
17286            generic_params.0,
17287            eq.0,
17288            impl_path.0,
17289            semicolon.0,
17290        ];
17291        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17292        ItemImplAliasGreen(
17293            GreenNode {
17294                kind: SyntaxKind::ItemImplAlias,
17295                details: GreenNodeDetails::Node { children: children.into(), width },
17296            }
17297            .intern(db),
17298        )
17299    }
17300}
17301impl<'db> ItemImplAlias<'db> {
17302    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17303        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17304    }
17305    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17306        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17307    }
17308    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
17309        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17310    }
17311    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17312        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17313    }
17314    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17315        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17316    }
17317    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17318        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17319    }
17320    pub fn impl_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
17321        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17322    }
17323    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17324        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17325    }
17326}
17327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17328pub struct ItemImplAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17329impl<'db> ItemImplAliasPtr<'db> {
17330    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17331        let ptr = self.0.long(db);
17332        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17333            TerminalIdentifierGreen(key_fields[0])
17334        } else {
17335            panic!("Unexpected key field query on root.");
17336        }
17337    }
17338}
17339impl<'db> TypedStablePtr<'db> for ItemImplAliasPtr<'db> {
17340    type SyntaxNode = ItemImplAlias<'db>;
17341    fn untyped(self) -> SyntaxStablePtrId<'db> {
17342        self.0
17343    }
17344    fn lookup(&self, db: &'db dyn Database) -> ItemImplAlias<'db> {
17345        ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17346    }
17347}
17348impl<'db> From<ItemImplAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17349    fn from(ptr: ItemImplAliasPtr<'db>) -> Self {
17350        ptr.untyped()
17351    }
17352}
17353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17354pub struct ItemImplAliasGreen<'db>(pub GreenId<'db>);
17355impl<'db> TypedSyntaxNode<'db> for ItemImplAlias<'db> {
17356    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17357    type StablePtr = ItemImplAliasPtr<'db>;
17358    type Green = ItemImplAliasGreen<'db>;
17359    fn missing(db: &'db dyn Database) -> Self::Green {
17360        ItemImplAliasGreen(
17361            GreenNode {
17362                kind: SyntaxKind::ItemImplAlias,
17363                details: GreenNodeDetails::Node {
17364                    children: [
17365                        AttributeList::missing(db).0,
17366                        Visibility::missing(db).0,
17367                        TerminalImpl::missing(db).0,
17368                        TerminalIdentifier::missing(db).0,
17369                        OptionWrappedGenericParamList::missing(db).0,
17370                        TerminalEq::missing(db).0,
17371                        ExprPath::missing(db).0,
17372                        TerminalSemicolon::missing(db).0,
17373                    ]
17374                    .into(),
17375                    width: TextWidth::default(),
17376                },
17377            }
17378            .intern(db),
17379        )
17380    }
17381    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17382        let kind = node.kind(db);
17383        assert_eq!(
17384            kind,
17385            SyntaxKind::ItemImplAlias,
17386            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17387            kind,
17388            SyntaxKind::ItemImplAlias
17389        );
17390        Self { node }
17391    }
17392    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17393        let kind = node.kind(db);
17394        if kind == SyntaxKind::ItemImplAlias {
17395            Some(Self::from_syntax_node(db, node))
17396        } else {
17397            None
17398        }
17399    }
17400    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17401        self.node
17402    }
17403    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17404        ItemImplAliasPtr(self.node.stable_ptr(db))
17405    }
17406}
17407#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17408pub struct ItemStruct<'db> {
17409    node: SyntaxNode<'db>,
17410}
17411impl<'db> ItemStruct<'db> {
17412    pub const INDEX_ATTRIBUTES: usize = 0;
17413    pub const INDEX_VISIBILITY: usize = 1;
17414    pub const INDEX_STRUCT_KW: usize = 2;
17415    pub const INDEX_NAME: usize = 3;
17416    pub const INDEX_GENERIC_PARAMS: usize = 4;
17417    pub const INDEX_LBRACE: usize = 5;
17418    pub const INDEX_MEMBERS: usize = 6;
17419    pub const INDEX_RBRACE: usize = 7;
17420    pub fn new_green(
17421        db: &'db dyn Database,
17422        attributes: AttributeListGreen<'db>,
17423        visibility: VisibilityGreen<'db>,
17424        struct_kw: TerminalStructGreen<'db>,
17425        name: TerminalIdentifierGreen<'db>,
17426        generic_params: OptionWrappedGenericParamListGreen<'db>,
17427        lbrace: TerminalLBraceGreen<'db>,
17428        members: MemberListGreen<'db>,
17429        rbrace: TerminalRBraceGreen<'db>,
17430    ) -> ItemStructGreen<'db> {
17431        let children = [
17432            attributes.0,
17433            visibility.0,
17434            struct_kw.0,
17435            name.0,
17436            generic_params.0,
17437            lbrace.0,
17438            members.0,
17439            rbrace.0,
17440        ];
17441        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17442        ItemStructGreen(
17443            GreenNode {
17444                kind: SyntaxKind::ItemStruct,
17445                details: GreenNodeDetails::Node { children: children.into(), width },
17446            }
17447            .intern(db),
17448        )
17449    }
17450}
17451impl<'db> ItemStruct<'db> {
17452    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17453        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17454    }
17455    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17456        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17457    }
17458    pub fn struct_kw(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
17459        TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17460    }
17461    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17462        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17463    }
17464    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17465        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17466    }
17467    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17468        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17469    }
17470    pub fn members(&self, db: &'db dyn Database) -> MemberList<'db> {
17471        MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17472    }
17473    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17474        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17475    }
17476}
17477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17478pub struct ItemStructPtr<'db>(pub SyntaxStablePtrId<'db>);
17479impl<'db> ItemStructPtr<'db> {
17480    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17481        let ptr = self.0.long(db);
17482        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17483            TerminalIdentifierGreen(key_fields[0])
17484        } else {
17485            panic!("Unexpected key field query on root.");
17486        }
17487    }
17488}
17489impl<'db> TypedStablePtr<'db> for ItemStructPtr<'db> {
17490    type SyntaxNode = ItemStruct<'db>;
17491    fn untyped(self) -> SyntaxStablePtrId<'db> {
17492        self.0
17493    }
17494    fn lookup(&self, db: &'db dyn Database) -> ItemStruct<'db> {
17495        ItemStruct::from_syntax_node(db, self.0.lookup(db))
17496    }
17497}
17498impl<'db> From<ItemStructPtr<'db>> for SyntaxStablePtrId<'db> {
17499    fn from(ptr: ItemStructPtr<'db>) -> Self {
17500        ptr.untyped()
17501    }
17502}
17503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17504pub struct ItemStructGreen<'db>(pub GreenId<'db>);
17505impl<'db> TypedSyntaxNode<'db> for ItemStruct<'db> {
17506    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17507    type StablePtr = ItemStructPtr<'db>;
17508    type Green = ItemStructGreen<'db>;
17509    fn missing(db: &'db dyn Database) -> Self::Green {
17510        ItemStructGreen(
17511            GreenNode {
17512                kind: SyntaxKind::ItemStruct,
17513                details: GreenNodeDetails::Node {
17514                    children: [
17515                        AttributeList::missing(db).0,
17516                        Visibility::missing(db).0,
17517                        TerminalStruct::missing(db).0,
17518                        TerminalIdentifier::missing(db).0,
17519                        OptionWrappedGenericParamList::missing(db).0,
17520                        TerminalLBrace::missing(db).0,
17521                        MemberList::missing(db).0,
17522                        TerminalRBrace::missing(db).0,
17523                    ]
17524                    .into(),
17525                    width: TextWidth::default(),
17526                },
17527            }
17528            .intern(db),
17529        )
17530    }
17531    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17532        let kind = node.kind(db);
17533        assert_eq!(
17534            kind,
17535            SyntaxKind::ItemStruct,
17536            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17537            kind,
17538            SyntaxKind::ItemStruct
17539        );
17540        Self { node }
17541    }
17542    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17543        let kind = node.kind(db);
17544        if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17545    }
17546    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17547        self.node
17548    }
17549    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17550        ItemStructPtr(self.node.stable_ptr(db))
17551    }
17552}
17553#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17554pub struct ItemEnum<'db> {
17555    node: SyntaxNode<'db>,
17556}
17557impl<'db> ItemEnum<'db> {
17558    pub const INDEX_ATTRIBUTES: usize = 0;
17559    pub const INDEX_VISIBILITY: usize = 1;
17560    pub const INDEX_ENUM_KW: usize = 2;
17561    pub const INDEX_NAME: usize = 3;
17562    pub const INDEX_GENERIC_PARAMS: usize = 4;
17563    pub const INDEX_LBRACE: usize = 5;
17564    pub const INDEX_VARIANTS: usize = 6;
17565    pub const INDEX_RBRACE: usize = 7;
17566    pub fn new_green(
17567        db: &'db dyn Database,
17568        attributes: AttributeListGreen<'db>,
17569        visibility: VisibilityGreen<'db>,
17570        enum_kw: TerminalEnumGreen<'db>,
17571        name: TerminalIdentifierGreen<'db>,
17572        generic_params: OptionWrappedGenericParamListGreen<'db>,
17573        lbrace: TerminalLBraceGreen<'db>,
17574        variants: VariantListGreen<'db>,
17575        rbrace: TerminalRBraceGreen<'db>,
17576    ) -> ItemEnumGreen<'db> {
17577        let children = [
17578            attributes.0,
17579            visibility.0,
17580            enum_kw.0,
17581            name.0,
17582            generic_params.0,
17583            lbrace.0,
17584            variants.0,
17585            rbrace.0,
17586        ];
17587        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17588        ItemEnumGreen(
17589            GreenNode {
17590                kind: SyntaxKind::ItemEnum,
17591                details: GreenNodeDetails::Node { children: children.into(), width },
17592            }
17593            .intern(db),
17594        )
17595    }
17596}
17597impl<'db> ItemEnum<'db> {
17598    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17599        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17600    }
17601    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17602        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17603    }
17604    pub fn enum_kw(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
17605        TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17606    }
17607    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17608        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17609    }
17610    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17611        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17612    }
17613    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17614        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17615    }
17616    pub fn variants(&self, db: &'db dyn Database) -> VariantList<'db> {
17617        VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17618    }
17619    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17620        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17621    }
17622}
17623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17624pub struct ItemEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
17625impl<'db> ItemEnumPtr<'db> {
17626    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17627        let ptr = self.0.long(db);
17628        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17629            TerminalIdentifierGreen(key_fields[0])
17630        } else {
17631            panic!("Unexpected key field query on root.");
17632        }
17633    }
17634}
17635impl<'db> TypedStablePtr<'db> for ItemEnumPtr<'db> {
17636    type SyntaxNode = ItemEnum<'db>;
17637    fn untyped(self) -> SyntaxStablePtrId<'db> {
17638        self.0
17639    }
17640    fn lookup(&self, db: &'db dyn Database) -> ItemEnum<'db> {
17641        ItemEnum::from_syntax_node(db, self.0.lookup(db))
17642    }
17643}
17644impl<'db> From<ItemEnumPtr<'db>> for SyntaxStablePtrId<'db> {
17645    fn from(ptr: ItemEnumPtr<'db>) -> Self {
17646        ptr.untyped()
17647    }
17648}
17649#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17650pub struct ItemEnumGreen<'db>(pub GreenId<'db>);
17651impl<'db> TypedSyntaxNode<'db> for ItemEnum<'db> {
17652    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17653    type StablePtr = ItemEnumPtr<'db>;
17654    type Green = ItemEnumGreen<'db>;
17655    fn missing(db: &'db dyn Database) -> Self::Green {
17656        ItemEnumGreen(
17657            GreenNode {
17658                kind: SyntaxKind::ItemEnum,
17659                details: GreenNodeDetails::Node {
17660                    children: [
17661                        AttributeList::missing(db).0,
17662                        Visibility::missing(db).0,
17663                        TerminalEnum::missing(db).0,
17664                        TerminalIdentifier::missing(db).0,
17665                        OptionWrappedGenericParamList::missing(db).0,
17666                        TerminalLBrace::missing(db).0,
17667                        VariantList::missing(db).0,
17668                        TerminalRBrace::missing(db).0,
17669                    ]
17670                    .into(),
17671                    width: TextWidth::default(),
17672                },
17673            }
17674            .intern(db),
17675        )
17676    }
17677    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17678        let kind = node.kind(db);
17679        assert_eq!(
17680            kind,
17681            SyntaxKind::ItemEnum,
17682            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17683            kind,
17684            SyntaxKind::ItemEnum
17685        );
17686        Self { node }
17687    }
17688    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17689        let kind = node.kind(db);
17690        if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17691    }
17692    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17693        self.node
17694    }
17695    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17696        ItemEnumPtr(self.node.stable_ptr(db))
17697    }
17698}
17699#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17700pub struct ItemTypeAlias<'db> {
17701    node: SyntaxNode<'db>,
17702}
17703impl<'db> ItemTypeAlias<'db> {
17704    pub const INDEX_ATTRIBUTES: usize = 0;
17705    pub const INDEX_VISIBILITY: usize = 1;
17706    pub const INDEX_TYPE_KW: usize = 2;
17707    pub const INDEX_NAME: usize = 3;
17708    pub const INDEX_GENERIC_PARAMS: usize = 4;
17709    pub const INDEX_EQ: usize = 5;
17710    pub const INDEX_TY: usize = 6;
17711    pub const INDEX_SEMICOLON: usize = 7;
17712    pub fn new_green(
17713        db: &'db dyn Database,
17714        attributes: AttributeListGreen<'db>,
17715        visibility: VisibilityGreen<'db>,
17716        type_kw: TerminalTypeGreen<'db>,
17717        name: TerminalIdentifierGreen<'db>,
17718        generic_params: OptionWrappedGenericParamListGreen<'db>,
17719        eq: TerminalEqGreen<'db>,
17720        ty: ExprGreen<'db>,
17721        semicolon: TerminalSemicolonGreen<'db>,
17722    ) -> ItemTypeAliasGreen<'db> {
17723        let children = [
17724            attributes.0,
17725            visibility.0,
17726            type_kw.0,
17727            name.0,
17728            generic_params.0,
17729            eq.0,
17730            ty.0,
17731            semicolon.0,
17732        ];
17733        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17734        ItemTypeAliasGreen(
17735            GreenNode {
17736                kind: SyntaxKind::ItemTypeAlias,
17737                details: GreenNodeDetails::Node { children: children.into(), width },
17738            }
17739            .intern(db),
17740        )
17741    }
17742}
17743impl<'db> ItemTypeAlias<'db> {
17744    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17745        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17746    }
17747    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17748        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17749    }
17750    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
17751        TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17752    }
17753    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17754        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17755    }
17756    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17757        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17758    }
17759    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17760        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17761    }
17762    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
17763        Expr::from_syntax_node(db, self.node.get_children(db)[6])
17764    }
17765    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17766        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17767    }
17768}
17769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17770pub struct ItemTypeAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17771impl<'db> ItemTypeAliasPtr<'db> {
17772    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17773        let ptr = self.0.long(db);
17774        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17775            TerminalIdentifierGreen(key_fields[0])
17776        } else {
17777            panic!("Unexpected key field query on root.");
17778        }
17779    }
17780}
17781impl<'db> TypedStablePtr<'db> for ItemTypeAliasPtr<'db> {
17782    type SyntaxNode = ItemTypeAlias<'db>;
17783    fn untyped(self) -> SyntaxStablePtrId<'db> {
17784        self.0
17785    }
17786    fn lookup(&self, db: &'db dyn Database) -> ItemTypeAlias<'db> {
17787        ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17788    }
17789}
17790impl<'db> From<ItemTypeAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17791    fn from(ptr: ItemTypeAliasPtr<'db>) -> Self {
17792        ptr.untyped()
17793    }
17794}
17795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17796pub struct ItemTypeAliasGreen<'db>(pub GreenId<'db>);
17797impl<'db> TypedSyntaxNode<'db> for ItemTypeAlias<'db> {
17798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17799    type StablePtr = ItemTypeAliasPtr<'db>;
17800    type Green = ItemTypeAliasGreen<'db>;
17801    fn missing(db: &'db dyn Database) -> Self::Green {
17802        ItemTypeAliasGreen(
17803            GreenNode {
17804                kind: SyntaxKind::ItemTypeAlias,
17805                details: GreenNodeDetails::Node {
17806                    children: [
17807                        AttributeList::missing(db).0,
17808                        Visibility::missing(db).0,
17809                        TerminalType::missing(db).0,
17810                        TerminalIdentifier::missing(db).0,
17811                        OptionWrappedGenericParamList::missing(db).0,
17812                        TerminalEq::missing(db).0,
17813                        Expr::missing(db).0,
17814                        TerminalSemicolon::missing(db).0,
17815                    ]
17816                    .into(),
17817                    width: TextWidth::default(),
17818                },
17819            }
17820            .intern(db),
17821        )
17822    }
17823    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17824        let kind = node.kind(db);
17825        assert_eq!(
17826            kind,
17827            SyntaxKind::ItemTypeAlias,
17828            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17829            kind,
17830            SyntaxKind::ItemTypeAlias
17831        );
17832        Self { node }
17833    }
17834    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17835        let kind = node.kind(db);
17836        if kind == SyntaxKind::ItemTypeAlias {
17837            Some(Self::from_syntax_node(db, node))
17838        } else {
17839            None
17840        }
17841    }
17842    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17843        self.node
17844    }
17845    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17846        ItemTypeAliasPtr(self.node.stable_ptr(db))
17847    }
17848}
17849#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17850pub struct ItemUse<'db> {
17851    node: SyntaxNode<'db>,
17852}
17853impl<'db> ItemUse<'db> {
17854    pub const INDEX_ATTRIBUTES: usize = 0;
17855    pub const INDEX_VISIBILITY: usize = 1;
17856    pub const INDEX_USE_KW: usize = 2;
17857    pub const INDEX_DOLLAR: usize = 3;
17858    pub const INDEX_USE_PATH: usize = 4;
17859    pub const INDEX_SEMICOLON: usize = 5;
17860    pub fn new_green(
17861        db: &'db dyn Database,
17862        attributes: AttributeListGreen<'db>,
17863        visibility: VisibilityGreen<'db>,
17864        use_kw: TerminalUseGreen<'db>,
17865        dollar: OptionTerminalDollarGreen<'db>,
17866        use_path: UsePathGreen<'db>,
17867        semicolon: TerminalSemicolonGreen<'db>,
17868    ) -> ItemUseGreen<'db> {
17869        let children = [attributes.0, visibility.0, use_kw.0, dollar.0, use_path.0, semicolon.0];
17870        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17871        ItemUseGreen(
17872            GreenNode {
17873                kind: SyntaxKind::ItemUse,
17874                details: GreenNodeDetails::Node { children: children.into(), width },
17875            }
17876            .intern(db),
17877        )
17878    }
17879}
17880impl<'db> ItemUse<'db> {
17881    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17882        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17883    }
17884    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17885        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17886    }
17887    pub fn use_kw(&self, db: &'db dyn Database) -> TerminalUse<'db> {
17888        TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17889    }
17890    pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
17891        OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[3])
17892    }
17893    pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
17894        UsePath::from_syntax_node(db, self.node.get_children(db)[4])
17895    }
17896    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17897        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
17898    }
17899}
17900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17901pub struct ItemUsePtr<'db>(pub SyntaxStablePtrId<'db>);
17902impl<'db> ItemUsePtr<'db> {
17903    pub fn use_path_green(self, db: &'db dyn Database) -> UsePathGreen<'db> {
17904        let ptr = self.0.long(db);
17905        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
17906            UsePathGreen(key_fields[0])
17907        } else {
17908            panic!("Unexpected key field query on root.");
17909        }
17910    }
17911}
17912impl<'db> TypedStablePtr<'db> for ItemUsePtr<'db> {
17913    type SyntaxNode = ItemUse<'db>;
17914    fn untyped(self) -> SyntaxStablePtrId<'db> {
17915        self.0
17916    }
17917    fn lookup(&self, db: &'db dyn Database) -> ItemUse<'db> {
17918        ItemUse::from_syntax_node(db, self.0.lookup(db))
17919    }
17920}
17921impl<'db> From<ItemUsePtr<'db>> for SyntaxStablePtrId<'db> {
17922    fn from(ptr: ItemUsePtr<'db>) -> Self {
17923        ptr.untyped()
17924    }
17925}
17926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17927pub struct ItemUseGreen<'db>(pub GreenId<'db>);
17928impl<'db> TypedSyntaxNode<'db> for ItemUse<'db> {
17929    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
17930    type StablePtr = ItemUsePtr<'db>;
17931    type Green = ItemUseGreen<'db>;
17932    fn missing(db: &'db dyn Database) -> Self::Green {
17933        ItemUseGreen(
17934            GreenNode {
17935                kind: SyntaxKind::ItemUse,
17936                details: GreenNodeDetails::Node {
17937                    children: [
17938                        AttributeList::missing(db).0,
17939                        Visibility::missing(db).0,
17940                        TerminalUse::missing(db).0,
17941                        OptionTerminalDollar::missing(db).0,
17942                        UsePath::missing(db).0,
17943                        TerminalSemicolon::missing(db).0,
17944                    ]
17945                    .into(),
17946                    width: TextWidth::default(),
17947                },
17948            }
17949            .intern(db),
17950        )
17951    }
17952    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17953        let kind = node.kind(db);
17954        assert_eq!(
17955            kind,
17956            SyntaxKind::ItemUse,
17957            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17958            kind,
17959            SyntaxKind::ItemUse
17960        );
17961        Self { node }
17962    }
17963    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17964        let kind = node.kind(db);
17965        if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
17966    }
17967    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17968        self.node
17969    }
17970    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17971        ItemUsePtr(self.node.stable_ptr(db))
17972    }
17973}
17974#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17975pub enum UsePath<'db> {
17976    Leaf(UsePathLeaf<'db>),
17977    Single(UsePathSingle<'db>),
17978    Multi(UsePathMulti<'db>),
17979    Star(UsePathStar<'db>),
17980}
17981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17982pub struct UsePathPtr<'db>(pub SyntaxStablePtrId<'db>);
17983impl<'db> TypedStablePtr<'db> for UsePathPtr<'db> {
17984    type SyntaxNode = UsePath<'db>;
17985    fn untyped(self) -> SyntaxStablePtrId<'db> {
17986        self.0
17987    }
17988    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
17989        UsePath::from_syntax_node(db, self.0.lookup(db))
17990    }
17991}
17992impl<'db> From<UsePathPtr<'db>> for SyntaxStablePtrId<'db> {
17993    fn from(ptr: UsePathPtr<'db>) -> Self {
17994        ptr.untyped()
17995    }
17996}
17997impl<'db> From<UsePathLeafPtr<'db>> for UsePathPtr<'db> {
17998    fn from(value: UsePathLeafPtr<'db>) -> Self {
17999        Self(value.0)
18000    }
18001}
18002impl<'db> From<UsePathSinglePtr<'db>> for UsePathPtr<'db> {
18003    fn from(value: UsePathSinglePtr<'db>) -> Self {
18004        Self(value.0)
18005    }
18006}
18007impl<'db> From<UsePathMultiPtr<'db>> for UsePathPtr<'db> {
18008    fn from(value: UsePathMultiPtr<'db>) -> Self {
18009        Self(value.0)
18010    }
18011}
18012impl<'db> From<UsePathStarPtr<'db>> for UsePathPtr<'db> {
18013    fn from(value: UsePathStarPtr<'db>) -> Self {
18014        Self(value.0)
18015    }
18016}
18017impl<'db> From<UsePathLeafGreen<'db>> for UsePathGreen<'db> {
18018    fn from(value: UsePathLeafGreen<'db>) -> Self {
18019        Self(value.0)
18020    }
18021}
18022impl<'db> From<UsePathSingleGreen<'db>> for UsePathGreen<'db> {
18023    fn from(value: UsePathSingleGreen<'db>) -> Self {
18024        Self(value.0)
18025    }
18026}
18027impl<'db> From<UsePathMultiGreen<'db>> for UsePathGreen<'db> {
18028    fn from(value: UsePathMultiGreen<'db>) -> Self {
18029        Self(value.0)
18030    }
18031}
18032impl<'db> From<UsePathStarGreen<'db>> for UsePathGreen<'db> {
18033    fn from(value: UsePathStarGreen<'db>) -> Self {
18034        Self(value.0)
18035    }
18036}
18037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18038pub struct UsePathGreen<'db>(pub GreenId<'db>);
18039impl<'db> TypedSyntaxNode<'db> for UsePath<'db> {
18040    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18041    type StablePtr = UsePathPtr<'db>;
18042    type Green = UsePathGreen<'db>;
18043    fn missing(db: &'db dyn Database) -> Self::Green {
18044        panic!("No missing variant.");
18045    }
18046    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18047        let kind = node.kind(db);
18048        match kind {
18049            SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
18050            SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
18051            SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
18052            SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
18053            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
18054        }
18055    }
18056    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18057        let kind = node.kind(db);
18058        match kind {
18059            SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
18060            SyntaxKind::UsePathSingle => {
18061                Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
18062            }
18063            SyntaxKind::UsePathMulti => {
18064                Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
18065            }
18066            SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
18067            _ => None,
18068        }
18069    }
18070    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18071        match self {
18072            UsePath::Leaf(x) => x.as_syntax_node(),
18073            UsePath::Single(x) => x.as_syntax_node(),
18074            UsePath::Multi(x) => x.as_syntax_node(),
18075            UsePath::Star(x) => x.as_syntax_node(),
18076        }
18077    }
18078    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18079        UsePathPtr(self.as_syntax_node().long(db).stable_ptr)
18080    }
18081}
18082impl<'db> UsePath<'db> {
18083    /// Checks if a kind of a variant of [UsePath].
18084    pub fn is_variant(kind: SyntaxKind) -> bool {
18085        matches!(
18086            kind,
18087            SyntaxKind::UsePathLeaf
18088                | SyntaxKind::UsePathSingle
18089                | SyntaxKind::UsePathMulti
18090                | SyntaxKind::UsePathStar
18091        )
18092    }
18093}
18094#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18095pub struct UsePathLeaf<'db> {
18096    node: SyntaxNode<'db>,
18097}
18098impl<'db> UsePathLeaf<'db> {
18099    pub const INDEX_IDENT: usize = 0;
18100    pub const INDEX_ALIAS_CLAUSE: usize = 1;
18101    pub fn new_green(
18102        db: &'db dyn Database,
18103        ident: PathSegmentGreen<'db>,
18104        alias_clause: OptionAliasClauseGreen<'db>,
18105    ) -> UsePathLeafGreen<'db> {
18106        let children = [ident.0, alias_clause.0];
18107        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18108        UsePathLeafGreen(
18109            GreenNode {
18110                kind: SyntaxKind::UsePathLeaf,
18111                details: GreenNodeDetails::Node { children: children.into(), width },
18112            }
18113            .intern(db),
18114        )
18115    }
18116}
18117impl<'db> UsePathLeaf<'db> {
18118    pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18119        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18120    }
18121    pub fn alias_clause(&self, db: &'db dyn Database) -> OptionAliasClause<'db> {
18122        OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
18123    }
18124}
18125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18126pub struct UsePathLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
18127impl<'db> UsePathLeafPtr<'db> {
18128    pub fn ident_green(self, db: &'db dyn Database) -> PathSegmentGreen<'db> {
18129        let ptr = self.0.long(db);
18130        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18131            PathSegmentGreen(key_fields[0])
18132        } else {
18133            panic!("Unexpected key field query on root.");
18134        }
18135    }
18136    pub fn alias_clause_green(self, db: &'db dyn Database) -> OptionAliasClauseGreen<'db> {
18137        let ptr = self.0.long(db);
18138        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18139            OptionAliasClauseGreen(key_fields[1])
18140        } else {
18141            panic!("Unexpected key field query on root.");
18142        }
18143    }
18144}
18145impl<'db> TypedStablePtr<'db> for UsePathLeafPtr<'db> {
18146    type SyntaxNode = UsePathLeaf<'db>;
18147    fn untyped(self) -> SyntaxStablePtrId<'db> {
18148        self.0
18149    }
18150    fn lookup(&self, db: &'db dyn Database) -> UsePathLeaf<'db> {
18151        UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18152    }
18153}
18154impl<'db> From<UsePathLeafPtr<'db>> for SyntaxStablePtrId<'db> {
18155    fn from(ptr: UsePathLeafPtr<'db>) -> Self {
18156        ptr.untyped()
18157    }
18158}
18159#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18160pub struct UsePathLeafGreen<'db>(pub GreenId<'db>);
18161impl<'db> TypedSyntaxNode<'db> for UsePathLeaf<'db> {
18162    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18163    type StablePtr = UsePathLeafPtr<'db>;
18164    type Green = UsePathLeafGreen<'db>;
18165    fn missing(db: &'db dyn Database) -> Self::Green {
18166        UsePathLeafGreen(
18167            GreenNode {
18168                kind: SyntaxKind::UsePathLeaf,
18169                details: GreenNodeDetails::Node {
18170                    children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
18171                    width: TextWidth::default(),
18172                },
18173            }
18174            .intern(db),
18175        )
18176    }
18177    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18178        let kind = node.kind(db);
18179        assert_eq!(
18180            kind,
18181            SyntaxKind::UsePathLeaf,
18182            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18183            kind,
18184            SyntaxKind::UsePathLeaf
18185        );
18186        Self { node }
18187    }
18188    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18189        let kind = node.kind(db);
18190        if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18191    }
18192    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18193        self.node
18194    }
18195    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18196        UsePathLeafPtr(self.node.stable_ptr(db))
18197    }
18198}
18199#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18200pub struct UsePathSingle<'db> {
18201    node: SyntaxNode<'db>,
18202}
18203impl<'db> UsePathSingle<'db> {
18204    pub const INDEX_IDENT: usize = 0;
18205    pub const INDEX_COLON_COLON: usize = 1;
18206    pub const INDEX_USE_PATH: usize = 2;
18207    pub fn new_green(
18208        db: &'db dyn Database,
18209        ident: PathSegmentGreen<'db>,
18210        colon_colon: TerminalColonColonGreen<'db>,
18211        use_path: UsePathGreen<'db>,
18212    ) -> UsePathSingleGreen<'db> {
18213        let children = [ident.0, colon_colon.0, use_path.0];
18214        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18215        UsePathSingleGreen(
18216            GreenNode {
18217                kind: SyntaxKind::UsePathSingle,
18218                details: GreenNodeDetails::Node { children: children.into(), width },
18219            }
18220            .intern(db),
18221        )
18222    }
18223}
18224impl<'db> UsePathSingle<'db> {
18225    pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18226        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18227    }
18228    pub fn colon_colon(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
18229        TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18230    }
18231    pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
18232        UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18233    }
18234}
18235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18236pub struct UsePathSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
18237impl<'db> UsePathSinglePtr<'db> {}
18238impl<'db> TypedStablePtr<'db> for UsePathSinglePtr<'db> {
18239    type SyntaxNode = UsePathSingle<'db>;
18240    fn untyped(self) -> SyntaxStablePtrId<'db> {
18241        self.0
18242    }
18243    fn lookup(&self, db: &'db dyn Database) -> UsePathSingle<'db> {
18244        UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18245    }
18246}
18247impl<'db> From<UsePathSinglePtr<'db>> for SyntaxStablePtrId<'db> {
18248    fn from(ptr: UsePathSinglePtr<'db>) -> Self {
18249        ptr.untyped()
18250    }
18251}
18252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18253pub struct UsePathSingleGreen<'db>(pub GreenId<'db>);
18254impl<'db> TypedSyntaxNode<'db> for UsePathSingle<'db> {
18255    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18256    type StablePtr = UsePathSinglePtr<'db>;
18257    type Green = UsePathSingleGreen<'db>;
18258    fn missing(db: &'db dyn Database) -> Self::Green {
18259        UsePathSingleGreen(
18260            GreenNode {
18261                kind: SyntaxKind::UsePathSingle,
18262                details: GreenNodeDetails::Node {
18263                    children: [
18264                        PathSegment::missing(db).0,
18265                        TerminalColonColon::missing(db).0,
18266                        UsePath::missing(db).0,
18267                    ]
18268                    .into(),
18269                    width: TextWidth::default(),
18270                },
18271            }
18272            .intern(db),
18273        )
18274    }
18275    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18276        let kind = node.kind(db);
18277        assert_eq!(
18278            kind,
18279            SyntaxKind::UsePathSingle,
18280            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18281            kind,
18282            SyntaxKind::UsePathSingle
18283        );
18284        Self { node }
18285    }
18286    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18287        let kind = node.kind(db);
18288        if kind == SyntaxKind::UsePathSingle {
18289            Some(Self::from_syntax_node(db, node))
18290        } else {
18291            None
18292        }
18293    }
18294    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18295        self.node
18296    }
18297    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18298        UsePathSinglePtr(self.node.stable_ptr(db))
18299    }
18300}
18301#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18302pub struct UsePathMulti<'db> {
18303    node: SyntaxNode<'db>,
18304}
18305impl<'db> UsePathMulti<'db> {
18306    pub const INDEX_LBRACE: usize = 0;
18307    pub const INDEX_USE_PATHS: usize = 1;
18308    pub const INDEX_RBRACE: usize = 2;
18309    pub fn new_green(
18310        db: &'db dyn Database,
18311        lbrace: TerminalLBraceGreen<'db>,
18312        use_paths: UsePathListGreen<'db>,
18313        rbrace: TerminalRBraceGreen<'db>,
18314    ) -> UsePathMultiGreen<'db> {
18315        let children = [lbrace.0, use_paths.0, rbrace.0];
18316        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18317        UsePathMultiGreen(
18318            GreenNode {
18319                kind: SyntaxKind::UsePathMulti,
18320                details: GreenNodeDetails::Node { children: children.into(), width },
18321            }
18322            .intern(db),
18323        )
18324    }
18325}
18326impl<'db> UsePathMulti<'db> {
18327    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
18328        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18329    }
18330    pub fn use_paths(&self, db: &'db dyn Database) -> UsePathList<'db> {
18331        UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18332    }
18333    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
18334        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18335    }
18336}
18337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18338pub struct UsePathMultiPtr<'db>(pub SyntaxStablePtrId<'db>);
18339impl<'db> UsePathMultiPtr<'db> {}
18340impl<'db> TypedStablePtr<'db> for UsePathMultiPtr<'db> {
18341    type SyntaxNode = UsePathMulti<'db>;
18342    fn untyped(self) -> SyntaxStablePtrId<'db> {
18343        self.0
18344    }
18345    fn lookup(&self, db: &'db dyn Database) -> UsePathMulti<'db> {
18346        UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18347    }
18348}
18349impl<'db> From<UsePathMultiPtr<'db>> for SyntaxStablePtrId<'db> {
18350    fn from(ptr: UsePathMultiPtr<'db>) -> Self {
18351        ptr.untyped()
18352    }
18353}
18354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18355pub struct UsePathMultiGreen<'db>(pub GreenId<'db>);
18356impl<'db> TypedSyntaxNode<'db> for UsePathMulti<'db> {
18357    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18358    type StablePtr = UsePathMultiPtr<'db>;
18359    type Green = UsePathMultiGreen<'db>;
18360    fn missing(db: &'db dyn Database) -> Self::Green {
18361        UsePathMultiGreen(
18362            GreenNode {
18363                kind: SyntaxKind::UsePathMulti,
18364                details: GreenNodeDetails::Node {
18365                    children: [
18366                        TerminalLBrace::missing(db).0,
18367                        UsePathList::missing(db).0,
18368                        TerminalRBrace::missing(db).0,
18369                    ]
18370                    .into(),
18371                    width: TextWidth::default(),
18372                },
18373            }
18374            .intern(db),
18375        )
18376    }
18377    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18378        let kind = node.kind(db);
18379        assert_eq!(
18380            kind,
18381            SyntaxKind::UsePathMulti,
18382            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18383            kind,
18384            SyntaxKind::UsePathMulti
18385        );
18386        Self { node }
18387    }
18388    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18389        let kind = node.kind(db);
18390        if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18391    }
18392    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18393        self.node
18394    }
18395    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18396        UsePathMultiPtr(self.node.stable_ptr(db))
18397    }
18398}
18399#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18400pub struct UsePathStar<'db> {
18401    node: SyntaxNode<'db>,
18402}
18403impl<'db> UsePathStar<'db> {
18404    pub const INDEX_STAR: usize = 0;
18405    pub fn new_green(db: &'db dyn Database, star: TerminalMulGreen<'db>) -> UsePathStarGreen<'db> {
18406        let children = [star.0];
18407        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18408        UsePathStarGreen(
18409            GreenNode {
18410                kind: SyntaxKind::UsePathStar,
18411                details: GreenNodeDetails::Node { children: children.into(), width },
18412            }
18413            .intern(db),
18414        )
18415    }
18416}
18417impl<'db> UsePathStar<'db> {
18418    pub fn star(&self, db: &'db dyn Database) -> TerminalMul<'db> {
18419        TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18420    }
18421}
18422#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18423pub struct UsePathStarPtr<'db>(pub SyntaxStablePtrId<'db>);
18424impl<'db> UsePathStarPtr<'db> {}
18425impl<'db> TypedStablePtr<'db> for UsePathStarPtr<'db> {
18426    type SyntaxNode = UsePathStar<'db>;
18427    fn untyped(self) -> SyntaxStablePtrId<'db> {
18428        self.0
18429    }
18430    fn lookup(&self, db: &'db dyn Database) -> UsePathStar<'db> {
18431        UsePathStar::from_syntax_node(db, self.0.lookup(db))
18432    }
18433}
18434impl<'db> From<UsePathStarPtr<'db>> for SyntaxStablePtrId<'db> {
18435    fn from(ptr: UsePathStarPtr<'db>) -> Self {
18436        ptr.untyped()
18437    }
18438}
18439#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18440pub struct UsePathStarGreen<'db>(pub GreenId<'db>);
18441impl<'db> TypedSyntaxNode<'db> for UsePathStar<'db> {
18442    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18443    type StablePtr = UsePathStarPtr<'db>;
18444    type Green = UsePathStarGreen<'db>;
18445    fn missing(db: &'db dyn Database) -> Self::Green {
18446        UsePathStarGreen(
18447            GreenNode {
18448                kind: SyntaxKind::UsePathStar,
18449                details: GreenNodeDetails::Node {
18450                    children: [TerminalMul::missing(db).0].into(),
18451                    width: TextWidth::default(),
18452                },
18453            }
18454            .intern(db),
18455        )
18456    }
18457    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18458        let kind = node.kind(db);
18459        assert_eq!(
18460            kind,
18461            SyntaxKind::UsePathStar,
18462            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18463            kind,
18464            SyntaxKind::UsePathStar
18465        );
18466        Self { node }
18467    }
18468    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18469        let kind = node.kind(db);
18470        if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18471    }
18472    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18473        self.node
18474    }
18475    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18476        UsePathStarPtr(self.node.stable_ptr(db))
18477    }
18478}
18479#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18480pub struct UsePathList<'db>(ElementList<'db, UsePath<'db>, 2>);
18481impl<'db> Deref for UsePathList<'db> {
18482    type Target = ElementList<'db, UsePath<'db>, 2>;
18483    fn deref(&self) -> &Self::Target {
18484        &self.0
18485    }
18486}
18487impl<'db> UsePathList<'db> {
18488    pub fn new_green(
18489        db: &'db dyn Database,
18490        children: &[UsePathListElementOrSeparatorGreen<'db>],
18491    ) -> UsePathListGreen<'db> {
18492        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
18493        UsePathListGreen(
18494            GreenNode {
18495                kind: SyntaxKind::UsePathList,
18496                details: GreenNodeDetails::Node {
18497                    children: children.iter().map(|x| x.id()).collect(),
18498                    width,
18499                },
18500            }
18501            .intern(db),
18502        )
18503    }
18504}
18505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18506pub struct UsePathListPtr<'db>(pub SyntaxStablePtrId<'db>);
18507impl<'db> TypedStablePtr<'db> for UsePathListPtr<'db> {
18508    type SyntaxNode = UsePathList<'db>;
18509    fn untyped(self) -> SyntaxStablePtrId<'db> {
18510        self.0
18511    }
18512    fn lookup(&self, db: &'db dyn Database) -> UsePathList<'db> {
18513        UsePathList::from_syntax_node(db, self.0.lookup(db))
18514    }
18515}
18516impl<'db> From<UsePathListPtr<'db>> for SyntaxStablePtrId<'db> {
18517    fn from(ptr: UsePathListPtr<'db>) -> Self {
18518        ptr.untyped()
18519    }
18520}
18521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18522pub enum UsePathListElementOrSeparatorGreen<'db> {
18523    Separator(TerminalCommaGreen<'db>),
18524    Element(UsePathGreen<'db>),
18525}
18526impl<'db> From<TerminalCommaGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18527    fn from(value: TerminalCommaGreen<'db>) -> Self {
18528        UsePathListElementOrSeparatorGreen::Separator(value)
18529    }
18530}
18531impl<'db> From<UsePathGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18532    fn from(value: UsePathGreen<'db>) -> Self {
18533        UsePathListElementOrSeparatorGreen::Element(value)
18534    }
18535}
18536impl<'db> UsePathListElementOrSeparatorGreen<'db> {
18537    fn id(&self) -> GreenId<'db> {
18538        match self {
18539            UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18540            UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18541        }
18542    }
18543}
18544#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18545pub struct UsePathListGreen<'db>(pub GreenId<'db>);
18546impl<'db> TypedSyntaxNode<'db> for UsePathList<'db> {
18547    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18548    type StablePtr = UsePathListPtr<'db>;
18549    type Green = UsePathListGreen<'db>;
18550    fn missing(db: &'db dyn Database) -> Self::Green {
18551        UsePathListGreen(
18552            GreenNode {
18553                kind: SyntaxKind::UsePathList,
18554                details: GreenNodeDetails::Node {
18555                    children: [].into(),
18556                    width: TextWidth::default(),
18557                },
18558            }
18559            .intern(db),
18560        )
18561    }
18562    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18563        Self(ElementList::new(node))
18564    }
18565    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18566        if node.kind(db) == SyntaxKind::UsePathList {
18567            Some(Self(ElementList::new(node)))
18568        } else {
18569            None
18570        }
18571    }
18572    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18573        self.node
18574    }
18575    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18576        UsePathListPtr(self.node.stable_ptr(db))
18577    }
18578}
18579#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18580pub struct AliasClause<'db> {
18581    node: SyntaxNode<'db>,
18582}
18583impl<'db> AliasClause<'db> {
18584    pub const INDEX_AS_KW: usize = 0;
18585    pub const INDEX_ALIAS: usize = 1;
18586    pub fn new_green(
18587        db: &'db dyn Database,
18588        as_kw: TerminalAsGreen<'db>,
18589        alias: TerminalIdentifierGreen<'db>,
18590    ) -> AliasClauseGreen<'db> {
18591        let children = [as_kw.0, alias.0];
18592        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18593        AliasClauseGreen(
18594            GreenNode {
18595                kind: SyntaxKind::AliasClause,
18596                details: GreenNodeDetails::Node { children: children.into(), width },
18597            }
18598            .intern(db),
18599        )
18600    }
18601}
18602impl<'db> AliasClause<'db> {
18603    pub fn as_kw(&self, db: &'db dyn Database) -> TerminalAs<'db> {
18604        TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18605    }
18606    pub fn alias(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18607        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18608    }
18609}
18610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18611pub struct AliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18612impl<'db> AliasClausePtr<'db> {
18613    pub fn alias_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
18614        let ptr = self.0.long(db);
18615        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
18616            TerminalIdentifierGreen(key_fields[0])
18617        } else {
18618            panic!("Unexpected key field query on root.");
18619        }
18620    }
18621}
18622impl<'db> TypedStablePtr<'db> for AliasClausePtr<'db> {
18623    type SyntaxNode = AliasClause<'db>;
18624    fn untyped(self) -> SyntaxStablePtrId<'db> {
18625        self.0
18626    }
18627    fn lookup(&self, db: &'db dyn Database) -> AliasClause<'db> {
18628        AliasClause::from_syntax_node(db, self.0.lookup(db))
18629    }
18630}
18631impl<'db> From<AliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18632    fn from(ptr: AliasClausePtr<'db>) -> Self {
18633        ptr.untyped()
18634    }
18635}
18636#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18637pub struct AliasClauseGreen<'db>(pub GreenId<'db>);
18638impl<'db> TypedSyntaxNode<'db> for AliasClause<'db> {
18639    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18640    type StablePtr = AliasClausePtr<'db>;
18641    type Green = AliasClauseGreen<'db>;
18642    fn missing(db: &'db dyn Database) -> Self::Green {
18643        AliasClauseGreen(
18644            GreenNode {
18645                kind: SyntaxKind::AliasClause,
18646                details: GreenNodeDetails::Node {
18647                    children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18648                    width: TextWidth::default(),
18649                },
18650            }
18651            .intern(db),
18652        )
18653    }
18654    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18655        let kind = node.kind(db);
18656        assert_eq!(
18657            kind,
18658            SyntaxKind::AliasClause,
18659            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18660            kind,
18661            SyntaxKind::AliasClause
18662        );
18663        Self { node }
18664    }
18665    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18666        let kind = node.kind(db);
18667        if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18668    }
18669    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18670        self.node
18671    }
18672    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18673        AliasClausePtr(self.node.stable_ptr(db))
18674    }
18675}
18676#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18677pub enum OptionAliasClause<'db> {
18678    Empty(OptionAliasClauseEmpty<'db>),
18679    AliasClause(AliasClause<'db>),
18680}
18681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18682pub struct OptionAliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18683impl<'db> TypedStablePtr<'db> for OptionAliasClausePtr<'db> {
18684    type SyntaxNode = OptionAliasClause<'db>;
18685    fn untyped(self) -> SyntaxStablePtrId<'db> {
18686        self.0
18687    }
18688    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18689        OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18690    }
18691}
18692impl<'db> From<OptionAliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18693    fn from(ptr: OptionAliasClausePtr<'db>) -> Self {
18694        ptr.untyped()
18695    }
18696}
18697impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for OptionAliasClausePtr<'db> {
18698    fn from(value: OptionAliasClauseEmptyPtr<'db>) -> Self {
18699        Self(value.0)
18700    }
18701}
18702impl<'db> From<AliasClausePtr<'db>> for OptionAliasClausePtr<'db> {
18703    fn from(value: AliasClausePtr<'db>) -> Self {
18704        Self(value.0)
18705    }
18706}
18707impl<'db> From<OptionAliasClauseEmptyGreen<'db>> for OptionAliasClauseGreen<'db> {
18708    fn from(value: OptionAliasClauseEmptyGreen<'db>) -> Self {
18709        Self(value.0)
18710    }
18711}
18712impl<'db> From<AliasClauseGreen<'db>> for OptionAliasClauseGreen<'db> {
18713    fn from(value: AliasClauseGreen<'db>) -> Self {
18714        Self(value.0)
18715    }
18716}
18717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18718pub struct OptionAliasClauseGreen<'db>(pub GreenId<'db>);
18719impl<'db> TypedSyntaxNode<'db> for OptionAliasClause<'db> {
18720    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18721    type StablePtr = OptionAliasClausePtr<'db>;
18722    type Green = OptionAliasClauseGreen<'db>;
18723    fn missing(db: &'db dyn Database) -> Self::Green {
18724        panic!("No missing variant.");
18725    }
18726    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18727        let kind = node.kind(db);
18728        match kind {
18729            SyntaxKind::OptionAliasClauseEmpty => {
18730                OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18731            }
18732            SyntaxKind::AliasClause => {
18733                OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18734            }
18735            _ => panic!(
18736                "Unexpected syntax kind {:?} when constructing {}.",
18737                kind, "OptionAliasClause"
18738            ),
18739        }
18740    }
18741    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18742        let kind = node.kind(db);
18743        match kind {
18744            SyntaxKind::OptionAliasClauseEmpty => {
18745                Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18746            }
18747            SyntaxKind::AliasClause => {
18748                Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18749            }
18750            _ => None,
18751        }
18752    }
18753    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18754        match self {
18755            OptionAliasClause::Empty(x) => x.as_syntax_node(),
18756            OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18757        }
18758    }
18759    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18760        OptionAliasClausePtr(self.as_syntax_node().long(db).stable_ptr)
18761    }
18762}
18763impl<'db> OptionAliasClause<'db> {
18764    /// Checks if a kind of a variant of [OptionAliasClause].
18765    pub fn is_variant(kind: SyntaxKind) -> bool {
18766        matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18767    }
18768}
18769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18770pub struct OptionAliasClauseEmpty<'db> {
18771    node: SyntaxNode<'db>,
18772}
18773impl<'db> OptionAliasClauseEmpty<'db> {
18774    pub fn new_green(db: &'db dyn Database) -> OptionAliasClauseEmptyGreen<'db> {
18775        let children = [];
18776        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18777        OptionAliasClauseEmptyGreen(
18778            GreenNode {
18779                kind: SyntaxKind::OptionAliasClauseEmpty,
18780                details: GreenNodeDetails::Node { children: children.into(), width },
18781            }
18782            .intern(db),
18783        )
18784    }
18785}
18786impl<'db> OptionAliasClauseEmpty<'db> {}
18787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18788pub struct OptionAliasClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
18789impl<'db> OptionAliasClauseEmptyPtr<'db> {}
18790impl<'db> TypedStablePtr<'db> for OptionAliasClauseEmptyPtr<'db> {
18791    type SyntaxNode = OptionAliasClauseEmpty<'db>;
18792    fn untyped(self) -> SyntaxStablePtrId<'db> {
18793        self.0
18794    }
18795    fn lookup(&self, db: &'db dyn Database) -> OptionAliasClauseEmpty<'db> {
18796        OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18797    }
18798}
18799impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
18800    fn from(ptr: OptionAliasClauseEmptyPtr<'db>) -> Self {
18801        ptr.untyped()
18802    }
18803}
18804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18805pub struct OptionAliasClauseEmptyGreen<'db>(pub GreenId<'db>);
18806impl<'db> TypedSyntaxNode<'db> for OptionAliasClauseEmpty<'db> {
18807    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18808    type StablePtr = OptionAliasClauseEmptyPtr<'db>;
18809    type Green = OptionAliasClauseEmptyGreen<'db>;
18810    fn missing(db: &'db dyn Database) -> Self::Green {
18811        OptionAliasClauseEmptyGreen(
18812            GreenNode {
18813                kind: SyntaxKind::OptionAliasClauseEmpty,
18814                details: GreenNodeDetails::Node {
18815                    children: [].into(),
18816                    width: TextWidth::default(),
18817                },
18818            }
18819            .intern(db),
18820        )
18821    }
18822    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18823        let kind = node.kind(db);
18824        assert_eq!(
18825            kind,
18826            SyntaxKind::OptionAliasClauseEmpty,
18827            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18828            kind,
18829            SyntaxKind::OptionAliasClauseEmpty
18830        );
18831        Self { node }
18832    }
18833    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18834        let kind = node.kind(db);
18835        if kind == SyntaxKind::OptionAliasClauseEmpty {
18836            Some(Self::from_syntax_node(db, node))
18837        } else {
18838            None
18839        }
18840    }
18841    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18842        self.node
18843    }
18844    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18845        OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18846    }
18847}
18848#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18849pub enum GenericArg<'db> {
18850    Unnamed(GenericArgUnnamed<'db>),
18851    Named(GenericArgNamed<'db>),
18852}
18853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18854pub struct GenericArgPtr<'db>(pub SyntaxStablePtrId<'db>);
18855impl<'db> TypedStablePtr<'db> for GenericArgPtr<'db> {
18856    type SyntaxNode = GenericArg<'db>;
18857    fn untyped(self) -> SyntaxStablePtrId<'db> {
18858        self.0
18859    }
18860    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18861        GenericArg::from_syntax_node(db, self.0.lookup(db))
18862    }
18863}
18864impl<'db> From<GenericArgPtr<'db>> for SyntaxStablePtrId<'db> {
18865    fn from(ptr: GenericArgPtr<'db>) -> Self {
18866        ptr.untyped()
18867    }
18868}
18869impl<'db> From<GenericArgUnnamedPtr<'db>> for GenericArgPtr<'db> {
18870    fn from(value: GenericArgUnnamedPtr<'db>) -> Self {
18871        Self(value.0)
18872    }
18873}
18874impl<'db> From<GenericArgNamedPtr<'db>> for GenericArgPtr<'db> {
18875    fn from(value: GenericArgNamedPtr<'db>) -> Self {
18876        Self(value.0)
18877    }
18878}
18879impl<'db> From<GenericArgUnnamedGreen<'db>> for GenericArgGreen<'db> {
18880    fn from(value: GenericArgUnnamedGreen<'db>) -> Self {
18881        Self(value.0)
18882    }
18883}
18884impl<'db> From<GenericArgNamedGreen<'db>> for GenericArgGreen<'db> {
18885    fn from(value: GenericArgNamedGreen<'db>) -> Self {
18886        Self(value.0)
18887    }
18888}
18889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18890pub struct GenericArgGreen<'db>(pub GreenId<'db>);
18891impl<'db> TypedSyntaxNode<'db> for GenericArg<'db> {
18892    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18893    type StablePtr = GenericArgPtr<'db>;
18894    type Green = GenericArgGreen<'db>;
18895    fn missing(db: &'db dyn Database) -> Self::Green {
18896        panic!("No missing variant.");
18897    }
18898    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18899        let kind = node.kind(db);
18900        match kind {
18901            SyntaxKind::GenericArgUnnamed => {
18902                GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18903            }
18904            SyntaxKind::GenericArgNamed => {
18905                GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18906            }
18907            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18908        }
18909    }
18910    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18911        let kind = node.kind(db);
18912        match kind {
18913            SyntaxKind::GenericArgUnnamed => {
18914                Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18915            }
18916            SyntaxKind::GenericArgNamed => {
18917                Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18918            }
18919            _ => None,
18920        }
18921    }
18922    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18923        match self {
18924            GenericArg::Unnamed(x) => x.as_syntax_node(),
18925            GenericArg::Named(x) => x.as_syntax_node(),
18926        }
18927    }
18928    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18929        GenericArgPtr(self.as_syntax_node().long(db).stable_ptr)
18930    }
18931}
18932impl<'db> GenericArg<'db> {
18933    /// Checks if a kind of a variant of [GenericArg].
18934    pub fn is_variant(kind: SyntaxKind) -> bool {
18935        matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
18936    }
18937}
18938#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18939pub struct GenericArgNamed<'db> {
18940    node: SyntaxNode<'db>,
18941}
18942impl<'db> GenericArgNamed<'db> {
18943    pub const INDEX_NAME: usize = 0;
18944    pub const INDEX_COLON: usize = 1;
18945    pub const INDEX_VALUE: usize = 2;
18946    pub fn new_green(
18947        db: &'db dyn Database,
18948        name: TerminalIdentifierGreen<'db>,
18949        colon: TerminalColonGreen<'db>,
18950        value: GenericArgValueGreen<'db>,
18951    ) -> GenericArgNamedGreen<'db> {
18952        let children = [name.0, colon.0, value.0];
18953        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18954        GenericArgNamedGreen(
18955            GreenNode {
18956                kind: SyntaxKind::GenericArgNamed,
18957                details: GreenNodeDetails::Node { children: children.into(), width },
18958            }
18959            .intern(db),
18960        )
18961    }
18962}
18963impl<'db> GenericArgNamed<'db> {
18964    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18965        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
18966    }
18967    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
18968        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
18969    }
18970    pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
18971        GenericArgValue::from_syntax_node(db, self.node.get_children(db)[2])
18972    }
18973}
18974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18975pub struct GenericArgNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18976impl<'db> GenericArgNamedPtr<'db> {}
18977impl<'db> TypedStablePtr<'db> for GenericArgNamedPtr<'db> {
18978    type SyntaxNode = GenericArgNamed<'db>;
18979    fn untyped(self) -> SyntaxStablePtrId<'db> {
18980        self.0
18981    }
18982    fn lookup(&self, db: &'db dyn Database) -> GenericArgNamed<'db> {
18983        GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
18984    }
18985}
18986impl<'db> From<GenericArgNamedPtr<'db>> for SyntaxStablePtrId<'db> {
18987    fn from(ptr: GenericArgNamedPtr<'db>) -> Self {
18988        ptr.untyped()
18989    }
18990}
18991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18992pub struct GenericArgNamedGreen<'db>(pub GreenId<'db>);
18993impl<'db> TypedSyntaxNode<'db> for GenericArgNamed<'db> {
18994    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
18995    type StablePtr = GenericArgNamedPtr<'db>;
18996    type Green = GenericArgNamedGreen<'db>;
18997    fn missing(db: &'db dyn Database) -> Self::Green {
18998        GenericArgNamedGreen(
18999            GreenNode {
19000                kind: SyntaxKind::GenericArgNamed,
19001                details: GreenNodeDetails::Node {
19002                    children: [
19003                        TerminalIdentifier::missing(db).0,
19004                        TerminalColon::missing(db).0,
19005                        GenericArgValue::missing(db).0,
19006                    ]
19007                    .into(),
19008                    width: TextWidth::default(),
19009                },
19010            }
19011            .intern(db),
19012        )
19013    }
19014    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19015        let kind = node.kind(db);
19016        assert_eq!(
19017            kind,
19018            SyntaxKind::GenericArgNamed,
19019            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19020            kind,
19021            SyntaxKind::GenericArgNamed
19022        );
19023        Self { node }
19024    }
19025    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19026        let kind = node.kind(db);
19027        if kind == SyntaxKind::GenericArgNamed {
19028            Some(Self::from_syntax_node(db, node))
19029        } else {
19030            None
19031        }
19032    }
19033    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19034        self.node
19035    }
19036    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19037        GenericArgNamedPtr(self.node.stable_ptr(db))
19038    }
19039}
19040#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19041pub struct GenericArgUnnamed<'db> {
19042    node: SyntaxNode<'db>,
19043}
19044impl<'db> GenericArgUnnamed<'db> {
19045    pub const INDEX_VALUE: usize = 0;
19046    pub fn new_green(
19047        db: &'db dyn Database,
19048        value: GenericArgValueGreen<'db>,
19049    ) -> GenericArgUnnamedGreen<'db> {
19050        let children = [value.0];
19051        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19052        GenericArgUnnamedGreen(
19053            GreenNode {
19054                kind: SyntaxKind::GenericArgUnnamed,
19055                details: GreenNodeDetails::Node { children: children.into(), width },
19056            }
19057            .intern(db),
19058        )
19059    }
19060}
19061impl<'db> GenericArgUnnamed<'db> {
19062    pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
19063        GenericArgValue::from_syntax_node(db, self.node.get_children(db)[0])
19064    }
19065}
19066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19067pub struct GenericArgUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
19068impl<'db> GenericArgUnnamedPtr<'db> {}
19069impl<'db> TypedStablePtr<'db> for GenericArgUnnamedPtr<'db> {
19070    type SyntaxNode = GenericArgUnnamed<'db>;
19071    fn untyped(self) -> SyntaxStablePtrId<'db> {
19072        self.0
19073    }
19074    fn lookup(&self, db: &'db dyn Database) -> GenericArgUnnamed<'db> {
19075        GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
19076    }
19077}
19078impl<'db> From<GenericArgUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
19079    fn from(ptr: GenericArgUnnamedPtr<'db>) -> Self {
19080        ptr.untyped()
19081    }
19082}
19083#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19084pub struct GenericArgUnnamedGreen<'db>(pub GreenId<'db>);
19085impl<'db> TypedSyntaxNode<'db> for GenericArgUnnamed<'db> {
19086    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
19087    type StablePtr = GenericArgUnnamedPtr<'db>;
19088    type Green = GenericArgUnnamedGreen<'db>;
19089    fn missing(db: &'db dyn Database) -> Self::Green {
19090        GenericArgUnnamedGreen(
19091            GreenNode {
19092                kind: SyntaxKind::GenericArgUnnamed,
19093                details: GreenNodeDetails::Node {
19094                    children: [GenericArgValue::missing(db).0].into(),
19095                    width: TextWidth::default(),
19096                },
19097            }
19098            .intern(db),
19099        )
19100    }
19101    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19102        let kind = node.kind(db);
19103        assert_eq!(
19104            kind,
19105            SyntaxKind::GenericArgUnnamed,
19106            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19107            kind,
19108            SyntaxKind::GenericArgUnnamed
19109        );
19110        Self { node }
19111    }
19112    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19113        let kind = node.kind(db);
19114        if kind == SyntaxKind::GenericArgUnnamed {
19115            Some(Self::from_syntax_node(db, node))
19116        } else {
19117            None
19118        }
19119    }
19120    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19121        self.node
19122    }
19123    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19124        GenericArgUnnamedPtr(self.node.stable_ptr(db))
19125    }
19126}
19127#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19128pub enum GenericArgValue<'db> {
19129    Expr(GenericArgValueExpr<'db>),
19130    Underscore(TerminalUnderscore<'db>),
19131}
19132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19133pub struct GenericArgValuePtr<'db>(pub SyntaxStablePtrId<'db>);
19134impl<'db> TypedStablePtr<'db> for GenericArgValuePtr<'db> {
19135    type SyntaxNode = GenericArgValue<'db>;
19136    fn untyped(self) -> SyntaxStablePtrId<'db> {
19137        self.0
19138    }
19139    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19140        GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19141    }
19142}
19143impl<'db> From<GenericArgValuePtr<'db>> for SyntaxStablePtrId<'db> {
19144    fn from(ptr: GenericArgValuePtr<'db>) -> Self {
19145        ptr.untyped()
19146    }
19147}
19148impl<'db> From<GenericArgValueExprPtr<'db>> for GenericArgValuePtr<'db> {
19149    fn from(value: GenericArgValueExprPtr<'db>) -> Self {
19150        Self(value.0)
19151    }
19152}
19153impl<'db> From<TerminalUnderscorePtr<'db>> for GenericArgValuePtr<'db> {
19154    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
19155        Self(value.0)
19156    }
19157}
19158impl<'db> From<GenericArgValueExprGreen<'db>> for GenericArgValueGreen<'db> {
19159    fn from(value: GenericArgValueExprGreen<'db>) -> Self {
19160        Self(value.0)
19161    }
19162}
19163impl<'db> From<TerminalUnderscoreGreen<'db>> for GenericArgValueGreen<'db> {
19164    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
19165        Self(value.0)
19166    }
19167}
19168#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19169pub struct GenericArgValueGreen<'db>(pub GreenId<'db>);
19170impl<'db> TypedSyntaxNode<'db> for GenericArgValue<'db> {
19171    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19172    type StablePtr = GenericArgValuePtr<'db>;
19173    type Green = GenericArgValueGreen<'db>;
19174    fn missing(db: &'db dyn Database) -> Self::Green {
19175        panic!("No missing variant.");
19176    }
19177    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19178        let kind = node.kind(db);
19179        match kind {
19180            SyntaxKind::GenericArgValueExpr => {
19181                GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19182            }
19183            SyntaxKind::TerminalUnderscore => {
19184                GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19185            }
19186            _ => {
19187                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19188            }
19189        }
19190    }
19191    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19192        let kind = node.kind(db);
19193        match kind {
19194            SyntaxKind::GenericArgValueExpr => {
19195                Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19196            }
19197            SyntaxKind::TerminalUnderscore => {
19198                Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19199            }
19200            _ => None,
19201        }
19202    }
19203    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19204        match self {
19205            GenericArgValue::Expr(x) => x.as_syntax_node(),
19206            GenericArgValue::Underscore(x) => x.as_syntax_node(),
19207        }
19208    }
19209    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19210        GenericArgValuePtr(self.as_syntax_node().long(db).stable_ptr)
19211    }
19212}
19213impl<'db> GenericArgValue<'db> {
19214    /// Checks if a kind of a variant of [GenericArgValue].
19215    pub fn is_variant(kind: SyntaxKind) -> bool {
19216        matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19217    }
19218}
19219#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19220pub struct GenericArgValueExpr<'db> {
19221    node: SyntaxNode<'db>,
19222}
19223impl<'db> GenericArgValueExpr<'db> {
19224    pub const INDEX_EXPR: usize = 0;
19225    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> GenericArgValueExprGreen<'db> {
19226        let children = [expr.0];
19227        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19228        GenericArgValueExprGreen(
19229            GreenNode {
19230                kind: SyntaxKind::GenericArgValueExpr,
19231                details: GreenNodeDetails::Node { children: children.into(), width },
19232            }
19233            .intern(db),
19234        )
19235    }
19236}
19237impl<'db> GenericArgValueExpr<'db> {
19238    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
19239        Expr::from_syntax_node(db, self.node.get_children(db)[0])
19240    }
19241}
19242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19243pub struct GenericArgValueExprPtr<'db>(pub SyntaxStablePtrId<'db>);
19244impl<'db> GenericArgValueExprPtr<'db> {}
19245impl<'db> TypedStablePtr<'db> for GenericArgValueExprPtr<'db> {
19246    type SyntaxNode = GenericArgValueExpr<'db>;
19247    fn untyped(self) -> SyntaxStablePtrId<'db> {
19248        self.0
19249    }
19250    fn lookup(&self, db: &'db dyn Database) -> GenericArgValueExpr<'db> {
19251        GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19252    }
19253}
19254impl<'db> From<GenericArgValueExprPtr<'db>> for SyntaxStablePtrId<'db> {
19255    fn from(ptr: GenericArgValueExprPtr<'db>) -> Self {
19256        ptr.untyped()
19257    }
19258}
19259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19260pub struct GenericArgValueExprGreen<'db>(pub GreenId<'db>);
19261impl<'db> TypedSyntaxNode<'db> for GenericArgValueExpr<'db> {
19262    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19263    type StablePtr = GenericArgValueExprPtr<'db>;
19264    type Green = GenericArgValueExprGreen<'db>;
19265    fn missing(db: &'db dyn Database) -> Self::Green {
19266        GenericArgValueExprGreen(
19267            GreenNode {
19268                kind: SyntaxKind::GenericArgValueExpr,
19269                details: GreenNodeDetails::Node {
19270                    children: [Expr::missing(db).0].into(),
19271                    width: TextWidth::default(),
19272                },
19273            }
19274            .intern(db),
19275        )
19276    }
19277    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19278        let kind = node.kind(db);
19279        assert_eq!(
19280            kind,
19281            SyntaxKind::GenericArgValueExpr,
19282            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19283            kind,
19284            SyntaxKind::GenericArgValueExpr
19285        );
19286        Self { node }
19287    }
19288    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19289        let kind = node.kind(db);
19290        if kind == SyntaxKind::GenericArgValueExpr {
19291            Some(Self::from_syntax_node(db, node))
19292        } else {
19293            None
19294        }
19295    }
19296    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19297        self.node
19298    }
19299    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19300        GenericArgValueExprPtr(self.node.stable_ptr(db))
19301    }
19302}
19303#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19304pub struct GenericArgs<'db> {
19305    node: SyntaxNode<'db>,
19306}
19307impl<'db> GenericArgs<'db> {
19308    pub const INDEX_LANGLE: usize = 0;
19309    pub const INDEX_GENERIC_ARGS: usize = 1;
19310    pub const INDEX_RANGLE: usize = 2;
19311    pub fn new_green(
19312        db: &'db dyn Database,
19313        langle: TerminalLTGreen<'db>,
19314        generic_args: GenericArgListGreen<'db>,
19315        rangle: TerminalGTGreen<'db>,
19316    ) -> GenericArgsGreen<'db> {
19317        let children = [langle.0, generic_args.0, rangle.0];
19318        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19319        GenericArgsGreen(
19320            GreenNode {
19321                kind: SyntaxKind::GenericArgs,
19322                details: GreenNodeDetails::Node { children: children.into(), width },
19323            }
19324            .intern(db),
19325        )
19326    }
19327}
19328impl<'db> GenericArgs<'db> {
19329    pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
19330        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19331    }
19332    pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19333        GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
19334    }
19335    pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
19336        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19337    }
19338}
19339#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19340pub struct GenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
19341impl<'db> GenericArgsPtr<'db> {}
19342impl<'db> TypedStablePtr<'db> for GenericArgsPtr<'db> {
19343    type SyntaxNode = GenericArgs<'db>;
19344    fn untyped(self) -> SyntaxStablePtrId<'db> {
19345        self.0
19346    }
19347    fn lookup(&self, db: &'db dyn Database) -> GenericArgs<'db> {
19348        GenericArgs::from_syntax_node(db, self.0.lookup(db))
19349    }
19350}
19351impl<'db> From<GenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
19352    fn from(ptr: GenericArgsPtr<'db>) -> Self {
19353        ptr.untyped()
19354    }
19355}
19356#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19357pub struct GenericArgsGreen<'db>(pub GreenId<'db>);
19358impl<'db> TypedSyntaxNode<'db> for GenericArgs<'db> {
19359    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19360    type StablePtr = GenericArgsPtr<'db>;
19361    type Green = GenericArgsGreen<'db>;
19362    fn missing(db: &'db dyn Database) -> Self::Green {
19363        GenericArgsGreen(
19364            GreenNode {
19365                kind: SyntaxKind::GenericArgs,
19366                details: GreenNodeDetails::Node {
19367                    children: [
19368                        TerminalLT::missing(db).0,
19369                        GenericArgList::missing(db).0,
19370                        TerminalGT::missing(db).0,
19371                    ]
19372                    .into(),
19373                    width: TextWidth::default(),
19374                },
19375            }
19376            .intern(db),
19377        )
19378    }
19379    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19380        let kind = node.kind(db);
19381        assert_eq!(
19382            kind,
19383            SyntaxKind::GenericArgs,
19384            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19385            kind,
19386            SyntaxKind::GenericArgs
19387        );
19388        Self { node }
19389    }
19390    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19391        let kind = node.kind(db);
19392        if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19393    }
19394    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19395        self.node
19396    }
19397    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19398        GenericArgsPtr(self.node.stable_ptr(db))
19399    }
19400}
19401#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19402pub struct GenericArgList<'db>(ElementList<'db, GenericArg<'db>, 2>);
19403impl<'db> Deref for GenericArgList<'db> {
19404    type Target = ElementList<'db, GenericArg<'db>, 2>;
19405    fn deref(&self) -> &Self::Target {
19406        &self.0
19407    }
19408}
19409impl<'db> GenericArgList<'db> {
19410    pub fn new_green(
19411        db: &'db dyn Database,
19412        children: &[GenericArgListElementOrSeparatorGreen<'db>],
19413    ) -> GenericArgListGreen<'db> {
19414        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19415        GenericArgListGreen(
19416            GreenNode {
19417                kind: SyntaxKind::GenericArgList,
19418                details: GreenNodeDetails::Node {
19419                    children: children.iter().map(|x| x.id()).collect(),
19420                    width,
19421                },
19422            }
19423            .intern(db),
19424        )
19425    }
19426}
19427#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19428pub struct GenericArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
19429impl<'db> TypedStablePtr<'db> for GenericArgListPtr<'db> {
19430    type SyntaxNode = GenericArgList<'db>;
19431    fn untyped(self) -> SyntaxStablePtrId<'db> {
19432        self.0
19433    }
19434    fn lookup(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19435        GenericArgList::from_syntax_node(db, self.0.lookup(db))
19436    }
19437}
19438impl<'db> From<GenericArgListPtr<'db>> for SyntaxStablePtrId<'db> {
19439    fn from(ptr: GenericArgListPtr<'db>) -> Self {
19440        ptr.untyped()
19441    }
19442}
19443#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19444pub enum GenericArgListElementOrSeparatorGreen<'db> {
19445    Separator(TerminalCommaGreen<'db>),
19446    Element(GenericArgGreen<'db>),
19447}
19448impl<'db> From<TerminalCommaGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19449    fn from(value: TerminalCommaGreen<'db>) -> Self {
19450        GenericArgListElementOrSeparatorGreen::Separator(value)
19451    }
19452}
19453impl<'db> From<GenericArgGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19454    fn from(value: GenericArgGreen<'db>) -> Self {
19455        GenericArgListElementOrSeparatorGreen::Element(value)
19456    }
19457}
19458impl<'db> GenericArgListElementOrSeparatorGreen<'db> {
19459    fn id(&self) -> GreenId<'db> {
19460        match self {
19461            GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19462            GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19463        }
19464    }
19465}
19466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19467pub struct GenericArgListGreen<'db>(pub GreenId<'db>);
19468impl<'db> TypedSyntaxNode<'db> for GenericArgList<'db> {
19469    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19470    type StablePtr = GenericArgListPtr<'db>;
19471    type Green = GenericArgListGreen<'db>;
19472    fn missing(db: &'db dyn Database) -> Self::Green {
19473        GenericArgListGreen(
19474            GreenNode {
19475                kind: SyntaxKind::GenericArgList,
19476                details: GreenNodeDetails::Node {
19477                    children: [].into(),
19478                    width: TextWidth::default(),
19479                },
19480            }
19481            .intern(db),
19482        )
19483    }
19484    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19485        Self(ElementList::new(node))
19486    }
19487    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19488        if node.kind(db) == SyntaxKind::GenericArgList {
19489            Some(Self(ElementList::new(node)))
19490        } else {
19491            None
19492        }
19493    }
19494    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19495        self.node
19496    }
19497    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19498        GenericArgListPtr(self.node.stable_ptr(db))
19499    }
19500}
19501#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19502pub struct AssociatedItemConstraint<'db> {
19503    node: SyntaxNode<'db>,
19504}
19505impl<'db> AssociatedItemConstraint<'db> {
19506    pub const INDEX_ITEM: usize = 0;
19507    pub const INDEX_COLON: usize = 1;
19508    pub const INDEX_VALUE: usize = 2;
19509    pub fn new_green(
19510        db: &'db dyn Database,
19511        item: TerminalIdentifierGreen<'db>,
19512        colon: TerminalColonGreen<'db>,
19513        value: ExprGreen<'db>,
19514    ) -> AssociatedItemConstraintGreen<'db> {
19515        let children = [item.0, colon.0, value.0];
19516        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19517        AssociatedItemConstraintGreen(
19518            GreenNode {
19519                kind: SyntaxKind::AssociatedItemConstraint,
19520                details: GreenNodeDetails::Node { children: children.into(), width },
19521            }
19522            .intern(db),
19523        )
19524    }
19525}
19526impl<'db> AssociatedItemConstraint<'db> {
19527    pub fn item(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
19528        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19529    }
19530    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
19531        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19532    }
19533    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
19534        Expr::from_syntax_node(db, self.node.get_children(db)[2])
19535    }
19536}
19537#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19538pub struct AssociatedItemConstraintPtr<'db>(pub SyntaxStablePtrId<'db>);
19539impl<'db> AssociatedItemConstraintPtr<'db> {}
19540impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintPtr<'db> {
19541    type SyntaxNode = AssociatedItemConstraint<'db>;
19542    fn untyped(self) -> SyntaxStablePtrId<'db> {
19543        self.0
19544    }
19545    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraint<'db> {
19546        AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19547    }
19548}
19549impl<'db> From<AssociatedItemConstraintPtr<'db>> for SyntaxStablePtrId<'db> {
19550    fn from(ptr: AssociatedItemConstraintPtr<'db>) -> Self {
19551        ptr.untyped()
19552    }
19553}
19554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19555pub struct AssociatedItemConstraintGreen<'db>(pub GreenId<'db>);
19556impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraint<'db> {
19557    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19558    type StablePtr = AssociatedItemConstraintPtr<'db>;
19559    type Green = AssociatedItemConstraintGreen<'db>;
19560    fn missing(db: &'db dyn Database) -> Self::Green {
19561        AssociatedItemConstraintGreen(
19562            GreenNode {
19563                kind: SyntaxKind::AssociatedItemConstraint,
19564                details: GreenNodeDetails::Node {
19565                    children: [
19566                        TerminalIdentifier::missing(db).0,
19567                        TerminalColon::missing(db).0,
19568                        Expr::missing(db).0,
19569                    ]
19570                    .into(),
19571                    width: TextWidth::default(),
19572                },
19573            }
19574            .intern(db),
19575        )
19576    }
19577    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19578        let kind = node.kind(db);
19579        assert_eq!(
19580            kind,
19581            SyntaxKind::AssociatedItemConstraint,
19582            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19583            kind,
19584            SyntaxKind::AssociatedItemConstraint
19585        );
19586        Self { node }
19587    }
19588    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19589        let kind = node.kind(db);
19590        if kind == SyntaxKind::AssociatedItemConstraint {
19591            Some(Self::from_syntax_node(db, node))
19592        } else {
19593            None
19594        }
19595    }
19596    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19597        self.node
19598    }
19599    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19600        AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19601    }
19602}
19603#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19604pub struct AssociatedItemConstraints<'db> {
19605    node: SyntaxNode<'db>,
19606}
19607impl<'db> AssociatedItemConstraints<'db> {
19608    pub const INDEX_LBRACK: usize = 0;
19609    pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19610    pub const INDEX_RBRACK: usize = 2;
19611    pub fn new_green(
19612        db: &'db dyn Database,
19613        lbrack: TerminalLBrackGreen<'db>,
19614        associated_item_constraints: AssociatedItemConstraintListGreen<'db>,
19615        rbrack: TerminalRBrackGreen<'db>,
19616    ) -> AssociatedItemConstraintsGreen<'db> {
19617        let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19618        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19619        AssociatedItemConstraintsGreen(
19620            GreenNode {
19621                kind: SyntaxKind::AssociatedItemConstraints,
19622                details: GreenNodeDetails::Node { children: children.into(), width },
19623            }
19624            .intern(db),
19625        )
19626    }
19627}
19628impl<'db> AssociatedItemConstraints<'db> {
19629    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
19630        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19631    }
19632    pub fn associated_item_constraints(
19633        &self,
19634        db: &'db dyn Database,
19635    ) -> AssociatedItemConstraintList<'db> {
19636        AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19637    }
19638    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
19639        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19640    }
19641}
19642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19643pub struct AssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19644impl<'db> AssociatedItemConstraintsPtr<'db> {}
19645impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintsPtr<'db> {
19646    type SyntaxNode = AssociatedItemConstraints<'db>;
19647    fn untyped(self) -> SyntaxStablePtrId<'db> {
19648        self.0
19649    }
19650    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraints<'db> {
19651        AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19652    }
19653}
19654impl<'db> From<AssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19655    fn from(ptr: AssociatedItemConstraintsPtr<'db>) -> Self {
19656        ptr.untyped()
19657    }
19658}
19659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19660pub struct AssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19661impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraints<'db> {
19662    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19663    type StablePtr = AssociatedItemConstraintsPtr<'db>;
19664    type Green = AssociatedItemConstraintsGreen<'db>;
19665    fn missing(db: &'db dyn Database) -> Self::Green {
19666        AssociatedItemConstraintsGreen(
19667            GreenNode {
19668                kind: SyntaxKind::AssociatedItemConstraints,
19669                details: GreenNodeDetails::Node {
19670                    children: [
19671                        TerminalLBrack::missing(db).0,
19672                        AssociatedItemConstraintList::missing(db).0,
19673                        TerminalRBrack::missing(db).0,
19674                    ]
19675                    .into(),
19676                    width: TextWidth::default(),
19677                },
19678            }
19679            .intern(db),
19680        )
19681    }
19682    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19683        let kind = node.kind(db);
19684        assert_eq!(
19685            kind,
19686            SyntaxKind::AssociatedItemConstraints,
19687            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19688            kind,
19689            SyntaxKind::AssociatedItemConstraints
19690        );
19691        Self { node }
19692    }
19693    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19694        let kind = node.kind(db);
19695        if kind == SyntaxKind::AssociatedItemConstraints {
19696            Some(Self::from_syntax_node(db, node))
19697        } else {
19698            None
19699        }
19700    }
19701    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19702        self.node
19703    }
19704    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19705        AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19706    }
19707}
19708#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19709pub struct AssociatedItemConstraintList<'db>(ElementList<'db, AssociatedItemConstraint<'db>, 2>);
19710impl<'db> Deref for AssociatedItemConstraintList<'db> {
19711    type Target = ElementList<'db, AssociatedItemConstraint<'db>, 2>;
19712    fn deref(&self) -> &Self::Target {
19713        &self.0
19714    }
19715}
19716impl<'db> AssociatedItemConstraintList<'db> {
19717    pub fn new_green(
19718        db: &'db dyn Database,
19719        children: &[AssociatedItemConstraintListElementOrSeparatorGreen<'db>],
19720    ) -> AssociatedItemConstraintListGreen<'db> {
19721        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19722        AssociatedItemConstraintListGreen(
19723            GreenNode {
19724                kind: SyntaxKind::AssociatedItemConstraintList,
19725                details: GreenNodeDetails::Node {
19726                    children: children.iter().map(|x| x.id()).collect(),
19727                    width,
19728                },
19729            }
19730            .intern(db),
19731        )
19732    }
19733}
19734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19735pub struct AssociatedItemConstraintListPtr<'db>(pub SyntaxStablePtrId<'db>);
19736impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintListPtr<'db> {
19737    type SyntaxNode = AssociatedItemConstraintList<'db>;
19738    fn untyped(self) -> SyntaxStablePtrId<'db> {
19739        self.0
19740    }
19741    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraintList<'db> {
19742        AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19743    }
19744}
19745impl<'db> From<AssociatedItemConstraintListPtr<'db>> for SyntaxStablePtrId<'db> {
19746    fn from(ptr: AssociatedItemConstraintListPtr<'db>) -> Self {
19747        ptr.untyped()
19748    }
19749}
19750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19751pub enum AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19752    Separator(TerminalCommaGreen<'db>),
19753    Element(AssociatedItemConstraintGreen<'db>),
19754}
19755impl<'db> From<TerminalCommaGreen<'db>>
19756    for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19757{
19758    fn from(value: TerminalCommaGreen<'db>) -> Self {
19759        AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19760    }
19761}
19762impl<'db> From<AssociatedItemConstraintGreen<'db>>
19763    for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19764{
19765    fn from(value: AssociatedItemConstraintGreen<'db>) -> Self {
19766        AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19767    }
19768}
19769impl<'db> AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19770    fn id(&self) -> GreenId<'db> {
19771        match self {
19772            AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19773            AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19774        }
19775    }
19776}
19777#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19778pub struct AssociatedItemConstraintListGreen<'db>(pub GreenId<'db>);
19779impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraintList<'db> {
19780    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19781    type StablePtr = AssociatedItemConstraintListPtr<'db>;
19782    type Green = AssociatedItemConstraintListGreen<'db>;
19783    fn missing(db: &'db dyn Database) -> Self::Green {
19784        AssociatedItemConstraintListGreen(
19785            GreenNode {
19786                kind: SyntaxKind::AssociatedItemConstraintList,
19787                details: GreenNodeDetails::Node {
19788                    children: [].into(),
19789                    width: TextWidth::default(),
19790                },
19791            }
19792            .intern(db),
19793        )
19794    }
19795    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19796        Self(ElementList::new(node))
19797    }
19798    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19799        if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19800            Some(Self(ElementList::new(node)))
19801        } else {
19802            None
19803        }
19804    }
19805    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19806        self.node
19807    }
19808    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19809        AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19810    }
19811}
19812#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19813pub enum OptionAssociatedItemConstraints<'db> {
19814    Empty(OptionAssociatedItemConstraintsEmpty<'db>),
19815    AssociatedItemConstraints(AssociatedItemConstraints<'db>),
19816}
19817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19818pub struct OptionAssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19819impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsPtr<'db> {
19820    type SyntaxNode = OptionAssociatedItemConstraints<'db>;
19821    fn untyped(self) -> SyntaxStablePtrId<'db> {
19822        self.0
19823    }
19824    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19825        OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19826    }
19827}
19828impl<'db> From<OptionAssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19829    fn from(ptr: OptionAssociatedItemConstraintsPtr<'db>) -> Self {
19830        ptr.untyped()
19831    }
19832}
19833impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>>
19834    for OptionAssociatedItemConstraintsPtr<'db>
19835{
19836    fn from(value: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19837        Self(value.0)
19838    }
19839}
19840impl<'db> From<AssociatedItemConstraintsPtr<'db>> for OptionAssociatedItemConstraintsPtr<'db> {
19841    fn from(value: AssociatedItemConstraintsPtr<'db>) -> Self {
19842        Self(value.0)
19843    }
19844}
19845impl<'db> From<OptionAssociatedItemConstraintsEmptyGreen<'db>>
19846    for OptionAssociatedItemConstraintsGreen<'db>
19847{
19848    fn from(value: OptionAssociatedItemConstraintsEmptyGreen<'db>) -> Self {
19849        Self(value.0)
19850    }
19851}
19852impl<'db> From<AssociatedItemConstraintsGreen<'db>> for OptionAssociatedItemConstraintsGreen<'db> {
19853    fn from(value: AssociatedItemConstraintsGreen<'db>) -> Self {
19854        Self(value.0)
19855    }
19856}
19857#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19858pub struct OptionAssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19859impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraints<'db> {
19860    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19861    type StablePtr = OptionAssociatedItemConstraintsPtr<'db>;
19862    type Green = OptionAssociatedItemConstraintsGreen<'db>;
19863    fn missing(db: &'db dyn Database) -> Self::Green {
19864        panic!("No missing variant.");
19865    }
19866    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19867        let kind = node.kind(db);
19868        match kind {
19869            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19870                OptionAssociatedItemConstraints::Empty(
19871                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19872                )
19873            }
19874            SyntaxKind::AssociatedItemConstraints => {
19875                OptionAssociatedItemConstraints::AssociatedItemConstraints(
19876                    AssociatedItemConstraints::from_syntax_node(db, node),
19877                )
19878            }
19879            _ => panic!(
19880                "Unexpected syntax kind {:?} when constructing {}.",
19881                kind, "OptionAssociatedItemConstraints"
19882            ),
19883        }
19884    }
19885    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19886        let kind = node.kind(db);
19887        match kind {
19888            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19889                Some(OptionAssociatedItemConstraints::Empty(
19890                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19891                ))
19892            }
19893            SyntaxKind::AssociatedItemConstraints => {
19894                Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19895                    AssociatedItemConstraints::from_syntax_node(db, node),
19896                ))
19897            }
19898            _ => None,
19899        }
19900    }
19901    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19902        match self {
19903            OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19904            OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19905        }
19906    }
19907    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19908        OptionAssociatedItemConstraintsPtr(self.as_syntax_node().long(db).stable_ptr)
19909    }
19910}
19911impl<'db> OptionAssociatedItemConstraints<'db> {
19912    /// Checks if a kind of a variant of [OptionAssociatedItemConstraints].
19913    pub fn is_variant(kind: SyntaxKind) -> bool {
19914        matches!(
19915            kind,
19916            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19917                | SyntaxKind::AssociatedItemConstraints
19918        )
19919    }
19920}
19921#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19922pub struct OptionAssociatedItemConstraintsEmpty<'db> {
19923    node: SyntaxNode<'db>,
19924}
19925impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {
19926    pub fn new_green(db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmptyGreen<'db> {
19927        let children = [];
19928        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19929        OptionAssociatedItemConstraintsEmptyGreen(
19930            GreenNode {
19931                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19932                details: GreenNodeDetails::Node { children: children.into(), width },
19933            }
19934            .intern(db),
19935        )
19936    }
19937}
19938impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {}
19939#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19940pub struct OptionAssociatedItemConstraintsEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19941impl<'db> OptionAssociatedItemConstraintsEmptyPtr<'db> {}
19942impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsEmptyPtr<'db> {
19943    type SyntaxNode = OptionAssociatedItemConstraintsEmpty<'db>;
19944    fn untyped(self) -> SyntaxStablePtrId<'db> {
19945        self.0
19946    }
19947    fn lookup(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmpty<'db> {
19948        OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
19949    }
19950}
19951impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19952    fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19953        ptr.untyped()
19954    }
19955}
19956#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19957pub struct OptionAssociatedItemConstraintsEmptyGreen<'db>(pub GreenId<'db>);
19958impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraintsEmpty<'db> {
19959    const OPTIONAL_KIND: Option<SyntaxKind> =
19960        Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
19961    type StablePtr = OptionAssociatedItemConstraintsEmptyPtr<'db>;
19962    type Green = OptionAssociatedItemConstraintsEmptyGreen<'db>;
19963    fn missing(db: &'db dyn Database) -> Self::Green {
19964        OptionAssociatedItemConstraintsEmptyGreen(
19965            GreenNode {
19966                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19967                details: GreenNodeDetails::Node {
19968                    children: [].into(),
19969                    width: TextWidth::default(),
19970                },
19971            }
19972            .intern(db),
19973        )
19974    }
19975    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19976        let kind = node.kind(db);
19977        assert_eq!(
19978            kind,
19979            SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19980            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19981            kind,
19982            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19983        );
19984        Self { node }
19985    }
19986    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19987        let kind = node.kind(db);
19988        if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
19989            Some(Self::from_syntax_node(db, node))
19990        } else {
19991            None
19992        }
19993    }
19994    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19995        self.node
19996    }
19997    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19998        OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
19999    }
20000}
20001#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20002pub enum OptionWrappedGenericParamList<'db> {
20003    Empty(OptionWrappedGenericParamListEmpty<'db>),
20004    WrappedGenericParamList(WrappedGenericParamList<'db>),
20005}
20006#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20007pub struct OptionWrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20008impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListPtr<'db> {
20009    type SyntaxNode = OptionWrappedGenericParamList<'db>;
20010    fn untyped(self) -> SyntaxStablePtrId<'db> {
20011        self.0
20012    }
20013    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20014        OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20015    }
20016}
20017impl<'db> From<OptionWrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20018    fn from(ptr: OptionWrappedGenericParamListPtr<'db>) -> Self {
20019        ptr.untyped()
20020    }
20021}
20022impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>>
20023    for OptionWrappedGenericParamListPtr<'db>
20024{
20025    fn from(value: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
20026        Self(value.0)
20027    }
20028}
20029impl<'db> From<WrappedGenericParamListPtr<'db>> for OptionWrappedGenericParamListPtr<'db> {
20030    fn from(value: WrappedGenericParamListPtr<'db>) -> Self {
20031        Self(value.0)
20032    }
20033}
20034impl<'db> From<OptionWrappedGenericParamListEmptyGreen<'db>>
20035    for OptionWrappedGenericParamListGreen<'db>
20036{
20037    fn from(value: OptionWrappedGenericParamListEmptyGreen<'db>) -> Self {
20038        Self(value.0)
20039    }
20040}
20041impl<'db> From<WrappedGenericParamListGreen<'db>> for OptionWrappedGenericParamListGreen<'db> {
20042    fn from(value: WrappedGenericParamListGreen<'db>) -> Self {
20043        Self(value.0)
20044    }
20045}
20046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20047pub struct OptionWrappedGenericParamListGreen<'db>(pub GreenId<'db>);
20048impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamList<'db> {
20049    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20050    type StablePtr = OptionWrappedGenericParamListPtr<'db>;
20051    type Green = OptionWrappedGenericParamListGreen<'db>;
20052    fn missing(db: &'db dyn Database) -> Self::Green {
20053        panic!("No missing variant.");
20054    }
20055    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20056        let kind = node.kind(db);
20057        match kind {
20058            SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
20059                OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20060            ),
20061            SyntaxKind::WrappedGenericParamList => {
20062                OptionWrappedGenericParamList::WrappedGenericParamList(
20063                    WrappedGenericParamList::from_syntax_node(db, node),
20064                )
20065            }
20066            _ => panic!(
20067                "Unexpected syntax kind {:?} when constructing {}.",
20068                kind, "OptionWrappedGenericParamList"
20069            ),
20070        }
20071    }
20072    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20073        let kind = node.kind(db);
20074        match kind {
20075            SyntaxKind::OptionWrappedGenericParamListEmpty => {
20076                Some(OptionWrappedGenericParamList::Empty(
20077                    OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
20078                ))
20079            }
20080            SyntaxKind::WrappedGenericParamList => {
20081                Some(OptionWrappedGenericParamList::WrappedGenericParamList(
20082                    WrappedGenericParamList::from_syntax_node(db, node),
20083                ))
20084            }
20085            _ => None,
20086        }
20087    }
20088    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20089        match self {
20090            OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
20091            OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
20092        }
20093    }
20094    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20095        OptionWrappedGenericParamListPtr(self.as_syntax_node().long(db).stable_ptr)
20096    }
20097}
20098impl<'db> OptionWrappedGenericParamList<'db> {
20099    /// Checks if a kind of a variant of [OptionWrappedGenericParamList].
20100    pub fn is_variant(kind: SyntaxKind) -> bool {
20101        matches!(
20102            kind,
20103            SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
20104        )
20105    }
20106}
20107#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20108pub struct OptionWrappedGenericParamListEmpty<'db> {
20109    node: SyntaxNode<'db>,
20110}
20111impl<'db> OptionWrappedGenericParamListEmpty<'db> {
20112    pub fn new_green(db: &'db dyn Database) -> OptionWrappedGenericParamListEmptyGreen<'db> {
20113        let children = [];
20114        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20115        OptionWrappedGenericParamListEmptyGreen(
20116            GreenNode {
20117                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20118                details: GreenNodeDetails::Node { children: children.into(), width },
20119            }
20120            .intern(db),
20121        )
20122    }
20123}
20124impl<'db> OptionWrappedGenericParamListEmpty<'db> {}
20125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20126pub struct OptionWrappedGenericParamListEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
20127impl<'db> OptionWrappedGenericParamListEmptyPtr<'db> {}
20128impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListEmptyPtr<'db> {
20129    type SyntaxNode = OptionWrappedGenericParamListEmpty<'db>;
20130    fn untyped(self) -> SyntaxStablePtrId<'db> {
20131        self.0
20132    }
20133    fn lookup(&self, db: &'db dyn Database) -> OptionWrappedGenericParamListEmpty<'db> {
20134        OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20135    }
20136}
20137impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
20138    fn from(ptr: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
20139        ptr.untyped()
20140    }
20141}
20142#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20143pub struct OptionWrappedGenericParamListEmptyGreen<'db>(pub GreenId<'db>);
20144impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamListEmpty<'db> {
20145    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20146    type StablePtr = OptionWrappedGenericParamListEmptyPtr<'db>;
20147    type Green = OptionWrappedGenericParamListEmptyGreen<'db>;
20148    fn missing(db: &'db dyn Database) -> Self::Green {
20149        OptionWrappedGenericParamListEmptyGreen(
20150            GreenNode {
20151                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20152                details: GreenNodeDetails::Node {
20153                    children: [].into(),
20154                    width: TextWidth::default(),
20155                },
20156            }
20157            .intern(db),
20158        )
20159    }
20160    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20161        let kind = node.kind(db);
20162        assert_eq!(
20163            kind,
20164            SyntaxKind::OptionWrappedGenericParamListEmpty,
20165            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20166            kind,
20167            SyntaxKind::OptionWrappedGenericParamListEmpty
20168        );
20169        Self { node }
20170    }
20171    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20172        let kind = node.kind(db);
20173        if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20174            Some(Self::from_syntax_node(db, node))
20175        } else {
20176            None
20177        }
20178    }
20179    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20180        self.node
20181    }
20182    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20183        OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
20184    }
20185}
20186#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20187pub struct WrappedGenericParamList<'db> {
20188    node: SyntaxNode<'db>,
20189}
20190impl<'db> WrappedGenericParamList<'db> {
20191    pub const INDEX_LANGLE: usize = 0;
20192    pub const INDEX_GENERIC_PARAMS: usize = 1;
20193    pub const INDEX_RANGLE: usize = 2;
20194    pub fn new_green(
20195        db: &'db dyn Database,
20196        langle: TerminalLTGreen<'db>,
20197        generic_params: GenericParamListGreen<'db>,
20198        rangle: TerminalGTGreen<'db>,
20199    ) -> WrappedGenericParamListGreen<'db> {
20200        let children = [langle.0, generic_params.0, rangle.0];
20201        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20202        WrappedGenericParamListGreen(
20203            GreenNode {
20204                kind: SyntaxKind::WrappedGenericParamList,
20205                details: GreenNodeDetails::Node { children: children.into(), width },
20206            }
20207            .intern(db),
20208        )
20209    }
20210}
20211impl<'db> WrappedGenericParamList<'db> {
20212    pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
20213        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
20214    }
20215    pub fn generic_params(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20216        GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
20217    }
20218    pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
20219        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
20220    }
20221}
20222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20223pub struct WrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20224impl<'db> WrappedGenericParamListPtr<'db> {}
20225impl<'db> TypedStablePtr<'db> for WrappedGenericParamListPtr<'db> {
20226    type SyntaxNode = WrappedGenericParamList<'db>;
20227    fn untyped(self) -> SyntaxStablePtrId<'db> {
20228        self.0
20229    }
20230    fn lookup(&self, db: &'db dyn Database) -> WrappedGenericParamList<'db> {
20231        WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20232    }
20233}
20234impl<'db> From<WrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20235    fn from(ptr: WrappedGenericParamListPtr<'db>) -> Self {
20236        ptr.untyped()
20237    }
20238}
20239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20240pub struct WrappedGenericParamListGreen<'db>(pub GreenId<'db>);
20241impl<'db> TypedSyntaxNode<'db> for WrappedGenericParamList<'db> {
20242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20243    type StablePtr = WrappedGenericParamListPtr<'db>;
20244    type Green = WrappedGenericParamListGreen<'db>;
20245    fn missing(db: &'db dyn Database) -> Self::Green {
20246        WrappedGenericParamListGreen(
20247            GreenNode {
20248                kind: SyntaxKind::WrappedGenericParamList,
20249                details: GreenNodeDetails::Node {
20250                    children: [
20251                        TerminalLT::missing(db).0,
20252                        GenericParamList::missing(db).0,
20253                        TerminalGT::missing(db).0,
20254                    ]
20255                    .into(),
20256                    width: TextWidth::default(),
20257                },
20258            }
20259            .intern(db),
20260        )
20261    }
20262    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20263        let kind = node.kind(db);
20264        assert_eq!(
20265            kind,
20266            SyntaxKind::WrappedGenericParamList,
20267            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20268            kind,
20269            SyntaxKind::WrappedGenericParamList
20270        );
20271        Self { node }
20272    }
20273    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20274        let kind = node.kind(db);
20275        if kind == SyntaxKind::WrappedGenericParamList {
20276            Some(Self::from_syntax_node(db, node))
20277        } else {
20278            None
20279        }
20280    }
20281    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20282        self.node
20283    }
20284    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20285        WrappedGenericParamListPtr(self.node.stable_ptr(db))
20286    }
20287}
20288#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20289pub struct GenericParamList<'db>(ElementList<'db, GenericParam<'db>, 2>);
20290impl<'db> Deref for GenericParamList<'db> {
20291    type Target = ElementList<'db, GenericParam<'db>, 2>;
20292    fn deref(&self) -> &Self::Target {
20293        &self.0
20294    }
20295}
20296impl<'db> GenericParamList<'db> {
20297    pub fn new_green(
20298        db: &'db dyn Database,
20299        children: &[GenericParamListElementOrSeparatorGreen<'db>],
20300    ) -> GenericParamListGreen<'db> {
20301        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
20302        GenericParamListGreen(
20303            GreenNode {
20304                kind: SyntaxKind::GenericParamList,
20305                details: GreenNodeDetails::Node {
20306                    children: children.iter().map(|x| x.id()).collect(),
20307                    width,
20308                },
20309            }
20310            .intern(db),
20311        )
20312    }
20313}
20314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20315pub struct GenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20316impl<'db> TypedStablePtr<'db> for GenericParamListPtr<'db> {
20317    type SyntaxNode = GenericParamList<'db>;
20318    fn untyped(self) -> SyntaxStablePtrId<'db> {
20319        self.0
20320    }
20321    fn lookup(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20322        GenericParamList::from_syntax_node(db, self.0.lookup(db))
20323    }
20324}
20325impl<'db> From<GenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20326    fn from(ptr: GenericParamListPtr<'db>) -> Self {
20327        ptr.untyped()
20328    }
20329}
20330#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20331pub enum GenericParamListElementOrSeparatorGreen<'db> {
20332    Separator(TerminalCommaGreen<'db>),
20333    Element(GenericParamGreen<'db>),
20334}
20335impl<'db> From<TerminalCommaGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20336    fn from(value: TerminalCommaGreen<'db>) -> Self {
20337        GenericParamListElementOrSeparatorGreen::Separator(value)
20338    }
20339}
20340impl<'db> From<GenericParamGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20341    fn from(value: GenericParamGreen<'db>) -> Self {
20342        GenericParamListElementOrSeparatorGreen::Element(value)
20343    }
20344}
20345impl<'db> GenericParamListElementOrSeparatorGreen<'db> {
20346    fn id(&self) -> GreenId<'db> {
20347        match self {
20348            GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20349            GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20350        }
20351    }
20352}
20353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20354pub struct GenericParamListGreen<'db>(pub GreenId<'db>);
20355impl<'db> TypedSyntaxNode<'db> for GenericParamList<'db> {
20356    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20357    type StablePtr = GenericParamListPtr<'db>;
20358    type Green = GenericParamListGreen<'db>;
20359    fn missing(db: &'db dyn Database) -> Self::Green {
20360        GenericParamListGreen(
20361            GreenNode {
20362                kind: SyntaxKind::GenericParamList,
20363                details: GreenNodeDetails::Node {
20364                    children: [].into(),
20365                    width: TextWidth::default(),
20366                },
20367            }
20368            .intern(db),
20369        )
20370    }
20371    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20372        Self(ElementList::new(node))
20373    }
20374    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20375        if node.kind(db) == SyntaxKind::GenericParamList {
20376            Some(Self(ElementList::new(node)))
20377        } else {
20378            None
20379        }
20380    }
20381    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20382        self.node
20383    }
20384    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20385        GenericParamListPtr(self.node.stable_ptr(db))
20386    }
20387}
20388#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20389pub enum GenericParam<'db> {
20390    Type(GenericParamType<'db>),
20391    Const(GenericParamConst<'db>),
20392    ImplNamed(GenericParamImplNamed<'db>),
20393    ImplAnonymous(GenericParamImplAnonymous<'db>),
20394    NegativeImpl(GenericParamNegativeImpl<'db>),
20395}
20396#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20397pub struct GenericParamPtr<'db>(pub SyntaxStablePtrId<'db>);
20398impl<'db> TypedStablePtr<'db> for GenericParamPtr<'db> {
20399    type SyntaxNode = GenericParam<'db>;
20400    fn untyped(self) -> SyntaxStablePtrId<'db> {
20401        self.0
20402    }
20403    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20404        GenericParam::from_syntax_node(db, self.0.lookup(db))
20405    }
20406}
20407impl<'db> From<GenericParamPtr<'db>> for SyntaxStablePtrId<'db> {
20408    fn from(ptr: GenericParamPtr<'db>) -> Self {
20409        ptr.untyped()
20410    }
20411}
20412impl<'db> From<GenericParamTypePtr<'db>> for GenericParamPtr<'db> {
20413    fn from(value: GenericParamTypePtr<'db>) -> Self {
20414        Self(value.0)
20415    }
20416}
20417impl<'db> From<GenericParamConstPtr<'db>> for GenericParamPtr<'db> {
20418    fn from(value: GenericParamConstPtr<'db>) -> Self {
20419        Self(value.0)
20420    }
20421}
20422impl<'db> From<GenericParamImplNamedPtr<'db>> for GenericParamPtr<'db> {
20423    fn from(value: GenericParamImplNamedPtr<'db>) -> Self {
20424        Self(value.0)
20425    }
20426}
20427impl<'db> From<GenericParamImplAnonymousPtr<'db>> for GenericParamPtr<'db> {
20428    fn from(value: GenericParamImplAnonymousPtr<'db>) -> Self {
20429        Self(value.0)
20430    }
20431}
20432impl<'db> From<GenericParamNegativeImplPtr<'db>> for GenericParamPtr<'db> {
20433    fn from(value: GenericParamNegativeImplPtr<'db>) -> Self {
20434        Self(value.0)
20435    }
20436}
20437impl<'db> From<GenericParamTypeGreen<'db>> for GenericParamGreen<'db> {
20438    fn from(value: GenericParamTypeGreen<'db>) -> Self {
20439        Self(value.0)
20440    }
20441}
20442impl<'db> From<GenericParamConstGreen<'db>> for GenericParamGreen<'db> {
20443    fn from(value: GenericParamConstGreen<'db>) -> Self {
20444        Self(value.0)
20445    }
20446}
20447impl<'db> From<GenericParamImplNamedGreen<'db>> for GenericParamGreen<'db> {
20448    fn from(value: GenericParamImplNamedGreen<'db>) -> Self {
20449        Self(value.0)
20450    }
20451}
20452impl<'db> From<GenericParamImplAnonymousGreen<'db>> for GenericParamGreen<'db> {
20453    fn from(value: GenericParamImplAnonymousGreen<'db>) -> Self {
20454        Self(value.0)
20455    }
20456}
20457impl<'db> From<GenericParamNegativeImplGreen<'db>> for GenericParamGreen<'db> {
20458    fn from(value: GenericParamNegativeImplGreen<'db>) -> Self {
20459        Self(value.0)
20460    }
20461}
20462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20463pub struct GenericParamGreen<'db>(pub GreenId<'db>);
20464impl<'db> TypedSyntaxNode<'db> for GenericParam<'db> {
20465    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20466    type StablePtr = GenericParamPtr<'db>;
20467    type Green = GenericParamGreen<'db>;
20468    fn missing(db: &'db dyn Database) -> Self::Green {
20469        panic!("No missing variant.");
20470    }
20471    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20472        let kind = node.kind(db);
20473        match kind {
20474            SyntaxKind::GenericParamType => {
20475                GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20476            }
20477            SyntaxKind::GenericParamConst => {
20478                GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20479            }
20480            SyntaxKind::GenericParamImplNamed => {
20481                GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20482            }
20483            SyntaxKind::GenericParamImplAnonymous => {
20484                GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20485            }
20486            SyntaxKind::GenericParamNegativeImpl => {
20487                GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20488            }
20489            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20490        }
20491    }
20492    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20493        let kind = node.kind(db);
20494        match kind {
20495            SyntaxKind::GenericParamType => {
20496                Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20497            }
20498            SyntaxKind::GenericParamConst => {
20499                Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20500            }
20501            SyntaxKind::GenericParamImplNamed => {
20502                Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20503            }
20504            SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20505                GenericParamImplAnonymous::from_syntax_node(db, node),
20506            )),
20507            SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20508                GenericParamNegativeImpl::from_syntax_node(db, node),
20509            )),
20510            _ => None,
20511        }
20512    }
20513    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20514        match self {
20515            GenericParam::Type(x) => x.as_syntax_node(),
20516            GenericParam::Const(x) => x.as_syntax_node(),
20517            GenericParam::ImplNamed(x) => x.as_syntax_node(),
20518            GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20519            GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20520        }
20521    }
20522    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20523        GenericParamPtr(self.as_syntax_node().long(db).stable_ptr)
20524    }
20525}
20526impl<'db> GenericParam<'db> {
20527    /// Checks if a kind of a variant of [GenericParam].
20528    pub fn is_variant(kind: SyntaxKind) -> bool {
20529        matches!(
20530            kind,
20531            SyntaxKind::GenericParamType
20532                | SyntaxKind::GenericParamConst
20533                | SyntaxKind::GenericParamImplNamed
20534                | SyntaxKind::GenericParamImplAnonymous
20535                | SyntaxKind::GenericParamNegativeImpl
20536        )
20537    }
20538}
20539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20540pub struct GenericParamType<'db> {
20541    node: SyntaxNode<'db>,
20542}
20543impl<'db> GenericParamType<'db> {
20544    pub const INDEX_NAME: usize = 0;
20545    pub fn new_green(
20546        db: &'db dyn Database,
20547        name: TerminalIdentifierGreen<'db>,
20548    ) -> GenericParamTypeGreen<'db> {
20549        let children = [name.0];
20550        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20551        GenericParamTypeGreen(
20552            GreenNode {
20553                kind: SyntaxKind::GenericParamType,
20554                details: GreenNodeDetails::Node { children: children.into(), width },
20555            }
20556            .intern(db),
20557        )
20558    }
20559}
20560impl<'db> GenericParamType<'db> {
20561    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20562        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20563    }
20564}
20565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20566pub struct GenericParamTypePtr<'db>(pub SyntaxStablePtrId<'db>);
20567impl<'db> GenericParamTypePtr<'db> {
20568    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20569        let ptr = self.0.long(db);
20570        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20571            TerminalIdentifierGreen(key_fields[0])
20572        } else {
20573            panic!("Unexpected key field query on root.");
20574        }
20575    }
20576}
20577impl<'db> TypedStablePtr<'db> for GenericParamTypePtr<'db> {
20578    type SyntaxNode = GenericParamType<'db>;
20579    fn untyped(self) -> SyntaxStablePtrId<'db> {
20580        self.0
20581    }
20582    fn lookup(&self, db: &'db dyn Database) -> GenericParamType<'db> {
20583        GenericParamType::from_syntax_node(db, self.0.lookup(db))
20584    }
20585}
20586impl<'db> From<GenericParamTypePtr<'db>> for SyntaxStablePtrId<'db> {
20587    fn from(ptr: GenericParamTypePtr<'db>) -> Self {
20588        ptr.untyped()
20589    }
20590}
20591#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20592pub struct GenericParamTypeGreen<'db>(pub GreenId<'db>);
20593impl<'db> TypedSyntaxNode<'db> for GenericParamType<'db> {
20594    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20595    type StablePtr = GenericParamTypePtr<'db>;
20596    type Green = GenericParamTypeGreen<'db>;
20597    fn missing(db: &'db dyn Database) -> Self::Green {
20598        GenericParamTypeGreen(
20599            GreenNode {
20600                kind: SyntaxKind::GenericParamType,
20601                details: GreenNodeDetails::Node {
20602                    children: [TerminalIdentifier::missing(db).0].into(),
20603                    width: TextWidth::default(),
20604                },
20605            }
20606            .intern(db),
20607        )
20608    }
20609    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20610        let kind = node.kind(db);
20611        assert_eq!(
20612            kind,
20613            SyntaxKind::GenericParamType,
20614            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20615            kind,
20616            SyntaxKind::GenericParamType
20617        );
20618        Self { node }
20619    }
20620    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20621        let kind = node.kind(db);
20622        if kind == SyntaxKind::GenericParamType {
20623            Some(Self::from_syntax_node(db, node))
20624        } else {
20625            None
20626        }
20627    }
20628    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20629        self.node
20630    }
20631    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20632        GenericParamTypePtr(self.node.stable_ptr(db))
20633    }
20634}
20635#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20636pub struct GenericParamConst<'db> {
20637    node: SyntaxNode<'db>,
20638}
20639impl<'db> GenericParamConst<'db> {
20640    pub const INDEX_CONST_KW: usize = 0;
20641    pub const INDEX_NAME: usize = 1;
20642    pub const INDEX_COLON: usize = 2;
20643    pub const INDEX_TY: usize = 3;
20644    pub fn new_green(
20645        db: &'db dyn Database,
20646        const_kw: TerminalConstGreen<'db>,
20647        name: TerminalIdentifierGreen<'db>,
20648        colon: TerminalColonGreen<'db>,
20649        ty: ExprGreen<'db>,
20650    ) -> GenericParamConstGreen<'db> {
20651        let children = [const_kw.0, name.0, colon.0, ty.0];
20652        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20653        GenericParamConstGreen(
20654            GreenNode {
20655                kind: SyntaxKind::GenericParamConst,
20656                details: GreenNodeDetails::Node { children: children.into(), width },
20657            }
20658            .intern(db),
20659        )
20660    }
20661}
20662impl<'db> GenericParamConst<'db> {
20663    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
20664        TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20665    }
20666    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20667        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20668    }
20669    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20670        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20671    }
20672    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
20673        Expr::from_syntax_node(db, self.node.get_children(db)[3])
20674    }
20675}
20676#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20677pub struct GenericParamConstPtr<'db>(pub SyntaxStablePtrId<'db>);
20678impl<'db> GenericParamConstPtr<'db> {
20679    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20680        let ptr = self.0.long(db);
20681        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20682            TerminalIdentifierGreen(key_fields[0])
20683        } else {
20684            panic!("Unexpected key field query on root.");
20685        }
20686    }
20687}
20688impl<'db> TypedStablePtr<'db> for GenericParamConstPtr<'db> {
20689    type SyntaxNode = GenericParamConst<'db>;
20690    fn untyped(self) -> SyntaxStablePtrId<'db> {
20691        self.0
20692    }
20693    fn lookup(&self, db: &'db dyn Database) -> GenericParamConst<'db> {
20694        GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20695    }
20696}
20697impl<'db> From<GenericParamConstPtr<'db>> for SyntaxStablePtrId<'db> {
20698    fn from(ptr: GenericParamConstPtr<'db>) -> Self {
20699        ptr.untyped()
20700    }
20701}
20702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20703pub struct GenericParamConstGreen<'db>(pub GreenId<'db>);
20704impl<'db> TypedSyntaxNode<'db> for GenericParamConst<'db> {
20705    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20706    type StablePtr = GenericParamConstPtr<'db>;
20707    type Green = GenericParamConstGreen<'db>;
20708    fn missing(db: &'db dyn Database) -> Self::Green {
20709        GenericParamConstGreen(
20710            GreenNode {
20711                kind: SyntaxKind::GenericParamConst,
20712                details: GreenNodeDetails::Node {
20713                    children: [
20714                        TerminalConst::missing(db).0,
20715                        TerminalIdentifier::missing(db).0,
20716                        TerminalColon::missing(db).0,
20717                        Expr::missing(db).0,
20718                    ]
20719                    .into(),
20720                    width: TextWidth::default(),
20721                },
20722            }
20723            .intern(db),
20724        )
20725    }
20726    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20727        let kind = node.kind(db);
20728        assert_eq!(
20729            kind,
20730            SyntaxKind::GenericParamConst,
20731            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20732            kind,
20733            SyntaxKind::GenericParamConst
20734        );
20735        Self { node }
20736    }
20737    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20738        let kind = node.kind(db);
20739        if kind == SyntaxKind::GenericParamConst {
20740            Some(Self::from_syntax_node(db, node))
20741        } else {
20742            None
20743        }
20744    }
20745    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20746        self.node
20747    }
20748    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20749        GenericParamConstPtr(self.node.stable_ptr(db))
20750    }
20751}
20752#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20753pub struct GenericParamImplNamed<'db> {
20754    node: SyntaxNode<'db>,
20755}
20756impl<'db> GenericParamImplNamed<'db> {
20757    pub const INDEX_IMPL_KW: usize = 0;
20758    pub const INDEX_NAME: usize = 1;
20759    pub const INDEX_COLON: usize = 2;
20760    pub const INDEX_TRAIT_PATH: usize = 3;
20761    pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20762    pub fn new_green(
20763        db: &'db dyn Database,
20764        impl_kw: TerminalImplGreen<'db>,
20765        name: TerminalIdentifierGreen<'db>,
20766        colon: TerminalColonGreen<'db>,
20767        trait_path: ExprPathGreen<'db>,
20768        type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20769    ) -> GenericParamImplNamedGreen<'db> {
20770        let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20771        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20772        GenericParamImplNamedGreen(
20773            GreenNode {
20774                kind: SyntaxKind::GenericParamImplNamed,
20775                details: GreenNodeDetails::Node { children: children.into(), width },
20776            }
20777            .intern(db),
20778        )
20779    }
20780}
20781impl<'db> GenericParamImplNamed<'db> {
20782    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
20783        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20784    }
20785    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20786        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20787    }
20788    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20789        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20790    }
20791    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20792        ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20793    }
20794    pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20795        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20796    }
20797}
20798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20799pub struct GenericParamImplNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
20800impl<'db> GenericParamImplNamedPtr<'db> {
20801    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20802        let ptr = self.0.long(db);
20803        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
20804            TerminalIdentifierGreen(key_fields[0])
20805        } else {
20806            panic!("Unexpected key field query on root.");
20807        }
20808    }
20809}
20810impl<'db> TypedStablePtr<'db> for GenericParamImplNamedPtr<'db> {
20811    type SyntaxNode = GenericParamImplNamed<'db>;
20812    fn untyped(self) -> SyntaxStablePtrId<'db> {
20813        self.0
20814    }
20815    fn lookup(&self, db: &'db dyn Database) -> GenericParamImplNamed<'db> {
20816        GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20817    }
20818}
20819impl<'db> From<GenericParamImplNamedPtr<'db>> for SyntaxStablePtrId<'db> {
20820    fn from(ptr: GenericParamImplNamedPtr<'db>) -> Self {
20821        ptr.untyped()
20822    }
20823}
20824#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20825pub struct GenericParamImplNamedGreen<'db>(pub GreenId<'db>);
20826impl<'db> TypedSyntaxNode<'db> for GenericParamImplNamed<'db> {
20827    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20828    type StablePtr = GenericParamImplNamedPtr<'db>;
20829    type Green = GenericParamImplNamedGreen<'db>;
20830    fn missing(db: &'db dyn Database) -> Self::Green {
20831        GenericParamImplNamedGreen(
20832            GreenNode {
20833                kind: SyntaxKind::GenericParamImplNamed,
20834                details: GreenNodeDetails::Node {
20835                    children: [
20836                        TerminalImpl::missing(db).0,
20837                        TerminalIdentifier::missing(db).0,
20838                        TerminalColon::missing(db).0,
20839                        ExprPath::missing(db).0,
20840                        OptionAssociatedItemConstraints::missing(db).0,
20841                    ]
20842                    .into(),
20843                    width: TextWidth::default(),
20844                },
20845            }
20846            .intern(db),
20847        )
20848    }
20849    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20850        let kind = node.kind(db);
20851        assert_eq!(
20852            kind,
20853            SyntaxKind::GenericParamImplNamed,
20854            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20855            kind,
20856            SyntaxKind::GenericParamImplNamed
20857        );
20858        Self { node }
20859    }
20860    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20861        let kind = node.kind(db);
20862        if kind == SyntaxKind::GenericParamImplNamed {
20863            Some(Self::from_syntax_node(db, node))
20864        } else {
20865            None
20866        }
20867    }
20868    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20869        self.node
20870    }
20871    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20872        GenericParamImplNamedPtr(self.node.stable_ptr(db))
20873    }
20874}
20875#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20876pub struct GenericParamImplAnonymous<'db> {
20877    node: SyntaxNode<'db>,
20878}
20879impl<'db> GenericParamImplAnonymous<'db> {
20880    pub const INDEX_PLUS: usize = 0;
20881    pub const INDEX_TRAIT_PATH: usize = 1;
20882    pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20883    pub fn new_green(
20884        db: &'db dyn Database,
20885        plus: TerminalPlusGreen<'db>,
20886        trait_path: ExprPathGreen<'db>,
20887        type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20888    ) -> GenericParamImplAnonymousGreen<'db> {
20889        let children = [plus.0, trait_path.0, type_constrains.0];
20890        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20891        GenericParamImplAnonymousGreen(
20892            GreenNode {
20893                kind: SyntaxKind::GenericParamImplAnonymous,
20894                details: GreenNodeDetails::Node { children: children.into(), width },
20895            }
20896            .intern(db),
20897        )
20898    }
20899}
20900impl<'db> GenericParamImplAnonymous<'db> {
20901    pub fn plus(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
20902        TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20903    }
20904    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20905        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20906    }
20907    pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20908        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20909    }
20910}
20911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20912pub struct GenericParamImplAnonymousPtr<'db>(pub SyntaxStablePtrId<'db>);
20913impl<'db> GenericParamImplAnonymousPtr<'db> {}
20914impl<'db> TypedStablePtr<'db> for GenericParamImplAnonymousPtr<'db> {
20915    type SyntaxNode = GenericParamImplAnonymous<'db>;
20916    fn untyped(self) -> SyntaxStablePtrId<'db> {
20917        self.0
20918    }
20919    fn lookup(&self, db: &'db dyn Database) -> GenericParamImplAnonymous<'db> {
20920        GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20921    }
20922}
20923impl<'db> From<GenericParamImplAnonymousPtr<'db>> for SyntaxStablePtrId<'db> {
20924    fn from(ptr: GenericParamImplAnonymousPtr<'db>) -> Self {
20925        ptr.untyped()
20926    }
20927}
20928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20929pub struct GenericParamImplAnonymousGreen<'db>(pub GreenId<'db>);
20930impl<'db> TypedSyntaxNode<'db> for GenericParamImplAnonymous<'db> {
20931    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20932    type StablePtr = GenericParamImplAnonymousPtr<'db>;
20933    type Green = GenericParamImplAnonymousGreen<'db>;
20934    fn missing(db: &'db dyn Database) -> Self::Green {
20935        GenericParamImplAnonymousGreen(
20936            GreenNode {
20937                kind: SyntaxKind::GenericParamImplAnonymous,
20938                details: GreenNodeDetails::Node {
20939                    children: [
20940                        TerminalPlus::missing(db).0,
20941                        ExprPath::missing(db).0,
20942                        OptionAssociatedItemConstraints::missing(db).0,
20943                    ]
20944                    .into(),
20945                    width: TextWidth::default(),
20946                },
20947            }
20948            .intern(db),
20949        )
20950    }
20951    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20952        let kind = node.kind(db);
20953        assert_eq!(
20954            kind,
20955            SyntaxKind::GenericParamImplAnonymous,
20956            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20957            kind,
20958            SyntaxKind::GenericParamImplAnonymous
20959        );
20960        Self { node }
20961    }
20962    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20963        let kind = node.kind(db);
20964        if kind == SyntaxKind::GenericParamImplAnonymous {
20965            Some(Self::from_syntax_node(db, node))
20966        } else {
20967            None
20968        }
20969    }
20970    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20971        self.node
20972    }
20973    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20974        GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
20975    }
20976}
20977#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20978pub struct GenericParamNegativeImpl<'db> {
20979    node: SyntaxNode<'db>,
20980}
20981impl<'db> GenericParamNegativeImpl<'db> {
20982    pub const INDEX_MINUS: usize = 0;
20983    pub const INDEX_TRAIT_PATH: usize = 1;
20984    pub fn new_green(
20985        db: &'db dyn Database,
20986        minus: TerminalMinusGreen<'db>,
20987        trait_path: ExprPathGreen<'db>,
20988    ) -> GenericParamNegativeImplGreen<'db> {
20989        let children = [minus.0, trait_path.0];
20990        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20991        GenericParamNegativeImplGreen(
20992            GreenNode {
20993                kind: SyntaxKind::GenericParamNegativeImpl,
20994                details: GreenNodeDetails::Node { children: children.into(), width },
20995            }
20996            .intern(db),
20997        )
20998    }
20999}
21000impl<'db> GenericParamNegativeImpl<'db> {
21001    pub fn minus(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
21002        TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
21003    }
21004    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
21005        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
21006    }
21007}
21008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21009pub struct GenericParamNegativeImplPtr<'db>(pub SyntaxStablePtrId<'db>);
21010impl<'db> GenericParamNegativeImplPtr<'db> {}
21011impl<'db> TypedStablePtr<'db> for GenericParamNegativeImplPtr<'db> {
21012    type SyntaxNode = GenericParamNegativeImpl<'db>;
21013    fn untyped(self) -> SyntaxStablePtrId<'db> {
21014        self.0
21015    }
21016    fn lookup(&self, db: &'db dyn Database) -> GenericParamNegativeImpl<'db> {
21017        GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
21018    }
21019}
21020impl<'db> From<GenericParamNegativeImplPtr<'db>> for SyntaxStablePtrId<'db> {
21021    fn from(ptr: GenericParamNegativeImplPtr<'db>) -> Self {
21022        ptr.untyped()
21023    }
21024}
21025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21026pub struct GenericParamNegativeImplGreen<'db>(pub GreenId<'db>);
21027impl<'db> TypedSyntaxNode<'db> for GenericParamNegativeImpl<'db> {
21028    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
21029    type StablePtr = GenericParamNegativeImplPtr<'db>;
21030    type Green = GenericParamNegativeImplGreen<'db>;
21031    fn missing(db: &'db dyn Database) -> Self::Green {
21032        GenericParamNegativeImplGreen(
21033            GreenNode {
21034                kind: SyntaxKind::GenericParamNegativeImpl,
21035                details: GreenNodeDetails::Node {
21036                    children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
21037                    width: TextWidth::default(),
21038                },
21039            }
21040            .intern(db),
21041        )
21042    }
21043    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21044        let kind = node.kind(db);
21045        assert_eq!(
21046            kind,
21047            SyntaxKind::GenericParamNegativeImpl,
21048            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21049            kind,
21050            SyntaxKind::GenericParamNegativeImpl
21051        );
21052        Self { node }
21053    }
21054    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21055        let kind = node.kind(db);
21056        if kind == SyntaxKind::GenericParamNegativeImpl {
21057            Some(Self::from_syntax_node(db, node))
21058        } else {
21059            None
21060        }
21061    }
21062    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21063        self.node
21064    }
21065    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21066        GenericParamNegativeImplPtr(self.node.stable_ptr(db))
21067    }
21068}
21069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21070pub struct TokenList<'db>(ElementList<'db, TokenTree<'db>, 1>);
21071impl<'db> Deref for TokenList<'db> {
21072    type Target = ElementList<'db, TokenTree<'db>, 1>;
21073    fn deref(&self) -> &Self::Target {
21074        &self.0
21075    }
21076}
21077impl<'db> TokenList<'db> {
21078    pub fn new_green(
21079        db: &'db dyn Database,
21080        children: &[TokenTreeGreen<'db>],
21081    ) -> TokenListGreen<'db> {
21082        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
21083        TokenListGreen(
21084            GreenNode {
21085                kind: SyntaxKind::TokenList,
21086                details: GreenNodeDetails::Node {
21087                    children: children.iter().map(|x| x.0).collect(),
21088                    width,
21089                },
21090            }
21091            .intern(db),
21092        )
21093    }
21094}
21095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21096pub struct TokenListPtr<'db>(pub SyntaxStablePtrId<'db>);
21097impl<'db> TypedStablePtr<'db> for TokenListPtr<'db> {
21098    type SyntaxNode = TokenList<'db>;
21099    fn untyped(self) -> SyntaxStablePtrId<'db> {
21100        self.0
21101    }
21102    fn lookup(&self, db: &'db dyn Database) -> TokenList<'db> {
21103        TokenList::from_syntax_node(db, self.0.lookup(db))
21104    }
21105}
21106impl<'db> From<TokenListPtr<'db>> for SyntaxStablePtrId<'db> {
21107    fn from(ptr: TokenListPtr<'db>) -> Self {
21108        ptr.untyped()
21109    }
21110}
21111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21112pub struct TokenListGreen<'db>(pub GreenId<'db>);
21113impl<'db> TypedSyntaxNode<'db> for TokenList<'db> {
21114    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
21115    type StablePtr = TokenListPtr<'db>;
21116    type Green = TokenListGreen<'db>;
21117    fn missing(db: &'db dyn Database) -> Self::Green {
21118        TokenListGreen(
21119            GreenNode {
21120                kind: SyntaxKind::TokenList,
21121                details: GreenNodeDetails::Node {
21122                    children: [].into(),
21123                    width: TextWidth::default(),
21124                },
21125            }
21126            .intern(db),
21127        )
21128    }
21129    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21130        Self(ElementList::new(node))
21131    }
21132    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21133        if node.kind(db) == SyntaxKind::TokenList {
21134            Some(Self(ElementList::new(node)))
21135        } else {
21136            None
21137        }
21138    }
21139    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21140        self.node
21141    }
21142    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21143        TokenListPtr(self.node.stable_ptr(db))
21144    }
21145}
21146#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21147pub struct TokenTreeLeaf<'db> {
21148    node: SyntaxNode<'db>,
21149}
21150impl<'db> TokenTreeLeaf<'db> {
21151    pub const INDEX_LEAF: usize = 0;
21152    pub fn new_green(db: &'db dyn Database, leaf: TokenNodeGreen<'db>) -> TokenTreeLeafGreen<'db> {
21153        let children = [leaf.0];
21154        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21155        TokenTreeLeafGreen(
21156            GreenNode {
21157                kind: SyntaxKind::TokenTreeLeaf,
21158                details: GreenNodeDetails::Node { children: children.into(), width },
21159            }
21160            .intern(db),
21161        )
21162    }
21163}
21164impl<'db> TokenTreeLeaf<'db> {
21165    pub fn leaf(&self, db: &'db dyn Database) -> TokenNode<'db> {
21166        TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
21167    }
21168}
21169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21170pub struct TokenTreeLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
21171impl<'db> TokenTreeLeafPtr<'db> {}
21172impl<'db> TypedStablePtr<'db> for TokenTreeLeafPtr<'db> {
21173    type SyntaxNode = TokenTreeLeaf<'db>;
21174    fn untyped(self) -> SyntaxStablePtrId<'db> {
21175        self.0
21176    }
21177    fn lookup(&self, db: &'db dyn Database) -> TokenTreeLeaf<'db> {
21178        TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
21179    }
21180}
21181impl<'db> From<TokenTreeLeafPtr<'db>> for SyntaxStablePtrId<'db> {
21182    fn from(ptr: TokenTreeLeafPtr<'db>) -> Self {
21183        ptr.untyped()
21184    }
21185}
21186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21187pub struct TokenTreeLeafGreen<'db>(pub GreenId<'db>);
21188impl<'db> TypedSyntaxNode<'db> for TokenTreeLeaf<'db> {
21189    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
21190    type StablePtr = TokenTreeLeafPtr<'db>;
21191    type Green = TokenTreeLeafGreen<'db>;
21192    fn missing(db: &'db dyn Database) -> Self::Green {
21193        TokenTreeLeafGreen(
21194            GreenNode {
21195                kind: SyntaxKind::TokenTreeLeaf,
21196                details: GreenNodeDetails::Node {
21197                    children: [TokenNode::missing(db).0].into(),
21198                    width: TextWidth::default(),
21199                },
21200            }
21201            .intern(db),
21202        )
21203    }
21204    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21205        let kind = node.kind(db);
21206        assert_eq!(
21207            kind,
21208            SyntaxKind::TokenTreeLeaf,
21209            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21210            kind,
21211            SyntaxKind::TokenTreeLeaf
21212        );
21213        Self { node }
21214    }
21215    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21216        let kind = node.kind(db);
21217        if kind == SyntaxKind::TokenTreeLeaf {
21218            Some(Self::from_syntax_node(db, node))
21219        } else {
21220            None
21221        }
21222    }
21223    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21224        self.node
21225    }
21226    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21227        TokenTreeLeafPtr(self.node.stable_ptr(db))
21228    }
21229}
21230#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21231pub struct TokenTreeNode<'db> {
21232    node: SyntaxNode<'db>,
21233}
21234impl<'db> TokenTreeNode<'db> {
21235    pub const INDEX_SUBTREE: usize = 0;
21236    pub fn new_green(
21237        db: &'db dyn Database,
21238        subtree: WrappedTokenTreeGreen<'db>,
21239    ) -> TokenTreeNodeGreen<'db> {
21240        let children = [subtree.0];
21241        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21242        TokenTreeNodeGreen(
21243            GreenNode {
21244                kind: SyntaxKind::TokenTreeNode,
21245                details: GreenNodeDetails::Node { children: children.into(), width },
21246            }
21247            .intern(db),
21248        )
21249    }
21250}
21251impl<'db> TokenTreeNode<'db> {
21252    pub fn subtree(&self, db: &'db dyn Database) -> WrappedTokenTree<'db> {
21253        WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
21254    }
21255}
21256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21257pub struct TokenTreeNodePtr<'db>(pub SyntaxStablePtrId<'db>);
21258impl<'db> TokenTreeNodePtr<'db> {}
21259impl<'db> TypedStablePtr<'db> for TokenTreeNodePtr<'db> {
21260    type SyntaxNode = TokenTreeNode<'db>;
21261    fn untyped(self) -> SyntaxStablePtrId<'db> {
21262        self.0
21263    }
21264    fn lookup(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
21265        TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
21266    }
21267}
21268impl<'db> From<TokenTreeNodePtr<'db>> for SyntaxStablePtrId<'db> {
21269    fn from(ptr: TokenTreeNodePtr<'db>) -> Self {
21270        ptr.untyped()
21271    }
21272}
21273#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21274pub struct TokenTreeNodeGreen<'db>(pub GreenId<'db>);
21275impl<'db> TypedSyntaxNode<'db> for TokenTreeNode<'db> {
21276    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
21277    type StablePtr = TokenTreeNodePtr<'db>;
21278    type Green = TokenTreeNodeGreen<'db>;
21279    fn missing(db: &'db dyn Database) -> Self::Green {
21280        TokenTreeNodeGreen(
21281            GreenNode {
21282                kind: SyntaxKind::TokenTreeNode,
21283                details: GreenNodeDetails::Node {
21284                    children: [WrappedTokenTree::missing(db).0].into(),
21285                    width: TextWidth::default(),
21286                },
21287            }
21288            .intern(db),
21289        )
21290    }
21291    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21292        let kind = node.kind(db);
21293        assert_eq!(
21294            kind,
21295            SyntaxKind::TokenTreeNode,
21296            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21297            kind,
21298            SyntaxKind::TokenTreeNode
21299        );
21300        Self { node }
21301    }
21302    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21303        let kind = node.kind(db);
21304        if kind == SyntaxKind::TokenTreeNode {
21305            Some(Self::from_syntax_node(db, node))
21306        } else {
21307            None
21308        }
21309    }
21310    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21311        self.node
21312    }
21313    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21314        TokenTreeNodePtr(self.node.stable_ptr(db))
21315    }
21316}
21317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21318pub struct TokenTreeRepetition<'db> {
21319    node: SyntaxNode<'db>,
21320}
21321impl<'db> TokenTreeRepetition<'db> {
21322    pub const INDEX_DOLLAR: usize = 0;
21323    pub const INDEX_LPAREN: usize = 1;
21324    pub const INDEX_ELEMENTS: usize = 2;
21325    pub const INDEX_RPAREN: usize = 3;
21326    pub const INDEX_SEPARATOR: usize = 4;
21327    pub const INDEX_OPERATOR: usize = 5;
21328    pub fn new_green(
21329        db: &'db dyn Database,
21330        dollar: TerminalDollarGreen<'db>,
21331        lparen: TerminalLParenGreen<'db>,
21332        elements: TokenListGreen<'db>,
21333        rparen: TerminalRParenGreen<'db>,
21334        separator: OptionTerminalCommaGreen<'db>,
21335        operator: MacroRepetitionOperatorGreen<'db>,
21336    ) -> TokenTreeRepetitionGreen<'db> {
21337        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
21338        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21339        TokenTreeRepetitionGreen(
21340            GreenNode {
21341                kind: SyntaxKind::TokenTreeRepetition,
21342                details: GreenNodeDetails::Node { children: children.into(), width },
21343            }
21344            .intern(db),
21345        )
21346    }
21347}
21348impl<'db> TokenTreeRepetition<'db> {
21349    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21350        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21351    }
21352    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21353        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
21354    }
21355    pub fn elements(&self, db: &'db dyn Database) -> TokenList<'db> {
21356        TokenList::from_syntax_node(db, self.node.get_children(db)[2])
21357    }
21358    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21359        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
21360    }
21361    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
21362        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
21363    }
21364    pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
21365        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
21366    }
21367}
21368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21369pub struct TokenTreeRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
21370impl<'db> TokenTreeRepetitionPtr<'db> {}
21371impl<'db> TypedStablePtr<'db> for TokenTreeRepetitionPtr<'db> {
21372    type SyntaxNode = TokenTreeRepetition<'db>;
21373    fn untyped(self) -> SyntaxStablePtrId<'db> {
21374        self.0
21375    }
21376    fn lookup(&self, db: &'db dyn Database) -> TokenTreeRepetition<'db> {
21377        TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
21378    }
21379}
21380impl<'db> From<TokenTreeRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
21381    fn from(ptr: TokenTreeRepetitionPtr<'db>) -> Self {
21382        ptr.untyped()
21383    }
21384}
21385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21386pub struct TokenTreeRepetitionGreen<'db>(pub GreenId<'db>);
21387impl<'db> TypedSyntaxNode<'db> for TokenTreeRepetition<'db> {
21388    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21389    type StablePtr = TokenTreeRepetitionPtr<'db>;
21390    type Green = TokenTreeRepetitionGreen<'db>;
21391    fn missing(db: &'db dyn Database) -> Self::Green {
21392        TokenTreeRepetitionGreen(
21393            GreenNode {
21394                kind: SyntaxKind::TokenTreeRepetition,
21395                details: GreenNodeDetails::Node {
21396                    children: [
21397                        TerminalDollar::missing(db).0,
21398                        TerminalLParen::missing(db).0,
21399                        TokenList::missing(db).0,
21400                        TerminalRParen::missing(db).0,
21401                        OptionTerminalComma::missing(db).0,
21402                        MacroRepetitionOperator::missing(db).0,
21403                    ]
21404                    .into(),
21405                    width: TextWidth::default(),
21406                },
21407            }
21408            .intern(db),
21409        )
21410    }
21411    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21412        let kind = node.kind(db);
21413        assert_eq!(
21414            kind,
21415            SyntaxKind::TokenTreeRepetition,
21416            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21417            kind,
21418            SyntaxKind::TokenTreeRepetition
21419        );
21420        Self { node }
21421    }
21422    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21423        let kind = node.kind(db);
21424        if kind == SyntaxKind::TokenTreeRepetition {
21425            Some(Self::from_syntax_node(db, node))
21426        } else {
21427            None
21428        }
21429    }
21430    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21431        self.node
21432    }
21433    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21434        TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21435    }
21436}
21437#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21438pub struct TokenTreeParam<'db> {
21439    node: SyntaxNode<'db>,
21440}
21441impl<'db> TokenTreeParam<'db> {
21442    pub const INDEX_DOLLAR: usize = 0;
21443    pub const INDEX_NAME: usize = 1;
21444    pub fn new_green(
21445        db: &'db dyn Database,
21446        dollar: TerminalDollarGreen<'db>,
21447        name: TerminalIdentifierGreen<'db>,
21448    ) -> TokenTreeParamGreen<'db> {
21449        let children = [dollar.0, name.0];
21450        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21451        TokenTreeParamGreen(
21452            GreenNode {
21453                kind: SyntaxKind::TokenTreeParam,
21454                details: GreenNodeDetails::Node { children: children.into(), width },
21455            }
21456            .intern(db),
21457        )
21458    }
21459}
21460impl<'db> TokenTreeParam<'db> {
21461    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21462        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21463    }
21464    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
21465        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21466    }
21467}
21468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21469pub struct TokenTreeParamPtr<'db>(pub SyntaxStablePtrId<'db>);
21470impl<'db> TokenTreeParamPtr<'db> {}
21471impl<'db> TypedStablePtr<'db> for TokenTreeParamPtr<'db> {
21472    type SyntaxNode = TokenTreeParam<'db>;
21473    fn untyped(self) -> SyntaxStablePtrId<'db> {
21474        self.0
21475    }
21476    fn lookup(&self, db: &'db dyn Database) -> TokenTreeParam<'db> {
21477        TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21478    }
21479}
21480impl<'db> From<TokenTreeParamPtr<'db>> for SyntaxStablePtrId<'db> {
21481    fn from(ptr: TokenTreeParamPtr<'db>) -> Self {
21482        ptr.untyped()
21483    }
21484}
21485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21486pub struct TokenTreeParamGreen<'db>(pub GreenId<'db>);
21487impl<'db> TypedSyntaxNode<'db> for TokenTreeParam<'db> {
21488    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21489    type StablePtr = TokenTreeParamPtr<'db>;
21490    type Green = TokenTreeParamGreen<'db>;
21491    fn missing(db: &'db dyn Database) -> Self::Green {
21492        TokenTreeParamGreen(
21493            GreenNode {
21494                kind: SyntaxKind::TokenTreeParam,
21495                details: GreenNodeDetails::Node {
21496                    children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21497                        .into(),
21498                    width: TextWidth::default(),
21499                },
21500            }
21501            .intern(db),
21502        )
21503    }
21504    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21505        let kind = node.kind(db);
21506        assert_eq!(
21507            kind,
21508            SyntaxKind::TokenTreeParam,
21509            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21510            kind,
21511            SyntaxKind::TokenTreeParam
21512        );
21513        Self { node }
21514    }
21515    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21516        let kind = node.kind(db);
21517        if kind == SyntaxKind::TokenTreeParam {
21518            Some(Self::from_syntax_node(db, node))
21519        } else {
21520            None
21521        }
21522    }
21523    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21524        self.node
21525    }
21526    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21527        TokenTreeParamPtr(self.node.stable_ptr(db))
21528    }
21529}
21530#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21531pub enum TokenTree<'db> {
21532    Token(TokenTreeLeaf<'db>),
21533    Subtree(TokenTreeNode<'db>),
21534    Repetition(TokenTreeRepetition<'db>),
21535    Param(TokenTreeParam<'db>),
21536    Missing(TokenTreeMissing<'db>),
21537}
21538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21539pub struct TokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21540impl<'db> TypedStablePtr<'db> for TokenTreePtr<'db> {
21541    type SyntaxNode = TokenTree<'db>;
21542    fn untyped(self) -> SyntaxStablePtrId<'db> {
21543        self.0
21544    }
21545    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21546        TokenTree::from_syntax_node(db, self.0.lookup(db))
21547    }
21548}
21549impl<'db> From<TokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21550    fn from(ptr: TokenTreePtr<'db>) -> Self {
21551        ptr.untyped()
21552    }
21553}
21554impl<'db> From<TokenTreeLeafPtr<'db>> for TokenTreePtr<'db> {
21555    fn from(value: TokenTreeLeafPtr<'db>) -> Self {
21556        Self(value.0)
21557    }
21558}
21559impl<'db> From<TokenTreeNodePtr<'db>> for TokenTreePtr<'db> {
21560    fn from(value: TokenTreeNodePtr<'db>) -> Self {
21561        Self(value.0)
21562    }
21563}
21564impl<'db> From<TokenTreeRepetitionPtr<'db>> for TokenTreePtr<'db> {
21565    fn from(value: TokenTreeRepetitionPtr<'db>) -> Self {
21566        Self(value.0)
21567    }
21568}
21569impl<'db> From<TokenTreeParamPtr<'db>> for TokenTreePtr<'db> {
21570    fn from(value: TokenTreeParamPtr<'db>) -> Self {
21571        Self(value.0)
21572    }
21573}
21574impl<'db> From<TokenTreeMissingPtr<'db>> for TokenTreePtr<'db> {
21575    fn from(value: TokenTreeMissingPtr<'db>) -> Self {
21576        Self(value.0)
21577    }
21578}
21579impl<'db> From<TokenTreeLeafGreen<'db>> for TokenTreeGreen<'db> {
21580    fn from(value: TokenTreeLeafGreen<'db>) -> Self {
21581        Self(value.0)
21582    }
21583}
21584impl<'db> From<TokenTreeNodeGreen<'db>> for TokenTreeGreen<'db> {
21585    fn from(value: TokenTreeNodeGreen<'db>) -> Self {
21586        Self(value.0)
21587    }
21588}
21589impl<'db> From<TokenTreeRepetitionGreen<'db>> for TokenTreeGreen<'db> {
21590    fn from(value: TokenTreeRepetitionGreen<'db>) -> Self {
21591        Self(value.0)
21592    }
21593}
21594impl<'db> From<TokenTreeParamGreen<'db>> for TokenTreeGreen<'db> {
21595    fn from(value: TokenTreeParamGreen<'db>) -> Self {
21596        Self(value.0)
21597    }
21598}
21599impl<'db> From<TokenTreeMissingGreen<'db>> for TokenTreeGreen<'db> {
21600    fn from(value: TokenTreeMissingGreen<'db>) -> Self {
21601        Self(value.0)
21602    }
21603}
21604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21605pub struct TokenTreeGreen<'db>(pub GreenId<'db>);
21606impl<'db> TypedSyntaxNode<'db> for TokenTree<'db> {
21607    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21608    type StablePtr = TokenTreePtr<'db>;
21609    type Green = TokenTreeGreen<'db>;
21610    fn missing(db: &'db dyn Database) -> Self::Green {
21611        TokenTreeGreen(TokenTreeMissing::missing(db).0)
21612    }
21613    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21614        let kind = node.kind(db);
21615        match kind {
21616            SyntaxKind::TokenTreeLeaf => {
21617                TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21618            }
21619            SyntaxKind::TokenTreeNode => {
21620                TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21621            }
21622            SyntaxKind::TokenTreeRepetition => {
21623                TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21624            }
21625            SyntaxKind::TokenTreeParam => {
21626                TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21627            }
21628            SyntaxKind::TokenTreeMissing => {
21629                TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21630            }
21631            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21632        }
21633    }
21634    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21635        let kind = node.kind(db);
21636        match kind {
21637            SyntaxKind::TokenTreeLeaf => {
21638                Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21639            }
21640            SyntaxKind::TokenTreeNode => {
21641                Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21642            }
21643            SyntaxKind::TokenTreeRepetition => {
21644                Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21645            }
21646            SyntaxKind::TokenTreeParam => {
21647                Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21648            }
21649            SyntaxKind::TokenTreeMissing => {
21650                Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21651            }
21652            _ => None,
21653        }
21654    }
21655    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21656        match self {
21657            TokenTree::Token(x) => x.as_syntax_node(),
21658            TokenTree::Subtree(x) => x.as_syntax_node(),
21659            TokenTree::Repetition(x) => x.as_syntax_node(),
21660            TokenTree::Param(x) => x.as_syntax_node(),
21661            TokenTree::Missing(x) => x.as_syntax_node(),
21662        }
21663    }
21664    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21665        TokenTreePtr(self.as_syntax_node().long(db).stable_ptr)
21666    }
21667}
21668impl<'db> TokenTree<'db> {
21669    /// Checks if a kind of a variant of [TokenTree].
21670    pub fn is_variant(kind: SyntaxKind) -> bool {
21671        matches!(
21672            kind,
21673            SyntaxKind::TokenTreeLeaf
21674                | SyntaxKind::TokenTreeNode
21675                | SyntaxKind::TokenTreeRepetition
21676                | SyntaxKind::TokenTreeParam
21677                | SyntaxKind::TokenTreeMissing
21678        )
21679    }
21680}
21681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21682pub struct TokenTreeMissing<'db> {
21683    node: SyntaxNode<'db>,
21684}
21685impl<'db> TokenTreeMissing<'db> {
21686    pub fn new_green(db: &'db dyn Database) -> TokenTreeMissingGreen<'db> {
21687        let children = [];
21688        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21689        TokenTreeMissingGreen(
21690            GreenNode {
21691                kind: SyntaxKind::TokenTreeMissing,
21692                details: GreenNodeDetails::Node { children: children.into(), width },
21693            }
21694            .intern(db),
21695        )
21696    }
21697}
21698impl<'db> TokenTreeMissing<'db> {}
21699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21700pub struct TokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21701impl<'db> TokenTreeMissingPtr<'db> {}
21702impl<'db> TypedStablePtr<'db> for TokenTreeMissingPtr<'db> {
21703    type SyntaxNode = TokenTreeMissing<'db>;
21704    fn untyped(self) -> SyntaxStablePtrId<'db> {
21705        self.0
21706    }
21707    fn lookup(&self, db: &'db dyn Database) -> TokenTreeMissing<'db> {
21708        TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21709    }
21710}
21711impl<'db> From<TokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21712    fn from(ptr: TokenTreeMissingPtr<'db>) -> Self {
21713        ptr.untyped()
21714    }
21715}
21716#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21717pub struct TokenTreeMissingGreen<'db>(pub GreenId<'db>);
21718impl<'db> TypedSyntaxNode<'db> for TokenTreeMissing<'db> {
21719    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21720    type StablePtr = TokenTreeMissingPtr<'db>;
21721    type Green = TokenTreeMissingGreen<'db>;
21722    fn missing(db: &'db dyn Database) -> Self::Green {
21723        TokenTreeMissingGreen(
21724            GreenNode {
21725                kind: SyntaxKind::TokenTreeMissing,
21726                details: GreenNodeDetails::Node {
21727                    children: [].into(),
21728                    width: TextWidth::default(),
21729                },
21730            }
21731            .intern(db),
21732        )
21733    }
21734    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21735        let kind = node.kind(db);
21736        assert_eq!(
21737            kind,
21738            SyntaxKind::TokenTreeMissing,
21739            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21740            kind,
21741            SyntaxKind::TokenTreeMissing
21742        );
21743        Self { node }
21744    }
21745    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21746        let kind = node.kind(db);
21747        if kind == SyntaxKind::TokenTreeMissing {
21748            Some(Self::from_syntax_node(db, node))
21749        } else {
21750            None
21751        }
21752    }
21753    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21754        self.node
21755    }
21756    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21757        TokenTreeMissingPtr(self.node.stable_ptr(db))
21758    }
21759}
21760#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21761pub enum WrappedTokenTree<'db> {
21762    Parenthesized(ParenthesizedTokenTree<'db>),
21763    Braced(BracedTokenTree<'db>),
21764    Bracketed(BracketedTokenTree<'db>),
21765    Missing(WrappedTokenTreeMissing<'db>),
21766}
21767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21768pub struct WrappedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21769impl<'db> TypedStablePtr<'db> for WrappedTokenTreePtr<'db> {
21770    type SyntaxNode = WrappedTokenTree<'db>;
21771    fn untyped(self) -> SyntaxStablePtrId<'db> {
21772        self.0
21773    }
21774    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21775        WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21776    }
21777}
21778impl<'db> From<WrappedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21779    fn from(ptr: WrappedTokenTreePtr<'db>) -> Self {
21780        ptr.untyped()
21781    }
21782}
21783impl<'db> From<ParenthesizedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21784    fn from(value: ParenthesizedTokenTreePtr<'db>) -> Self {
21785        Self(value.0)
21786    }
21787}
21788impl<'db> From<BracedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21789    fn from(value: BracedTokenTreePtr<'db>) -> Self {
21790        Self(value.0)
21791    }
21792}
21793impl<'db> From<BracketedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21794    fn from(value: BracketedTokenTreePtr<'db>) -> Self {
21795        Self(value.0)
21796    }
21797}
21798impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for WrappedTokenTreePtr<'db> {
21799    fn from(value: WrappedTokenTreeMissingPtr<'db>) -> Self {
21800        Self(value.0)
21801    }
21802}
21803impl<'db> From<ParenthesizedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21804    fn from(value: ParenthesizedTokenTreeGreen<'db>) -> Self {
21805        Self(value.0)
21806    }
21807}
21808impl<'db> From<BracedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21809    fn from(value: BracedTokenTreeGreen<'db>) -> Self {
21810        Self(value.0)
21811    }
21812}
21813impl<'db> From<BracketedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21814    fn from(value: BracketedTokenTreeGreen<'db>) -> Self {
21815        Self(value.0)
21816    }
21817}
21818impl<'db> From<WrappedTokenTreeMissingGreen<'db>> for WrappedTokenTreeGreen<'db> {
21819    fn from(value: WrappedTokenTreeMissingGreen<'db>) -> Self {
21820        Self(value.0)
21821    }
21822}
21823#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21824pub struct WrappedTokenTreeGreen<'db>(pub GreenId<'db>);
21825impl<'db> TypedSyntaxNode<'db> for WrappedTokenTree<'db> {
21826    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21827    type StablePtr = WrappedTokenTreePtr<'db>;
21828    type Green = WrappedTokenTreeGreen<'db>;
21829    fn missing(db: &'db dyn Database) -> Self::Green {
21830        WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21831    }
21832    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21833        let kind = node.kind(db);
21834        match kind {
21835            SyntaxKind::ParenthesizedTokenTree => {
21836                WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21837            }
21838            SyntaxKind::BracedTokenTree => {
21839                WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21840            }
21841            SyntaxKind::BracketedTokenTree => {
21842                WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21843            }
21844            SyntaxKind::WrappedTokenTreeMissing => {
21845                WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21846            }
21847            _ => panic!(
21848                "Unexpected syntax kind {:?} when constructing {}.",
21849                kind, "WrappedTokenTree"
21850            ),
21851        }
21852    }
21853    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21854        let kind = node.kind(db);
21855        match kind {
21856            SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21857                ParenthesizedTokenTree::from_syntax_node(db, node),
21858            )),
21859            SyntaxKind::BracedTokenTree => {
21860                Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21861            }
21862            SyntaxKind::BracketedTokenTree => {
21863                Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21864            }
21865            SyntaxKind::WrappedTokenTreeMissing => {
21866                Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21867            }
21868            _ => None,
21869        }
21870    }
21871    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21872        match self {
21873            WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21874            WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21875            WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21876            WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21877        }
21878    }
21879    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21880        WrappedTokenTreePtr(self.as_syntax_node().long(db).stable_ptr)
21881    }
21882}
21883impl<'db> WrappedTokenTree<'db> {
21884    /// Checks if a kind of a variant of [WrappedTokenTree].
21885    pub fn is_variant(kind: SyntaxKind) -> bool {
21886        matches!(
21887            kind,
21888            SyntaxKind::ParenthesizedTokenTree
21889                | SyntaxKind::BracedTokenTree
21890                | SyntaxKind::BracketedTokenTree
21891                | SyntaxKind::WrappedTokenTreeMissing
21892        )
21893    }
21894}
21895#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21896pub struct WrappedTokenTreeMissing<'db> {
21897    node: SyntaxNode<'db>,
21898}
21899impl<'db> WrappedTokenTreeMissing<'db> {
21900    pub fn new_green(db: &'db dyn Database) -> WrappedTokenTreeMissingGreen<'db> {
21901        let children = [];
21902        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21903        WrappedTokenTreeMissingGreen(
21904            GreenNode {
21905                kind: SyntaxKind::WrappedTokenTreeMissing,
21906                details: GreenNodeDetails::Node { children: children.into(), width },
21907            }
21908            .intern(db),
21909        )
21910    }
21911}
21912impl<'db> WrappedTokenTreeMissing<'db> {}
21913#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21914pub struct WrappedTokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21915impl<'db> WrappedTokenTreeMissingPtr<'db> {}
21916impl<'db> TypedStablePtr<'db> for WrappedTokenTreeMissingPtr<'db> {
21917    type SyntaxNode = WrappedTokenTreeMissing<'db>;
21918    fn untyped(self) -> SyntaxStablePtrId<'db> {
21919        self.0
21920    }
21921    fn lookup(&self, db: &'db dyn Database) -> WrappedTokenTreeMissing<'db> {
21922        WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21923    }
21924}
21925impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21926    fn from(ptr: WrappedTokenTreeMissingPtr<'db>) -> Self {
21927        ptr.untyped()
21928    }
21929}
21930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21931pub struct WrappedTokenTreeMissingGreen<'db>(pub GreenId<'db>);
21932impl<'db> TypedSyntaxNode<'db> for WrappedTokenTreeMissing<'db> {
21933    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21934    type StablePtr = WrappedTokenTreeMissingPtr<'db>;
21935    type Green = WrappedTokenTreeMissingGreen<'db>;
21936    fn missing(db: &'db dyn Database) -> Self::Green {
21937        WrappedTokenTreeMissingGreen(
21938            GreenNode {
21939                kind: SyntaxKind::WrappedTokenTreeMissing,
21940                details: GreenNodeDetails::Node {
21941                    children: [].into(),
21942                    width: TextWidth::default(),
21943                },
21944            }
21945            .intern(db),
21946        )
21947    }
21948    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21949        let kind = node.kind(db);
21950        assert_eq!(
21951            kind,
21952            SyntaxKind::WrappedTokenTreeMissing,
21953            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21954            kind,
21955            SyntaxKind::WrappedTokenTreeMissing
21956        );
21957        Self { node }
21958    }
21959    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21960        let kind = node.kind(db);
21961        if kind == SyntaxKind::WrappedTokenTreeMissing {
21962            Some(Self::from_syntax_node(db, node))
21963        } else {
21964            None
21965        }
21966    }
21967    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21968        self.node
21969    }
21970    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21971        WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
21972    }
21973}
21974#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21975pub struct ParenthesizedTokenTree<'db> {
21976    node: SyntaxNode<'db>,
21977}
21978impl<'db> ParenthesizedTokenTree<'db> {
21979    pub const INDEX_LPAREN: usize = 0;
21980    pub const INDEX_TOKENS: usize = 1;
21981    pub const INDEX_RPAREN: usize = 2;
21982    pub fn new_green(
21983        db: &'db dyn Database,
21984        lparen: TerminalLParenGreen<'db>,
21985        tokens: TokenListGreen<'db>,
21986        rparen: TerminalRParenGreen<'db>,
21987    ) -> ParenthesizedTokenTreeGreen<'db> {
21988        let children = [lparen.0, tokens.0, rparen.0];
21989        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21990        ParenthesizedTokenTreeGreen(
21991            GreenNode {
21992                kind: SyntaxKind::ParenthesizedTokenTree,
21993                details: GreenNodeDetails::Node { children: children.into(), width },
21994            }
21995            .intern(db),
21996        )
21997    }
21998}
21999impl<'db> ParenthesizedTokenTree<'db> {
22000    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
22001        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
22002    }
22003    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22004        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22005    }
22006    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
22007        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
22008    }
22009}
22010#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22011pub struct ParenthesizedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22012impl<'db> ParenthesizedTokenTreePtr<'db> {}
22013impl<'db> TypedStablePtr<'db> for ParenthesizedTokenTreePtr<'db> {
22014    type SyntaxNode = ParenthesizedTokenTree<'db>;
22015    fn untyped(self) -> SyntaxStablePtrId<'db> {
22016        self.0
22017    }
22018    fn lookup(&self, db: &'db dyn Database) -> ParenthesizedTokenTree<'db> {
22019        ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
22020    }
22021}
22022impl<'db> From<ParenthesizedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22023    fn from(ptr: ParenthesizedTokenTreePtr<'db>) -> Self {
22024        ptr.untyped()
22025    }
22026}
22027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22028pub struct ParenthesizedTokenTreeGreen<'db>(pub GreenId<'db>);
22029impl<'db> TypedSyntaxNode<'db> for ParenthesizedTokenTree<'db> {
22030    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
22031    type StablePtr = ParenthesizedTokenTreePtr<'db>;
22032    type Green = ParenthesizedTokenTreeGreen<'db>;
22033    fn missing(db: &'db dyn Database) -> Self::Green {
22034        ParenthesizedTokenTreeGreen(
22035            GreenNode {
22036                kind: SyntaxKind::ParenthesizedTokenTree,
22037                details: GreenNodeDetails::Node {
22038                    children: [
22039                        TerminalLParen::missing(db).0,
22040                        TokenList::missing(db).0,
22041                        TerminalRParen::missing(db).0,
22042                    ]
22043                    .into(),
22044                    width: TextWidth::default(),
22045                },
22046            }
22047            .intern(db),
22048        )
22049    }
22050    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22051        let kind = node.kind(db);
22052        assert_eq!(
22053            kind,
22054            SyntaxKind::ParenthesizedTokenTree,
22055            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22056            kind,
22057            SyntaxKind::ParenthesizedTokenTree
22058        );
22059        Self { node }
22060    }
22061    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22062        let kind = node.kind(db);
22063        if kind == SyntaxKind::ParenthesizedTokenTree {
22064            Some(Self::from_syntax_node(db, node))
22065        } else {
22066            None
22067        }
22068    }
22069    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22070        self.node
22071    }
22072    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22073        ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
22074    }
22075}
22076#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22077pub struct BracedTokenTree<'db> {
22078    node: SyntaxNode<'db>,
22079}
22080impl<'db> BracedTokenTree<'db> {
22081    pub const INDEX_LBRACE: usize = 0;
22082    pub const INDEX_TOKENS: usize = 1;
22083    pub const INDEX_RBRACE: usize = 2;
22084    pub fn new_green(
22085        db: &'db dyn Database,
22086        lbrace: TerminalLBraceGreen<'db>,
22087        tokens: TokenListGreen<'db>,
22088        rbrace: TerminalRBraceGreen<'db>,
22089    ) -> BracedTokenTreeGreen<'db> {
22090        let children = [lbrace.0, tokens.0, rbrace.0];
22091        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22092        BracedTokenTreeGreen(
22093            GreenNode {
22094                kind: SyntaxKind::BracedTokenTree,
22095                details: GreenNodeDetails::Node { children: children.into(), width },
22096            }
22097            .intern(db),
22098        )
22099    }
22100}
22101impl<'db> BracedTokenTree<'db> {
22102    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22103        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
22104    }
22105    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22106        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22107    }
22108    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22109        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
22110    }
22111}
22112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22113pub struct BracedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22114impl<'db> BracedTokenTreePtr<'db> {}
22115impl<'db> TypedStablePtr<'db> for BracedTokenTreePtr<'db> {
22116    type SyntaxNode = BracedTokenTree<'db>;
22117    fn untyped(self) -> SyntaxStablePtrId<'db> {
22118        self.0
22119    }
22120    fn lookup(&self, db: &'db dyn Database) -> BracedTokenTree<'db> {
22121        BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
22122    }
22123}
22124impl<'db> From<BracedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22125    fn from(ptr: BracedTokenTreePtr<'db>) -> Self {
22126        ptr.untyped()
22127    }
22128}
22129#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22130pub struct BracedTokenTreeGreen<'db>(pub GreenId<'db>);
22131impl<'db> TypedSyntaxNode<'db> for BracedTokenTree<'db> {
22132    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
22133    type StablePtr = BracedTokenTreePtr<'db>;
22134    type Green = BracedTokenTreeGreen<'db>;
22135    fn missing(db: &'db dyn Database) -> Self::Green {
22136        BracedTokenTreeGreen(
22137            GreenNode {
22138                kind: SyntaxKind::BracedTokenTree,
22139                details: GreenNodeDetails::Node {
22140                    children: [
22141                        TerminalLBrace::missing(db).0,
22142                        TokenList::missing(db).0,
22143                        TerminalRBrace::missing(db).0,
22144                    ]
22145                    .into(),
22146                    width: TextWidth::default(),
22147                },
22148            }
22149            .intern(db),
22150        )
22151    }
22152    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22153        let kind = node.kind(db);
22154        assert_eq!(
22155            kind,
22156            SyntaxKind::BracedTokenTree,
22157            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22158            kind,
22159            SyntaxKind::BracedTokenTree
22160        );
22161        Self { node }
22162    }
22163    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22164        let kind = node.kind(db);
22165        if kind == SyntaxKind::BracedTokenTree {
22166            Some(Self::from_syntax_node(db, node))
22167        } else {
22168            None
22169        }
22170    }
22171    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22172        self.node
22173    }
22174    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22175        BracedTokenTreePtr(self.node.stable_ptr(db))
22176    }
22177}
22178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22179pub struct BracketedTokenTree<'db> {
22180    node: SyntaxNode<'db>,
22181}
22182impl<'db> BracketedTokenTree<'db> {
22183    pub const INDEX_LBRACK: usize = 0;
22184    pub const INDEX_TOKENS: usize = 1;
22185    pub const INDEX_RBRACK: usize = 2;
22186    pub fn new_green(
22187        db: &'db dyn Database,
22188        lbrack: TerminalLBrackGreen<'db>,
22189        tokens: TokenListGreen<'db>,
22190        rbrack: TerminalRBrackGreen<'db>,
22191    ) -> BracketedTokenTreeGreen<'db> {
22192        let children = [lbrack.0, tokens.0, rbrack.0];
22193        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22194        BracketedTokenTreeGreen(
22195            GreenNode {
22196                kind: SyntaxKind::BracketedTokenTree,
22197                details: GreenNodeDetails::Node { children: children.into(), width },
22198            }
22199            .intern(db),
22200        )
22201    }
22202}
22203impl<'db> BracketedTokenTree<'db> {
22204    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
22205        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
22206    }
22207    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22208        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22209    }
22210    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
22211        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
22212    }
22213}
22214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22215pub struct BracketedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22216impl<'db> BracketedTokenTreePtr<'db> {}
22217impl<'db> TypedStablePtr<'db> for BracketedTokenTreePtr<'db> {
22218    type SyntaxNode = BracketedTokenTree<'db>;
22219    fn untyped(self) -> SyntaxStablePtrId<'db> {
22220        self.0
22221    }
22222    fn lookup(&self, db: &'db dyn Database) -> BracketedTokenTree<'db> {
22223        BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
22224    }
22225}
22226impl<'db> From<BracketedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22227    fn from(ptr: BracketedTokenTreePtr<'db>) -> Self {
22228        ptr.untyped()
22229    }
22230}
22231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22232pub struct BracketedTokenTreeGreen<'db>(pub GreenId<'db>);
22233impl<'db> TypedSyntaxNode<'db> for BracketedTokenTree<'db> {
22234    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
22235    type StablePtr = BracketedTokenTreePtr<'db>;
22236    type Green = BracketedTokenTreeGreen<'db>;
22237    fn missing(db: &'db dyn Database) -> Self::Green {
22238        BracketedTokenTreeGreen(
22239            GreenNode {
22240                kind: SyntaxKind::BracketedTokenTree,
22241                details: GreenNodeDetails::Node {
22242                    children: [
22243                        TerminalLBrack::missing(db).0,
22244                        TokenList::missing(db).0,
22245                        TerminalRBrack::missing(db).0,
22246                    ]
22247                    .into(),
22248                    width: TextWidth::default(),
22249                },
22250            }
22251            .intern(db),
22252        )
22253    }
22254    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22255        let kind = node.kind(db);
22256        assert_eq!(
22257            kind,
22258            SyntaxKind::BracketedTokenTree,
22259            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22260            kind,
22261            SyntaxKind::BracketedTokenTree
22262        );
22263        Self { node }
22264    }
22265    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22266        let kind = node.kind(db);
22267        if kind == SyntaxKind::BracketedTokenTree {
22268            Some(Self::from_syntax_node(db, node))
22269        } else {
22270            None
22271        }
22272    }
22273    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22274        self.node
22275    }
22276    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22277        BracketedTokenTreePtr(self.node.stable_ptr(db))
22278    }
22279}
22280#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22281pub struct ExprInlineMacro<'db> {
22282    node: SyntaxNode<'db>,
22283}
22284impl<'db> ExprInlineMacro<'db> {
22285    pub const INDEX_PATH: usize = 0;
22286    pub const INDEX_BANG: usize = 1;
22287    pub const INDEX_ARGUMENTS: usize = 2;
22288    pub fn new_green(
22289        db: &'db dyn Database,
22290        path: ExprPathGreen<'db>,
22291        bang: TerminalNotGreen<'db>,
22292        arguments: TokenTreeNodeGreen<'db>,
22293    ) -> ExprInlineMacroGreen<'db> {
22294        let children = [path.0, bang.0, arguments.0];
22295        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22296        ExprInlineMacroGreen(
22297            GreenNode {
22298                kind: SyntaxKind::ExprInlineMacro,
22299                details: GreenNodeDetails::Node { children: children.into(), width },
22300            }
22301            .intern(db),
22302        )
22303    }
22304}
22305impl<'db> ExprInlineMacro<'db> {
22306    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22307        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
22308    }
22309    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22310        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
22311    }
22312    pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22313        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
22314    }
22315}
22316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22317pub struct ExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22318impl<'db> ExprInlineMacroPtr<'db> {}
22319impl<'db> TypedStablePtr<'db> for ExprInlineMacroPtr<'db> {
22320    type SyntaxNode = ExprInlineMacro<'db>;
22321    fn untyped(self) -> SyntaxStablePtrId<'db> {
22322        self.0
22323    }
22324    fn lookup(&self, db: &'db dyn Database) -> ExprInlineMacro<'db> {
22325        ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
22326    }
22327}
22328impl<'db> From<ExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22329    fn from(ptr: ExprInlineMacroPtr<'db>) -> Self {
22330        ptr.untyped()
22331    }
22332}
22333#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22334pub struct ExprInlineMacroGreen<'db>(pub GreenId<'db>);
22335impl<'db> TypedSyntaxNode<'db> for ExprInlineMacro<'db> {
22336    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
22337    type StablePtr = ExprInlineMacroPtr<'db>;
22338    type Green = ExprInlineMacroGreen<'db>;
22339    fn missing(db: &'db dyn Database) -> Self::Green {
22340        ExprInlineMacroGreen(
22341            GreenNode {
22342                kind: SyntaxKind::ExprInlineMacro,
22343                details: GreenNodeDetails::Node {
22344                    children: [
22345                        ExprPath::missing(db).0,
22346                        TerminalNot::missing(db).0,
22347                        TokenTreeNode::missing(db).0,
22348                    ]
22349                    .into(),
22350                    width: TextWidth::default(),
22351                },
22352            }
22353            .intern(db),
22354        )
22355    }
22356    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22357        let kind = node.kind(db);
22358        assert_eq!(
22359            kind,
22360            SyntaxKind::ExprInlineMacro,
22361            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22362            kind,
22363            SyntaxKind::ExprInlineMacro
22364        );
22365        Self { node }
22366    }
22367    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22368        let kind = node.kind(db);
22369        if kind == SyntaxKind::ExprInlineMacro {
22370            Some(Self::from_syntax_node(db, node))
22371        } else {
22372            None
22373        }
22374    }
22375    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22376        self.node
22377    }
22378    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22379        ExprInlineMacroPtr(self.node.stable_ptr(db))
22380    }
22381}
22382#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22383pub struct ItemInlineMacro<'db> {
22384    node: SyntaxNode<'db>,
22385}
22386impl<'db> ItemInlineMacro<'db> {
22387    pub const INDEX_ATTRIBUTES: usize = 0;
22388    pub const INDEX_PATH: usize = 1;
22389    pub const INDEX_BANG: usize = 2;
22390    pub const INDEX_ARGUMENTS: usize = 3;
22391    pub const INDEX_SEMICOLON: usize = 4;
22392    pub fn new_green(
22393        db: &'db dyn Database,
22394        attributes: AttributeListGreen<'db>,
22395        path: ExprPathGreen<'db>,
22396        bang: TerminalNotGreen<'db>,
22397        arguments: TokenTreeNodeGreen<'db>,
22398        semicolon: TerminalSemicolonGreen<'db>,
22399    ) -> ItemInlineMacroGreen<'db> {
22400        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22401        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22402        ItemInlineMacroGreen(
22403            GreenNode {
22404                kind: SyntaxKind::ItemInlineMacro,
22405                details: GreenNodeDetails::Node { children: children.into(), width },
22406            }
22407            .intern(db),
22408        )
22409    }
22410}
22411impl<'db> ItemInlineMacro<'db> {
22412    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22413        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22414    }
22415    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22416        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22417    }
22418    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22419        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22420    }
22421    pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22422        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22423    }
22424    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22425        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22426    }
22427}
22428#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22429pub struct ItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22430impl<'db> ItemInlineMacroPtr<'db> {}
22431impl<'db> TypedStablePtr<'db> for ItemInlineMacroPtr<'db> {
22432    type SyntaxNode = ItemInlineMacro<'db>;
22433    fn untyped(self) -> SyntaxStablePtrId<'db> {
22434        self.0
22435    }
22436    fn lookup(&self, db: &'db dyn Database) -> ItemInlineMacro<'db> {
22437        ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22438    }
22439}
22440impl<'db> From<ItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22441    fn from(ptr: ItemInlineMacroPtr<'db>) -> Self {
22442        ptr.untyped()
22443    }
22444}
22445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22446pub struct ItemInlineMacroGreen<'db>(pub GreenId<'db>);
22447impl<'db> TypedSyntaxNode<'db> for ItemInlineMacro<'db> {
22448    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22449    type StablePtr = ItemInlineMacroPtr<'db>;
22450    type Green = ItemInlineMacroGreen<'db>;
22451    fn missing(db: &'db dyn Database) -> Self::Green {
22452        ItemInlineMacroGreen(
22453            GreenNode {
22454                kind: SyntaxKind::ItemInlineMacro,
22455                details: GreenNodeDetails::Node {
22456                    children: [
22457                        AttributeList::missing(db).0,
22458                        ExprPath::missing(db).0,
22459                        TerminalNot::missing(db).0,
22460                        TokenTreeNode::missing(db).0,
22461                        TerminalSemicolon::missing(db).0,
22462                    ]
22463                    .into(),
22464                    width: TextWidth::default(),
22465                },
22466            }
22467            .intern(db),
22468        )
22469    }
22470    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22471        let kind = node.kind(db);
22472        assert_eq!(
22473            kind,
22474            SyntaxKind::ItemInlineMacro,
22475            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22476            kind,
22477            SyntaxKind::ItemInlineMacro
22478        );
22479        Self { node }
22480    }
22481    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22482        let kind = node.kind(db);
22483        if kind == SyntaxKind::ItemInlineMacro {
22484            Some(Self::from_syntax_node(db, node))
22485        } else {
22486            None
22487        }
22488    }
22489    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22490        self.node
22491    }
22492    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22493        ItemInlineMacroPtr(self.node.stable_ptr(db))
22494    }
22495}
22496#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22497pub struct ItemMacroDeclaration<'db> {
22498    node: SyntaxNode<'db>,
22499}
22500impl<'db> ItemMacroDeclaration<'db> {
22501    pub const INDEX_ATTRIBUTES: usize = 0;
22502    pub const INDEX_VISIBILITY: usize = 1;
22503    pub const INDEX_MACRO_KW: usize = 2;
22504    pub const INDEX_NAME: usize = 3;
22505    pub const INDEX_LBRACE: usize = 4;
22506    pub const INDEX_RULES: usize = 5;
22507    pub const INDEX_RBRACE: usize = 6;
22508    pub fn new_green(
22509        db: &'db dyn Database,
22510        attributes: AttributeListGreen<'db>,
22511        visibility: VisibilityGreen<'db>,
22512        macro_kw: TerminalMacroGreen<'db>,
22513        name: TerminalIdentifierGreen<'db>,
22514        lbrace: TerminalLBraceGreen<'db>,
22515        rules: MacroRulesListGreen<'db>,
22516        rbrace: TerminalRBraceGreen<'db>,
22517    ) -> ItemMacroDeclarationGreen<'db> {
22518        let children =
22519            [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22520        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22521        ItemMacroDeclarationGreen(
22522            GreenNode {
22523                kind: SyntaxKind::ItemMacroDeclaration,
22524                details: GreenNodeDetails::Node { children: children.into(), width },
22525            }
22526            .intern(db),
22527        )
22528    }
22529}
22530impl<'db> ItemMacroDeclaration<'db> {
22531    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22532        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22533    }
22534    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
22535        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22536    }
22537    pub fn macro_kw(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
22538        TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22539    }
22540    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22541        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22542    }
22543    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22544        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22545    }
22546    pub fn rules(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22547        MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22548    }
22549    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22550        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22551    }
22552}
22553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22554pub struct ItemMacroDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
22555impl<'db> ItemMacroDeclarationPtr<'db> {
22556    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
22557        let ptr = self.0.long(db);
22558        if let SyntaxStablePtr::Child { key_fields, .. } = ptr {
22559            TerminalIdentifierGreen(key_fields[0])
22560        } else {
22561            panic!("Unexpected key field query on root.");
22562        }
22563    }
22564}
22565impl<'db> TypedStablePtr<'db> for ItemMacroDeclarationPtr<'db> {
22566    type SyntaxNode = ItemMacroDeclaration<'db>;
22567    fn untyped(self) -> SyntaxStablePtrId<'db> {
22568        self.0
22569    }
22570    fn lookup(&self, db: &'db dyn Database) -> ItemMacroDeclaration<'db> {
22571        ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22572    }
22573}
22574impl<'db> From<ItemMacroDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
22575    fn from(ptr: ItemMacroDeclarationPtr<'db>) -> Self {
22576        ptr.untyped()
22577    }
22578}
22579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22580pub struct ItemMacroDeclarationGreen<'db>(pub GreenId<'db>);
22581impl<'db> TypedSyntaxNode<'db> for ItemMacroDeclaration<'db> {
22582    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22583    type StablePtr = ItemMacroDeclarationPtr<'db>;
22584    type Green = ItemMacroDeclarationGreen<'db>;
22585    fn missing(db: &'db dyn Database) -> Self::Green {
22586        ItemMacroDeclarationGreen(
22587            GreenNode {
22588                kind: SyntaxKind::ItemMacroDeclaration,
22589                details: GreenNodeDetails::Node {
22590                    children: [
22591                        AttributeList::missing(db).0,
22592                        Visibility::missing(db).0,
22593                        TerminalMacro::missing(db).0,
22594                        TerminalIdentifier::missing(db).0,
22595                        TerminalLBrace::missing(db).0,
22596                        MacroRulesList::missing(db).0,
22597                        TerminalRBrace::missing(db).0,
22598                    ]
22599                    .into(),
22600                    width: TextWidth::default(),
22601                },
22602            }
22603            .intern(db),
22604        )
22605    }
22606    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22607        let kind = node.kind(db);
22608        assert_eq!(
22609            kind,
22610            SyntaxKind::ItemMacroDeclaration,
22611            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22612            kind,
22613            SyntaxKind::ItemMacroDeclaration
22614        );
22615        Self { node }
22616    }
22617    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22618        let kind = node.kind(db);
22619        if kind == SyntaxKind::ItemMacroDeclaration {
22620            Some(Self::from_syntax_node(db, node))
22621        } else {
22622            None
22623        }
22624    }
22625    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22626        self.node
22627    }
22628    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22629        ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22630    }
22631}
22632#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22633pub struct MacroRulesList<'db>(ElementList<'db, MacroRule<'db>, 1>);
22634impl<'db> Deref for MacroRulesList<'db> {
22635    type Target = ElementList<'db, MacroRule<'db>, 1>;
22636    fn deref(&self) -> &Self::Target {
22637        &self.0
22638    }
22639}
22640impl<'db> MacroRulesList<'db> {
22641    pub fn new_green(
22642        db: &'db dyn Database,
22643        children: &[MacroRuleGreen<'db>],
22644    ) -> MacroRulesListGreen<'db> {
22645        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
22646        MacroRulesListGreen(
22647            GreenNode {
22648                kind: SyntaxKind::MacroRulesList,
22649                details: GreenNodeDetails::Node {
22650                    children: children.iter().map(|x| x.0).collect(),
22651                    width,
22652                },
22653            }
22654            .intern(db),
22655        )
22656    }
22657}
22658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22659pub struct MacroRulesListPtr<'db>(pub SyntaxStablePtrId<'db>);
22660impl<'db> TypedStablePtr<'db> for MacroRulesListPtr<'db> {
22661    type SyntaxNode = MacroRulesList<'db>;
22662    fn untyped(self) -> SyntaxStablePtrId<'db> {
22663        self.0
22664    }
22665    fn lookup(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22666        MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22667    }
22668}
22669impl<'db> From<MacroRulesListPtr<'db>> for SyntaxStablePtrId<'db> {
22670    fn from(ptr: MacroRulesListPtr<'db>) -> Self {
22671        ptr.untyped()
22672    }
22673}
22674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22675pub struct MacroRulesListGreen<'db>(pub GreenId<'db>);
22676impl<'db> TypedSyntaxNode<'db> for MacroRulesList<'db> {
22677    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22678    type StablePtr = MacroRulesListPtr<'db>;
22679    type Green = MacroRulesListGreen<'db>;
22680    fn missing(db: &'db dyn Database) -> Self::Green {
22681        MacroRulesListGreen(
22682            GreenNode {
22683                kind: SyntaxKind::MacroRulesList,
22684                details: GreenNodeDetails::Node {
22685                    children: [].into(),
22686                    width: TextWidth::default(),
22687                },
22688            }
22689            .intern(db),
22690        )
22691    }
22692    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22693        Self(ElementList::new(node))
22694    }
22695    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22696        if node.kind(db) == SyntaxKind::MacroRulesList {
22697            Some(Self(ElementList::new(node)))
22698        } else {
22699            None
22700        }
22701    }
22702    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22703        self.node
22704    }
22705    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22706        MacroRulesListPtr(self.node.stable_ptr(db))
22707    }
22708}
22709#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22710pub struct MacroRule<'db> {
22711    node: SyntaxNode<'db>,
22712}
22713impl<'db> MacroRule<'db> {
22714    pub const INDEX_LHS: usize = 0;
22715    pub const INDEX_FAT_ARROW: usize = 1;
22716    pub const INDEX_RHS: usize = 2;
22717    pub const INDEX_SEMICOLON: usize = 3;
22718    pub fn new_green(
22719        db: &'db dyn Database,
22720        lhs: WrappedMacroGreen<'db>,
22721        fat_arrow: TerminalMatchArrowGreen<'db>,
22722        rhs: BracedMacroGreen<'db>,
22723        semicolon: TerminalSemicolonGreen<'db>,
22724    ) -> MacroRuleGreen<'db> {
22725        let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22726        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22727        MacroRuleGreen(
22728            GreenNode {
22729                kind: SyntaxKind::MacroRule,
22730                details: GreenNodeDetails::Node { children: children.into(), width },
22731            }
22732            .intern(db),
22733        )
22734    }
22735}
22736impl<'db> MacroRule<'db> {
22737    pub fn lhs(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
22738        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22739    }
22740    pub fn fat_arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
22741        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22742    }
22743    pub fn rhs(&self, db: &'db dyn Database) -> BracedMacro<'db> {
22744        BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22745    }
22746    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22747        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22748    }
22749}
22750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22751pub struct MacroRulePtr<'db>(pub SyntaxStablePtrId<'db>);
22752impl<'db> MacroRulePtr<'db> {}
22753impl<'db> TypedStablePtr<'db> for MacroRulePtr<'db> {
22754    type SyntaxNode = MacroRule<'db>;
22755    fn untyped(self) -> SyntaxStablePtrId<'db> {
22756        self.0
22757    }
22758    fn lookup(&self, db: &'db dyn Database) -> MacroRule<'db> {
22759        MacroRule::from_syntax_node(db, self.0.lookup(db))
22760    }
22761}
22762impl<'db> From<MacroRulePtr<'db>> for SyntaxStablePtrId<'db> {
22763    fn from(ptr: MacroRulePtr<'db>) -> Self {
22764        ptr.untyped()
22765    }
22766}
22767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22768pub struct MacroRuleGreen<'db>(pub GreenId<'db>);
22769impl<'db> TypedSyntaxNode<'db> for MacroRule<'db> {
22770    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22771    type StablePtr = MacroRulePtr<'db>;
22772    type Green = MacroRuleGreen<'db>;
22773    fn missing(db: &'db dyn Database) -> Self::Green {
22774        MacroRuleGreen(
22775            GreenNode {
22776                kind: SyntaxKind::MacroRule,
22777                details: GreenNodeDetails::Node {
22778                    children: [
22779                        WrappedMacro::missing(db).0,
22780                        TerminalMatchArrow::missing(db).0,
22781                        BracedMacro::missing(db).0,
22782                        TerminalSemicolon::missing(db).0,
22783                    ]
22784                    .into(),
22785                    width: TextWidth::default(),
22786                },
22787            }
22788            .intern(db),
22789        )
22790    }
22791    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22792        let kind = node.kind(db);
22793        assert_eq!(
22794            kind,
22795            SyntaxKind::MacroRule,
22796            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22797            kind,
22798            SyntaxKind::MacroRule
22799        );
22800        Self { node }
22801    }
22802    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22803        let kind = node.kind(db);
22804        if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22805    }
22806    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22807        self.node
22808    }
22809    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22810        MacroRulePtr(self.node.stable_ptr(db))
22811    }
22812}
22813#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22814pub struct ParamKind<'db> {
22815    node: SyntaxNode<'db>,
22816}
22817impl<'db> ParamKind<'db> {
22818    pub const INDEX_COLON: usize = 0;
22819    pub const INDEX_KIND: usize = 1;
22820    pub fn new_green(
22821        db: &'db dyn Database,
22822        colon: TerminalColonGreen<'db>,
22823        kind: MacroParamKindGreen<'db>,
22824    ) -> ParamKindGreen<'db> {
22825        let children = [colon.0, kind.0];
22826        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22827        ParamKindGreen(
22828            GreenNode {
22829                kind: SyntaxKind::ParamKind,
22830                details: GreenNodeDetails::Node { children: children.into(), width },
22831            }
22832            .intern(db),
22833        )
22834    }
22835}
22836impl<'db> ParamKind<'db> {
22837    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
22838        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22839    }
22840    pub fn kind(&self, db: &'db dyn Database) -> MacroParamKind<'db> {
22841        MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22842    }
22843}
22844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22845pub struct ParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22846impl<'db> ParamKindPtr<'db> {}
22847impl<'db> TypedStablePtr<'db> for ParamKindPtr<'db> {
22848    type SyntaxNode = ParamKind<'db>;
22849    fn untyped(self) -> SyntaxStablePtrId<'db> {
22850        self.0
22851    }
22852    fn lookup(&self, db: &'db dyn Database) -> ParamKind<'db> {
22853        ParamKind::from_syntax_node(db, self.0.lookup(db))
22854    }
22855}
22856impl<'db> From<ParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22857    fn from(ptr: ParamKindPtr<'db>) -> Self {
22858        ptr.untyped()
22859    }
22860}
22861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22862pub struct ParamKindGreen<'db>(pub GreenId<'db>);
22863impl<'db> TypedSyntaxNode<'db> for ParamKind<'db> {
22864    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22865    type StablePtr = ParamKindPtr<'db>;
22866    type Green = ParamKindGreen<'db>;
22867    fn missing(db: &'db dyn Database) -> Self::Green {
22868        ParamKindGreen(
22869            GreenNode {
22870                kind: SyntaxKind::ParamKind,
22871                details: GreenNodeDetails::Node {
22872                    children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22873                    width: TextWidth::default(),
22874                },
22875            }
22876            .intern(db),
22877        )
22878    }
22879    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22880        let kind = node.kind(db);
22881        assert_eq!(
22882            kind,
22883            SyntaxKind::ParamKind,
22884            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22885            kind,
22886            SyntaxKind::ParamKind
22887        );
22888        Self { node }
22889    }
22890    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22891        let kind = node.kind(db);
22892        if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22893    }
22894    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22895        self.node
22896    }
22897    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22898        ParamKindPtr(self.node.stable_ptr(db))
22899    }
22900}
22901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22902pub enum OptionParamKind<'db> {
22903    Empty(OptionParamKindEmpty<'db>),
22904    ParamKind(ParamKind<'db>),
22905}
22906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22907pub struct OptionParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22908impl<'db> TypedStablePtr<'db> for OptionParamKindPtr<'db> {
22909    type SyntaxNode = OptionParamKind<'db>;
22910    fn untyped(self) -> SyntaxStablePtrId<'db> {
22911        self.0
22912    }
22913    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22914        OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22915    }
22916}
22917impl<'db> From<OptionParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22918    fn from(ptr: OptionParamKindPtr<'db>) -> Self {
22919        ptr.untyped()
22920    }
22921}
22922impl<'db> From<OptionParamKindEmptyPtr<'db>> for OptionParamKindPtr<'db> {
22923    fn from(value: OptionParamKindEmptyPtr<'db>) -> Self {
22924        Self(value.0)
22925    }
22926}
22927impl<'db> From<ParamKindPtr<'db>> for OptionParamKindPtr<'db> {
22928    fn from(value: ParamKindPtr<'db>) -> Self {
22929        Self(value.0)
22930    }
22931}
22932impl<'db> From<OptionParamKindEmptyGreen<'db>> for OptionParamKindGreen<'db> {
22933    fn from(value: OptionParamKindEmptyGreen<'db>) -> Self {
22934        Self(value.0)
22935    }
22936}
22937impl<'db> From<ParamKindGreen<'db>> for OptionParamKindGreen<'db> {
22938    fn from(value: ParamKindGreen<'db>) -> Self {
22939        Self(value.0)
22940    }
22941}
22942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22943pub struct OptionParamKindGreen<'db>(pub GreenId<'db>);
22944impl<'db> TypedSyntaxNode<'db> for OptionParamKind<'db> {
22945    const OPTIONAL_KIND: Option<SyntaxKind> = None;
22946    type StablePtr = OptionParamKindPtr<'db>;
22947    type Green = OptionParamKindGreen<'db>;
22948    fn missing(db: &'db dyn Database) -> Self::Green {
22949        panic!("No missing variant.");
22950    }
22951    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22952        let kind = node.kind(db);
22953        match kind {
22954            SyntaxKind::OptionParamKindEmpty => {
22955                OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
22956            }
22957            SyntaxKind::ParamKind => {
22958                OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
22959            }
22960            _ => {
22961                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
22962            }
22963        }
22964    }
22965    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22966        let kind = node.kind(db);
22967        match kind {
22968            SyntaxKind::OptionParamKindEmpty => {
22969                Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
22970            }
22971            SyntaxKind::ParamKind => {
22972                Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
22973            }
22974            _ => None,
22975        }
22976    }
22977    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22978        match self {
22979            OptionParamKind::Empty(x) => x.as_syntax_node(),
22980            OptionParamKind::ParamKind(x) => x.as_syntax_node(),
22981        }
22982    }
22983    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22984        OptionParamKindPtr(self.as_syntax_node().long(db).stable_ptr)
22985    }
22986}
22987impl<'db> OptionParamKind<'db> {
22988    /// Checks if a kind of a variant of [OptionParamKind].
22989    pub fn is_variant(kind: SyntaxKind) -> bool {
22990        matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
22991    }
22992}
22993#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22994pub struct OptionParamKindEmpty<'db> {
22995    node: SyntaxNode<'db>,
22996}
22997impl<'db> OptionParamKindEmpty<'db> {
22998    pub fn new_green(db: &'db dyn Database) -> OptionParamKindEmptyGreen<'db> {
22999        let children = [];
23000        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23001        OptionParamKindEmptyGreen(
23002            GreenNode {
23003                kind: SyntaxKind::OptionParamKindEmpty,
23004                details: GreenNodeDetails::Node { children: children.into(), width },
23005            }
23006            .intern(db),
23007        )
23008    }
23009}
23010impl<'db> OptionParamKindEmpty<'db> {}
23011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23012pub struct OptionParamKindEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23013impl<'db> OptionParamKindEmptyPtr<'db> {}
23014impl<'db> TypedStablePtr<'db> for OptionParamKindEmptyPtr<'db> {
23015    type SyntaxNode = OptionParamKindEmpty<'db>;
23016    fn untyped(self) -> SyntaxStablePtrId<'db> {
23017        self.0
23018    }
23019    fn lookup(&self, db: &'db dyn Database) -> OptionParamKindEmpty<'db> {
23020        OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
23021    }
23022}
23023impl<'db> From<OptionParamKindEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23024    fn from(ptr: OptionParamKindEmptyPtr<'db>) -> Self {
23025        ptr.untyped()
23026    }
23027}
23028#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23029pub struct OptionParamKindEmptyGreen<'db>(pub GreenId<'db>);
23030impl<'db> TypedSyntaxNode<'db> for OptionParamKindEmpty<'db> {
23031    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
23032    type StablePtr = OptionParamKindEmptyPtr<'db>;
23033    type Green = OptionParamKindEmptyGreen<'db>;
23034    fn missing(db: &'db dyn Database) -> Self::Green {
23035        OptionParamKindEmptyGreen(
23036            GreenNode {
23037                kind: SyntaxKind::OptionParamKindEmpty,
23038                details: GreenNodeDetails::Node {
23039                    children: [].into(),
23040                    width: TextWidth::default(),
23041                },
23042            }
23043            .intern(db),
23044        )
23045    }
23046    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23047        let kind = node.kind(db);
23048        assert_eq!(
23049            kind,
23050            SyntaxKind::OptionParamKindEmpty,
23051            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23052            kind,
23053            SyntaxKind::OptionParamKindEmpty
23054        );
23055        Self { node }
23056    }
23057    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23058        let kind = node.kind(db);
23059        if kind == SyntaxKind::OptionParamKindEmpty {
23060            Some(Self::from_syntax_node(db, node))
23061        } else {
23062            None
23063        }
23064    }
23065    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23066        self.node
23067    }
23068    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23069        OptionParamKindEmptyPtr(self.node.stable_ptr(db))
23070    }
23071}
23072#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23073pub struct MacroParam<'db> {
23074    node: SyntaxNode<'db>,
23075}
23076impl<'db> MacroParam<'db> {
23077    pub const INDEX_DOLLAR: usize = 0;
23078    pub const INDEX_NAME: usize = 1;
23079    pub const INDEX_KIND: usize = 2;
23080    pub fn new_green(
23081        db: &'db dyn Database,
23082        dollar: TerminalDollarGreen<'db>,
23083        name: TerminalIdentifierGreen<'db>,
23084        kind: OptionParamKindGreen<'db>,
23085    ) -> MacroParamGreen<'db> {
23086        let children = [dollar.0, name.0, kind.0];
23087        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23088        MacroParamGreen(
23089            GreenNode {
23090                kind: SyntaxKind::MacroParam,
23091                details: GreenNodeDetails::Node { children: children.into(), width },
23092            }
23093            .intern(db),
23094        )
23095    }
23096}
23097impl<'db> MacroParam<'db> {
23098    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
23099        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23100    }
23101    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23102        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
23103    }
23104    pub fn kind(&self, db: &'db dyn Database) -> OptionParamKind<'db> {
23105        OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
23106    }
23107}
23108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23109pub struct MacroParamPtr<'db>(pub SyntaxStablePtrId<'db>);
23110impl<'db> MacroParamPtr<'db> {}
23111impl<'db> TypedStablePtr<'db> for MacroParamPtr<'db> {
23112    type SyntaxNode = MacroParam<'db>;
23113    fn untyped(self) -> SyntaxStablePtrId<'db> {
23114        self.0
23115    }
23116    fn lookup(&self, db: &'db dyn Database) -> MacroParam<'db> {
23117        MacroParam::from_syntax_node(db, self.0.lookup(db))
23118    }
23119}
23120impl<'db> From<MacroParamPtr<'db>> for SyntaxStablePtrId<'db> {
23121    fn from(ptr: MacroParamPtr<'db>) -> Self {
23122        ptr.untyped()
23123    }
23124}
23125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23126pub struct MacroParamGreen<'db>(pub GreenId<'db>);
23127impl<'db> TypedSyntaxNode<'db> for MacroParam<'db> {
23128    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
23129    type StablePtr = MacroParamPtr<'db>;
23130    type Green = MacroParamGreen<'db>;
23131    fn missing(db: &'db dyn Database) -> Self::Green {
23132        MacroParamGreen(
23133            GreenNode {
23134                kind: SyntaxKind::MacroParam,
23135                details: GreenNodeDetails::Node {
23136                    children: [
23137                        TerminalDollar::missing(db).0,
23138                        TerminalIdentifier::missing(db).0,
23139                        OptionParamKind::missing(db).0,
23140                    ]
23141                    .into(),
23142                    width: TextWidth::default(),
23143                },
23144            }
23145            .intern(db),
23146        )
23147    }
23148    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23149        let kind = node.kind(db);
23150        assert_eq!(
23151            kind,
23152            SyntaxKind::MacroParam,
23153            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23154            kind,
23155            SyntaxKind::MacroParam
23156        );
23157        Self { node }
23158    }
23159    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23160        let kind = node.kind(db);
23161        if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
23162    }
23163    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23164        self.node
23165    }
23166    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23167        MacroParamPtr(self.node.stable_ptr(db))
23168    }
23169}
23170#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23171pub struct MacroRepetition<'db> {
23172    node: SyntaxNode<'db>,
23173}
23174impl<'db> MacroRepetition<'db> {
23175    pub const INDEX_DOLLAR: usize = 0;
23176    pub const INDEX_LPAREN: usize = 1;
23177    pub const INDEX_ELEMENTS: usize = 2;
23178    pub const INDEX_RPAREN: usize = 3;
23179    pub const INDEX_SEPARATOR: usize = 4;
23180    pub const INDEX_OPERATOR: usize = 5;
23181    pub fn new_green(
23182        db: &'db dyn Database,
23183        dollar: TerminalDollarGreen<'db>,
23184        lparen: TerminalLParenGreen<'db>,
23185        elements: MacroElementsGreen<'db>,
23186        rparen: TerminalRParenGreen<'db>,
23187        separator: OptionTerminalCommaGreen<'db>,
23188        operator: MacroRepetitionOperatorGreen<'db>,
23189    ) -> MacroRepetitionGreen<'db> {
23190        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
23191        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23192        MacroRepetitionGreen(
23193            GreenNode {
23194                kind: SyntaxKind::MacroRepetition,
23195                details: GreenNodeDetails::Node { children: children.into(), width },
23196            }
23197            .intern(db),
23198        )
23199    }
23200}
23201impl<'db> MacroRepetition<'db> {
23202    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
23203        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23204    }
23205    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
23206        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
23207    }
23208    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
23209        MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
23210    }
23211    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
23212        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
23213    }
23214    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
23215        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
23216    }
23217    pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
23218        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
23219    }
23220}
23221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23222pub struct MacroRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
23223impl<'db> MacroRepetitionPtr<'db> {}
23224impl<'db> TypedStablePtr<'db> for MacroRepetitionPtr<'db> {
23225    type SyntaxNode = MacroRepetition<'db>;
23226    fn untyped(self) -> SyntaxStablePtrId<'db> {
23227        self.0
23228    }
23229    fn lookup(&self, db: &'db dyn Database) -> MacroRepetition<'db> {
23230        MacroRepetition::from_syntax_node(db, self.0.lookup(db))
23231    }
23232}
23233impl<'db> From<MacroRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
23234    fn from(ptr: MacroRepetitionPtr<'db>) -> Self {
23235        ptr.untyped()
23236    }
23237}
23238#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23239pub struct MacroRepetitionGreen<'db>(pub GreenId<'db>);
23240impl<'db> TypedSyntaxNode<'db> for MacroRepetition<'db> {
23241    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
23242    type StablePtr = MacroRepetitionPtr<'db>;
23243    type Green = MacroRepetitionGreen<'db>;
23244    fn missing(db: &'db dyn Database) -> Self::Green {
23245        MacroRepetitionGreen(
23246            GreenNode {
23247                kind: SyntaxKind::MacroRepetition,
23248                details: GreenNodeDetails::Node {
23249                    children: [
23250                        TerminalDollar::missing(db).0,
23251                        TerminalLParen::missing(db).0,
23252                        MacroElements::missing(db).0,
23253                        TerminalRParen::missing(db).0,
23254                        OptionTerminalComma::missing(db).0,
23255                        MacroRepetitionOperator::missing(db).0,
23256                    ]
23257                    .into(),
23258                    width: TextWidth::default(),
23259                },
23260            }
23261            .intern(db),
23262        )
23263    }
23264    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23265        let kind = node.kind(db);
23266        assert_eq!(
23267            kind,
23268            SyntaxKind::MacroRepetition,
23269            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23270            kind,
23271            SyntaxKind::MacroRepetition
23272        );
23273        Self { node }
23274    }
23275    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23276        let kind = node.kind(db);
23277        if kind == SyntaxKind::MacroRepetition {
23278            Some(Self::from_syntax_node(db, node))
23279        } else {
23280            None
23281        }
23282    }
23283    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23284        self.node
23285    }
23286    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23287        MacroRepetitionPtr(self.node.stable_ptr(db))
23288    }
23289}
23290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23291pub enum OptionTerminalComma<'db> {
23292    Empty(OptionTerminalCommaEmpty<'db>),
23293    TerminalComma(TerminalComma<'db>),
23294}
23295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23296pub struct OptionTerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
23297impl<'db> TypedStablePtr<'db> for OptionTerminalCommaPtr<'db> {
23298    type SyntaxNode = OptionTerminalComma<'db>;
23299    fn untyped(self) -> SyntaxStablePtrId<'db> {
23300        self.0
23301    }
23302    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23303        OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
23304    }
23305}
23306impl<'db> From<OptionTerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
23307    fn from(ptr: OptionTerminalCommaPtr<'db>) -> Self {
23308        ptr.untyped()
23309    }
23310}
23311impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for OptionTerminalCommaPtr<'db> {
23312    fn from(value: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23313        Self(value.0)
23314    }
23315}
23316impl<'db> From<TerminalCommaPtr<'db>> for OptionTerminalCommaPtr<'db> {
23317    fn from(value: TerminalCommaPtr<'db>) -> Self {
23318        Self(value.0)
23319    }
23320}
23321impl<'db> From<OptionTerminalCommaEmptyGreen<'db>> for OptionTerminalCommaGreen<'db> {
23322    fn from(value: OptionTerminalCommaEmptyGreen<'db>) -> Self {
23323        Self(value.0)
23324    }
23325}
23326impl<'db> From<TerminalCommaGreen<'db>> for OptionTerminalCommaGreen<'db> {
23327    fn from(value: TerminalCommaGreen<'db>) -> Self {
23328        Self(value.0)
23329    }
23330}
23331#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23332pub struct OptionTerminalCommaGreen<'db>(pub GreenId<'db>);
23333impl<'db> TypedSyntaxNode<'db> for OptionTerminalComma<'db> {
23334    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23335    type StablePtr = OptionTerminalCommaPtr<'db>;
23336    type Green = OptionTerminalCommaGreen<'db>;
23337    fn missing(db: &'db dyn Database) -> Self::Green {
23338        panic!("No missing variant.");
23339    }
23340    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23341        let kind = node.kind(db);
23342        match kind {
23343            SyntaxKind::OptionTerminalCommaEmpty => {
23344                OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
23345            }
23346            SyntaxKind::TerminalComma => {
23347                OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
23348            }
23349            _ => panic!(
23350                "Unexpected syntax kind {:?} when constructing {}.",
23351                kind, "OptionTerminalComma"
23352            ),
23353        }
23354    }
23355    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23356        let kind = node.kind(db);
23357        match kind {
23358            SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
23359                OptionTerminalCommaEmpty::from_syntax_node(db, node),
23360            )),
23361            SyntaxKind::TerminalComma => {
23362                Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
23363            }
23364            _ => None,
23365        }
23366    }
23367    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23368        match self {
23369            OptionTerminalComma::Empty(x) => x.as_syntax_node(),
23370            OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
23371        }
23372    }
23373    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23374        OptionTerminalCommaPtr(self.as_syntax_node().long(db).stable_ptr)
23375    }
23376}
23377impl<'db> OptionTerminalComma<'db> {
23378    /// Checks if a kind of a variant of [OptionTerminalComma].
23379    pub fn is_variant(kind: SyntaxKind) -> bool {
23380        matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
23381    }
23382}
23383#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23384pub struct OptionTerminalCommaEmpty<'db> {
23385    node: SyntaxNode<'db>,
23386}
23387impl<'db> OptionTerminalCommaEmpty<'db> {
23388    pub fn new_green(db: &'db dyn Database) -> OptionTerminalCommaEmptyGreen<'db> {
23389        let children = [];
23390        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23391        OptionTerminalCommaEmptyGreen(
23392            GreenNode {
23393                kind: SyntaxKind::OptionTerminalCommaEmpty,
23394                details: GreenNodeDetails::Node { children: children.into(), width },
23395            }
23396            .intern(db),
23397        )
23398    }
23399}
23400impl<'db> OptionTerminalCommaEmpty<'db> {}
23401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23402pub struct OptionTerminalCommaEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23403impl<'db> OptionTerminalCommaEmptyPtr<'db> {}
23404impl<'db> TypedStablePtr<'db> for OptionTerminalCommaEmptyPtr<'db> {
23405    type SyntaxNode = OptionTerminalCommaEmpty<'db>;
23406    fn untyped(self) -> SyntaxStablePtrId<'db> {
23407        self.0
23408    }
23409    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalCommaEmpty<'db> {
23410        OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23411    }
23412}
23413impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23414    fn from(ptr: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23415        ptr.untyped()
23416    }
23417}
23418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23419pub struct OptionTerminalCommaEmptyGreen<'db>(pub GreenId<'db>);
23420impl<'db> TypedSyntaxNode<'db> for OptionTerminalCommaEmpty<'db> {
23421    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23422    type StablePtr = OptionTerminalCommaEmptyPtr<'db>;
23423    type Green = OptionTerminalCommaEmptyGreen<'db>;
23424    fn missing(db: &'db dyn Database) -> Self::Green {
23425        OptionTerminalCommaEmptyGreen(
23426            GreenNode {
23427                kind: SyntaxKind::OptionTerminalCommaEmpty,
23428                details: GreenNodeDetails::Node {
23429                    children: [].into(),
23430                    width: TextWidth::default(),
23431                },
23432            }
23433            .intern(db),
23434        )
23435    }
23436    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23437        let kind = node.kind(db);
23438        assert_eq!(
23439            kind,
23440            SyntaxKind::OptionTerminalCommaEmpty,
23441            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23442            kind,
23443            SyntaxKind::OptionTerminalCommaEmpty
23444        );
23445        Self { node }
23446    }
23447    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23448        let kind = node.kind(db);
23449        if kind == SyntaxKind::OptionTerminalCommaEmpty {
23450            Some(Self::from_syntax_node(db, node))
23451        } else {
23452            None
23453        }
23454    }
23455    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23456        self.node
23457    }
23458    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23459        OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23460    }
23461}
23462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23463pub enum MacroRepetitionOperator<'db> {
23464    ZeroOrOne(TerminalQuestionMark<'db>),
23465    OneOrMore(TerminalPlus<'db>),
23466    ZeroOrMore(TerminalMul<'db>),
23467    Missing(MacroRepetitionOperatorMissing<'db>),
23468}
23469#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23470pub struct MacroRepetitionOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
23471impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorPtr<'db> {
23472    type SyntaxNode = MacroRepetitionOperator<'db>;
23473    fn untyped(self) -> SyntaxStablePtrId<'db> {
23474        self.0
23475    }
23476    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23477        MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23478    }
23479}
23480impl<'db> From<MacroRepetitionOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
23481    fn from(ptr: MacroRepetitionOperatorPtr<'db>) -> Self {
23482        ptr.untyped()
23483    }
23484}
23485impl<'db> From<TerminalQuestionMarkPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23486    fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
23487        Self(value.0)
23488    }
23489}
23490impl<'db> From<TerminalPlusPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23491    fn from(value: TerminalPlusPtr<'db>) -> Self {
23492        Self(value.0)
23493    }
23494}
23495impl<'db> From<TerminalMulPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23496    fn from(value: TerminalMulPtr<'db>) -> Self {
23497        Self(value.0)
23498    }
23499}
23500impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23501    fn from(value: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23502        Self(value.0)
23503    }
23504}
23505impl<'db> From<TerminalQuestionMarkGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23506    fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
23507        Self(value.0)
23508    }
23509}
23510impl<'db> From<TerminalPlusGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23511    fn from(value: TerminalPlusGreen<'db>) -> Self {
23512        Self(value.0)
23513    }
23514}
23515impl<'db> From<TerminalMulGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23516    fn from(value: TerminalMulGreen<'db>) -> Self {
23517        Self(value.0)
23518    }
23519}
23520impl<'db> From<MacroRepetitionOperatorMissingGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23521    fn from(value: MacroRepetitionOperatorMissingGreen<'db>) -> Self {
23522        Self(value.0)
23523    }
23524}
23525#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23526pub struct MacroRepetitionOperatorGreen<'db>(pub GreenId<'db>);
23527impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperator<'db> {
23528    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23529    type StablePtr = MacroRepetitionOperatorPtr<'db>;
23530    type Green = MacroRepetitionOperatorGreen<'db>;
23531    fn missing(db: &'db dyn Database) -> Self::Green {
23532        MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23533    }
23534    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23535        let kind = node.kind(db);
23536        match kind {
23537            SyntaxKind::TerminalQuestionMark => {
23538                MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23539            }
23540            SyntaxKind::TerminalPlus => {
23541                MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23542            }
23543            SyntaxKind::TerminalMul => {
23544                MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23545            }
23546            SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23547                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23548            ),
23549            _ => panic!(
23550                "Unexpected syntax kind {:?} when constructing {}.",
23551                kind, "MacroRepetitionOperator"
23552            ),
23553        }
23554    }
23555    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23556        let kind = node.kind(db);
23557        match kind {
23558            SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23559                TerminalQuestionMark::from_syntax_node(db, node),
23560            )),
23561            SyntaxKind::TerminalPlus => {
23562                Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23563            }
23564            SyntaxKind::TerminalMul => {
23565                Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23566            }
23567            SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23568                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23569            )),
23570            _ => None,
23571        }
23572    }
23573    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23574        match self {
23575            MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23576            MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23577            MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23578            MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23579        }
23580    }
23581    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23582        MacroRepetitionOperatorPtr(self.as_syntax_node().long(db).stable_ptr)
23583    }
23584}
23585impl<'db> MacroRepetitionOperator<'db> {
23586    /// Checks if a kind of a variant of [MacroRepetitionOperator].
23587    pub fn is_variant(kind: SyntaxKind) -> bool {
23588        matches!(
23589            kind,
23590            SyntaxKind::TerminalQuestionMark
23591                | SyntaxKind::TerminalPlus
23592                | SyntaxKind::TerminalMul
23593                | SyntaxKind::MacroRepetitionOperatorMissing
23594        )
23595    }
23596}
23597#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23598pub struct MacroRepetitionOperatorMissing<'db> {
23599    node: SyntaxNode<'db>,
23600}
23601impl<'db> MacroRepetitionOperatorMissing<'db> {
23602    pub fn new_green(db: &'db dyn Database) -> MacroRepetitionOperatorMissingGreen<'db> {
23603        let children = [];
23604        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23605        MacroRepetitionOperatorMissingGreen(
23606            GreenNode {
23607                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23608                details: GreenNodeDetails::Node { children: children.into(), width },
23609            }
23610            .intern(db),
23611        )
23612    }
23613}
23614impl<'db> MacroRepetitionOperatorMissing<'db> {}
23615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23616pub struct MacroRepetitionOperatorMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23617impl<'db> MacroRepetitionOperatorMissingPtr<'db> {}
23618impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorMissingPtr<'db> {
23619    type SyntaxNode = MacroRepetitionOperatorMissing<'db>;
23620    fn untyped(self) -> SyntaxStablePtrId<'db> {
23621        self.0
23622    }
23623    fn lookup(&self, db: &'db dyn Database) -> MacroRepetitionOperatorMissing<'db> {
23624        MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23625    }
23626}
23627impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23628    fn from(ptr: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23629        ptr.untyped()
23630    }
23631}
23632#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23633pub struct MacroRepetitionOperatorMissingGreen<'db>(pub GreenId<'db>);
23634impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperatorMissing<'db> {
23635    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23636    type StablePtr = MacroRepetitionOperatorMissingPtr<'db>;
23637    type Green = MacroRepetitionOperatorMissingGreen<'db>;
23638    fn missing(db: &'db dyn Database) -> Self::Green {
23639        MacroRepetitionOperatorMissingGreen(
23640            GreenNode {
23641                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23642                details: GreenNodeDetails::Node {
23643                    children: [].into(),
23644                    width: TextWidth::default(),
23645                },
23646            }
23647            .intern(db),
23648        )
23649    }
23650    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23651        let kind = node.kind(db);
23652        assert_eq!(
23653            kind,
23654            SyntaxKind::MacroRepetitionOperatorMissing,
23655            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23656            kind,
23657            SyntaxKind::MacroRepetitionOperatorMissing
23658        );
23659        Self { node }
23660    }
23661    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23662        let kind = node.kind(db);
23663        if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23664            Some(Self::from_syntax_node(db, node))
23665        } else {
23666            None
23667        }
23668    }
23669    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23670        self.node
23671    }
23672    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23673        MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23674    }
23675}
23676#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23677pub struct ParamIdent<'db> {
23678    node: SyntaxNode<'db>,
23679}
23680impl<'db> ParamIdent<'db> {
23681    pub const INDEX_IDENT: usize = 0;
23682    pub fn new_green(
23683        db: &'db dyn Database,
23684        ident: TerminalIdentifierGreen<'db>,
23685    ) -> ParamIdentGreen<'db> {
23686        let children = [ident.0];
23687        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23688        ParamIdentGreen(
23689            GreenNode {
23690                kind: SyntaxKind::ParamIdent,
23691                details: GreenNodeDetails::Node { children: children.into(), width },
23692            }
23693            .intern(db),
23694        )
23695    }
23696}
23697impl<'db> ParamIdent<'db> {
23698    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23699        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23700    }
23701}
23702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23703pub struct ParamIdentPtr<'db>(pub SyntaxStablePtrId<'db>);
23704impl<'db> ParamIdentPtr<'db> {}
23705impl<'db> TypedStablePtr<'db> for ParamIdentPtr<'db> {
23706    type SyntaxNode = ParamIdent<'db>;
23707    fn untyped(self) -> SyntaxStablePtrId<'db> {
23708        self.0
23709    }
23710    fn lookup(&self, db: &'db dyn Database) -> ParamIdent<'db> {
23711        ParamIdent::from_syntax_node(db, self.0.lookup(db))
23712    }
23713}
23714impl<'db> From<ParamIdentPtr<'db>> for SyntaxStablePtrId<'db> {
23715    fn from(ptr: ParamIdentPtr<'db>) -> Self {
23716        ptr.untyped()
23717    }
23718}
23719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23720pub struct ParamIdentGreen<'db>(pub GreenId<'db>);
23721impl<'db> TypedSyntaxNode<'db> for ParamIdent<'db> {
23722    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23723    type StablePtr = ParamIdentPtr<'db>;
23724    type Green = ParamIdentGreen<'db>;
23725    fn missing(db: &'db dyn Database) -> Self::Green {
23726        ParamIdentGreen(
23727            GreenNode {
23728                kind: SyntaxKind::ParamIdent,
23729                details: GreenNodeDetails::Node {
23730                    children: [TerminalIdentifier::missing(db).0].into(),
23731                    width: TextWidth::default(),
23732                },
23733            }
23734            .intern(db),
23735        )
23736    }
23737    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23738        let kind = node.kind(db);
23739        assert_eq!(
23740            kind,
23741            SyntaxKind::ParamIdent,
23742            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23743            kind,
23744            SyntaxKind::ParamIdent
23745        );
23746        Self { node }
23747    }
23748    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23749        let kind = node.kind(db);
23750        if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23751    }
23752    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23753        self.node
23754    }
23755    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23756        ParamIdentPtr(self.node.stable_ptr(db))
23757    }
23758}
23759#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23760pub struct ParamExpr<'db> {
23761    node: SyntaxNode<'db>,
23762}
23763impl<'db> ParamExpr<'db> {
23764    pub const INDEX_EXPR: usize = 0;
23765    pub fn new_green(
23766        db: &'db dyn Database,
23767        expr: TerminalIdentifierGreen<'db>,
23768    ) -> ParamExprGreen<'db> {
23769        let children = [expr.0];
23770        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23771        ParamExprGreen(
23772            GreenNode {
23773                kind: SyntaxKind::ParamExpr,
23774                details: GreenNodeDetails::Node { children: children.into(), width },
23775            }
23776            .intern(db),
23777        )
23778    }
23779}
23780impl<'db> ParamExpr<'db> {
23781    pub fn expr(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23782        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23783    }
23784}
23785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23786pub struct ParamExprPtr<'db>(pub SyntaxStablePtrId<'db>);
23787impl<'db> ParamExprPtr<'db> {}
23788impl<'db> TypedStablePtr<'db> for ParamExprPtr<'db> {
23789    type SyntaxNode = ParamExpr<'db>;
23790    fn untyped(self) -> SyntaxStablePtrId<'db> {
23791        self.0
23792    }
23793    fn lookup(&self, db: &'db dyn Database) -> ParamExpr<'db> {
23794        ParamExpr::from_syntax_node(db, self.0.lookup(db))
23795    }
23796}
23797impl<'db> From<ParamExprPtr<'db>> for SyntaxStablePtrId<'db> {
23798    fn from(ptr: ParamExprPtr<'db>) -> Self {
23799        ptr.untyped()
23800    }
23801}
23802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23803pub struct ParamExprGreen<'db>(pub GreenId<'db>);
23804impl<'db> TypedSyntaxNode<'db> for ParamExpr<'db> {
23805    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23806    type StablePtr = ParamExprPtr<'db>;
23807    type Green = ParamExprGreen<'db>;
23808    fn missing(db: &'db dyn Database) -> Self::Green {
23809        ParamExprGreen(
23810            GreenNode {
23811                kind: SyntaxKind::ParamExpr,
23812                details: GreenNodeDetails::Node {
23813                    children: [TerminalIdentifier::missing(db).0].into(),
23814                    width: TextWidth::default(),
23815                },
23816            }
23817            .intern(db),
23818        )
23819    }
23820    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23821        let kind = node.kind(db);
23822        assert_eq!(
23823            kind,
23824            SyntaxKind::ParamExpr,
23825            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23826            kind,
23827            SyntaxKind::ParamExpr
23828        );
23829        Self { node }
23830    }
23831    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23832        let kind = node.kind(db);
23833        if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23834    }
23835    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23836        self.node
23837    }
23838    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23839        ParamExprPtr(self.node.stable_ptr(db))
23840    }
23841}
23842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23843pub enum MacroParamKind<'db> {
23844    Identifier(ParamIdent<'db>),
23845    Expr(ParamExpr<'db>),
23846    Missing(MacroParamKindMissing<'db>),
23847}
23848#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23849pub struct MacroParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
23850impl<'db> TypedStablePtr<'db> for MacroParamKindPtr<'db> {
23851    type SyntaxNode = MacroParamKind<'db>;
23852    fn untyped(self) -> SyntaxStablePtrId<'db> {
23853        self.0
23854    }
23855    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23856        MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23857    }
23858}
23859impl<'db> From<MacroParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
23860    fn from(ptr: MacroParamKindPtr<'db>) -> Self {
23861        ptr.untyped()
23862    }
23863}
23864impl<'db> From<ParamIdentPtr<'db>> for MacroParamKindPtr<'db> {
23865    fn from(value: ParamIdentPtr<'db>) -> Self {
23866        Self(value.0)
23867    }
23868}
23869impl<'db> From<ParamExprPtr<'db>> for MacroParamKindPtr<'db> {
23870    fn from(value: ParamExprPtr<'db>) -> Self {
23871        Self(value.0)
23872    }
23873}
23874impl<'db> From<MacroParamKindMissingPtr<'db>> for MacroParamKindPtr<'db> {
23875    fn from(value: MacroParamKindMissingPtr<'db>) -> Self {
23876        Self(value.0)
23877    }
23878}
23879impl<'db> From<ParamIdentGreen<'db>> for MacroParamKindGreen<'db> {
23880    fn from(value: ParamIdentGreen<'db>) -> Self {
23881        Self(value.0)
23882    }
23883}
23884impl<'db> From<ParamExprGreen<'db>> for MacroParamKindGreen<'db> {
23885    fn from(value: ParamExprGreen<'db>) -> Self {
23886        Self(value.0)
23887    }
23888}
23889impl<'db> From<MacroParamKindMissingGreen<'db>> for MacroParamKindGreen<'db> {
23890    fn from(value: MacroParamKindMissingGreen<'db>) -> Self {
23891        Self(value.0)
23892    }
23893}
23894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23895pub struct MacroParamKindGreen<'db>(pub GreenId<'db>);
23896impl<'db> TypedSyntaxNode<'db> for MacroParamKind<'db> {
23897    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23898    type StablePtr = MacroParamKindPtr<'db>;
23899    type Green = MacroParamKindGreen<'db>;
23900    fn missing(db: &'db dyn Database) -> Self::Green {
23901        MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23902    }
23903    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23904        let kind = node.kind(db);
23905        match kind {
23906            SyntaxKind::ParamIdent => {
23907                MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23908            }
23909            SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23910            SyntaxKind::MacroParamKindMissing => {
23911                MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23912            }
23913            _ => {
23914                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23915            }
23916        }
23917    }
23918    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23919        let kind = node.kind(db);
23920        match kind {
23921            SyntaxKind::ParamIdent => {
23922                Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23923            }
23924            SyntaxKind::ParamExpr => {
23925                Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23926            }
23927            SyntaxKind::MacroParamKindMissing => {
23928                Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23929            }
23930            _ => None,
23931        }
23932    }
23933    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23934        match self {
23935            MacroParamKind::Identifier(x) => x.as_syntax_node(),
23936            MacroParamKind::Expr(x) => x.as_syntax_node(),
23937            MacroParamKind::Missing(x) => x.as_syntax_node(),
23938        }
23939    }
23940    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23941        MacroParamKindPtr(self.as_syntax_node().long(db).stable_ptr)
23942    }
23943}
23944impl<'db> MacroParamKind<'db> {
23945    /// Checks if a kind of a variant of [MacroParamKind].
23946    pub fn is_variant(kind: SyntaxKind) -> bool {
23947        matches!(
23948            kind,
23949            SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23950        )
23951    }
23952}
23953#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23954pub struct MacroParamKindMissing<'db> {
23955    node: SyntaxNode<'db>,
23956}
23957impl<'db> MacroParamKindMissing<'db> {
23958    pub fn new_green(db: &'db dyn Database) -> MacroParamKindMissingGreen<'db> {
23959        let children = [];
23960        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23961        MacroParamKindMissingGreen(
23962            GreenNode {
23963                kind: SyntaxKind::MacroParamKindMissing,
23964                details: GreenNodeDetails::Node { children: children.into(), width },
23965            }
23966            .intern(db),
23967        )
23968    }
23969}
23970impl<'db> MacroParamKindMissing<'db> {}
23971#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23972pub struct MacroParamKindMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23973impl<'db> MacroParamKindMissingPtr<'db> {}
23974impl<'db> TypedStablePtr<'db> for MacroParamKindMissingPtr<'db> {
23975    type SyntaxNode = MacroParamKindMissing<'db>;
23976    fn untyped(self) -> SyntaxStablePtrId<'db> {
23977        self.0
23978    }
23979    fn lookup(&self, db: &'db dyn Database) -> MacroParamKindMissing<'db> {
23980        MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
23981    }
23982}
23983impl<'db> From<MacroParamKindMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23984    fn from(ptr: MacroParamKindMissingPtr<'db>) -> Self {
23985        ptr.untyped()
23986    }
23987}
23988#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23989pub struct MacroParamKindMissingGreen<'db>(pub GreenId<'db>);
23990impl<'db> TypedSyntaxNode<'db> for MacroParamKindMissing<'db> {
23991    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
23992    type StablePtr = MacroParamKindMissingPtr<'db>;
23993    type Green = MacroParamKindMissingGreen<'db>;
23994    fn missing(db: &'db dyn Database) -> Self::Green {
23995        MacroParamKindMissingGreen(
23996            GreenNode {
23997                kind: SyntaxKind::MacroParamKindMissing,
23998                details: GreenNodeDetails::Node {
23999                    children: [].into(),
24000                    width: TextWidth::default(),
24001                },
24002            }
24003            .intern(db),
24004        )
24005    }
24006    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24007        let kind = node.kind(db);
24008        assert_eq!(
24009            kind,
24010            SyntaxKind::MacroParamKindMissing,
24011            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24012            kind,
24013            SyntaxKind::MacroParamKindMissing
24014        );
24015        Self { node }
24016    }
24017    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24018        let kind = node.kind(db);
24019        if kind == SyntaxKind::MacroParamKindMissing {
24020            Some(Self::from_syntax_node(db, node))
24021        } else {
24022            None
24023        }
24024    }
24025    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24026        self.node
24027    }
24028    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24029        MacroParamKindMissingPtr(self.node.stable_ptr(db))
24030    }
24031}
24032#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24033pub enum MacroElement<'db> {
24034    Token(TokenTreeLeaf<'db>),
24035    Param(MacroParam<'db>),
24036    Subtree(MacroWrapper<'db>),
24037    Repetition(MacroRepetition<'db>),
24038}
24039#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24040pub struct MacroElementPtr<'db>(pub SyntaxStablePtrId<'db>);
24041impl<'db> TypedStablePtr<'db> for MacroElementPtr<'db> {
24042    type SyntaxNode = MacroElement<'db>;
24043    fn untyped(self) -> SyntaxStablePtrId<'db> {
24044        self.0
24045    }
24046    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24047        MacroElement::from_syntax_node(db, self.0.lookup(db))
24048    }
24049}
24050impl<'db> From<MacroElementPtr<'db>> for SyntaxStablePtrId<'db> {
24051    fn from(ptr: MacroElementPtr<'db>) -> Self {
24052        ptr.untyped()
24053    }
24054}
24055impl<'db> From<TokenTreeLeafPtr<'db>> for MacroElementPtr<'db> {
24056    fn from(value: TokenTreeLeafPtr<'db>) -> Self {
24057        Self(value.0)
24058    }
24059}
24060impl<'db> From<MacroParamPtr<'db>> for MacroElementPtr<'db> {
24061    fn from(value: MacroParamPtr<'db>) -> Self {
24062        Self(value.0)
24063    }
24064}
24065impl<'db> From<MacroWrapperPtr<'db>> for MacroElementPtr<'db> {
24066    fn from(value: MacroWrapperPtr<'db>) -> Self {
24067        Self(value.0)
24068    }
24069}
24070impl<'db> From<MacroRepetitionPtr<'db>> for MacroElementPtr<'db> {
24071    fn from(value: MacroRepetitionPtr<'db>) -> Self {
24072        Self(value.0)
24073    }
24074}
24075impl<'db> From<TokenTreeLeafGreen<'db>> for MacroElementGreen<'db> {
24076    fn from(value: TokenTreeLeafGreen<'db>) -> Self {
24077        Self(value.0)
24078    }
24079}
24080impl<'db> From<MacroParamGreen<'db>> for MacroElementGreen<'db> {
24081    fn from(value: MacroParamGreen<'db>) -> Self {
24082        Self(value.0)
24083    }
24084}
24085impl<'db> From<MacroWrapperGreen<'db>> for MacroElementGreen<'db> {
24086    fn from(value: MacroWrapperGreen<'db>) -> Self {
24087        Self(value.0)
24088    }
24089}
24090impl<'db> From<MacroRepetitionGreen<'db>> for MacroElementGreen<'db> {
24091    fn from(value: MacroRepetitionGreen<'db>) -> Self {
24092        Self(value.0)
24093    }
24094}
24095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24096pub struct MacroElementGreen<'db>(pub GreenId<'db>);
24097impl<'db> TypedSyntaxNode<'db> for MacroElement<'db> {
24098    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24099    type StablePtr = MacroElementPtr<'db>;
24100    type Green = MacroElementGreen<'db>;
24101    fn missing(db: &'db dyn Database) -> Self::Green {
24102        panic!("No missing variant.");
24103    }
24104    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24105        let kind = node.kind(db);
24106        match kind {
24107            SyntaxKind::TokenTreeLeaf => {
24108                MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
24109            }
24110            SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
24111            SyntaxKind::MacroWrapper => {
24112                MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
24113            }
24114            SyntaxKind::MacroRepetition => {
24115                MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
24116            }
24117            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
24118        }
24119    }
24120    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24121        let kind = node.kind(db);
24122        match kind {
24123            SyntaxKind::TokenTreeLeaf => {
24124                Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
24125            }
24126            SyntaxKind::MacroParam => {
24127                Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
24128            }
24129            SyntaxKind::MacroWrapper => {
24130                Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
24131            }
24132            SyntaxKind::MacroRepetition => {
24133                Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
24134            }
24135            _ => None,
24136        }
24137    }
24138    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24139        match self {
24140            MacroElement::Token(x) => x.as_syntax_node(),
24141            MacroElement::Param(x) => x.as_syntax_node(),
24142            MacroElement::Subtree(x) => x.as_syntax_node(),
24143            MacroElement::Repetition(x) => x.as_syntax_node(),
24144        }
24145    }
24146    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24147        MacroElementPtr(self.as_syntax_node().long(db).stable_ptr)
24148    }
24149}
24150impl<'db> MacroElement<'db> {
24151    /// Checks if a kind of a variant of [MacroElement].
24152    pub fn is_variant(kind: SyntaxKind) -> bool {
24153        matches!(
24154            kind,
24155            SyntaxKind::TokenTreeLeaf
24156                | SyntaxKind::MacroParam
24157                | SyntaxKind::MacroWrapper
24158                | SyntaxKind::MacroRepetition
24159        )
24160    }
24161}
24162#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24163pub struct MacroElements<'db>(ElementList<'db, MacroElement<'db>, 1>);
24164impl<'db> Deref for MacroElements<'db> {
24165    type Target = ElementList<'db, MacroElement<'db>, 1>;
24166    fn deref(&self) -> &Self::Target {
24167        &self.0
24168    }
24169}
24170impl<'db> MacroElements<'db> {
24171    pub fn new_green(
24172        db: &'db dyn Database,
24173        children: &[MacroElementGreen<'db>],
24174    ) -> MacroElementsGreen<'db> {
24175        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
24176        MacroElementsGreen(
24177            GreenNode {
24178                kind: SyntaxKind::MacroElements,
24179                details: GreenNodeDetails::Node {
24180                    children: children.iter().map(|x| x.0).collect(),
24181                    width,
24182                },
24183            }
24184            .intern(db),
24185        )
24186    }
24187}
24188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24189pub struct MacroElementsPtr<'db>(pub SyntaxStablePtrId<'db>);
24190impl<'db> TypedStablePtr<'db> for MacroElementsPtr<'db> {
24191    type SyntaxNode = MacroElements<'db>;
24192    fn untyped(self) -> SyntaxStablePtrId<'db> {
24193        self.0
24194    }
24195    fn lookup(&self, db: &'db dyn Database) -> MacroElements<'db> {
24196        MacroElements::from_syntax_node(db, self.0.lookup(db))
24197    }
24198}
24199impl<'db> From<MacroElementsPtr<'db>> for SyntaxStablePtrId<'db> {
24200    fn from(ptr: MacroElementsPtr<'db>) -> Self {
24201        ptr.untyped()
24202    }
24203}
24204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24205pub struct MacroElementsGreen<'db>(pub GreenId<'db>);
24206impl<'db> TypedSyntaxNode<'db> for MacroElements<'db> {
24207    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
24208    type StablePtr = MacroElementsPtr<'db>;
24209    type Green = MacroElementsGreen<'db>;
24210    fn missing(db: &'db dyn Database) -> Self::Green {
24211        MacroElementsGreen(
24212            GreenNode {
24213                kind: SyntaxKind::MacroElements,
24214                details: GreenNodeDetails::Node {
24215                    children: [].into(),
24216                    width: TextWidth::default(),
24217                },
24218            }
24219            .intern(db),
24220        )
24221    }
24222    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24223        Self(ElementList::new(node))
24224    }
24225    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24226        if node.kind(db) == SyntaxKind::MacroElements {
24227            Some(Self(ElementList::new(node)))
24228        } else {
24229            None
24230        }
24231    }
24232    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24233        self.node
24234    }
24235    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24236        MacroElementsPtr(self.node.stable_ptr(db))
24237    }
24238}
24239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24240pub struct MacroWrapper<'db> {
24241    node: SyntaxNode<'db>,
24242}
24243impl<'db> MacroWrapper<'db> {
24244    pub const INDEX_SUBTREE: usize = 0;
24245    pub fn new_green(
24246        db: &'db dyn Database,
24247        subtree: WrappedMacroGreen<'db>,
24248    ) -> MacroWrapperGreen<'db> {
24249        let children = [subtree.0];
24250        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24251        MacroWrapperGreen(
24252            GreenNode {
24253                kind: SyntaxKind::MacroWrapper,
24254                details: GreenNodeDetails::Node { children: children.into(), width },
24255            }
24256            .intern(db),
24257        )
24258    }
24259}
24260impl<'db> MacroWrapper<'db> {
24261    pub fn subtree(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
24262        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
24263    }
24264}
24265#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24266pub struct MacroWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
24267impl<'db> MacroWrapperPtr<'db> {}
24268impl<'db> TypedStablePtr<'db> for MacroWrapperPtr<'db> {
24269    type SyntaxNode = MacroWrapper<'db>;
24270    fn untyped(self) -> SyntaxStablePtrId<'db> {
24271        self.0
24272    }
24273    fn lookup(&self, db: &'db dyn Database) -> MacroWrapper<'db> {
24274        MacroWrapper::from_syntax_node(db, self.0.lookup(db))
24275    }
24276}
24277impl<'db> From<MacroWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
24278    fn from(ptr: MacroWrapperPtr<'db>) -> Self {
24279        ptr.untyped()
24280    }
24281}
24282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24283pub struct MacroWrapperGreen<'db>(pub GreenId<'db>);
24284impl<'db> TypedSyntaxNode<'db> for MacroWrapper<'db> {
24285    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
24286    type StablePtr = MacroWrapperPtr<'db>;
24287    type Green = MacroWrapperGreen<'db>;
24288    fn missing(db: &'db dyn Database) -> Self::Green {
24289        MacroWrapperGreen(
24290            GreenNode {
24291                kind: SyntaxKind::MacroWrapper,
24292                details: GreenNodeDetails::Node {
24293                    children: [WrappedMacro::missing(db).0].into(),
24294                    width: TextWidth::default(),
24295                },
24296            }
24297            .intern(db),
24298        )
24299    }
24300    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24301        let kind = node.kind(db);
24302        assert_eq!(
24303            kind,
24304            SyntaxKind::MacroWrapper,
24305            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24306            kind,
24307            SyntaxKind::MacroWrapper
24308        );
24309        Self { node }
24310    }
24311    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24312        let kind = node.kind(db);
24313        if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
24314    }
24315    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24316        self.node
24317    }
24318    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24319        MacroWrapperPtr(self.node.stable_ptr(db))
24320    }
24321}
24322#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24323pub enum WrappedMacro<'db> {
24324    Parenthesized(ParenthesizedMacro<'db>),
24325    Braced(BracedMacro<'db>),
24326    Bracketed(BracketedMacro<'db>),
24327}
24328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24329pub struct WrappedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24330impl<'db> TypedStablePtr<'db> for WrappedMacroPtr<'db> {
24331    type SyntaxNode = WrappedMacro<'db>;
24332    fn untyped(self) -> SyntaxStablePtrId<'db> {
24333        self.0
24334    }
24335    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24336        WrappedMacro::from_syntax_node(db, self.0.lookup(db))
24337    }
24338}
24339impl<'db> From<WrappedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24340    fn from(ptr: WrappedMacroPtr<'db>) -> Self {
24341        ptr.untyped()
24342    }
24343}
24344impl<'db> From<ParenthesizedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24345    fn from(value: ParenthesizedMacroPtr<'db>) -> Self {
24346        Self(value.0)
24347    }
24348}
24349impl<'db> From<BracedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24350    fn from(value: BracedMacroPtr<'db>) -> Self {
24351        Self(value.0)
24352    }
24353}
24354impl<'db> From<BracketedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24355    fn from(value: BracketedMacroPtr<'db>) -> Self {
24356        Self(value.0)
24357    }
24358}
24359impl<'db> From<ParenthesizedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24360    fn from(value: ParenthesizedMacroGreen<'db>) -> Self {
24361        Self(value.0)
24362    }
24363}
24364impl<'db> From<BracedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24365    fn from(value: BracedMacroGreen<'db>) -> Self {
24366        Self(value.0)
24367    }
24368}
24369impl<'db> From<BracketedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24370    fn from(value: BracketedMacroGreen<'db>) -> Self {
24371        Self(value.0)
24372    }
24373}
24374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24375pub struct WrappedMacroGreen<'db>(pub GreenId<'db>);
24376impl<'db> TypedSyntaxNode<'db> for WrappedMacro<'db> {
24377    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24378    type StablePtr = WrappedMacroPtr<'db>;
24379    type Green = WrappedMacroGreen<'db>;
24380    fn missing(db: &'db dyn Database) -> Self::Green {
24381        panic!("No missing variant.");
24382    }
24383    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24384        let kind = node.kind(db);
24385        match kind {
24386            SyntaxKind::ParenthesizedMacro => {
24387                WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
24388            }
24389            SyntaxKind::BracedMacro => {
24390                WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
24391            }
24392            SyntaxKind::BracketedMacro => {
24393                WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24394            }
24395            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24396        }
24397    }
24398    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24399        let kind = node.kind(db);
24400        match kind {
24401            SyntaxKind::ParenthesizedMacro => {
24402                Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24403            }
24404            SyntaxKind::BracedMacro => {
24405                Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24406            }
24407            SyntaxKind::BracketedMacro => {
24408                Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24409            }
24410            _ => None,
24411        }
24412    }
24413    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24414        match self {
24415            WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24416            WrappedMacro::Braced(x) => x.as_syntax_node(),
24417            WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24418        }
24419    }
24420    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24421        WrappedMacroPtr(self.as_syntax_node().long(db).stable_ptr)
24422    }
24423}
24424impl<'db> WrappedMacro<'db> {
24425    /// Checks if a kind of a variant of [WrappedMacro].
24426    pub fn is_variant(kind: SyntaxKind) -> bool {
24427        matches!(
24428            kind,
24429            SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24430        )
24431    }
24432}
24433#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24434pub struct ParenthesizedMacro<'db> {
24435    node: SyntaxNode<'db>,
24436}
24437impl<'db> ParenthesizedMacro<'db> {
24438    pub const INDEX_LPAREN: usize = 0;
24439    pub const INDEX_ELEMENTS: usize = 1;
24440    pub const INDEX_RPAREN: usize = 2;
24441    pub fn new_green(
24442        db: &'db dyn Database,
24443        lparen: TerminalLParenGreen<'db>,
24444        elements: MacroElementsGreen<'db>,
24445        rparen: TerminalRParenGreen<'db>,
24446    ) -> ParenthesizedMacroGreen<'db> {
24447        let children = [lparen.0, elements.0, rparen.0];
24448        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24449        ParenthesizedMacroGreen(
24450            GreenNode {
24451                kind: SyntaxKind::ParenthesizedMacro,
24452                details: GreenNodeDetails::Node { children: children.into(), width },
24453            }
24454            .intern(db),
24455        )
24456    }
24457}
24458impl<'db> ParenthesizedMacro<'db> {
24459    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
24460        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24461    }
24462    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24463        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24464    }
24465    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
24466        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24467    }
24468}
24469#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24470pub struct ParenthesizedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24471impl<'db> ParenthesizedMacroPtr<'db> {}
24472impl<'db> TypedStablePtr<'db> for ParenthesizedMacroPtr<'db> {
24473    type SyntaxNode = ParenthesizedMacro<'db>;
24474    fn untyped(self) -> SyntaxStablePtrId<'db> {
24475        self.0
24476    }
24477    fn lookup(&self, db: &'db dyn Database) -> ParenthesizedMacro<'db> {
24478        ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24479    }
24480}
24481impl<'db> From<ParenthesizedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24482    fn from(ptr: ParenthesizedMacroPtr<'db>) -> Self {
24483        ptr.untyped()
24484    }
24485}
24486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24487pub struct ParenthesizedMacroGreen<'db>(pub GreenId<'db>);
24488impl<'db> TypedSyntaxNode<'db> for ParenthesizedMacro<'db> {
24489    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24490    type StablePtr = ParenthesizedMacroPtr<'db>;
24491    type Green = ParenthesizedMacroGreen<'db>;
24492    fn missing(db: &'db dyn Database) -> Self::Green {
24493        ParenthesizedMacroGreen(
24494            GreenNode {
24495                kind: SyntaxKind::ParenthesizedMacro,
24496                details: GreenNodeDetails::Node {
24497                    children: [
24498                        TerminalLParen::missing(db).0,
24499                        MacroElements::missing(db).0,
24500                        TerminalRParen::missing(db).0,
24501                    ]
24502                    .into(),
24503                    width: TextWidth::default(),
24504                },
24505            }
24506            .intern(db),
24507        )
24508    }
24509    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24510        let kind = node.kind(db);
24511        assert_eq!(
24512            kind,
24513            SyntaxKind::ParenthesizedMacro,
24514            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24515            kind,
24516            SyntaxKind::ParenthesizedMacro
24517        );
24518        Self { node }
24519    }
24520    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24521        let kind = node.kind(db);
24522        if kind == SyntaxKind::ParenthesizedMacro {
24523            Some(Self::from_syntax_node(db, node))
24524        } else {
24525            None
24526        }
24527    }
24528    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24529        self.node
24530    }
24531    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24532        ParenthesizedMacroPtr(self.node.stable_ptr(db))
24533    }
24534}
24535#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24536pub struct BracedMacro<'db> {
24537    node: SyntaxNode<'db>,
24538}
24539impl<'db> BracedMacro<'db> {
24540    pub const INDEX_LBRACE: usize = 0;
24541    pub const INDEX_ELEMENTS: usize = 1;
24542    pub const INDEX_RBRACE: usize = 2;
24543    pub fn new_green(
24544        db: &'db dyn Database,
24545        lbrace: TerminalLBraceGreen<'db>,
24546        elements: MacroElementsGreen<'db>,
24547        rbrace: TerminalRBraceGreen<'db>,
24548    ) -> BracedMacroGreen<'db> {
24549        let children = [lbrace.0, elements.0, rbrace.0];
24550        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24551        BracedMacroGreen(
24552            GreenNode {
24553                kind: SyntaxKind::BracedMacro,
24554                details: GreenNodeDetails::Node { children: children.into(), width },
24555            }
24556            .intern(db),
24557        )
24558    }
24559}
24560impl<'db> BracedMacro<'db> {
24561    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
24562        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24563    }
24564    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24565        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24566    }
24567    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
24568        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24569    }
24570}
24571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24572pub struct BracedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24573impl<'db> BracedMacroPtr<'db> {}
24574impl<'db> TypedStablePtr<'db> for BracedMacroPtr<'db> {
24575    type SyntaxNode = BracedMacro<'db>;
24576    fn untyped(self) -> SyntaxStablePtrId<'db> {
24577        self.0
24578    }
24579    fn lookup(&self, db: &'db dyn Database) -> BracedMacro<'db> {
24580        BracedMacro::from_syntax_node(db, self.0.lookup(db))
24581    }
24582}
24583impl<'db> From<BracedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24584    fn from(ptr: BracedMacroPtr<'db>) -> Self {
24585        ptr.untyped()
24586    }
24587}
24588#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24589pub struct BracedMacroGreen<'db>(pub GreenId<'db>);
24590impl<'db> TypedSyntaxNode<'db> for BracedMacro<'db> {
24591    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24592    type StablePtr = BracedMacroPtr<'db>;
24593    type Green = BracedMacroGreen<'db>;
24594    fn missing(db: &'db dyn Database) -> Self::Green {
24595        BracedMacroGreen(
24596            GreenNode {
24597                kind: SyntaxKind::BracedMacro,
24598                details: GreenNodeDetails::Node {
24599                    children: [
24600                        TerminalLBrace::missing(db).0,
24601                        MacroElements::missing(db).0,
24602                        TerminalRBrace::missing(db).0,
24603                    ]
24604                    .into(),
24605                    width: TextWidth::default(),
24606                },
24607            }
24608            .intern(db),
24609        )
24610    }
24611    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24612        let kind = node.kind(db);
24613        assert_eq!(
24614            kind,
24615            SyntaxKind::BracedMacro,
24616            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24617            kind,
24618            SyntaxKind::BracedMacro
24619        );
24620        Self { node }
24621    }
24622    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24623        let kind = node.kind(db);
24624        if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24625    }
24626    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24627        self.node
24628    }
24629    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24630        BracedMacroPtr(self.node.stable_ptr(db))
24631    }
24632}
24633#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24634pub struct BracketedMacro<'db> {
24635    node: SyntaxNode<'db>,
24636}
24637impl<'db> BracketedMacro<'db> {
24638    pub const INDEX_LBRACK: usize = 0;
24639    pub const INDEX_ELEMENTS: usize = 1;
24640    pub const INDEX_RBRACK: usize = 2;
24641    pub fn new_green(
24642        db: &'db dyn Database,
24643        lbrack: TerminalLBrackGreen<'db>,
24644        elements: MacroElementsGreen<'db>,
24645        rbrack: TerminalRBrackGreen<'db>,
24646    ) -> BracketedMacroGreen<'db> {
24647        let children = [lbrack.0, elements.0, rbrack.0];
24648        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24649        BracketedMacroGreen(
24650            GreenNode {
24651                kind: SyntaxKind::BracketedMacro,
24652                details: GreenNodeDetails::Node { children: children.into(), width },
24653            }
24654            .intern(db),
24655        )
24656    }
24657}
24658impl<'db> BracketedMacro<'db> {
24659    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
24660        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24661    }
24662    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24663        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24664    }
24665    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
24666        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24667    }
24668}
24669#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24670pub struct BracketedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24671impl<'db> BracketedMacroPtr<'db> {}
24672impl<'db> TypedStablePtr<'db> for BracketedMacroPtr<'db> {
24673    type SyntaxNode = BracketedMacro<'db>;
24674    fn untyped(self) -> SyntaxStablePtrId<'db> {
24675        self.0
24676    }
24677    fn lookup(&self, db: &'db dyn Database) -> BracketedMacro<'db> {
24678        BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24679    }
24680}
24681impl<'db> From<BracketedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24682    fn from(ptr: BracketedMacroPtr<'db>) -> Self {
24683        ptr.untyped()
24684    }
24685}
24686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24687pub struct BracketedMacroGreen<'db>(pub GreenId<'db>);
24688impl<'db> TypedSyntaxNode<'db> for BracketedMacro<'db> {
24689    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24690    type StablePtr = BracketedMacroPtr<'db>;
24691    type Green = BracketedMacroGreen<'db>;
24692    fn missing(db: &'db dyn Database) -> Self::Green {
24693        BracketedMacroGreen(
24694            GreenNode {
24695                kind: SyntaxKind::BracketedMacro,
24696                details: GreenNodeDetails::Node {
24697                    children: [
24698                        TerminalLBrack::missing(db).0,
24699                        MacroElements::missing(db).0,
24700                        TerminalRBrack::missing(db).0,
24701                    ]
24702                    .into(),
24703                    width: TextWidth::default(),
24704                },
24705            }
24706            .intern(db),
24707        )
24708    }
24709    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24710        let kind = node.kind(db);
24711        assert_eq!(
24712            kind,
24713            SyntaxKind::BracketedMacro,
24714            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24715            kind,
24716            SyntaxKind::BracketedMacro
24717        );
24718        Self { node }
24719    }
24720    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24721        let kind = node.kind(db);
24722        if kind == SyntaxKind::BracketedMacro {
24723            Some(Self::from_syntax_node(db, node))
24724        } else {
24725            None
24726        }
24727    }
24728    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24729        self.node
24730    }
24731    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24732        BracketedMacroPtr(self.node.stable_ptr(db))
24733    }
24734}
24735#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24736pub struct LegacyExprInlineMacro<'db> {
24737    node: SyntaxNode<'db>,
24738}
24739impl<'db> LegacyExprInlineMacro<'db> {
24740    pub const INDEX_PATH: usize = 0;
24741    pub const INDEX_BANG: usize = 1;
24742    pub const INDEX_ARGUMENTS: usize = 2;
24743    pub fn new_green(
24744        db: &'db dyn Database,
24745        path: ExprPathGreen<'db>,
24746        bang: TerminalNotGreen<'db>,
24747        arguments: WrappedArgListGreen<'db>,
24748    ) -> LegacyExprInlineMacroGreen<'db> {
24749        let children = [path.0, bang.0, arguments.0];
24750        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24751        LegacyExprInlineMacroGreen(
24752            GreenNode {
24753                kind: SyntaxKind::LegacyExprInlineMacro,
24754                details: GreenNodeDetails::Node { children: children.into(), width },
24755            }
24756            .intern(db),
24757        )
24758    }
24759}
24760impl<'db> LegacyExprInlineMacro<'db> {
24761    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24762        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24763    }
24764    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24765        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24766    }
24767    pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24768        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24769    }
24770}
24771#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24772pub struct LegacyExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24773impl<'db> LegacyExprInlineMacroPtr<'db> {}
24774impl<'db> TypedStablePtr<'db> for LegacyExprInlineMacroPtr<'db> {
24775    type SyntaxNode = LegacyExprInlineMacro<'db>;
24776    fn untyped(self) -> SyntaxStablePtrId<'db> {
24777        self.0
24778    }
24779    fn lookup(&self, db: &'db dyn Database) -> LegacyExprInlineMacro<'db> {
24780        LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24781    }
24782}
24783impl<'db> From<LegacyExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24784    fn from(ptr: LegacyExprInlineMacroPtr<'db>) -> Self {
24785        ptr.untyped()
24786    }
24787}
24788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24789pub struct LegacyExprInlineMacroGreen<'db>(pub GreenId<'db>);
24790impl<'db> TypedSyntaxNode<'db> for LegacyExprInlineMacro<'db> {
24791    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24792    type StablePtr = LegacyExprInlineMacroPtr<'db>;
24793    type Green = LegacyExprInlineMacroGreen<'db>;
24794    fn missing(db: &'db dyn Database) -> Self::Green {
24795        LegacyExprInlineMacroGreen(
24796            GreenNode {
24797                kind: SyntaxKind::LegacyExprInlineMacro,
24798                details: GreenNodeDetails::Node {
24799                    children: [
24800                        ExprPath::missing(db).0,
24801                        TerminalNot::missing(db).0,
24802                        WrappedArgList::missing(db).0,
24803                    ]
24804                    .into(),
24805                    width: TextWidth::default(),
24806                },
24807            }
24808            .intern(db),
24809        )
24810    }
24811    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24812        let kind = node.kind(db);
24813        assert_eq!(
24814            kind,
24815            SyntaxKind::LegacyExprInlineMacro,
24816            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24817            kind,
24818            SyntaxKind::LegacyExprInlineMacro
24819        );
24820        Self { node }
24821    }
24822    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24823        let kind = node.kind(db);
24824        if kind == SyntaxKind::LegacyExprInlineMacro {
24825            Some(Self::from_syntax_node(db, node))
24826        } else {
24827            None
24828        }
24829    }
24830    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24831        self.node
24832    }
24833    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24834        LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24835    }
24836}
24837#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24838pub struct LegacyItemInlineMacro<'db> {
24839    node: SyntaxNode<'db>,
24840}
24841impl<'db> LegacyItemInlineMacro<'db> {
24842    pub const INDEX_ATTRIBUTES: usize = 0;
24843    pub const INDEX_PATH: usize = 1;
24844    pub const INDEX_BANG: usize = 2;
24845    pub const INDEX_ARGUMENTS: usize = 3;
24846    pub const INDEX_SEMICOLON: usize = 4;
24847    pub fn new_green(
24848        db: &'db dyn Database,
24849        attributes: AttributeListGreen<'db>,
24850        path: ExprPathGreen<'db>,
24851        bang: TerminalNotGreen<'db>,
24852        arguments: WrappedArgListGreen<'db>,
24853        semicolon: TerminalSemicolonGreen<'db>,
24854    ) -> LegacyItemInlineMacroGreen<'db> {
24855        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24856        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24857        LegacyItemInlineMacroGreen(
24858            GreenNode {
24859                kind: SyntaxKind::LegacyItemInlineMacro,
24860                details: GreenNodeDetails::Node { children: children.into(), width },
24861            }
24862            .intern(db),
24863        )
24864    }
24865}
24866impl<'db> LegacyItemInlineMacro<'db> {
24867    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
24868        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24869    }
24870    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24871        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24872    }
24873    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24874        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24875    }
24876    pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24877        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24878    }
24879    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
24880        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24881    }
24882}
24883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24884pub struct LegacyItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24885impl<'db> LegacyItemInlineMacroPtr<'db> {}
24886impl<'db> TypedStablePtr<'db> for LegacyItemInlineMacroPtr<'db> {
24887    type SyntaxNode = LegacyItemInlineMacro<'db>;
24888    fn untyped(self) -> SyntaxStablePtrId<'db> {
24889        self.0
24890    }
24891    fn lookup(&self, db: &'db dyn Database) -> LegacyItemInlineMacro<'db> {
24892        LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24893    }
24894}
24895impl<'db> From<LegacyItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24896    fn from(ptr: LegacyItemInlineMacroPtr<'db>) -> Self {
24897        ptr.untyped()
24898    }
24899}
24900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24901pub struct LegacyItemInlineMacroGreen<'db>(pub GreenId<'db>);
24902impl<'db> TypedSyntaxNode<'db> for LegacyItemInlineMacro<'db> {
24903    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24904    type StablePtr = LegacyItemInlineMacroPtr<'db>;
24905    type Green = LegacyItemInlineMacroGreen<'db>;
24906    fn missing(db: &'db dyn Database) -> Self::Green {
24907        LegacyItemInlineMacroGreen(
24908            GreenNode {
24909                kind: SyntaxKind::LegacyItemInlineMacro,
24910                details: GreenNodeDetails::Node {
24911                    children: [
24912                        AttributeList::missing(db).0,
24913                        ExprPath::missing(db).0,
24914                        TerminalNot::missing(db).0,
24915                        WrappedArgList::missing(db).0,
24916                        TerminalSemicolon::missing(db).0,
24917                    ]
24918                    .into(),
24919                    width: TextWidth::default(),
24920                },
24921            }
24922            .intern(db),
24923        )
24924    }
24925    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24926        let kind = node.kind(db);
24927        assert_eq!(
24928            kind,
24929            SyntaxKind::LegacyItemInlineMacro,
24930            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24931            kind,
24932            SyntaxKind::LegacyItemInlineMacro
24933        );
24934        Self { node }
24935    }
24936    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24937        let kind = node.kind(db);
24938        if kind == SyntaxKind::LegacyItemInlineMacro {
24939            Some(Self::from_syntax_node(db, node))
24940        } else {
24941            None
24942        }
24943    }
24944    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24945        self.node
24946    }
24947    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24948        LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24949    }
24950}
24951#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24952pub struct TriviumSkippedNode<'db> {
24953    node: SyntaxNode<'db>,
24954}
24955impl<'db> TriviumSkippedNode<'db> {
24956    pub const INDEX_NODE: usize = 0;
24957    pub fn new_green(
24958        db: &'db dyn Database,
24959        node: SkippedNodeGreen<'db>,
24960    ) -> TriviumSkippedNodeGreen<'db> {
24961        let children = [node.0];
24962        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24963        TriviumSkippedNodeGreen(
24964            GreenNode {
24965                kind: SyntaxKind::TriviumSkippedNode,
24966                details: GreenNodeDetails::Node { children: children.into(), width },
24967            }
24968            .intern(db),
24969        )
24970    }
24971}
24972impl<'db> TriviumSkippedNode<'db> {
24973    pub fn node(&self, db: &'db dyn Database) -> SkippedNode<'db> {
24974        SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
24975    }
24976}
24977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24978pub struct TriviumSkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24979impl<'db> TriviumSkippedNodePtr<'db> {}
24980impl<'db> TypedStablePtr<'db> for TriviumSkippedNodePtr<'db> {
24981    type SyntaxNode = TriviumSkippedNode<'db>;
24982    fn untyped(self) -> SyntaxStablePtrId<'db> {
24983        self.0
24984    }
24985    fn lookup(&self, db: &'db dyn Database) -> TriviumSkippedNode<'db> {
24986        TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
24987    }
24988}
24989impl<'db> From<TriviumSkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24990    fn from(ptr: TriviumSkippedNodePtr<'db>) -> Self {
24991        ptr.untyped()
24992    }
24993}
24994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24995pub struct TriviumSkippedNodeGreen<'db>(pub GreenId<'db>);
24996impl<'db> TypedSyntaxNode<'db> for TriviumSkippedNode<'db> {
24997    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
24998    type StablePtr = TriviumSkippedNodePtr<'db>;
24999    type Green = TriviumSkippedNodeGreen<'db>;
25000    fn missing(db: &'db dyn Database) -> Self::Green {
25001        TriviumSkippedNodeGreen(
25002            GreenNode {
25003                kind: SyntaxKind::TriviumSkippedNode,
25004                details: GreenNodeDetails::Node {
25005                    children: [SkippedNode::missing(db).0].into(),
25006                    width: TextWidth::default(),
25007                },
25008            }
25009            .intern(db),
25010        )
25011    }
25012    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25013        let kind = node.kind(db);
25014        assert_eq!(
25015            kind,
25016            SyntaxKind::TriviumSkippedNode,
25017            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25018            kind,
25019            SyntaxKind::TriviumSkippedNode
25020        );
25021        Self { node }
25022    }
25023    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25024        let kind = node.kind(db);
25025        if kind == SyntaxKind::TriviumSkippedNode {
25026            Some(Self::from_syntax_node(db, node))
25027        } else {
25028            None
25029        }
25030    }
25031    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25032        self.node
25033    }
25034    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25035        TriviumSkippedNodePtr(self.node.stable_ptr(db))
25036    }
25037}
25038#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25039pub enum SkippedNode<'db> {
25040    AttributeList(AttributeList<'db>),
25041    VisibilityPub(VisibilityPub<'db>),
25042    ExprPath(ExprPath<'db>),
25043}
25044#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25045pub struct SkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
25046impl<'db> TypedStablePtr<'db> for SkippedNodePtr<'db> {
25047    type SyntaxNode = SkippedNode<'db>;
25048    fn untyped(self) -> SyntaxStablePtrId<'db> {
25049        self.0
25050    }
25051    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
25052        SkippedNode::from_syntax_node(db, self.0.lookup(db))
25053    }
25054}
25055impl<'db> From<SkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
25056    fn from(ptr: SkippedNodePtr<'db>) -> Self {
25057        ptr.untyped()
25058    }
25059}
25060impl<'db> From<AttributeListPtr<'db>> for SkippedNodePtr<'db> {
25061    fn from(value: AttributeListPtr<'db>) -> Self {
25062        Self(value.0)
25063    }
25064}
25065impl<'db> From<VisibilityPubPtr<'db>> for SkippedNodePtr<'db> {
25066    fn from(value: VisibilityPubPtr<'db>) -> Self {
25067        Self(value.0)
25068    }
25069}
25070impl<'db> From<ExprPathPtr<'db>> for SkippedNodePtr<'db> {
25071    fn from(value: ExprPathPtr<'db>) -> Self {
25072        Self(value.0)
25073    }
25074}
25075impl<'db> From<AttributeListGreen<'db>> for SkippedNodeGreen<'db> {
25076    fn from(value: AttributeListGreen<'db>) -> Self {
25077        Self(value.0)
25078    }
25079}
25080impl<'db> From<VisibilityPubGreen<'db>> for SkippedNodeGreen<'db> {
25081    fn from(value: VisibilityPubGreen<'db>) -> Self {
25082        Self(value.0)
25083    }
25084}
25085impl<'db> From<ExprPathGreen<'db>> for SkippedNodeGreen<'db> {
25086    fn from(value: ExprPathGreen<'db>) -> Self {
25087        Self(value.0)
25088    }
25089}
25090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25091pub struct SkippedNodeGreen<'db>(pub GreenId<'db>);
25092impl<'db> TypedSyntaxNode<'db> for SkippedNode<'db> {
25093    const OPTIONAL_KIND: Option<SyntaxKind> = None;
25094    type StablePtr = SkippedNodePtr<'db>;
25095    type Green = SkippedNodeGreen<'db>;
25096    fn missing(db: &'db dyn Database) -> Self::Green {
25097        panic!("No missing variant.");
25098    }
25099    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25100        let kind = node.kind(db);
25101        match kind {
25102            SyntaxKind::AttributeList => {
25103                SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
25104            }
25105            SyntaxKind::VisibilityPub => {
25106                SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
25107            }
25108            SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
25109            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
25110        }
25111    }
25112    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25113        let kind = node.kind(db);
25114        match kind {
25115            SyntaxKind::AttributeList => {
25116                Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
25117            }
25118            SyntaxKind::VisibilityPub => {
25119                Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
25120            }
25121            SyntaxKind::ExprPath => {
25122                Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
25123            }
25124            _ => None,
25125        }
25126    }
25127    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25128        match self {
25129            SkippedNode::AttributeList(x) => x.as_syntax_node(),
25130            SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
25131            SkippedNode::ExprPath(x) => x.as_syntax_node(),
25132        }
25133    }
25134    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25135        SkippedNodePtr(self.as_syntax_node().long(db).stable_ptr)
25136    }
25137}
25138impl<'db> SkippedNode<'db> {
25139    /// Checks if a kind of a variant of [SkippedNode].
25140    pub fn is_variant(kind: SyntaxKind) -> bool {
25141        matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
25142    }
25143}
25144#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25145pub struct TokenIdentifier<'db> {
25146    node: SyntaxNode<'db>,
25147}
25148impl<'db> Token<'db> for TokenIdentifier<'db> {
25149    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25150        TokenIdentifierGreen(
25151            GreenNode { kind: SyntaxKind::TokenIdentifier, details: GreenNodeDetails::Token(text) }
25152                .intern(db),
25153        )
25154    }
25155    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25156        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25157    }
25158}
25159#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25160pub struct TokenIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25161impl<'db> TypedStablePtr<'db> for TokenIdentifierPtr<'db> {
25162    type SyntaxNode = TokenIdentifier<'db>;
25163    fn untyped(self) -> SyntaxStablePtrId<'db> {
25164        self.0
25165    }
25166    fn lookup(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25167        TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
25168    }
25169}
25170impl<'db> From<TokenIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25171    fn from(ptr: TokenIdentifierPtr<'db>) -> Self {
25172        ptr.untyped()
25173    }
25174}
25175#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25176pub struct TokenIdentifierGreen<'db>(pub GreenId<'db>);
25177impl<'db> TokenIdentifierGreen<'db> {
25178    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25179        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25180    }
25181}
25182impl<'db> TypedSyntaxNode<'db> for TokenIdentifier<'db> {
25183    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
25184    type StablePtr = TokenIdentifierPtr<'db>;
25185    type Green = TokenIdentifierGreen<'db>;
25186    fn missing(db: &'db dyn Database) -> Self::Green {
25187        TokenIdentifierGreen(
25188            GreenNode {
25189                kind: SyntaxKind::TokenMissing,
25190                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25191            }
25192            .intern(db),
25193        )
25194    }
25195    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25196        match node.long(db).green.long(db).details {
25197            GreenNodeDetails::Token(_) => Self { node },
25198            GreenNodeDetails::Node { .. } => {
25199                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
25200            }
25201        }
25202    }
25203    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25204        match node.long(db).green.long(db).details {
25205            GreenNodeDetails::Token(_) => Some(Self { node }),
25206            GreenNodeDetails::Node { .. } => None,
25207        }
25208    }
25209    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25210        self.node
25211    }
25212    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25213        TokenIdentifierPtr(self.node.stable_ptr(db))
25214    }
25215}
25216#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25217pub struct TerminalIdentifier<'db> {
25218    node: SyntaxNode<'db>,
25219}
25220impl<'db> Terminal<'db> for TerminalIdentifier<'db> {
25221    const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
25222    type TokenType = TokenIdentifier<'db>;
25223    fn new_green(
25224        db: &'db dyn Database,
25225        leading_trivia: TriviaGreen<'db>,
25226        token: <<TerminalIdentifier<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25227        trailing_trivia: TriviaGreen<'db>,
25228    ) -> Self::Green {
25229        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25230        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25231        TerminalIdentifierGreen(
25232            GreenNode {
25233                kind: SyntaxKind::TerminalIdentifier,
25234                details: GreenNodeDetails::Node { children: children.into(), width },
25235            }
25236            .intern(db),
25237        )
25238    }
25239    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25240        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25241        else {
25242            unreachable!("Expected a node, not a token");
25243        };
25244        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25245    }
25246}
25247impl<'db> TerminalIdentifier<'db> {
25248    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25249        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25250    }
25251    pub fn token(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25252        TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
25253    }
25254    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25255        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25256    }
25257}
25258#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25259pub struct TerminalIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25260impl<'db> TerminalIdentifierPtr<'db> {}
25261impl<'db> TypedStablePtr<'db> for TerminalIdentifierPtr<'db> {
25262    type SyntaxNode = TerminalIdentifier<'db>;
25263    fn untyped(self) -> SyntaxStablePtrId<'db> {
25264        self.0
25265    }
25266    fn lookup(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
25267        TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
25268    }
25269}
25270impl<'db> From<TerminalIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25271    fn from(ptr: TerminalIdentifierPtr<'db>) -> Self {
25272        ptr.untyped()
25273    }
25274}
25275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25276pub struct TerminalIdentifierGreen<'db>(pub GreenId<'db>);
25277impl<'db> TypedSyntaxNode<'db> for TerminalIdentifier<'db> {
25278    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
25279    type StablePtr = TerminalIdentifierPtr<'db>;
25280    type Green = TerminalIdentifierGreen<'db>;
25281    fn missing(db: &'db dyn Database) -> Self::Green {
25282        TerminalIdentifierGreen(
25283            GreenNode {
25284                kind: SyntaxKind::TerminalIdentifier,
25285                details: GreenNodeDetails::Node {
25286                    children: [
25287                        Trivia::missing(db).0,
25288                        TokenIdentifier::missing(db).0,
25289                        Trivia::missing(db).0,
25290                    ]
25291                    .into(),
25292                    width: TextWidth::default(),
25293                },
25294            }
25295            .intern(db),
25296        )
25297    }
25298    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25299        let kind = node.kind(db);
25300        assert_eq!(
25301            kind,
25302            SyntaxKind::TerminalIdentifier,
25303            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25304            kind,
25305            SyntaxKind::TerminalIdentifier
25306        );
25307        Self { node }
25308    }
25309    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25310        let kind = node.kind(db);
25311        if kind == SyntaxKind::TerminalIdentifier {
25312            Some(Self::from_syntax_node(db, node))
25313        } else {
25314            None
25315        }
25316    }
25317    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25318        self.node
25319    }
25320    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25321        TerminalIdentifierPtr(self.node.stable_ptr(db))
25322    }
25323}
25324#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25325pub struct TokenLiteralNumber<'db> {
25326    node: SyntaxNode<'db>,
25327}
25328impl<'db> Token<'db> for TokenLiteralNumber<'db> {
25329    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25330        TokenLiteralNumberGreen(
25331            GreenNode {
25332                kind: SyntaxKind::TokenLiteralNumber,
25333                details: GreenNodeDetails::Token(text),
25334            }
25335            .intern(db),
25336        )
25337    }
25338    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25339        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25340    }
25341}
25342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25343pub struct TokenLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25344impl<'db> TypedStablePtr<'db> for TokenLiteralNumberPtr<'db> {
25345    type SyntaxNode = TokenLiteralNumber<'db>;
25346    fn untyped(self) -> SyntaxStablePtrId<'db> {
25347        self.0
25348    }
25349    fn lookup(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25350        TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25351    }
25352}
25353impl<'db> From<TokenLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25354    fn from(ptr: TokenLiteralNumberPtr<'db>) -> Self {
25355        ptr.untyped()
25356    }
25357}
25358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25359pub struct TokenLiteralNumberGreen<'db>(pub GreenId<'db>);
25360impl<'db> TokenLiteralNumberGreen<'db> {
25361    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25362        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25363    }
25364}
25365impl<'db> TypedSyntaxNode<'db> for TokenLiteralNumber<'db> {
25366    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
25367    type StablePtr = TokenLiteralNumberPtr<'db>;
25368    type Green = TokenLiteralNumberGreen<'db>;
25369    fn missing(db: &'db dyn Database) -> Self::Green {
25370        TokenLiteralNumberGreen(
25371            GreenNode {
25372                kind: SyntaxKind::TokenMissing,
25373                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25374            }
25375            .intern(db),
25376        )
25377    }
25378    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25379        match node.long(db).green.long(db).details {
25380            GreenNodeDetails::Token(_) => Self { node },
25381            GreenNodeDetails::Node { .. } => panic!(
25382                "Expected a token {:?}, not an internal node",
25383                SyntaxKind::TokenLiteralNumber
25384            ),
25385        }
25386    }
25387    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25388        match node.long(db).green.long(db).details {
25389            GreenNodeDetails::Token(_) => Some(Self { node }),
25390            GreenNodeDetails::Node { .. } => None,
25391        }
25392    }
25393    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25394        self.node
25395    }
25396    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25397        TokenLiteralNumberPtr(self.node.stable_ptr(db))
25398    }
25399}
25400#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25401pub struct TerminalLiteralNumber<'db> {
25402    node: SyntaxNode<'db>,
25403}
25404impl<'db> Terminal<'db> for TerminalLiteralNumber<'db> {
25405    const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25406    type TokenType = TokenLiteralNumber<'db>;
25407    fn new_green(
25408        db: &'db dyn Database,
25409        leading_trivia: TriviaGreen<'db>,
25410        token: <<TerminalLiteralNumber<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25411        trailing_trivia: TriviaGreen<'db>,
25412    ) -> Self::Green {
25413        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25414        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25415        TerminalLiteralNumberGreen(
25416            GreenNode {
25417                kind: SyntaxKind::TerminalLiteralNumber,
25418                details: GreenNodeDetails::Node { children: children.into(), width },
25419            }
25420            .intern(db),
25421        )
25422    }
25423    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25424        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25425        else {
25426            unreachable!("Expected a node, not a token");
25427        };
25428        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25429    }
25430}
25431impl<'db> TerminalLiteralNumber<'db> {
25432    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25433        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25434    }
25435    pub fn token(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25436        TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25437    }
25438    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25439        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25440    }
25441}
25442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25443pub struct TerminalLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25444impl<'db> TerminalLiteralNumberPtr<'db> {}
25445impl<'db> TypedStablePtr<'db> for TerminalLiteralNumberPtr<'db> {
25446    type SyntaxNode = TerminalLiteralNumber<'db>;
25447    fn untyped(self) -> SyntaxStablePtrId<'db> {
25448        self.0
25449    }
25450    fn lookup(&self, db: &'db dyn Database) -> TerminalLiteralNumber<'db> {
25451        TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25452    }
25453}
25454impl<'db> From<TerminalLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25455    fn from(ptr: TerminalLiteralNumberPtr<'db>) -> Self {
25456        ptr.untyped()
25457    }
25458}
25459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25460pub struct TerminalLiteralNumberGreen<'db>(pub GreenId<'db>);
25461impl<'db> TypedSyntaxNode<'db> for TerminalLiteralNumber<'db> {
25462    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25463    type StablePtr = TerminalLiteralNumberPtr<'db>;
25464    type Green = TerminalLiteralNumberGreen<'db>;
25465    fn missing(db: &'db dyn Database) -> Self::Green {
25466        TerminalLiteralNumberGreen(
25467            GreenNode {
25468                kind: SyntaxKind::TerminalLiteralNumber,
25469                details: GreenNodeDetails::Node {
25470                    children: [
25471                        Trivia::missing(db).0,
25472                        TokenLiteralNumber::missing(db).0,
25473                        Trivia::missing(db).0,
25474                    ]
25475                    .into(),
25476                    width: TextWidth::default(),
25477                },
25478            }
25479            .intern(db),
25480        )
25481    }
25482    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25483        let kind = node.kind(db);
25484        assert_eq!(
25485            kind,
25486            SyntaxKind::TerminalLiteralNumber,
25487            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25488            kind,
25489            SyntaxKind::TerminalLiteralNumber
25490        );
25491        Self { node }
25492    }
25493    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25494        let kind = node.kind(db);
25495        if kind == SyntaxKind::TerminalLiteralNumber {
25496            Some(Self::from_syntax_node(db, node))
25497        } else {
25498            None
25499        }
25500    }
25501    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25502        self.node
25503    }
25504    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25505        TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25506    }
25507}
25508#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25509pub struct TokenShortString<'db> {
25510    node: SyntaxNode<'db>,
25511}
25512impl<'db> Token<'db> for TokenShortString<'db> {
25513    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25514        TokenShortStringGreen(
25515            GreenNode {
25516                kind: SyntaxKind::TokenShortString,
25517                details: GreenNodeDetails::Token(text),
25518            }
25519            .intern(db),
25520        )
25521    }
25522    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25523        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25524    }
25525}
25526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25527pub struct TokenShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25528impl<'db> TypedStablePtr<'db> for TokenShortStringPtr<'db> {
25529    type SyntaxNode = TokenShortString<'db>;
25530    fn untyped(self) -> SyntaxStablePtrId<'db> {
25531        self.0
25532    }
25533    fn lookup(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25534        TokenShortString::from_syntax_node(db, self.0.lookup(db))
25535    }
25536}
25537impl<'db> From<TokenShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25538    fn from(ptr: TokenShortStringPtr<'db>) -> Self {
25539        ptr.untyped()
25540    }
25541}
25542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25543pub struct TokenShortStringGreen<'db>(pub GreenId<'db>);
25544impl<'db> TokenShortStringGreen<'db> {
25545    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25546        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25547    }
25548}
25549impl<'db> TypedSyntaxNode<'db> for TokenShortString<'db> {
25550    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25551    type StablePtr = TokenShortStringPtr<'db>;
25552    type Green = TokenShortStringGreen<'db>;
25553    fn missing(db: &'db dyn Database) -> Self::Green {
25554        TokenShortStringGreen(
25555            GreenNode {
25556                kind: SyntaxKind::TokenMissing,
25557                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25558            }
25559            .intern(db),
25560        )
25561    }
25562    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25563        match node.long(db).green.long(db).details {
25564            GreenNodeDetails::Token(_) => Self { node },
25565            GreenNodeDetails::Node { .. } => {
25566                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25567            }
25568        }
25569    }
25570    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25571        match node.long(db).green.long(db).details {
25572            GreenNodeDetails::Token(_) => Some(Self { node }),
25573            GreenNodeDetails::Node { .. } => None,
25574        }
25575    }
25576    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25577        self.node
25578    }
25579    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25580        TokenShortStringPtr(self.node.stable_ptr(db))
25581    }
25582}
25583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25584pub struct TerminalShortString<'db> {
25585    node: SyntaxNode<'db>,
25586}
25587impl<'db> Terminal<'db> for TerminalShortString<'db> {
25588    const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25589    type TokenType = TokenShortString<'db>;
25590    fn new_green(
25591        db: &'db dyn Database,
25592        leading_trivia: TriviaGreen<'db>,
25593        token: <<TerminalShortString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25594        trailing_trivia: TriviaGreen<'db>,
25595    ) -> Self::Green {
25596        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25597        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25598        TerminalShortStringGreen(
25599            GreenNode {
25600                kind: SyntaxKind::TerminalShortString,
25601                details: GreenNodeDetails::Node { children: children.into(), width },
25602            }
25603            .intern(db),
25604        )
25605    }
25606    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25607        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25608        else {
25609            unreachable!("Expected a node, not a token");
25610        };
25611        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25612    }
25613}
25614impl<'db> TerminalShortString<'db> {
25615    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25616        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25617    }
25618    pub fn token(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25619        TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25620    }
25621    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25622        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25623    }
25624}
25625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25626pub struct TerminalShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25627impl<'db> TerminalShortStringPtr<'db> {}
25628impl<'db> TypedStablePtr<'db> for TerminalShortStringPtr<'db> {
25629    type SyntaxNode = TerminalShortString<'db>;
25630    fn untyped(self) -> SyntaxStablePtrId<'db> {
25631        self.0
25632    }
25633    fn lookup(&self, db: &'db dyn Database) -> TerminalShortString<'db> {
25634        TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25635    }
25636}
25637impl<'db> From<TerminalShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25638    fn from(ptr: TerminalShortStringPtr<'db>) -> Self {
25639        ptr.untyped()
25640    }
25641}
25642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25643pub struct TerminalShortStringGreen<'db>(pub GreenId<'db>);
25644impl<'db> TypedSyntaxNode<'db> for TerminalShortString<'db> {
25645    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25646    type StablePtr = TerminalShortStringPtr<'db>;
25647    type Green = TerminalShortStringGreen<'db>;
25648    fn missing(db: &'db dyn Database) -> Self::Green {
25649        TerminalShortStringGreen(
25650            GreenNode {
25651                kind: SyntaxKind::TerminalShortString,
25652                details: GreenNodeDetails::Node {
25653                    children: [
25654                        Trivia::missing(db).0,
25655                        TokenShortString::missing(db).0,
25656                        Trivia::missing(db).0,
25657                    ]
25658                    .into(),
25659                    width: TextWidth::default(),
25660                },
25661            }
25662            .intern(db),
25663        )
25664    }
25665    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25666        let kind = node.kind(db);
25667        assert_eq!(
25668            kind,
25669            SyntaxKind::TerminalShortString,
25670            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25671            kind,
25672            SyntaxKind::TerminalShortString
25673        );
25674        Self { node }
25675    }
25676    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25677        let kind = node.kind(db);
25678        if kind == SyntaxKind::TerminalShortString {
25679            Some(Self::from_syntax_node(db, node))
25680        } else {
25681            None
25682        }
25683    }
25684    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25685        self.node
25686    }
25687    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25688        TerminalShortStringPtr(self.node.stable_ptr(db))
25689    }
25690}
25691#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25692pub struct TokenString<'db> {
25693    node: SyntaxNode<'db>,
25694}
25695impl<'db> Token<'db> for TokenString<'db> {
25696    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25697        TokenStringGreen(
25698            GreenNode { kind: SyntaxKind::TokenString, details: GreenNodeDetails::Token(text) }
25699                .intern(db),
25700        )
25701    }
25702    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25703        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25704    }
25705}
25706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25707pub struct TokenStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25708impl<'db> TypedStablePtr<'db> for TokenStringPtr<'db> {
25709    type SyntaxNode = TokenString<'db>;
25710    fn untyped(self) -> SyntaxStablePtrId<'db> {
25711        self.0
25712    }
25713    fn lookup(&self, db: &'db dyn Database) -> TokenString<'db> {
25714        TokenString::from_syntax_node(db, self.0.lookup(db))
25715    }
25716}
25717impl<'db> From<TokenStringPtr<'db>> for SyntaxStablePtrId<'db> {
25718    fn from(ptr: TokenStringPtr<'db>) -> Self {
25719        ptr.untyped()
25720    }
25721}
25722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25723pub struct TokenStringGreen<'db>(pub GreenId<'db>);
25724impl<'db> TokenStringGreen<'db> {
25725    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25726        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25727    }
25728}
25729impl<'db> TypedSyntaxNode<'db> for TokenString<'db> {
25730    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25731    type StablePtr = TokenStringPtr<'db>;
25732    type Green = TokenStringGreen<'db>;
25733    fn missing(db: &'db dyn Database) -> Self::Green {
25734        TokenStringGreen(
25735            GreenNode {
25736                kind: SyntaxKind::TokenMissing,
25737                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25738            }
25739            .intern(db),
25740        )
25741    }
25742    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25743        match node.long(db).green.long(db).details {
25744            GreenNodeDetails::Token(_) => Self { node },
25745            GreenNodeDetails::Node { .. } => {
25746                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25747            }
25748        }
25749    }
25750    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25751        match node.long(db).green.long(db).details {
25752            GreenNodeDetails::Token(_) => Some(Self { node }),
25753            GreenNodeDetails::Node { .. } => None,
25754        }
25755    }
25756    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25757        self.node
25758    }
25759    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25760        TokenStringPtr(self.node.stable_ptr(db))
25761    }
25762}
25763#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25764pub struct TerminalString<'db> {
25765    node: SyntaxNode<'db>,
25766}
25767impl<'db> Terminal<'db> for TerminalString<'db> {
25768    const KIND: SyntaxKind = SyntaxKind::TerminalString;
25769    type TokenType = TokenString<'db>;
25770    fn new_green(
25771        db: &'db dyn Database,
25772        leading_trivia: TriviaGreen<'db>,
25773        token: <<TerminalString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25774        trailing_trivia: TriviaGreen<'db>,
25775    ) -> Self::Green {
25776        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25777        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25778        TerminalStringGreen(
25779            GreenNode {
25780                kind: SyntaxKind::TerminalString,
25781                details: GreenNodeDetails::Node { children: children.into(), width },
25782            }
25783            .intern(db),
25784        )
25785    }
25786    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25787        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25788        else {
25789            unreachable!("Expected a node, not a token");
25790        };
25791        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25792    }
25793}
25794impl<'db> TerminalString<'db> {
25795    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25796        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25797    }
25798    pub fn token(&self, db: &'db dyn Database) -> TokenString<'db> {
25799        TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25800    }
25801    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25802        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25803    }
25804}
25805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25806pub struct TerminalStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25807impl<'db> TerminalStringPtr<'db> {}
25808impl<'db> TypedStablePtr<'db> for TerminalStringPtr<'db> {
25809    type SyntaxNode = TerminalString<'db>;
25810    fn untyped(self) -> SyntaxStablePtrId<'db> {
25811        self.0
25812    }
25813    fn lookup(&self, db: &'db dyn Database) -> TerminalString<'db> {
25814        TerminalString::from_syntax_node(db, self.0.lookup(db))
25815    }
25816}
25817impl<'db> From<TerminalStringPtr<'db>> for SyntaxStablePtrId<'db> {
25818    fn from(ptr: TerminalStringPtr<'db>) -> Self {
25819        ptr.untyped()
25820    }
25821}
25822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25823pub struct TerminalStringGreen<'db>(pub GreenId<'db>);
25824impl<'db> TypedSyntaxNode<'db> for TerminalString<'db> {
25825    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25826    type StablePtr = TerminalStringPtr<'db>;
25827    type Green = TerminalStringGreen<'db>;
25828    fn missing(db: &'db dyn Database) -> Self::Green {
25829        TerminalStringGreen(
25830            GreenNode {
25831                kind: SyntaxKind::TerminalString,
25832                details: GreenNodeDetails::Node {
25833                    children: [
25834                        Trivia::missing(db).0,
25835                        TokenString::missing(db).0,
25836                        Trivia::missing(db).0,
25837                    ]
25838                    .into(),
25839                    width: TextWidth::default(),
25840                },
25841            }
25842            .intern(db),
25843        )
25844    }
25845    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25846        let kind = node.kind(db);
25847        assert_eq!(
25848            kind,
25849            SyntaxKind::TerminalString,
25850            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25851            kind,
25852            SyntaxKind::TerminalString
25853        );
25854        Self { node }
25855    }
25856    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25857        let kind = node.kind(db);
25858        if kind == SyntaxKind::TerminalString {
25859            Some(Self::from_syntax_node(db, node))
25860        } else {
25861            None
25862        }
25863    }
25864    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25865        self.node
25866    }
25867    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25868        TerminalStringPtr(self.node.stable_ptr(db))
25869    }
25870}
25871#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25872pub struct TokenAs<'db> {
25873    node: SyntaxNode<'db>,
25874}
25875impl<'db> Token<'db> for TokenAs<'db> {
25876    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25877        TokenAsGreen(
25878            GreenNode { kind: SyntaxKind::TokenAs, details: GreenNodeDetails::Token(text) }
25879                .intern(db),
25880        )
25881    }
25882    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25883        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
25884    }
25885}
25886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25887pub struct TokenAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25888impl<'db> TypedStablePtr<'db> for TokenAsPtr<'db> {
25889    type SyntaxNode = TokenAs<'db>;
25890    fn untyped(self) -> SyntaxStablePtrId<'db> {
25891        self.0
25892    }
25893    fn lookup(&self, db: &'db dyn Database) -> TokenAs<'db> {
25894        TokenAs::from_syntax_node(db, self.0.lookup(db))
25895    }
25896}
25897impl<'db> From<TokenAsPtr<'db>> for SyntaxStablePtrId<'db> {
25898    fn from(ptr: TokenAsPtr<'db>) -> Self {
25899        ptr.untyped()
25900    }
25901}
25902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25903pub struct TokenAsGreen<'db>(pub GreenId<'db>);
25904impl<'db> TokenAsGreen<'db> {
25905    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25906        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25907    }
25908}
25909impl<'db> TypedSyntaxNode<'db> for TokenAs<'db> {
25910    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25911    type StablePtr = TokenAsPtr<'db>;
25912    type Green = TokenAsGreen<'db>;
25913    fn missing(db: &'db dyn Database) -> Self::Green {
25914        TokenAsGreen(
25915            GreenNode {
25916                kind: SyntaxKind::TokenMissing,
25917                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25918            }
25919            .intern(db),
25920        )
25921    }
25922    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25923        match node.long(db).green.long(db).details {
25924            GreenNodeDetails::Token(_) => Self { node },
25925            GreenNodeDetails::Node { .. } => {
25926                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25927            }
25928        }
25929    }
25930    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25931        match node.long(db).green.long(db).details {
25932            GreenNodeDetails::Token(_) => Some(Self { node }),
25933            GreenNodeDetails::Node { .. } => None,
25934        }
25935    }
25936    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25937        self.node
25938    }
25939    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25940        TokenAsPtr(self.node.stable_ptr(db))
25941    }
25942}
25943#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25944pub struct TerminalAs<'db> {
25945    node: SyntaxNode<'db>,
25946}
25947impl<'db> Terminal<'db> for TerminalAs<'db> {
25948    const KIND: SyntaxKind = SyntaxKind::TerminalAs;
25949    type TokenType = TokenAs<'db>;
25950    fn new_green(
25951        db: &'db dyn Database,
25952        leading_trivia: TriviaGreen<'db>,
25953        token: <<TerminalAs<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25954        trailing_trivia: TriviaGreen<'db>,
25955    ) -> Self::Green {
25956        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25957        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25958        TerminalAsGreen(
25959            GreenNode {
25960                kind: SyntaxKind::TerminalAs,
25961                details: GreenNodeDetails::Node { children: children.into(), width },
25962            }
25963            .intern(db),
25964        )
25965    }
25966    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25967        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
25968        else {
25969            unreachable!("Expected a node, not a token");
25970        };
25971        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25972    }
25973}
25974impl<'db> TerminalAs<'db> {
25975    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25976        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25977    }
25978    pub fn token(&self, db: &'db dyn Database) -> TokenAs<'db> {
25979        TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
25980    }
25981    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25982        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25983    }
25984}
25985#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25986pub struct TerminalAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25987impl<'db> TerminalAsPtr<'db> {}
25988impl<'db> TypedStablePtr<'db> for TerminalAsPtr<'db> {
25989    type SyntaxNode = TerminalAs<'db>;
25990    fn untyped(self) -> SyntaxStablePtrId<'db> {
25991        self.0
25992    }
25993    fn lookup(&self, db: &'db dyn Database) -> TerminalAs<'db> {
25994        TerminalAs::from_syntax_node(db, self.0.lookup(db))
25995    }
25996}
25997impl<'db> From<TerminalAsPtr<'db>> for SyntaxStablePtrId<'db> {
25998    fn from(ptr: TerminalAsPtr<'db>) -> Self {
25999        ptr.untyped()
26000    }
26001}
26002#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26003pub struct TerminalAsGreen<'db>(pub GreenId<'db>);
26004impl<'db> TypedSyntaxNode<'db> for TerminalAs<'db> {
26005    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
26006    type StablePtr = TerminalAsPtr<'db>;
26007    type Green = TerminalAsGreen<'db>;
26008    fn missing(db: &'db dyn Database) -> Self::Green {
26009        TerminalAsGreen(
26010            GreenNode {
26011                kind: SyntaxKind::TerminalAs,
26012                details: GreenNodeDetails::Node {
26013                    children: [
26014                        Trivia::missing(db).0,
26015                        TokenAs::missing(db).0,
26016                        Trivia::missing(db).0,
26017                    ]
26018                    .into(),
26019                    width: TextWidth::default(),
26020                },
26021            }
26022            .intern(db),
26023        )
26024    }
26025    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26026        let kind = node.kind(db);
26027        assert_eq!(
26028            kind,
26029            SyntaxKind::TerminalAs,
26030            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26031            kind,
26032            SyntaxKind::TerminalAs
26033        );
26034        Self { node }
26035    }
26036    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26037        let kind = node.kind(db);
26038        if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
26039    }
26040    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26041        self.node
26042    }
26043    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26044        TerminalAsPtr(self.node.stable_ptr(db))
26045    }
26046}
26047#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26048pub struct TokenConst<'db> {
26049    node: SyntaxNode<'db>,
26050}
26051impl<'db> Token<'db> for TokenConst<'db> {
26052    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26053        TokenConstGreen(
26054            GreenNode { kind: SyntaxKind::TokenConst, details: GreenNodeDetails::Token(text) }
26055                .intern(db),
26056        )
26057    }
26058    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26059        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26060    }
26061}
26062#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26063pub struct TokenConstPtr<'db>(pub SyntaxStablePtrId<'db>);
26064impl<'db> TypedStablePtr<'db> for TokenConstPtr<'db> {
26065    type SyntaxNode = TokenConst<'db>;
26066    fn untyped(self) -> SyntaxStablePtrId<'db> {
26067        self.0
26068    }
26069    fn lookup(&self, db: &'db dyn Database) -> TokenConst<'db> {
26070        TokenConst::from_syntax_node(db, self.0.lookup(db))
26071    }
26072}
26073impl<'db> From<TokenConstPtr<'db>> for SyntaxStablePtrId<'db> {
26074    fn from(ptr: TokenConstPtr<'db>) -> Self {
26075        ptr.untyped()
26076    }
26077}
26078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26079pub struct TokenConstGreen<'db>(pub GreenId<'db>);
26080impl<'db> TokenConstGreen<'db> {
26081    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26082        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26083    }
26084}
26085impl<'db> TypedSyntaxNode<'db> for TokenConst<'db> {
26086    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
26087    type StablePtr = TokenConstPtr<'db>;
26088    type Green = TokenConstGreen<'db>;
26089    fn missing(db: &'db dyn Database) -> Self::Green {
26090        TokenConstGreen(
26091            GreenNode {
26092                kind: SyntaxKind::TokenMissing,
26093                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26094            }
26095            .intern(db),
26096        )
26097    }
26098    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26099        match node.long(db).green.long(db).details {
26100            GreenNodeDetails::Token(_) => Self { node },
26101            GreenNodeDetails::Node { .. } => {
26102                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
26103            }
26104        }
26105    }
26106    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26107        match node.long(db).green.long(db).details {
26108            GreenNodeDetails::Token(_) => Some(Self { node }),
26109            GreenNodeDetails::Node { .. } => None,
26110        }
26111    }
26112    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26113        self.node
26114    }
26115    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26116        TokenConstPtr(self.node.stable_ptr(db))
26117    }
26118}
26119#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26120pub struct TerminalConst<'db> {
26121    node: SyntaxNode<'db>,
26122}
26123impl<'db> Terminal<'db> for TerminalConst<'db> {
26124    const KIND: SyntaxKind = SyntaxKind::TerminalConst;
26125    type TokenType = TokenConst<'db>;
26126    fn new_green(
26127        db: &'db dyn Database,
26128        leading_trivia: TriviaGreen<'db>,
26129        token: <<TerminalConst<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26130        trailing_trivia: TriviaGreen<'db>,
26131    ) -> Self::Green {
26132        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26133        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26134        TerminalConstGreen(
26135            GreenNode {
26136                kind: SyntaxKind::TerminalConst,
26137                details: GreenNodeDetails::Node { children: children.into(), width },
26138            }
26139            .intern(db),
26140        )
26141    }
26142    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26143        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26144        else {
26145            unreachable!("Expected a node, not a token");
26146        };
26147        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26148    }
26149}
26150impl<'db> TerminalConst<'db> {
26151    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26152        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26153    }
26154    pub fn token(&self, db: &'db dyn Database) -> TokenConst<'db> {
26155        TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
26156    }
26157    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26158        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26159    }
26160}
26161#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26162pub struct TerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
26163impl<'db> TerminalConstPtr<'db> {}
26164impl<'db> TypedStablePtr<'db> for TerminalConstPtr<'db> {
26165    type SyntaxNode = TerminalConst<'db>;
26166    fn untyped(self) -> SyntaxStablePtrId<'db> {
26167        self.0
26168    }
26169    fn lookup(&self, db: &'db dyn Database) -> TerminalConst<'db> {
26170        TerminalConst::from_syntax_node(db, self.0.lookup(db))
26171    }
26172}
26173impl<'db> From<TerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
26174    fn from(ptr: TerminalConstPtr<'db>) -> Self {
26175        ptr.untyped()
26176    }
26177}
26178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26179pub struct TerminalConstGreen<'db>(pub GreenId<'db>);
26180impl<'db> TypedSyntaxNode<'db> for TerminalConst<'db> {
26181    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
26182    type StablePtr = TerminalConstPtr<'db>;
26183    type Green = TerminalConstGreen<'db>;
26184    fn missing(db: &'db dyn Database) -> Self::Green {
26185        TerminalConstGreen(
26186            GreenNode {
26187                kind: SyntaxKind::TerminalConst,
26188                details: GreenNodeDetails::Node {
26189                    children: [
26190                        Trivia::missing(db).0,
26191                        TokenConst::missing(db).0,
26192                        Trivia::missing(db).0,
26193                    ]
26194                    .into(),
26195                    width: TextWidth::default(),
26196                },
26197            }
26198            .intern(db),
26199        )
26200    }
26201    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26202        let kind = node.kind(db);
26203        assert_eq!(
26204            kind,
26205            SyntaxKind::TerminalConst,
26206            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26207            kind,
26208            SyntaxKind::TerminalConst
26209        );
26210        Self { node }
26211    }
26212    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26213        let kind = node.kind(db);
26214        if kind == SyntaxKind::TerminalConst {
26215            Some(Self::from_syntax_node(db, node))
26216        } else {
26217            None
26218        }
26219    }
26220    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26221        self.node
26222    }
26223    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26224        TerminalConstPtr(self.node.stable_ptr(db))
26225    }
26226}
26227#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26228pub struct TokenElse<'db> {
26229    node: SyntaxNode<'db>,
26230}
26231impl<'db> Token<'db> for TokenElse<'db> {
26232    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26233        TokenElseGreen(
26234            GreenNode { kind: SyntaxKind::TokenElse, details: GreenNodeDetails::Token(text) }
26235                .intern(db),
26236        )
26237    }
26238    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26239        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26240    }
26241}
26242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26243pub struct TokenElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26244impl<'db> TypedStablePtr<'db> for TokenElsePtr<'db> {
26245    type SyntaxNode = TokenElse<'db>;
26246    fn untyped(self) -> SyntaxStablePtrId<'db> {
26247        self.0
26248    }
26249    fn lookup(&self, db: &'db dyn Database) -> TokenElse<'db> {
26250        TokenElse::from_syntax_node(db, self.0.lookup(db))
26251    }
26252}
26253impl<'db> From<TokenElsePtr<'db>> for SyntaxStablePtrId<'db> {
26254    fn from(ptr: TokenElsePtr<'db>) -> Self {
26255        ptr.untyped()
26256    }
26257}
26258#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26259pub struct TokenElseGreen<'db>(pub GreenId<'db>);
26260impl<'db> TokenElseGreen<'db> {
26261    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26262        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26263    }
26264}
26265impl<'db> TypedSyntaxNode<'db> for TokenElse<'db> {
26266    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
26267    type StablePtr = TokenElsePtr<'db>;
26268    type Green = TokenElseGreen<'db>;
26269    fn missing(db: &'db dyn Database) -> Self::Green {
26270        TokenElseGreen(
26271            GreenNode {
26272                kind: SyntaxKind::TokenMissing,
26273                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26274            }
26275            .intern(db),
26276        )
26277    }
26278    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26279        match node.long(db).green.long(db).details {
26280            GreenNodeDetails::Token(_) => Self { node },
26281            GreenNodeDetails::Node { .. } => {
26282                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
26283            }
26284        }
26285    }
26286    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26287        match node.long(db).green.long(db).details {
26288            GreenNodeDetails::Token(_) => Some(Self { node }),
26289            GreenNodeDetails::Node { .. } => None,
26290        }
26291    }
26292    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26293        self.node
26294    }
26295    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26296        TokenElsePtr(self.node.stable_ptr(db))
26297    }
26298}
26299#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26300pub struct TerminalElse<'db> {
26301    node: SyntaxNode<'db>,
26302}
26303impl<'db> Terminal<'db> for TerminalElse<'db> {
26304    const KIND: SyntaxKind = SyntaxKind::TerminalElse;
26305    type TokenType = TokenElse<'db>;
26306    fn new_green(
26307        db: &'db dyn Database,
26308        leading_trivia: TriviaGreen<'db>,
26309        token: <<TerminalElse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26310        trailing_trivia: TriviaGreen<'db>,
26311    ) -> Self::Green {
26312        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26313        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26314        TerminalElseGreen(
26315            GreenNode {
26316                kind: SyntaxKind::TerminalElse,
26317                details: GreenNodeDetails::Node { children: children.into(), width },
26318            }
26319            .intern(db),
26320        )
26321    }
26322    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26323        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26324        else {
26325            unreachable!("Expected a node, not a token");
26326        };
26327        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26328    }
26329}
26330impl<'db> TerminalElse<'db> {
26331    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26332        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26333    }
26334    pub fn token(&self, db: &'db dyn Database) -> TokenElse<'db> {
26335        TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
26336    }
26337    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26338        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26339    }
26340}
26341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26342pub struct TerminalElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26343impl<'db> TerminalElsePtr<'db> {}
26344impl<'db> TypedStablePtr<'db> for TerminalElsePtr<'db> {
26345    type SyntaxNode = TerminalElse<'db>;
26346    fn untyped(self) -> SyntaxStablePtrId<'db> {
26347        self.0
26348    }
26349    fn lookup(&self, db: &'db dyn Database) -> TerminalElse<'db> {
26350        TerminalElse::from_syntax_node(db, self.0.lookup(db))
26351    }
26352}
26353impl<'db> From<TerminalElsePtr<'db>> for SyntaxStablePtrId<'db> {
26354    fn from(ptr: TerminalElsePtr<'db>) -> Self {
26355        ptr.untyped()
26356    }
26357}
26358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26359pub struct TerminalElseGreen<'db>(pub GreenId<'db>);
26360impl<'db> TypedSyntaxNode<'db> for TerminalElse<'db> {
26361    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
26362    type StablePtr = TerminalElsePtr<'db>;
26363    type Green = TerminalElseGreen<'db>;
26364    fn missing(db: &'db dyn Database) -> Self::Green {
26365        TerminalElseGreen(
26366            GreenNode {
26367                kind: SyntaxKind::TerminalElse,
26368                details: GreenNodeDetails::Node {
26369                    children: [
26370                        Trivia::missing(db).0,
26371                        TokenElse::missing(db).0,
26372                        Trivia::missing(db).0,
26373                    ]
26374                    .into(),
26375                    width: TextWidth::default(),
26376                },
26377            }
26378            .intern(db),
26379        )
26380    }
26381    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26382        let kind = node.kind(db);
26383        assert_eq!(
26384            kind,
26385            SyntaxKind::TerminalElse,
26386            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26387            kind,
26388            SyntaxKind::TerminalElse
26389        );
26390        Self { node }
26391    }
26392    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26393        let kind = node.kind(db);
26394        if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
26395    }
26396    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26397        self.node
26398    }
26399    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26400        TerminalElsePtr(self.node.stable_ptr(db))
26401    }
26402}
26403#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26404pub struct TokenEnum<'db> {
26405    node: SyntaxNode<'db>,
26406}
26407impl<'db> Token<'db> for TokenEnum<'db> {
26408    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26409        TokenEnumGreen(
26410            GreenNode { kind: SyntaxKind::TokenEnum, details: GreenNodeDetails::Token(text) }
26411                .intern(db),
26412        )
26413    }
26414    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26415        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26416    }
26417}
26418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26419pub struct TokenEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26420impl<'db> TypedStablePtr<'db> for TokenEnumPtr<'db> {
26421    type SyntaxNode = TokenEnum<'db>;
26422    fn untyped(self) -> SyntaxStablePtrId<'db> {
26423        self.0
26424    }
26425    fn lookup(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26426        TokenEnum::from_syntax_node(db, self.0.lookup(db))
26427    }
26428}
26429impl<'db> From<TokenEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26430    fn from(ptr: TokenEnumPtr<'db>) -> Self {
26431        ptr.untyped()
26432    }
26433}
26434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26435pub struct TokenEnumGreen<'db>(pub GreenId<'db>);
26436impl<'db> TokenEnumGreen<'db> {
26437    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26438        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26439    }
26440}
26441impl<'db> TypedSyntaxNode<'db> for TokenEnum<'db> {
26442    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26443    type StablePtr = TokenEnumPtr<'db>;
26444    type Green = TokenEnumGreen<'db>;
26445    fn missing(db: &'db dyn Database) -> Self::Green {
26446        TokenEnumGreen(
26447            GreenNode {
26448                kind: SyntaxKind::TokenMissing,
26449                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26450            }
26451            .intern(db),
26452        )
26453    }
26454    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26455        match node.long(db).green.long(db).details {
26456            GreenNodeDetails::Token(_) => Self { node },
26457            GreenNodeDetails::Node { .. } => {
26458                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26459            }
26460        }
26461    }
26462    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26463        match node.long(db).green.long(db).details {
26464            GreenNodeDetails::Token(_) => Some(Self { node }),
26465            GreenNodeDetails::Node { .. } => None,
26466        }
26467    }
26468    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26469        self.node
26470    }
26471    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26472        TokenEnumPtr(self.node.stable_ptr(db))
26473    }
26474}
26475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26476pub struct TerminalEnum<'db> {
26477    node: SyntaxNode<'db>,
26478}
26479impl<'db> Terminal<'db> for TerminalEnum<'db> {
26480    const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26481    type TokenType = TokenEnum<'db>;
26482    fn new_green(
26483        db: &'db dyn Database,
26484        leading_trivia: TriviaGreen<'db>,
26485        token: <<TerminalEnum<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26486        trailing_trivia: TriviaGreen<'db>,
26487    ) -> Self::Green {
26488        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26489        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26490        TerminalEnumGreen(
26491            GreenNode {
26492                kind: SyntaxKind::TerminalEnum,
26493                details: GreenNodeDetails::Node { children: children.into(), width },
26494            }
26495            .intern(db),
26496        )
26497    }
26498    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26499        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26500        else {
26501            unreachable!("Expected a node, not a token");
26502        };
26503        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26504    }
26505}
26506impl<'db> TerminalEnum<'db> {
26507    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26508        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26509    }
26510    pub fn token(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26511        TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26512    }
26513    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26514        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26515    }
26516}
26517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26518pub struct TerminalEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26519impl<'db> TerminalEnumPtr<'db> {}
26520impl<'db> TypedStablePtr<'db> for TerminalEnumPtr<'db> {
26521    type SyntaxNode = TerminalEnum<'db>;
26522    fn untyped(self) -> SyntaxStablePtrId<'db> {
26523        self.0
26524    }
26525    fn lookup(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
26526        TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26527    }
26528}
26529impl<'db> From<TerminalEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26530    fn from(ptr: TerminalEnumPtr<'db>) -> Self {
26531        ptr.untyped()
26532    }
26533}
26534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26535pub struct TerminalEnumGreen<'db>(pub GreenId<'db>);
26536impl<'db> TypedSyntaxNode<'db> for TerminalEnum<'db> {
26537    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26538    type StablePtr = TerminalEnumPtr<'db>;
26539    type Green = TerminalEnumGreen<'db>;
26540    fn missing(db: &'db dyn Database) -> Self::Green {
26541        TerminalEnumGreen(
26542            GreenNode {
26543                kind: SyntaxKind::TerminalEnum,
26544                details: GreenNodeDetails::Node {
26545                    children: [
26546                        Trivia::missing(db).0,
26547                        TokenEnum::missing(db).0,
26548                        Trivia::missing(db).0,
26549                    ]
26550                    .into(),
26551                    width: TextWidth::default(),
26552                },
26553            }
26554            .intern(db),
26555        )
26556    }
26557    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26558        let kind = node.kind(db);
26559        assert_eq!(
26560            kind,
26561            SyntaxKind::TerminalEnum,
26562            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26563            kind,
26564            SyntaxKind::TerminalEnum
26565        );
26566        Self { node }
26567    }
26568    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26569        let kind = node.kind(db);
26570        if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26571    }
26572    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26573        self.node
26574    }
26575    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26576        TerminalEnumPtr(self.node.stable_ptr(db))
26577    }
26578}
26579#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26580pub struct TokenExtern<'db> {
26581    node: SyntaxNode<'db>,
26582}
26583impl<'db> Token<'db> for TokenExtern<'db> {
26584    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26585        TokenExternGreen(
26586            GreenNode { kind: SyntaxKind::TokenExtern, details: GreenNodeDetails::Token(text) }
26587                .intern(db),
26588        )
26589    }
26590    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26591        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26592    }
26593}
26594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26595pub struct TokenExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26596impl<'db> TypedStablePtr<'db> for TokenExternPtr<'db> {
26597    type SyntaxNode = TokenExtern<'db>;
26598    fn untyped(self) -> SyntaxStablePtrId<'db> {
26599        self.0
26600    }
26601    fn lookup(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26602        TokenExtern::from_syntax_node(db, self.0.lookup(db))
26603    }
26604}
26605impl<'db> From<TokenExternPtr<'db>> for SyntaxStablePtrId<'db> {
26606    fn from(ptr: TokenExternPtr<'db>) -> Self {
26607        ptr.untyped()
26608    }
26609}
26610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26611pub struct TokenExternGreen<'db>(pub GreenId<'db>);
26612impl<'db> TokenExternGreen<'db> {
26613    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26614        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26615    }
26616}
26617impl<'db> TypedSyntaxNode<'db> for TokenExtern<'db> {
26618    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26619    type StablePtr = TokenExternPtr<'db>;
26620    type Green = TokenExternGreen<'db>;
26621    fn missing(db: &'db dyn Database) -> Self::Green {
26622        TokenExternGreen(
26623            GreenNode {
26624                kind: SyntaxKind::TokenMissing,
26625                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26626            }
26627            .intern(db),
26628        )
26629    }
26630    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26631        match node.long(db).green.long(db).details {
26632            GreenNodeDetails::Token(_) => Self { node },
26633            GreenNodeDetails::Node { .. } => {
26634                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26635            }
26636        }
26637    }
26638    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26639        match node.long(db).green.long(db).details {
26640            GreenNodeDetails::Token(_) => Some(Self { node }),
26641            GreenNodeDetails::Node { .. } => None,
26642        }
26643    }
26644    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26645        self.node
26646    }
26647    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26648        TokenExternPtr(self.node.stable_ptr(db))
26649    }
26650}
26651#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26652pub struct TerminalExtern<'db> {
26653    node: SyntaxNode<'db>,
26654}
26655impl<'db> Terminal<'db> for TerminalExtern<'db> {
26656    const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26657    type TokenType = TokenExtern<'db>;
26658    fn new_green(
26659        db: &'db dyn Database,
26660        leading_trivia: TriviaGreen<'db>,
26661        token: <<TerminalExtern<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26662        trailing_trivia: TriviaGreen<'db>,
26663    ) -> Self::Green {
26664        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26665        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26666        TerminalExternGreen(
26667            GreenNode {
26668                kind: SyntaxKind::TerminalExtern,
26669                details: GreenNodeDetails::Node { children: children.into(), width },
26670            }
26671            .intern(db),
26672        )
26673    }
26674    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26675        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26676        else {
26677            unreachable!("Expected a node, not a token");
26678        };
26679        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26680    }
26681}
26682impl<'db> TerminalExtern<'db> {
26683    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26684        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26685    }
26686    pub fn token(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26687        TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26688    }
26689    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26690        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26691    }
26692}
26693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26694pub struct TerminalExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26695impl<'db> TerminalExternPtr<'db> {}
26696impl<'db> TypedStablePtr<'db> for TerminalExternPtr<'db> {
26697    type SyntaxNode = TerminalExtern<'db>;
26698    fn untyped(self) -> SyntaxStablePtrId<'db> {
26699        self.0
26700    }
26701    fn lookup(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
26702        TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26703    }
26704}
26705impl<'db> From<TerminalExternPtr<'db>> for SyntaxStablePtrId<'db> {
26706    fn from(ptr: TerminalExternPtr<'db>) -> Self {
26707        ptr.untyped()
26708    }
26709}
26710#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26711pub struct TerminalExternGreen<'db>(pub GreenId<'db>);
26712impl<'db> TypedSyntaxNode<'db> for TerminalExtern<'db> {
26713    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26714    type StablePtr = TerminalExternPtr<'db>;
26715    type Green = TerminalExternGreen<'db>;
26716    fn missing(db: &'db dyn Database) -> Self::Green {
26717        TerminalExternGreen(
26718            GreenNode {
26719                kind: SyntaxKind::TerminalExtern,
26720                details: GreenNodeDetails::Node {
26721                    children: [
26722                        Trivia::missing(db).0,
26723                        TokenExtern::missing(db).0,
26724                        Trivia::missing(db).0,
26725                    ]
26726                    .into(),
26727                    width: TextWidth::default(),
26728                },
26729            }
26730            .intern(db),
26731        )
26732    }
26733    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26734        let kind = node.kind(db);
26735        assert_eq!(
26736            kind,
26737            SyntaxKind::TerminalExtern,
26738            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26739            kind,
26740            SyntaxKind::TerminalExtern
26741        );
26742        Self { node }
26743    }
26744    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26745        let kind = node.kind(db);
26746        if kind == SyntaxKind::TerminalExtern {
26747            Some(Self::from_syntax_node(db, node))
26748        } else {
26749            None
26750        }
26751    }
26752    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26753        self.node
26754    }
26755    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26756        TerminalExternPtr(self.node.stable_ptr(db))
26757    }
26758}
26759#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26760pub struct TokenFalse<'db> {
26761    node: SyntaxNode<'db>,
26762}
26763impl<'db> Token<'db> for TokenFalse<'db> {
26764    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26765        TokenFalseGreen(
26766            GreenNode { kind: SyntaxKind::TokenFalse, details: GreenNodeDetails::Token(text) }
26767                .intern(db),
26768        )
26769    }
26770    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26771        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26772    }
26773}
26774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26775pub struct TokenFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26776impl<'db> TypedStablePtr<'db> for TokenFalsePtr<'db> {
26777    type SyntaxNode = TokenFalse<'db>;
26778    fn untyped(self) -> SyntaxStablePtrId<'db> {
26779        self.0
26780    }
26781    fn lookup(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26782        TokenFalse::from_syntax_node(db, self.0.lookup(db))
26783    }
26784}
26785impl<'db> From<TokenFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26786    fn from(ptr: TokenFalsePtr<'db>) -> Self {
26787        ptr.untyped()
26788    }
26789}
26790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26791pub struct TokenFalseGreen<'db>(pub GreenId<'db>);
26792impl<'db> TokenFalseGreen<'db> {
26793    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26794        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26795    }
26796}
26797impl<'db> TypedSyntaxNode<'db> for TokenFalse<'db> {
26798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26799    type StablePtr = TokenFalsePtr<'db>;
26800    type Green = TokenFalseGreen<'db>;
26801    fn missing(db: &'db dyn Database) -> Self::Green {
26802        TokenFalseGreen(
26803            GreenNode {
26804                kind: SyntaxKind::TokenMissing,
26805                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26806            }
26807            .intern(db),
26808        )
26809    }
26810    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26811        match node.long(db).green.long(db).details {
26812            GreenNodeDetails::Token(_) => Self { node },
26813            GreenNodeDetails::Node { .. } => {
26814                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26815            }
26816        }
26817    }
26818    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26819        match node.long(db).green.long(db).details {
26820            GreenNodeDetails::Token(_) => Some(Self { node }),
26821            GreenNodeDetails::Node { .. } => None,
26822        }
26823    }
26824    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26825        self.node
26826    }
26827    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26828        TokenFalsePtr(self.node.stable_ptr(db))
26829    }
26830}
26831#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26832pub struct TerminalFalse<'db> {
26833    node: SyntaxNode<'db>,
26834}
26835impl<'db> Terminal<'db> for TerminalFalse<'db> {
26836    const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26837    type TokenType = TokenFalse<'db>;
26838    fn new_green(
26839        db: &'db dyn Database,
26840        leading_trivia: TriviaGreen<'db>,
26841        token: <<TerminalFalse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26842        trailing_trivia: TriviaGreen<'db>,
26843    ) -> Self::Green {
26844        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26845        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26846        TerminalFalseGreen(
26847            GreenNode {
26848                kind: SyntaxKind::TerminalFalse,
26849                details: GreenNodeDetails::Node { children: children.into(), width },
26850            }
26851            .intern(db),
26852        )
26853    }
26854    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26855        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
26856        else {
26857            unreachable!("Expected a node, not a token");
26858        };
26859        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26860    }
26861}
26862impl<'db> TerminalFalse<'db> {
26863    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26864        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26865    }
26866    pub fn token(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26867        TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26868    }
26869    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26870        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26871    }
26872}
26873#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26874pub struct TerminalFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26875impl<'db> TerminalFalsePtr<'db> {}
26876impl<'db> TypedStablePtr<'db> for TerminalFalsePtr<'db> {
26877    type SyntaxNode = TerminalFalse<'db>;
26878    fn untyped(self) -> SyntaxStablePtrId<'db> {
26879        self.0
26880    }
26881    fn lookup(&self, db: &'db dyn Database) -> TerminalFalse<'db> {
26882        TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26883    }
26884}
26885impl<'db> From<TerminalFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26886    fn from(ptr: TerminalFalsePtr<'db>) -> Self {
26887        ptr.untyped()
26888    }
26889}
26890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26891pub struct TerminalFalseGreen<'db>(pub GreenId<'db>);
26892impl<'db> TypedSyntaxNode<'db> for TerminalFalse<'db> {
26893    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26894    type StablePtr = TerminalFalsePtr<'db>;
26895    type Green = TerminalFalseGreen<'db>;
26896    fn missing(db: &'db dyn Database) -> Self::Green {
26897        TerminalFalseGreen(
26898            GreenNode {
26899                kind: SyntaxKind::TerminalFalse,
26900                details: GreenNodeDetails::Node {
26901                    children: [
26902                        Trivia::missing(db).0,
26903                        TokenFalse::missing(db).0,
26904                        Trivia::missing(db).0,
26905                    ]
26906                    .into(),
26907                    width: TextWidth::default(),
26908                },
26909            }
26910            .intern(db),
26911        )
26912    }
26913    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26914        let kind = node.kind(db);
26915        assert_eq!(
26916            kind,
26917            SyntaxKind::TerminalFalse,
26918            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26919            kind,
26920            SyntaxKind::TerminalFalse
26921        );
26922        Self { node }
26923    }
26924    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26925        let kind = node.kind(db);
26926        if kind == SyntaxKind::TerminalFalse {
26927            Some(Self::from_syntax_node(db, node))
26928        } else {
26929            None
26930        }
26931    }
26932    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26933        self.node
26934    }
26935    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26936        TerminalFalsePtr(self.node.stable_ptr(db))
26937    }
26938}
26939#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26940pub struct TokenFunction<'db> {
26941    node: SyntaxNode<'db>,
26942}
26943impl<'db> Token<'db> for TokenFunction<'db> {
26944    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26945        TokenFunctionGreen(
26946            GreenNode { kind: SyntaxKind::TokenFunction, details: GreenNodeDetails::Token(text) }
26947                .intern(db),
26948        )
26949    }
26950    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26951        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
26952    }
26953}
26954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26955pub struct TokenFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26956impl<'db> TypedStablePtr<'db> for TokenFunctionPtr<'db> {
26957    type SyntaxNode = TokenFunction<'db>;
26958    fn untyped(self) -> SyntaxStablePtrId<'db> {
26959        self.0
26960    }
26961    fn lookup(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26962        TokenFunction::from_syntax_node(db, self.0.lookup(db))
26963    }
26964}
26965impl<'db> From<TokenFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26966    fn from(ptr: TokenFunctionPtr<'db>) -> Self {
26967        ptr.untyped()
26968    }
26969}
26970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26971pub struct TokenFunctionGreen<'db>(pub GreenId<'db>);
26972impl<'db> TokenFunctionGreen<'db> {
26973    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26974        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26975    }
26976}
26977impl<'db> TypedSyntaxNode<'db> for TokenFunction<'db> {
26978    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
26979    type StablePtr = TokenFunctionPtr<'db>;
26980    type Green = TokenFunctionGreen<'db>;
26981    fn missing(db: &'db dyn Database) -> Self::Green {
26982        TokenFunctionGreen(
26983            GreenNode {
26984                kind: SyntaxKind::TokenMissing,
26985                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26986            }
26987            .intern(db),
26988        )
26989    }
26990    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26991        match node.long(db).green.long(db).details {
26992            GreenNodeDetails::Token(_) => Self { node },
26993            GreenNodeDetails::Node { .. } => {
26994                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
26995            }
26996        }
26997    }
26998    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26999        match node.long(db).green.long(db).details {
27000            GreenNodeDetails::Token(_) => Some(Self { node }),
27001            GreenNodeDetails::Node { .. } => None,
27002        }
27003    }
27004    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27005        self.node
27006    }
27007    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27008        TokenFunctionPtr(self.node.stable_ptr(db))
27009    }
27010}
27011#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27012pub struct TerminalFunction<'db> {
27013    node: SyntaxNode<'db>,
27014}
27015impl<'db> Terminal<'db> for TerminalFunction<'db> {
27016    const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
27017    type TokenType = TokenFunction<'db>;
27018    fn new_green(
27019        db: &'db dyn Database,
27020        leading_trivia: TriviaGreen<'db>,
27021        token: <<TerminalFunction<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27022        trailing_trivia: TriviaGreen<'db>,
27023    ) -> Self::Green {
27024        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27025        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27026        TerminalFunctionGreen(
27027            GreenNode {
27028                kind: SyntaxKind::TerminalFunction,
27029                details: GreenNodeDetails::Node { children: children.into(), width },
27030            }
27031            .intern(db),
27032        )
27033    }
27034    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27035        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27036        else {
27037            unreachable!("Expected a node, not a token");
27038        };
27039        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27040    }
27041}
27042impl<'db> TerminalFunction<'db> {
27043    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27044        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27045    }
27046    pub fn token(&self, db: &'db dyn Database) -> TokenFunction<'db> {
27047        TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
27048    }
27049    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27050        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27051    }
27052}
27053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27054pub struct TerminalFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
27055impl<'db> TerminalFunctionPtr<'db> {}
27056impl<'db> TypedStablePtr<'db> for TerminalFunctionPtr<'db> {
27057    type SyntaxNode = TerminalFunction<'db>;
27058    fn untyped(self) -> SyntaxStablePtrId<'db> {
27059        self.0
27060    }
27061    fn lookup(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
27062        TerminalFunction::from_syntax_node(db, self.0.lookup(db))
27063    }
27064}
27065impl<'db> From<TerminalFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
27066    fn from(ptr: TerminalFunctionPtr<'db>) -> Self {
27067        ptr.untyped()
27068    }
27069}
27070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27071pub struct TerminalFunctionGreen<'db>(pub GreenId<'db>);
27072impl<'db> TypedSyntaxNode<'db> for TerminalFunction<'db> {
27073    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
27074    type StablePtr = TerminalFunctionPtr<'db>;
27075    type Green = TerminalFunctionGreen<'db>;
27076    fn missing(db: &'db dyn Database) -> Self::Green {
27077        TerminalFunctionGreen(
27078            GreenNode {
27079                kind: SyntaxKind::TerminalFunction,
27080                details: GreenNodeDetails::Node {
27081                    children: [
27082                        Trivia::missing(db).0,
27083                        TokenFunction::missing(db).0,
27084                        Trivia::missing(db).0,
27085                    ]
27086                    .into(),
27087                    width: TextWidth::default(),
27088                },
27089            }
27090            .intern(db),
27091        )
27092    }
27093    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27094        let kind = node.kind(db);
27095        assert_eq!(
27096            kind,
27097            SyntaxKind::TerminalFunction,
27098            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27099            kind,
27100            SyntaxKind::TerminalFunction
27101        );
27102        Self { node }
27103    }
27104    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27105        let kind = node.kind(db);
27106        if kind == SyntaxKind::TerminalFunction {
27107            Some(Self::from_syntax_node(db, node))
27108        } else {
27109            None
27110        }
27111    }
27112    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27113        self.node
27114    }
27115    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27116        TerminalFunctionPtr(self.node.stable_ptr(db))
27117    }
27118}
27119#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27120pub struct TokenIf<'db> {
27121    node: SyntaxNode<'db>,
27122}
27123impl<'db> Token<'db> for TokenIf<'db> {
27124    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27125        TokenIfGreen(
27126            GreenNode { kind: SyntaxKind::TokenIf, details: GreenNodeDetails::Token(text) }
27127                .intern(db),
27128        )
27129    }
27130    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27131        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27132    }
27133}
27134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27135pub struct TokenIfPtr<'db>(pub SyntaxStablePtrId<'db>);
27136impl<'db> TypedStablePtr<'db> for TokenIfPtr<'db> {
27137    type SyntaxNode = TokenIf<'db>;
27138    fn untyped(self) -> SyntaxStablePtrId<'db> {
27139        self.0
27140    }
27141    fn lookup(&self, db: &'db dyn Database) -> TokenIf<'db> {
27142        TokenIf::from_syntax_node(db, self.0.lookup(db))
27143    }
27144}
27145impl<'db> From<TokenIfPtr<'db>> for SyntaxStablePtrId<'db> {
27146    fn from(ptr: TokenIfPtr<'db>) -> Self {
27147        ptr.untyped()
27148    }
27149}
27150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27151pub struct TokenIfGreen<'db>(pub GreenId<'db>);
27152impl<'db> TokenIfGreen<'db> {
27153    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27154        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27155    }
27156}
27157impl<'db> TypedSyntaxNode<'db> for TokenIf<'db> {
27158    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
27159    type StablePtr = TokenIfPtr<'db>;
27160    type Green = TokenIfGreen<'db>;
27161    fn missing(db: &'db dyn Database) -> Self::Green {
27162        TokenIfGreen(
27163            GreenNode {
27164                kind: SyntaxKind::TokenMissing,
27165                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27166            }
27167            .intern(db),
27168        )
27169    }
27170    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27171        match node.long(db).green.long(db).details {
27172            GreenNodeDetails::Token(_) => Self { node },
27173            GreenNodeDetails::Node { .. } => {
27174                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
27175            }
27176        }
27177    }
27178    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27179        match node.long(db).green.long(db).details {
27180            GreenNodeDetails::Token(_) => Some(Self { node }),
27181            GreenNodeDetails::Node { .. } => None,
27182        }
27183    }
27184    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27185        self.node
27186    }
27187    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27188        TokenIfPtr(self.node.stable_ptr(db))
27189    }
27190}
27191#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27192pub struct TerminalIf<'db> {
27193    node: SyntaxNode<'db>,
27194}
27195impl<'db> Terminal<'db> for TerminalIf<'db> {
27196    const KIND: SyntaxKind = SyntaxKind::TerminalIf;
27197    type TokenType = TokenIf<'db>;
27198    fn new_green(
27199        db: &'db dyn Database,
27200        leading_trivia: TriviaGreen<'db>,
27201        token: <<TerminalIf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27202        trailing_trivia: TriviaGreen<'db>,
27203    ) -> Self::Green {
27204        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27205        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27206        TerminalIfGreen(
27207            GreenNode {
27208                kind: SyntaxKind::TerminalIf,
27209                details: GreenNodeDetails::Node { children: children.into(), width },
27210            }
27211            .intern(db),
27212        )
27213    }
27214    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27215        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27216        else {
27217            unreachable!("Expected a node, not a token");
27218        };
27219        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27220    }
27221}
27222impl<'db> TerminalIf<'db> {
27223    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27224        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27225    }
27226    pub fn token(&self, db: &'db dyn Database) -> TokenIf<'db> {
27227        TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
27228    }
27229    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27230        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27231    }
27232}
27233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27234pub struct TerminalIfPtr<'db>(pub SyntaxStablePtrId<'db>);
27235impl<'db> TerminalIfPtr<'db> {}
27236impl<'db> TypedStablePtr<'db> for TerminalIfPtr<'db> {
27237    type SyntaxNode = TerminalIf<'db>;
27238    fn untyped(self) -> SyntaxStablePtrId<'db> {
27239        self.0
27240    }
27241    fn lookup(&self, db: &'db dyn Database) -> TerminalIf<'db> {
27242        TerminalIf::from_syntax_node(db, self.0.lookup(db))
27243    }
27244}
27245impl<'db> From<TerminalIfPtr<'db>> for SyntaxStablePtrId<'db> {
27246    fn from(ptr: TerminalIfPtr<'db>) -> Self {
27247        ptr.untyped()
27248    }
27249}
27250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27251pub struct TerminalIfGreen<'db>(pub GreenId<'db>);
27252impl<'db> TypedSyntaxNode<'db> for TerminalIf<'db> {
27253    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
27254    type StablePtr = TerminalIfPtr<'db>;
27255    type Green = TerminalIfGreen<'db>;
27256    fn missing(db: &'db dyn Database) -> Self::Green {
27257        TerminalIfGreen(
27258            GreenNode {
27259                kind: SyntaxKind::TerminalIf,
27260                details: GreenNodeDetails::Node {
27261                    children: [
27262                        Trivia::missing(db).0,
27263                        TokenIf::missing(db).0,
27264                        Trivia::missing(db).0,
27265                    ]
27266                    .into(),
27267                    width: TextWidth::default(),
27268                },
27269            }
27270            .intern(db),
27271        )
27272    }
27273    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27274        let kind = node.kind(db);
27275        assert_eq!(
27276            kind,
27277            SyntaxKind::TerminalIf,
27278            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27279            kind,
27280            SyntaxKind::TerminalIf
27281        );
27282        Self { node }
27283    }
27284    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27285        let kind = node.kind(db);
27286        if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
27287    }
27288    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27289        self.node
27290    }
27291    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27292        TerminalIfPtr(self.node.stable_ptr(db))
27293    }
27294}
27295#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27296pub struct TokenWhile<'db> {
27297    node: SyntaxNode<'db>,
27298}
27299impl<'db> Token<'db> for TokenWhile<'db> {
27300    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27301        TokenWhileGreen(
27302            GreenNode { kind: SyntaxKind::TokenWhile, details: GreenNodeDetails::Token(text) }
27303                .intern(db),
27304        )
27305    }
27306    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27307        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27308    }
27309}
27310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27311pub struct TokenWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27312impl<'db> TypedStablePtr<'db> for TokenWhilePtr<'db> {
27313    type SyntaxNode = TokenWhile<'db>;
27314    fn untyped(self) -> SyntaxStablePtrId<'db> {
27315        self.0
27316    }
27317    fn lookup(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27318        TokenWhile::from_syntax_node(db, self.0.lookup(db))
27319    }
27320}
27321impl<'db> From<TokenWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27322    fn from(ptr: TokenWhilePtr<'db>) -> Self {
27323        ptr.untyped()
27324    }
27325}
27326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27327pub struct TokenWhileGreen<'db>(pub GreenId<'db>);
27328impl<'db> TokenWhileGreen<'db> {
27329    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27330        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27331    }
27332}
27333impl<'db> TypedSyntaxNode<'db> for TokenWhile<'db> {
27334    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
27335    type StablePtr = TokenWhilePtr<'db>;
27336    type Green = TokenWhileGreen<'db>;
27337    fn missing(db: &'db dyn Database) -> Self::Green {
27338        TokenWhileGreen(
27339            GreenNode {
27340                kind: SyntaxKind::TokenMissing,
27341                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27342            }
27343            .intern(db),
27344        )
27345    }
27346    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27347        match node.long(db).green.long(db).details {
27348            GreenNodeDetails::Token(_) => Self { node },
27349            GreenNodeDetails::Node { .. } => {
27350                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
27351            }
27352        }
27353    }
27354    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27355        match node.long(db).green.long(db).details {
27356            GreenNodeDetails::Token(_) => Some(Self { node }),
27357            GreenNodeDetails::Node { .. } => None,
27358        }
27359    }
27360    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27361        self.node
27362    }
27363    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27364        TokenWhilePtr(self.node.stable_ptr(db))
27365    }
27366}
27367#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27368pub struct TerminalWhile<'db> {
27369    node: SyntaxNode<'db>,
27370}
27371impl<'db> Terminal<'db> for TerminalWhile<'db> {
27372    const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
27373    type TokenType = TokenWhile<'db>;
27374    fn new_green(
27375        db: &'db dyn Database,
27376        leading_trivia: TriviaGreen<'db>,
27377        token: <<TerminalWhile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27378        trailing_trivia: TriviaGreen<'db>,
27379    ) -> Self::Green {
27380        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27381        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27382        TerminalWhileGreen(
27383            GreenNode {
27384                kind: SyntaxKind::TerminalWhile,
27385                details: GreenNodeDetails::Node { children: children.into(), width },
27386            }
27387            .intern(db),
27388        )
27389    }
27390    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27391        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27392        else {
27393            unreachable!("Expected a node, not a token");
27394        };
27395        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27396    }
27397}
27398impl<'db> TerminalWhile<'db> {
27399    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27400        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27401    }
27402    pub fn token(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27403        TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
27404    }
27405    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27406        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27407    }
27408}
27409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27410pub struct TerminalWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27411impl<'db> TerminalWhilePtr<'db> {}
27412impl<'db> TypedStablePtr<'db> for TerminalWhilePtr<'db> {
27413    type SyntaxNode = TerminalWhile<'db>;
27414    fn untyped(self) -> SyntaxStablePtrId<'db> {
27415        self.0
27416    }
27417    fn lookup(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
27418        TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27419    }
27420}
27421impl<'db> From<TerminalWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27422    fn from(ptr: TerminalWhilePtr<'db>) -> Self {
27423        ptr.untyped()
27424    }
27425}
27426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27427pub struct TerminalWhileGreen<'db>(pub GreenId<'db>);
27428impl<'db> TypedSyntaxNode<'db> for TerminalWhile<'db> {
27429    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27430    type StablePtr = TerminalWhilePtr<'db>;
27431    type Green = TerminalWhileGreen<'db>;
27432    fn missing(db: &'db dyn Database) -> Self::Green {
27433        TerminalWhileGreen(
27434            GreenNode {
27435                kind: SyntaxKind::TerminalWhile,
27436                details: GreenNodeDetails::Node {
27437                    children: [
27438                        Trivia::missing(db).0,
27439                        TokenWhile::missing(db).0,
27440                        Trivia::missing(db).0,
27441                    ]
27442                    .into(),
27443                    width: TextWidth::default(),
27444                },
27445            }
27446            .intern(db),
27447        )
27448    }
27449    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27450        let kind = node.kind(db);
27451        assert_eq!(
27452            kind,
27453            SyntaxKind::TerminalWhile,
27454            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27455            kind,
27456            SyntaxKind::TerminalWhile
27457        );
27458        Self { node }
27459    }
27460    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27461        let kind = node.kind(db);
27462        if kind == SyntaxKind::TerminalWhile {
27463            Some(Self::from_syntax_node(db, node))
27464        } else {
27465            None
27466        }
27467    }
27468    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27469        self.node
27470    }
27471    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27472        TerminalWhilePtr(self.node.stable_ptr(db))
27473    }
27474}
27475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27476pub struct TokenFor<'db> {
27477    node: SyntaxNode<'db>,
27478}
27479impl<'db> Token<'db> for TokenFor<'db> {
27480    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27481        TokenForGreen(
27482            GreenNode { kind: SyntaxKind::TokenFor, details: GreenNodeDetails::Token(text) }
27483                .intern(db),
27484        )
27485    }
27486    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27487        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27488    }
27489}
27490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27491pub struct TokenForPtr<'db>(pub SyntaxStablePtrId<'db>);
27492impl<'db> TypedStablePtr<'db> for TokenForPtr<'db> {
27493    type SyntaxNode = TokenFor<'db>;
27494    fn untyped(self) -> SyntaxStablePtrId<'db> {
27495        self.0
27496    }
27497    fn lookup(&self, db: &'db dyn Database) -> TokenFor<'db> {
27498        TokenFor::from_syntax_node(db, self.0.lookup(db))
27499    }
27500}
27501impl<'db> From<TokenForPtr<'db>> for SyntaxStablePtrId<'db> {
27502    fn from(ptr: TokenForPtr<'db>) -> Self {
27503        ptr.untyped()
27504    }
27505}
27506#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27507pub struct TokenForGreen<'db>(pub GreenId<'db>);
27508impl<'db> TokenForGreen<'db> {
27509    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27510        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27511    }
27512}
27513impl<'db> TypedSyntaxNode<'db> for TokenFor<'db> {
27514    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27515    type StablePtr = TokenForPtr<'db>;
27516    type Green = TokenForGreen<'db>;
27517    fn missing(db: &'db dyn Database) -> Self::Green {
27518        TokenForGreen(
27519            GreenNode {
27520                kind: SyntaxKind::TokenMissing,
27521                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27522            }
27523            .intern(db),
27524        )
27525    }
27526    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27527        match node.long(db).green.long(db).details {
27528            GreenNodeDetails::Token(_) => Self { node },
27529            GreenNodeDetails::Node { .. } => {
27530                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27531            }
27532        }
27533    }
27534    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27535        match node.long(db).green.long(db).details {
27536            GreenNodeDetails::Token(_) => Some(Self { node }),
27537            GreenNodeDetails::Node { .. } => None,
27538        }
27539    }
27540    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27541        self.node
27542    }
27543    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27544        TokenForPtr(self.node.stable_ptr(db))
27545    }
27546}
27547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27548pub struct TerminalFor<'db> {
27549    node: SyntaxNode<'db>,
27550}
27551impl<'db> Terminal<'db> for TerminalFor<'db> {
27552    const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27553    type TokenType = TokenFor<'db>;
27554    fn new_green(
27555        db: &'db dyn Database,
27556        leading_trivia: TriviaGreen<'db>,
27557        token: <<TerminalFor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27558        trailing_trivia: TriviaGreen<'db>,
27559    ) -> Self::Green {
27560        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27561        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27562        TerminalForGreen(
27563            GreenNode {
27564                kind: SyntaxKind::TerminalFor,
27565                details: GreenNodeDetails::Node { children: children.into(), width },
27566            }
27567            .intern(db),
27568        )
27569    }
27570    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27571        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27572        else {
27573            unreachable!("Expected a node, not a token");
27574        };
27575        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27576    }
27577}
27578impl<'db> TerminalFor<'db> {
27579    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27580        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27581    }
27582    pub fn token(&self, db: &'db dyn Database) -> TokenFor<'db> {
27583        TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27584    }
27585    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27586        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27587    }
27588}
27589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27590pub struct TerminalForPtr<'db>(pub SyntaxStablePtrId<'db>);
27591impl<'db> TerminalForPtr<'db> {}
27592impl<'db> TypedStablePtr<'db> for TerminalForPtr<'db> {
27593    type SyntaxNode = TerminalFor<'db>;
27594    fn untyped(self) -> SyntaxStablePtrId<'db> {
27595        self.0
27596    }
27597    fn lookup(&self, db: &'db dyn Database) -> TerminalFor<'db> {
27598        TerminalFor::from_syntax_node(db, self.0.lookup(db))
27599    }
27600}
27601impl<'db> From<TerminalForPtr<'db>> for SyntaxStablePtrId<'db> {
27602    fn from(ptr: TerminalForPtr<'db>) -> Self {
27603        ptr.untyped()
27604    }
27605}
27606#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27607pub struct TerminalForGreen<'db>(pub GreenId<'db>);
27608impl<'db> TypedSyntaxNode<'db> for TerminalFor<'db> {
27609    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27610    type StablePtr = TerminalForPtr<'db>;
27611    type Green = TerminalForGreen<'db>;
27612    fn missing(db: &'db dyn Database) -> Self::Green {
27613        TerminalForGreen(
27614            GreenNode {
27615                kind: SyntaxKind::TerminalFor,
27616                details: GreenNodeDetails::Node {
27617                    children: [
27618                        Trivia::missing(db).0,
27619                        TokenFor::missing(db).0,
27620                        Trivia::missing(db).0,
27621                    ]
27622                    .into(),
27623                    width: TextWidth::default(),
27624                },
27625            }
27626            .intern(db),
27627        )
27628    }
27629    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27630        let kind = node.kind(db);
27631        assert_eq!(
27632            kind,
27633            SyntaxKind::TerminalFor,
27634            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27635            kind,
27636            SyntaxKind::TerminalFor
27637        );
27638        Self { node }
27639    }
27640    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27641        let kind = node.kind(db);
27642        if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27643    }
27644    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27645        self.node
27646    }
27647    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27648        TerminalForPtr(self.node.stable_ptr(db))
27649    }
27650}
27651#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27652pub struct TokenLoop<'db> {
27653    node: SyntaxNode<'db>,
27654}
27655impl<'db> Token<'db> for TokenLoop<'db> {
27656    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27657        TokenLoopGreen(
27658            GreenNode { kind: SyntaxKind::TokenLoop, details: GreenNodeDetails::Token(text) }
27659                .intern(db),
27660        )
27661    }
27662    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27663        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27664    }
27665}
27666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27667pub struct TokenLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27668impl<'db> TypedStablePtr<'db> for TokenLoopPtr<'db> {
27669    type SyntaxNode = TokenLoop<'db>;
27670    fn untyped(self) -> SyntaxStablePtrId<'db> {
27671        self.0
27672    }
27673    fn lookup(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27674        TokenLoop::from_syntax_node(db, self.0.lookup(db))
27675    }
27676}
27677impl<'db> From<TokenLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27678    fn from(ptr: TokenLoopPtr<'db>) -> Self {
27679        ptr.untyped()
27680    }
27681}
27682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27683pub struct TokenLoopGreen<'db>(pub GreenId<'db>);
27684impl<'db> TokenLoopGreen<'db> {
27685    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27686        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27687    }
27688}
27689impl<'db> TypedSyntaxNode<'db> for TokenLoop<'db> {
27690    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27691    type StablePtr = TokenLoopPtr<'db>;
27692    type Green = TokenLoopGreen<'db>;
27693    fn missing(db: &'db dyn Database) -> Self::Green {
27694        TokenLoopGreen(
27695            GreenNode {
27696                kind: SyntaxKind::TokenMissing,
27697                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27698            }
27699            .intern(db),
27700        )
27701    }
27702    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27703        match node.long(db).green.long(db).details {
27704            GreenNodeDetails::Token(_) => Self { node },
27705            GreenNodeDetails::Node { .. } => {
27706                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27707            }
27708        }
27709    }
27710    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27711        match node.long(db).green.long(db).details {
27712            GreenNodeDetails::Token(_) => Some(Self { node }),
27713            GreenNodeDetails::Node { .. } => None,
27714        }
27715    }
27716    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27717        self.node
27718    }
27719    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27720        TokenLoopPtr(self.node.stable_ptr(db))
27721    }
27722}
27723#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27724pub struct TerminalLoop<'db> {
27725    node: SyntaxNode<'db>,
27726}
27727impl<'db> Terminal<'db> for TerminalLoop<'db> {
27728    const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27729    type TokenType = TokenLoop<'db>;
27730    fn new_green(
27731        db: &'db dyn Database,
27732        leading_trivia: TriviaGreen<'db>,
27733        token: <<TerminalLoop<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27734        trailing_trivia: TriviaGreen<'db>,
27735    ) -> Self::Green {
27736        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27737        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27738        TerminalLoopGreen(
27739            GreenNode {
27740                kind: SyntaxKind::TerminalLoop,
27741                details: GreenNodeDetails::Node { children: children.into(), width },
27742            }
27743            .intern(db),
27744        )
27745    }
27746    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27747        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27748        else {
27749            unreachable!("Expected a node, not a token");
27750        };
27751        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27752    }
27753}
27754impl<'db> TerminalLoop<'db> {
27755    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27756        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27757    }
27758    pub fn token(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27759        TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27760    }
27761    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27762        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27763    }
27764}
27765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27766pub struct TerminalLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27767impl<'db> TerminalLoopPtr<'db> {}
27768impl<'db> TypedStablePtr<'db> for TerminalLoopPtr<'db> {
27769    type SyntaxNode = TerminalLoop<'db>;
27770    fn untyped(self) -> SyntaxStablePtrId<'db> {
27771        self.0
27772    }
27773    fn lookup(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
27774        TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27775    }
27776}
27777impl<'db> From<TerminalLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27778    fn from(ptr: TerminalLoopPtr<'db>) -> Self {
27779        ptr.untyped()
27780    }
27781}
27782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27783pub struct TerminalLoopGreen<'db>(pub GreenId<'db>);
27784impl<'db> TypedSyntaxNode<'db> for TerminalLoop<'db> {
27785    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27786    type StablePtr = TerminalLoopPtr<'db>;
27787    type Green = TerminalLoopGreen<'db>;
27788    fn missing(db: &'db dyn Database) -> Self::Green {
27789        TerminalLoopGreen(
27790            GreenNode {
27791                kind: SyntaxKind::TerminalLoop,
27792                details: GreenNodeDetails::Node {
27793                    children: [
27794                        Trivia::missing(db).0,
27795                        TokenLoop::missing(db).0,
27796                        Trivia::missing(db).0,
27797                    ]
27798                    .into(),
27799                    width: TextWidth::default(),
27800                },
27801            }
27802            .intern(db),
27803        )
27804    }
27805    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27806        let kind = node.kind(db);
27807        assert_eq!(
27808            kind,
27809            SyntaxKind::TerminalLoop,
27810            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27811            kind,
27812            SyntaxKind::TerminalLoop
27813        );
27814        Self { node }
27815    }
27816    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27817        let kind = node.kind(db);
27818        if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27819    }
27820    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27821        self.node
27822    }
27823    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27824        TerminalLoopPtr(self.node.stable_ptr(db))
27825    }
27826}
27827#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27828pub struct TokenImpl<'db> {
27829    node: SyntaxNode<'db>,
27830}
27831impl<'db> Token<'db> for TokenImpl<'db> {
27832    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27833        TokenImplGreen(
27834            GreenNode { kind: SyntaxKind::TokenImpl, details: GreenNodeDetails::Token(text) }
27835                .intern(db),
27836        )
27837    }
27838    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27839        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
27840    }
27841}
27842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27843pub struct TokenImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27844impl<'db> TypedStablePtr<'db> for TokenImplPtr<'db> {
27845    type SyntaxNode = TokenImpl<'db>;
27846    fn untyped(self) -> SyntaxStablePtrId<'db> {
27847        self.0
27848    }
27849    fn lookup(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27850        TokenImpl::from_syntax_node(db, self.0.lookup(db))
27851    }
27852}
27853impl<'db> From<TokenImplPtr<'db>> for SyntaxStablePtrId<'db> {
27854    fn from(ptr: TokenImplPtr<'db>) -> Self {
27855        ptr.untyped()
27856    }
27857}
27858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27859pub struct TokenImplGreen<'db>(pub GreenId<'db>);
27860impl<'db> TokenImplGreen<'db> {
27861    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27862        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27863    }
27864}
27865impl<'db> TypedSyntaxNode<'db> for TokenImpl<'db> {
27866    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
27867    type StablePtr = TokenImplPtr<'db>;
27868    type Green = TokenImplGreen<'db>;
27869    fn missing(db: &'db dyn Database) -> Self::Green {
27870        TokenImplGreen(
27871            GreenNode {
27872                kind: SyntaxKind::TokenMissing,
27873                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27874            }
27875            .intern(db),
27876        )
27877    }
27878    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27879        match node.long(db).green.long(db).details {
27880            GreenNodeDetails::Token(_) => Self { node },
27881            GreenNodeDetails::Node { .. } => {
27882                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
27883            }
27884        }
27885    }
27886    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27887        match node.long(db).green.long(db).details {
27888            GreenNodeDetails::Token(_) => Some(Self { node }),
27889            GreenNodeDetails::Node { .. } => None,
27890        }
27891    }
27892    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27893        self.node
27894    }
27895    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27896        TokenImplPtr(self.node.stable_ptr(db))
27897    }
27898}
27899#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27900pub struct TerminalImpl<'db> {
27901    node: SyntaxNode<'db>,
27902}
27903impl<'db> Terminal<'db> for TerminalImpl<'db> {
27904    const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
27905    type TokenType = TokenImpl<'db>;
27906    fn new_green(
27907        db: &'db dyn Database,
27908        leading_trivia: TriviaGreen<'db>,
27909        token: <<TerminalImpl<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27910        trailing_trivia: TriviaGreen<'db>,
27911    ) -> Self::Green {
27912        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27913        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27914        TerminalImplGreen(
27915            GreenNode {
27916                kind: SyntaxKind::TerminalImpl,
27917                details: GreenNodeDetails::Node { children: children.into(), width },
27918            }
27919            .intern(db),
27920        )
27921    }
27922    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27923        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
27924        else {
27925            unreachable!("Expected a node, not a token");
27926        };
27927        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27928    }
27929}
27930impl<'db> TerminalImpl<'db> {
27931    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27932        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27933    }
27934    pub fn token(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27935        TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
27936    }
27937    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27938        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27939    }
27940}
27941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27942pub struct TerminalImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27943impl<'db> TerminalImplPtr<'db> {}
27944impl<'db> TypedStablePtr<'db> for TerminalImplPtr<'db> {
27945    type SyntaxNode = TerminalImpl<'db>;
27946    fn untyped(self) -> SyntaxStablePtrId<'db> {
27947        self.0
27948    }
27949    fn lookup(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
27950        TerminalImpl::from_syntax_node(db, self.0.lookup(db))
27951    }
27952}
27953impl<'db> From<TerminalImplPtr<'db>> for SyntaxStablePtrId<'db> {
27954    fn from(ptr: TerminalImplPtr<'db>) -> Self {
27955        ptr.untyped()
27956    }
27957}
27958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27959pub struct TerminalImplGreen<'db>(pub GreenId<'db>);
27960impl<'db> TypedSyntaxNode<'db> for TerminalImpl<'db> {
27961    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
27962    type StablePtr = TerminalImplPtr<'db>;
27963    type Green = TerminalImplGreen<'db>;
27964    fn missing(db: &'db dyn Database) -> Self::Green {
27965        TerminalImplGreen(
27966            GreenNode {
27967                kind: SyntaxKind::TerminalImpl,
27968                details: GreenNodeDetails::Node {
27969                    children: [
27970                        Trivia::missing(db).0,
27971                        TokenImpl::missing(db).0,
27972                        Trivia::missing(db).0,
27973                    ]
27974                    .into(),
27975                    width: TextWidth::default(),
27976                },
27977            }
27978            .intern(db),
27979        )
27980    }
27981    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27982        let kind = node.kind(db);
27983        assert_eq!(
27984            kind,
27985            SyntaxKind::TerminalImpl,
27986            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27987            kind,
27988            SyntaxKind::TerminalImpl
27989        );
27990        Self { node }
27991    }
27992    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27993        let kind = node.kind(db);
27994        if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
27995    }
27996    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27997        self.node
27998    }
27999    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28000        TerminalImplPtr(self.node.stable_ptr(db))
28001    }
28002}
28003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28004pub struct TokenImplicits<'db> {
28005    node: SyntaxNode<'db>,
28006}
28007impl<'db> Token<'db> for TokenImplicits<'db> {
28008    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28009        TokenImplicitsGreen(
28010            GreenNode { kind: SyntaxKind::TokenImplicits, details: GreenNodeDetails::Token(text) }
28011                .intern(db),
28012        )
28013    }
28014    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28015        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28016    }
28017}
28018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28019pub struct TokenImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
28020impl<'db> TypedStablePtr<'db> for TokenImplicitsPtr<'db> {
28021    type SyntaxNode = TokenImplicits<'db>;
28022    fn untyped(self) -> SyntaxStablePtrId<'db> {
28023        self.0
28024    }
28025    fn lookup(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
28026        TokenImplicits::from_syntax_node(db, self.0.lookup(db))
28027    }
28028}
28029impl<'db> From<TokenImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
28030    fn from(ptr: TokenImplicitsPtr<'db>) -> Self {
28031        ptr.untyped()
28032    }
28033}
28034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28035pub struct TokenImplicitsGreen<'db>(pub GreenId<'db>);
28036impl<'db> TokenImplicitsGreen<'db> {
28037    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28038        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28039    }
28040}
28041impl<'db> TypedSyntaxNode<'db> for TokenImplicits<'db> {
28042    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
28043    type StablePtr = TokenImplicitsPtr<'db>;
28044    type Green = TokenImplicitsGreen<'db>;
28045    fn missing(db: &'db dyn Database) -> Self::Green {
28046        TokenImplicitsGreen(
28047            GreenNode {
28048                kind: SyntaxKind::TokenMissing,
28049                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28050            }
28051            .intern(db),
28052        )
28053    }
28054    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28055        match node.long(db).green.long(db).details {
28056            GreenNodeDetails::Token(_) => Self { node },
28057            GreenNodeDetails::Node { .. } => {
28058                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
28059            }
28060        }
28061    }
28062    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28063        match node.long(db).green.long(db).details {
28064            GreenNodeDetails::Token(_) => Some(Self { node }),
28065            GreenNodeDetails::Node { .. } => None,
28066        }
28067    }
28068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28069        self.node
28070    }
28071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28072        TokenImplicitsPtr(self.node.stable_ptr(db))
28073    }
28074}
28075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28076pub struct TerminalImplicits<'db> {
28077    node: SyntaxNode<'db>,
28078}
28079impl<'db> Terminal<'db> for TerminalImplicits<'db> {
28080    const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
28081    type TokenType = TokenImplicits<'db>;
28082    fn new_green(
28083        db: &'db dyn Database,
28084        leading_trivia: TriviaGreen<'db>,
28085        token: <<TerminalImplicits<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28086        trailing_trivia: TriviaGreen<'db>,
28087    ) -> Self::Green {
28088        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28089        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28090        TerminalImplicitsGreen(
28091            GreenNode {
28092                kind: SyntaxKind::TerminalImplicits,
28093                details: GreenNodeDetails::Node { children: children.into(), width },
28094            }
28095            .intern(db),
28096        )
28097    }
28098    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28099        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28100        else {
28101            unreachable!("Expected a node, not a token");
28102        };
28103        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28104    }
28105}
28106impl<'db> TerminalImplicits<'db> {
28107    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28108        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28109    }
28110    pub fn token(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
28111        TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
28112    }
28113    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28114        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28115    }
28116}
28117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28118pub struct TerminalImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
28119impl<'db> TerminalImplicitsPtr<'db> {}
28120impl<'db> TypedStablePtr<'db> for TerminalImplicitsPtr<'db> {
28121    type SyntaxNode = TerminalImplicits<'db>;
28122    fn untyped(self) -> SyntaxStablePtrId<'db> {
28123        self.0
28124    }
28125    fn lookup(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
28126        TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
28127    }
28128}
28129impl<'db> From<TerminalImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
28130    fn from(ptr: TerminalImplicitsPtr<'db>) -> Self {
28131        ptr.untyped()
28132    }
28133}
28134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28135pub struct TerminalImplicitsGreen<'db>(pub GreenId<'db>);
28136impl<'db> TypedSyntaxNode<'db> for TerminalImplicits<'db> {
28137    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
28138    type StablePtr = TerminalImplicitsPtr<'db>;
28139    type Green = TerminalImplicitsGreen<'db>;
28140    fn missing(db: &'db dyn Database) -> Self::Green {
28141        TerminalImplicitsGreen(
28142            GreenNode {
28143                kind: SyntaxKind::TerminalImplicits,
28144                details: GreenNodeDetails::Node {
28145                    children: [
28146                        Trivia::missing(db).0,
28147                        TokenImplicits::missing(db).0,
28148                        Trivia::missing(db).0,
28149                    ]
28150                    .into(),
28151                    width: TextWidth::default(),
28152                },
28153            }
28154            .intern(db),
28155        )
28156    }
28157    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28158        let kind = node.kind(db);
28159        assert_eq!(
28160            kind,
28161            SyntaxKind::TerminalImplicits,
28162            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28163            kind,
28164            SyntaxKind::TerminalImplicits
28165        );
28166        Self { node }
28167    }
28168    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28169        let kind = node.kind(db);
28170        if kind == SyntaxKind::TerminalImplicits {
28171            Some(Self::from_syntax_node(db, node))
28172        } else {
28173            None
28174        }
28175    }
28176    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28177        self.node
28178    }
28179    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28180        TerminalImplicitsPtr(self.node.stable_ptr(db))
28181    }
28182}
28183#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28184pub struct TokenLet<'db> {
28185    node: SyntaxNode<'db>,
28186}
28187impl<'db> Token<'db> for TokenLet<'db> {
28188    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28189        TokenLetGreen(
28190            GreenNode { kind: SyntaxKind::TokenLet, details: GreenNodeDetails::Token(text) }
28191                .intern(db),
28192        )
28193    }
28194    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28195        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28196    }
28197}
28198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28199pub struct TokenLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28200impl<'db> TypedStablePtr<'db> for TokenLetPtr<'db> {
28201    type SyntaxNode = TokenLet<'db>;
28202    fn untyped(self) -> SyntaxStablePtrId<'db> {
28203        self.0
28204    }
28205    fn lookup(&self, db: &'db dyn Database) -> TokenLet<'db> {
28206        TokenLet::from_syntax_node(db, self.0.lookup(db))
28207    }
28208}
28209impl<'db> From<TokenLetPtr<'db>> for SyntaxStablePtrId<'db> {
28210    fn from(ptr: TokenLetPtr<'db>) -> Self {
28211        ptr.untyped()
28212    }
28213}
28214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28215pub struct TokenLetGreen<'db>(pub GreenId<'db>);
28216impl<'db> TokenLetGreen<'db> {
28217    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28218        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28219    }
28220}
28221impl<'db> TypedSyntaxNode<'db> for TokenLet<'db> {
28222    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
28223    type StablePtr = TokenLetPtr<'db>;
28224    type Green = TokenLetGreen<'db>;
28225    fn missing(db: &'db dyn Database) -> Self::Green {
28226        TokenLetGreen(
28227            GreenNode {
28228                kind: SyntaxKind::TokenMissing,
28229                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28230            }
28231            .intern(db),
28232        )
28233    }
28234    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28235        match node.long(db).green.long(db).details {
28236            GreenNodeDetails::Token(_) => Self { node },
28237            GreenNodeDetails::Node { .. } => {
28238                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
28239            }
28240        }
28241    }
28242    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28243        match node.long(db).green.long(db).details {
28244            GreenNodeDetails::Token(_) => Some(Self { node }),
28245            GreenNodeDetails::Node { .. } => None,
28246        }
28247    }
28248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28249        self.node
28250    }
28251    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28252        TokenLetPtr(self.node.stable_ptr(db))
28253    }
28254}
28255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28256pub struct TerminalLet<'db> {
28257    node: SyntaxNode<'db>,
28258}
28259impl<'db> Terminal<'db> for TerminalLet<'db> {
28260    const KIND: SyntaxKind = SyntaxKind::TerminalLet;
28261    type TokenType = TokenLet<'db>;
28262    fn new_green(
28263        db: &'db dyn Database,
28264        leading_trivia: TriviaGreen<'db>,
28265        token: <<TerminalLet<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28266        trailing_trivia: TriviaGreen<'db>,
28267    ) -> Self::Green {
28268        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28269        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28270        TerminalLetGreen(
28271            GreenNode {
28272                kind: SyntaxKind::TerminalLet,
28273                details: GreenNodeDetails::Node { children: children.into(), width },
28274            }
28275            .intern(db),
28276        )
28277    }
28278    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28279        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28280        else {
28281            unreachable!("Expected a node, not a token");
28282        };
28283        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28284    }
28285}
28286impl<'db> TerminalLet<'db> {
28287    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28288        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28289    }
28290    pub fn token(&self, db: &'db dyn Database) -> TokenLet<'db> {
28291        TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
28292    }
28293    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28294        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28295    }
28296}
28297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28298pub struct TerminalLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28299impl<'db> TerminalLetPtr<'db> {}
28300impl<'db> TypedStablePtr<'db> for TerminalLetPtr<'db> {
28301    type SyntaxNode = TerminalLet<'db>;
28302    fn untyped(self) -> SyntaxStablePtrId<'db> {
28303        self.0
28304    }
28305    fn lookup(&self, db: &'db dyn Database) -> TerminalLet<'db> {
28306        TerminalLet::from_syntax_node(db, self.0.lookup(db))
28307    }
28308}
28309impl<'db> From<TerminalLetPtr<'db>> for SyntaxStablePtrId<'db> {
28310    fn from(ptr: TerminalLetPtr<'db>) -> Self {
28311        ptr.untyped()
28312    }
28313}
28314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28315pub struct TerminalLetGreen<'db>(pub GreenId<'db>);
28316impl<'db> TypedSyntaxNode<'db> for TerminalLet<'db> {
28317    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
28318    type StablePtr = TerminalLetPtr<'db>;
28319    type Green = TerminalLetGreen<'db>;
28320    fn missing(db: &'db dyn Database) -> Self::Green {
28321        TerminalLetGreen(
28322            GreenNode {
28323                kind: SyntaxKind::TerminalLet,
28324                details: GreenNodeDetails::Node {
28325                    children: [
28326                        Trivia::missing(db).0,
28327                        TokenLet::missing(db).0,
28328                        Trivia::missing(db).0,
28329                    ]
28330                    .into(),
28331                    width: TextWidth::default(),
28332                },
28333            }
28334            .intern(db),
28335        )
28336    }
28337    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28338        let kind = node.kind(db);
28339        assert_eq!(
28340            kind,
28341            SyntaxKind::TerminalLet,
28342            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28343            kind,
28344            SyntaxKind::TerminalLet
28345        );
28346        Self { node }
28347    }
28348    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28349        let kind = node.kind(db);
28350        if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
28351    }
28352    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28353        self.node
28354    }
28355    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28356        TerminalLetPtr(self.node.stable_ptr(db))
28357    }
28358}
28359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28360pub struct TokenMacro<'db> {
28361    node: SyntaxNode<'db>,
28362}
28363impl<'db> Token<'db> for TokenMacro<'db> {
28364    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28365        TokenMacroGreen(
28366            GreenNode { kind: SyntaxKind::TokenMacro, details: GreenNodeDetails::Token(text) }
28367                .intern(db),
28368        )
28369    }
28370    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28371        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28372    }
28373}
28374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28375pub struct TokenMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28376impl<'db> TypedStablePtr<'db> for TokenMacroPtr<'db> {
28377    type SyntaxNode = TokenMacro<'db>;
28378    fn untyped(self) -> SyntaxStablePtrId<'db> {
28379        self.0
28380    }
28381    fn lookup(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28382        TokenMacro::from_syntax_node(db, self.0.lookup(db))
28383    }
28384}
28385impl<'db> From<TokenMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28386    fn from(ptr: TokenMacroPtr<'db>) -> Self {
28387        ptr.untyped()
28388    }
28389}
28390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28391pub struct TokenMacroGreen<'db>(pub GreenId<'db>);
28392impl<'db> TokenMacroGreen<'db> {
28393    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28394        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28395    }
28396}
28397impl<'db> TypedSyntaxNode<'db> for TokenMacro<'db> {
28398    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
28399    type StablePtr = TokenMacroPtr<'db>;
28400    type Green = TokenMacroGreen<'db>;
28401    fn missing(db: &'db dyn Database) -> Self::Green {
28402        TokenMacroGreen(
28403            GreenNode {
28404                kind: SyntaxKind::TokenMissing,
28405                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28406            }
28407            .intern(db),
28408        )
28409    }
28410    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28411        match node.long(db).green.long(db).details {
28412            GreenNodeDetails::Token(_) => Self { node },
28413            GreenNodeDetails::Node { .. } => {
28414                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28415            }
28416        }
28417    }
28418    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28419        match node.long(db).green.long(db).details {
28420            GreenNodeDetails::Token(_) => Some(Self { node }),
28421            GreenNodeDetails::Node { .. } => None,
28422        }
28423    }
28424    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28425        self.node
28426    }
28427    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28428        TokenMacroPtr(self.node.stable_ptr(db))
28429    }
28430}
28431#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28432pub struct TerminalMacro<'db> {
28433    node: SyntaxNode<'db>,
28434}
28435impl<'db> Terminal<'db> for TerminalMacro<'db> {
28436    const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28437    type TokenType = TokenMacro<'db>;
28438    fn new_green(
28439        db: &'db dyn Database,
28440        leading_trivia: TriviaGreen<'db>,
28441        token: <<TerminalMacro<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28442        trailing_trivia: TriviaGreen<'db>,
28443    ) -> Self::Green {
28444        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28445        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28446        TerminalMacroGreen(
28447            GreenNode {
28448                kind: SyntaxKind::TerminalMacro,
28449                details: GreenNodeDetails::Node { children: children.into(), width },
28450            }
28451            .intern(db),
28452        )
28453    }
28454    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28455        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28456        else {
28457            unreachable!("Expected a node, not a token");
28458        };
28459        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28460    }
28461}
28462impl<'db> TerminalMacro<'db> {
28463    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28464        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28465    }
28466    pub fn token(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28467        TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28468    }
28469    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28470        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28471    }
28472}
28473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28474pub struct TerminalMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28475impl<'db> TerminalMacroPtr<'db> {}
28476impl<'db> TypedStablePtr<'db> for TerminalMacroPtr<'db> {
28477    type SyntaxNode = TerminalMacro<'db>;
28478    fn untyped(self) -> SyntaxStablePtrId<'db> {
28479        self.0
28480    }
28481    fn lookup(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
28482        TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28483    }
28484}
28485impl<'db> From<TerminalMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28486    fn from(ptr: TerminalMacroPtr<'db>) -> Self {
28487        ptr.untyped()
28488    }
28489}
28490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28491pub struct TerminalMacroGreen<'db>(pub GreenId<'db>);
28492impl<'db> TypedSyntaxNode<'db> for TerminalMacro<'db> {
28493    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28494    type StablePtr = TerminalMacroPtr<'db>;
28495    type Green = TerminalMacroGreen<'db>;
28496    fn missing(db: &'db dyn Database) -> Self::Green {
28497        TerminalMacroGreen(
28498            GreenNode {
28499                kind: SyntaxKind::TerminalMacro,
28500                details: GreenNodeDetails::Node {
28501                    children: [
28502                        Trivia::missing(db).0,
28503                        TokenMacro::missing(db).0,
28504                        Trivia::missing(db).0,
28505                    ]
28506                    .into(),
28507                    width: TextWidth::default(),
28508                },
28509            }
28510            .intern(db),
28511        )
28512    }
28513    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28514        let kind = node.kind(db);
28515        assert_eq!(
28516            kind,
28517            SyntaxKind::TerminalMacro,
28518            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28519            kind,
28520            SyntaxKind::TerminalMacro
28521        );
28522        Self { node }
28523    }
28524    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28525        let kind = node.kind(db);
28526        if kind == SyntaxKind::TerminalMacro {
28527            Some(Self::from_syntax_node(db, node))
28528        } else {
28529            None
28530        }
28531    }
28532    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28533        self.node
28534    }
28535    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28536        TerminalMacroPtr(self.node.stable_ptr(db))
28537    }
28538}
28539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28540pub struct TokenMatch<'db> {
28541    node: SyntaxNode<'db>,
28542}
28543impl<'db> Token<'db> for TokenMatch<'db> {
28544    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28545        TokenMatchGreen(
28546            GreenNode { kind: SyntaxKind::TokenMatch, details: GreenNodeDetails::Token(text) }
28547                .intern(db),
28548        )
28549    }
28550    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28551        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28552    }
28553}
28554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28555pub struct TokenMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28556impl<'db> TypedStablePtr<'db> for TokenMatchPtr<'db> {
28557    type SyntaxNode = TokenMatch<'db>;
28558    fn untyped(self) -> SyntaxStablePtrId<'db> {
28559        self.0
28560    }
28561    fn lookup(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28562        TokenMatch::from_syntax_node(db, self.0.lookup(db))
28563    }
28564}
28565impl<'db> From<TokenMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28566    fn from(ptr: TokenMatchPtr<'db>) -> Self {
28567        ptr.untyped()
28568    }
28569}
28570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28571pub struct TokenMatchGreen<'db>(pub GreenId<'db>);
28572impl<'db> TokenMatchGreen<'db> {
28573    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28574        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28575    }
28576}
28577impl<'db> TypedSyntaxNode<'db> for TokenMatch<'db> {
28578    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28579    type StablePtr = TokenMatchPtr<'db>;
28580    type Green = TokenMatchGreen<'db>;
28581    fn missing(db: &'db dyn Database) -> Self::Green {
28582        TokenMatchGreen(
28583            GreenNode {
28584                kind: SyntaxKind::TokenMissing,
28585                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28586            }
28587            .intern(db),
28588        )
28589    }
28590    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28591        match node.long(db).green.long(db).details {
28592            GreenNodeDetails::Token(_) => Self { node },
28593            GreenNodeDetails::Node { .. } => {
28594                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28595            }
28596        }
28597    }
28598    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28599        match node.long(db).green.long(db).details {
28600            GreenNodeDetails::Token(_) => Some(Self { node }),
28601            GreenNodeDetails::Node { .. } => None,
28602        }
28603    }
28604    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28605        self.node
28606    }
28607    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28608        TokenMatchPtr(self.node.stable_ptr(db))
28609    }
28610}
28611#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28612pub struct TerminalMatch<'db> {
28613    node: SyntaxNode<'db>,
28614}
28615impl<'db> Terminal<'db> for TerminalMatch<'db> {
28616    const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28617    type TokenType = TokenMatch<'db>;
28618    fn new_green(
28619        db: &'db dyn Database,
28620        leading_trivia: TriviaGreen<'db>,
28621        token: <<TerminalMatch<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28622        trailing_trivia: TriviaGreen<'db>,
28623    ) -> Self::Green {
28624        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28625        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28626        TerminalMatchGreen(
28627            GreenNode {
28628                kind: SyntaxKind::TerminalMatch,
28629                details: GreenNodeDetails::Node { children: children.into(), width },
28630            }
28631            .intern(db),
28632        )
28633    }
28634    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28635        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28636        else {
28637            unreachable!("Expected a node, not a token");
28638        };
28639        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28640    }
28641}
28642impl<'db> TerminalMatch<'db> {
28643    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28644        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28645    }
28646    pub fn token(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28647        TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28648    }
28649    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28650        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28651    }
28652}
28653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28654pub struct TerminalMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28655impl<'db> TerminalMatchPtr<'db> {}
28656impl<'db> TypedStablePtr<'db> for TerminalMatchPtr<'db> {
28657    type SyntaxNode = TerminalMatch<'db>;
28658    fn untyped(self) -> SyntaxStablePtrId<'db> {
28659        self.0
28660    }
28661    fn lookup(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
28662        TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28663    }
28664}
28665impl<'db> From<TerminalMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28666    fn from(ptr: TerminalMatchPtr<'db>) -> Self {
28667        ptr.untyped()
28668    }
28669}
28670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28671pub struct TerminalMatchGreen<'db>(pub GreenId<'db>);
28672impl<'db> TypedSyntaxNode<'db> for TerminalMatch<'db> {
28673    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28674    type StablePtr = TerminalMatchPtr<'db>;
28675    type Green = TerminalMatchGreen<'db>;
28676    fn missing(db: &'db dyn Database) -> Self::Green {
28677        TerminalMatchGreen(
28678            GreenNode {
28679                kind: SyntaxKind::TerminalMatch,
28680                details: GreenNodeDetails::Node {
28681                    children: [
28682                        Trivia::missing(db).0,
28683                        TokenMatch::missing(db).0,
28684                        Trivia::missing(db).0,
28685                    ]
28686                    .into(),
28687                    width: TextWidth::default(),
28688                },
28689            }
28690            .intern(db),
28691        )
28692    }
28693    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28694        let kind = node.kind(db);
28695        assert_eq!(
28696            kind,
28697            SyntaxKind::TerminalMatch,
28698            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28699            kind,
28700            SyntaxKind::TerminalMatch
28701        );
28702        Self { node }
28703    }
28704    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28705        let kind = node.kind(db);
28706        if kind == SyntaxKind::TerminalMatch {
28707            Some(Self::from_syntax_node(db, node))
28708        } else {
28709            None
28710        }
28711    }
28712    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28713        self.node
28714    }
28715    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28716        TerminalMatchPtr(self.node.stable_ptr(db))
28717    }
28718}
28719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28720pub struct TokenModule<'db> {
28721    node: SyntaxNode<'db>,
28722}
28723impl<'db> Token<'db> for TokenModule<'db> {
28724    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28725        TokenModuleGreen(
28726            GreenNode { kind: SyntaxKind::TokenModule, details: GreenNodeDetails::Token(text) }
28727                .intern(db),
28728        )
28729    }
28730    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28731        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28732    }
28733}
28734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28735pub struct TokenModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28736impl<'db> TypedStablePtr<'db> for TokenModulePtr<'db> {
28737    type SyntaxNode = TokenModule<'db>;
28738    fn untyped(self) -> SyntaxStablePtrId<'db> {
28739        self.0
28740    }
28741    fn lookup(&self, db: &'db dyn Database) -> TokenModule<'db> {
28742        TokenModule::from_syntax_node(db, self.0.lookup(db))
28743    }
28744}
28745impl<'db> From<TokenModulePtr<'db>> for SyntaxStablePtrId<'db> {
28746    fn from(ptr: TokenModulePtr<'db>) -> Self {
28747        ptr.untyped()
28748    }
28749}
28750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28751pub struct TokenModuleGreen<'db>(pub GreenId<'db>);
28752impl<'db> TokenModuleGreen<'db> {
28753    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28754        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28755    }
28756}
28757impl<'db> TypedSyntaxNode<'db> for TokenModule<'db> {
28758    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28759    type StablePtr = TokenModulePtr<'db>;
28760    type Green = TokenModuleGreen<'db>;
28761    fn missing(db: &'db dyn Database) -> Self::Green {
28762        TokenModuleGreen(
28763            GreenNode {
28764                kind: SyntaxKind::TokenMissing,
28765                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28766            }
28767            .intern(db),
28768        )
28769    }
28770    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28771        match node.long(db).green.long(db).details {
28772            GreenNodeDetails::Token(_) => Self { node },
28773            GreenNodeDetails::Node { .. } => {
28774                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28775            }
28776        }
28777    }
28778    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28779        match node.long(db).green.long(db).details {
28780            GreenNodeDetails::Token(_) => Some(Self { node }),
28781            GreenNodeDetails::Node { .. } => None,
28782        }
28783    }
28784    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28785        self.node
28786    }
28787    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28788        TokenModulePtr(self.node.stable_ptr(db))
28789    }
28790}
28791#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28792pub struct TerminalModule<'db> {
28793    node: SyntaxNode<'db>,
28794}
28795impl<'db> Terminal<'db> for TerminalModule<'db> {
28796    const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28797    type TokenType = TokenModule<'db>;
28798    fn new_green(
28799        db: &'db dyn Database,
28800        leading_trivia: TriviaGreen<'db>,
28801        token: <<TerminalModule<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28802        trailing_trivia: TriviaGreen<'db>,
28803    ) -> Self::Green {
28804        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28805        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28806        TerminalModuleGreen(
28807            GreenNode {
28808                kind: SyntaxKind::TerminalModule,
28809                details: GreenNodeDetails::Node { children: children.into(), width },
28810            }
28811            .intern(db),
28812        )
28813    }
28814    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28815        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28816        else {
28817            unreachable!("Expected a node, not a token");
28818        };
28819        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28820    }
28821}
28822impl<'db> TerminalModule<'db> {
28823    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28824        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28825    }
28826    pub fn token(&self, db: &'db dyn Database) -> TokenModule<'db> {
28827        TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
28828    }
28829    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28830        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28831    }
28832}
28833#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28834pub struct TerminalModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28835impl<'db> TerminalModulePtr<'db> {}
28836impl<'db> TypedStablePtr<'db> for TerminalModulePtr<'db> {
28837    type SyntaxNode = TerminalModule<'db>;
28838    fn untyped(self) -> SyntaxStablePtrId<'db> {
28839        self.0
28840    }
28841    fn lookup(&self, db: &'db dyn Database) -> TerminalModule<'db> {
28842        TerminalModule::from_syntax_node(db, self.0.lookup(db))
28843    }
28844}
28845impl<'db> From<TerminalModulePtr<'db>> for SyntaxStablePtrId<'db> {
28846    fn from(ptr: TerminalModulePtr<'db>) -> Self {
28847        ptr.untyped()
28848    }
28849}
28850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28851pub struct TerminalModuleGreen<'db>(pub GreenId<'db>);
28852impl<'db> TypedSyntaxNode<'db> for TerminalModule<'db> {
28853    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
28854    type StablePtr = TerminalModulePtr<'db>;
28855    type Green = TerminalModuleGreen<'db>;
28856    fn missing(db: &'db dyn Database) -> Self::Green {
28857        TerminalModuleGreen(
28858            GreenNode {
28859                kind: SyntaxKind::TerminalModule,
28860                details: GreenNodeDetails::Node {
28861                    children: [
28862                        Trivia::missing(db).0,
28863                        TokenModule::missing(db).0,
28864                        Trivia::missing(db).0,
28865                    ]
28866                    .into(),
28867                    width: TextWidth::default(),
28868                },
28869            }
28870            .intern(db),
28871        )
28872    }
28873    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28874        let kind = node.kind(db);
28875        assert_eq!(
28876            kind,
28877            SyntaxKind::TerminalModule,
28878            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28879            kind,
28880            SyntaxKind::TerminalModule
28881        );
28882        Self { node }
28883    }
28884    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28885        let kind = node.kind(db);
28886        if kind == SyntaxKind::TerminalModule {
28887            Some(Self::from_syntax_node(db, node))
28888        } else {
28889            None
28890        }
28891    }
28892    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28893        self.node
28894    }
28895    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28896        TerminalModulePtr(self.node.stable_ptr(db))
28897    }
28898}
28899#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28900pub struct TokenMut<'db> {
28901    node: SyntaxNode<'db>,
28902}
28903impl<'db> Token<'db> for TokenMut<'db> {
28904    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28905        TokenMutGreen(
28906            GreenNode { kind: SyntaxKind::TokenMut, details: GreenNodeDetails::Token(text) }
28907                .intern(db),
28908        )
28909    }
28910    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28911        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
28912    }
28913}
28914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28915pub struct TokenMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28916impl<'db> TypedStablePtr<'db> for TokenMutPtr<'db> {
28917    type SyntaxNode = TokenMut<'db>;
28918    fn untyped(self) -> SyntaxStablePtrId<'db> {
28919        self.0
28920    }
28921    fn lookup(&self, db: &'db dyn Database) -> TokenMut<'db> {
28922        TokenMut::from_syntax_node(db, self.0.lookup(db))
28923    }
28924}
28925impl<'db> From<TokenMutPtr<'db>> for SyntaxStablePtrId<'db> {
28926    fn from(ptr: TokenMutPtr<'db>) -> Self {
28927        ptr.untyped()
28928    }
28929}
28930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28931pub struct TokenMutGreen<'db>(pub GreenId<'db>);
28932impl<'db> TokenMutGreen<'db> {
28933    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28934        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28935    }
28936}
28937impl<'db> TypedSyntaxNode<'db> for TokenMut<'db> {
28938    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
28939    type StablePtr = TokenMutPtr<'db>;
28940    type Green = TokenMutGreen<'db>;
28941    fn missing(db: &'db dyn Database) -> Self::Green {
28942        TokenMutGreen(
28943            GreenNode {
28944                kind: SyntaxKind::TokenMissing,
28945                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28946            }
28947            .intern(db),
28948        )
28949    }
28950    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28951        match node.long(db).green.long(db).details {
28952            GreenNodeDetails::Token(_) => Self { node },
28953            GreenNodeDetails::Node { .. } => {
28954                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
28955            }
28956        }
28957    }
28958    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28959        match node.long(db).green.long(db).details {
28960            GreenNodeDetails::Token(_) => Some(Self { node }),
28961            GreenNodeDetails::Node { .. } => None,
28962        }
28963    }
28964    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28965        self.node
28966    }
28967    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28968        TokenMutPtr(self.node.stable_ptr(db))
28969    }
28970}
28971#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28972pub struct TerminalMut<'db> {
28973    node: SyntaxNode<'db>,
28974}
28975impl<'db> Terminal<'db> for TerminalMut<'db> {
28976    const KIND: SyntaxKind = SyntaxKind::TerminalMut;
28977    type TokenType = TokenMut<'db>;
28978    fn new_green(
28979        db: &'db dyn Database,
28980        leading_trivia: TriviaGreen<'db>,
28981        token: <<TerminalMut<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28982        trailing_trivia: TriviaGreen<'db>,
28983    ) -> Self::Green {
28984        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28985        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28986        TerminalMutGreen(
28987            GreenNode {
28988                kind: SyntaxKind::TerminalMut,
28989                details: GreenNodeDetails::Node { children: children.into(), width },
28990            }
28991            .intern(db),
28992        )
28993    }
28994    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28995        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
28996        else {
28997            unreachable!("Expected a node, not a token");
28998        };
28999        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29000    }
29001}
29002impl<'db> TerminalMut<'db> {
29003    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29004        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29005    }
29006    pub fn token(&self, db: &'db dyn Database) -> TokenMut<'db> {
29007        TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
29008    }
29009    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29010        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29011    }
29012}
29013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29014pub struct TerminalMutPtr<'db>(pub SyntaxStablePtrId<'db>);
29015impl<'db> TerminalMutPtr<'db> {}
29016impl<'db> TypedStablePtr<'db> for TerminalMutPtr<'db> {
29017    type SyntaxNode = TerminalMut<'db>;
29018    fn untyped(self) -> SyntaxStablePtrId<'db> {
29019        self.0
29020    }
29021    fn lookup(&self, db: &'db dyn Database) -> TerminalMut<'db> {
29022        TerminalMut::from_syntax_node(db, self.0.lookup(db))
29023    }
29024}
29025impl<'db> From<TerminalMutPtr<'db>> for SyntaxStablePtrId<'db> {
29026    fn from(ptr: TerminalMutPtr<'db>) -> Self {
29027        ptr.untyped()
29028    }
29029}
29030#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29031pub struct TerminalMutGreen<'db>(pub GreenId<'db>);
29032impl<'db> TypedSyntaxNode<'db> for TerminalMut<'db> {
29033    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
29034    type StablePtr = TerminalMutPtr<'db>;
29035    type Green = TerminalMutGreen<'db>;
29036    fn missing(db: &'db dyn Database) -> Self::Green {
29037        TerminalMutGreen(
29038            GreenNode {
29039                kind: SyntaxKind::TerminalMut,
29040                details: GreenNodeDetails::Node {
29041                    children: [
29042                        Trivia::missing(db).0,
29043                        TokenMut::missing(db).0,
29044                        Trivia::missing(db).0,
29045                    ]
29046                    .into(),
29047                    width: TextWidth::default(),
29048                },
29049            }
29050            .intern(db),
29051        )
29052    }
29053    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29054        let kind = node.kind(db);
29055        assert_eq!(
29056            kind,
29057            SyntaxKind::TerminalMut,
29058            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29059            kind,
29060            SyntaxKind::TerminalMut
29061        );
29062        Self { node }
29063    }
29064    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29065        let kind = node.kind(db);
29066        if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
29067    }
29068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29069        self.node
29070    }
29071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29072        TerminalMutPtr(self.node.stable_ptr(db))
29073    }
29074}
29075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29076pub struct TokenNoPanic<'db> {
29077    node: SyntaxNode<'db>,
29078}
29079impl<'db> Token<'db> for TokenNoPanic<'db> {
29080    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29081        TokenNoPanicGreen(
29082            GreenNode { kind: SyntaxKind::TokenNoPanic, details: GreenNodeDetails::Token(text) }
29083                .intern(db),
29084        )
29085    }
29086    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29087        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29088    }
29089}
29090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29091pub struct TokenNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
29092impl<'db> TypedStablePtr<'db> for TokenNoPanicPtr<'db> {
29093    type SyntaxNode = TokenNoPanic<'db>;
29094    fn untyped(self) -> SyntaxStablePtrId<'db> {
29095        self.0
29096    }
29097    fn lookup(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
29098        TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
29099    }
29100}
29101impl<'db> From<TokenNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
29102    fn from(ptr: TokenNoPanicPtr<'db>) -> Self {
29103        ptr.untyped()
29104    }
29105}
29106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29107pub struct TokenNoPanicGreen<'db>(pub GreenId<'db>);
29108impl<'db> TokenNoPanicGreen<'db> {
29109    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29110        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29111    }
29112}
29113impl<'db> TypedSyntaxNode<'db> for TokenNoPanic<'db> {
29114    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
29115    type StablePtr = TokenNoPanicPtr<'db>;
29116    type Green = TokenNoPanicGreen<'db>;
29117    fn missing(db: &'db dyn Database) -> Self::Green {
29118        TokenNoPanicGreen(
29119            GreenNode {
29120                kind: SyntaxKind::TokenMissing,
29121                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29122            }
29123            .intern(db),
29124        )
29125    }
29126    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29127        match node.long(db).green.long(db).details {
29128            GreenNodeDetails::Token(_) => Self { node },
29129            GreenNodeDetails::Node { .. } => {
29130                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
29131            }
29132        }
29133    }
29134    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29135        match node.long(db).green.long(db).details {
29136            GreenNodeDetails::Token(_) => Some(Self { node }),
29137            GreenNodeDetails::Node { .. } => None,
29138        }
29139    }
29140    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29141        self.node
29142    }
29143    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29144        TokenNoPanicPtr(self.node.stable_ptr(db))
29145    }
29146}
29147#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29148pub struct TerminalNoPanic<'db> {
29149    node: SyntaxNode<'db>,
29150}
29151impl<'db> Terminal<'db> for TerminalNoPanic<'db> {
29152    const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
29153    type TokenType = TokenNoPanic<'db>;
29154    fn new_green(
29155        db: &'db dyn Database,
29156        leading_trivia: TriviaGreen<'db>,
29157        token: <<TerminalNoPanic<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29158        trailing_trivia: TriviaGreen<'db>,
29159    ) -> Self::Green {
29160        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29161        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29162        TerminalNoPanicGreen(
29163            GreenNode {
29164                kind: SyntaxKind::TerminalNoPanic,
29165                details: GreenNodeDetails::Node { children: children.into(), width },
29166            }
29167            .intern(db),
29168        )
29169    }
29170    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29171        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29172        else {
29173            unreachable!("Expected a node, not a token");
29174        };
29175        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29176    }
29177}
29178impl<'db> TerminalNoPanic<'db> {
29179    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29180        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29181    }
29182    pub fn token(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
29183        TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
29184    }
29185    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29186        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29187    }
29188}
29189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29190pub struct TerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
29191impl<'db> TerminalNoPanicPtr<'db> {}
29192impl<'db> TypedStablePtr<'db> for TerminalNoPanicPtr<'db> {
29193    type SyntaxNode = TerminalNoPanic<'db>;
29194    fn untyped(self) -> SyntaxStablePtrId<'db> {
29195        self.0
29196    }
29197    fn lookup(&self, db: &'db dyn Database) -> TerminalNoPanic<'db> {
29198        TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
29199    }
29200}
29201impl<'db> From<TerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
29202    fn from(ptr: TerminalNoPanicPtr<'db>) -> Self {
29203        ptr.untyped()
29204    }
29205}
29206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29207pub struct TerminalNoPanicGreen<'db>(pub GreenId<'db>);
29208impl<'db> TypedSyntaxNode<'db> for TerminalNoPanic<'db> {
29209    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
29210    type StablePtr = TerminalNoPanicPtr<'db>;
29211    type Green = TerminalNoPanicGreen<'db>;
29212    fn missing(db: &'db dyn Database) -> Self::Green {
29213        TerminalNoPanicGreen(
29214            GreenNode {
29215                kind: SyntaxKind::TerminalNoPanic,
29216                details: GreenNodeDetails::Node {
29217                    children: [
29218                        Trivia::missing(db).0,
29219                        TokenNoPanic::missing(db).0,
29220                        Trivia::missing(db).0,
29221                    ]
29222                    .into(),
29223                    width: TextWidth::default(),
29224                },
29225            }
29226            .intern(db),
29227        )
29228    }
29229    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29230        let kind = node.kind(db);
29231        assert_eq!(
29232            kind,
29233            SyntaxKind::TerminalNoPanic,
29234            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29235            kind,
29236            SyntaxKind::TerminalNoPanic
29237        );
29238        Self { node }
29239    }
29240    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29241        let kind = node.kind(db);
29242        if kind == SyntaxKind::TerminalNoPanic {
29243            Some(Self::from_syntax_node(db, node))
29244        } else {
29245            None
29246        }
29247    }
29248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29249        self.node
29250    }
29251    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29252        TerminalNoPanicPtr(self.node.stable_ptr(db))
29253    }
29254}
29255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29256pub struct TokenOf<'db> {
29257    node: SyntaxNode<'db>,
29258}
29259impl<'db> Token<'db> for TokenOf<'db> {
29260    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29261        TokenOfGreen(
29262            GreenNode { kind: SyntaxKind::TokenOf, details: GreenNodeDetails::Token(text) }
29263                .intern(db),
29264        )
29265    }
29266    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29267        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29268    }
29269}
29270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29271pub struct TokenOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29272impl<'db> TypedStablePtr<'db> for TokenOfPtr<'db> {
29273    type SyntaxNode = TokenOf<'db>;
29274    fn untyped(self) -> SyntaxStablePtrId<'db> {
29275        self.0
29276    }
29277    fn lookup(&self, db: &'db dyn Database) -> TokenOf<'db> {
29278        TokenOf::from_syntax_node(db, self.0.lookup(db))
29279    }
29280}
29281impl<'db> From<TokenOfPtr<'db>> for SyntaxStablePtrId<'db> {
29282    fn from(ptr: TokenOfPtr<'db>) -> Self {
29283        ptr.untyped()
29284    }
29285}
29286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29287pub struct TokenOfGreen<'db>(pub GreenId<'db>);
29288impl<'db> TokenOfGreen<'db> {
29289    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29290        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29291    }
29292}
29293impl<'db> TypedSyntaxNode<'db> for TokenOf<'db> {
29294    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
29295    type StablePtr = TokenOfPtr<'db>;
29296    type Green = TokenOfGreen<'db>;
29297    fn missing(db: &'db dyn Database) -> Self::Green {
29298        TokenOfGreen(
29299            GreenNode {
29300                kind: SyntaxKind::TokenMissing,
29301                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29302            }
29303            .intern(db),
29304        )
29305    }
29306    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29307        match node.long(db).green.long(db).details {
29308            GreenNodeDetails::Token(_) => Self { node },
29309            GreenNodeDetails::Node { .. } => {
29310                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
29311            }
29312        }
29313    }
29314    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29315        match node.long(db).green.long(db).details {
29316            GreenNodeDetails::Token(_) => Some(Self { node }),
29317            GreenNodeDetails::Node { .. } => None,
29318        }
29319    }
29320    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29321        self.node
29322    }
29323    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29324        TokenOfPtr(self.node.stable_ptr(db))
29325    }
29326}
29327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29328pub struct TerminalOf<'db> {
29329    node: SyntaxNode<'db>,
29330}
29331impl<'db> Terminal<'db> for TerminalOf<'db> {
29332    const KIND: SyntaxKind = SyntaxKind::TerminalOf;
29333    type TokenType = TokenOf<'db>;
29334    fn new_green(
29335        db: &'db dyn Database,
29336        leading_trivia: TriviaGreen<'db>,
29337        token: <<TerminalOf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29338        trailing_trivia: TriviaGreen<'db>,
29339    ) -> Self::Green {
29340        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29341        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29342        TerminalOfGreen(
29343            GreenNode {
29344                kind: SyntaxKind::TerminalOf,
29345                details: GreenNodeDetails::Node { children: children.into(), width },
29346            }
29347            .intern(db),
29348        )
29349    }
29350    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29351        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29352        else {
29353            unreachable!("Expected a node, not a token");
29354        };
29355        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29356    }
29357}
29358impl<'db> TerminalOf<'db> {
29359    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29360        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29361    }
29362    pub fn token(&self, db: &'db dyn Database) -> TokenOf<'db> {
29363        TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
29364    }
29365    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29366        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29367    }
29368}
29369#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29370pub struct TerminalOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29371impl<'db> TerminalOfPtr<'db> {}
29372impl<'db> TypedStablePtr<'db> for TerminalOfPtr<'db> {
29373    type SyntaxNode = TerminalOf<'db>;
29374    fn untyped(self) -> SyntaxStablePtrId<'db> {
29375        self.0
29376    }
29377    fn lookup(&self, db: &'db dyn Database) -> TerminalOf<'db> {
29378        TerminalOf::from_syntax_node(db, self.0.lookup(db))
29379    }
29380}
29381impl<'db> From<TerminalOfPtr<'db>> for SyntaxStablePtrId<'db> {
29382    fn from(ptr: TerminalOfPtr<'db>) -> Self {
29383        ptr.untyped()
29384    }
29385}
29386#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29387pub struct TerminalOfGreen<'db>(pub GreenId<'db>);
29388impl<'db> TypedSyntaxNode<'db> for TerminalOf<'db> {
29389    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
29390    type StablePtr = TerminalOfPtr<'db>;
29391    type Green = TerminalOfGreen<'db>;
29392    fn missing(db: &'db dyn Database) -> Self::Green {
29393        TerminalOfGreen(
29394            GreenNode {
29395                kind: SyntaxKind::TerminalOf,
29396                details: GreenNodeDetails::Node {
29397                    children: [
29398                        Trivia::missing(db).0,
29399                        TokenOf::missing(db).0,
29400                        Trivia::missing(db).0,
29401                    ]
29402                    .into(),
29403                    width: TextWidth::default(),
29404                },
29405            }
29406            .intern(db),
29407        )
29408    }
29409    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29410        let kind = node.kind(db);
29411        assert_eq!(
29412            kind,
29413            SyntaxKind::TerminalOf,
29414            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29415            kind,
29416            SyntaxKind::TerminalOf
29417        );
29418        Self { node }
29419    }
29420    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29421        let kind = node.kind(db);
29422        if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29423    }
29424    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29425        self.node
29426    }
29427    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29428        TerminalOfPtr(self.node.stable_ptr(db))
29429    }
29430}
29431#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29432pub struct TokenRef<'db> {
29433    node: SyntaxNode<'db>,
29434}
29435impl<'db> Token<'db> for TokenRef<'db> {
29436    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29437        TokenRefGreen(
29438            GreenNode { kind: SyntaxKind::TokenRef, details: GreenNodeDetails::Token(text) }
29439                .intern(db),
29440        )
29441    }
29442    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29443        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29444    }
29445}
29446#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29447pub struct TokenRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29448impl<'db> TypedStablePtr<'db> for TokenRefPtr<'db> {
29449    type SyntaxNode = TokenRef<'db>;
29450    fn untyped(self) -> SyntaxStablePtrId<'db> {
29451        self.0
29452    }
29453    fn lookup(&self, db: &'db dyn Database) -> TokenRef<'db> {
29454        TokenRef::from_syntax_node(db, self.0.lookup(db))
29455    }
29456}
29457impl<'db> From<TokenRefPtr<'db>> for SyntaxStablePtrId<'db> {
29458    fn from(ptr: TokenRefPtr<'db>) -> Self {
29459        ptr.untyped()
29460    }
29461}
29462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29463pub struct TokenRefGreen<'db>(pub GreenId<'db>);
29464impl<'db> TokenRefGreen<'db> {
29465    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29466        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29467    }
29468}
29469impl<'db> TypedSyntaxNode<'db> for TokenRef<'db> {
29470    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29471    type StablePtr = TokenRefPtr<'db>;
29472    type Green = TokenRefGreen<'db>;
29473    fn missing(db: &'db dyn Database) -> Self::Green {
29474        TokenRefGreen(
29475            GreenNode {
29476                kind: SyntaxKind::TokenMissing,
29477                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29478            }
29479            .intern(db),
29480        )
29481    }
29482    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29483        match node.long(db).green.long(db).details {
29484            GreenNodeDetails::Token(_) => Self { node },
29485            GreenNodeDetails::Node { .. } => {
29486                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29487            }
29488        }
29489    }
29490    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29491        match node.long(db).green.long(db).details {
29492            GreenNodeDetails::Token(_) => Some(Self { node }),
29493            GreenNodeDetails::Node { .. } => None,
29494        }
29495    }
29496    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29497        self.node
29498    }
29499    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29500        TokenRefPtr(self.node.stable_ptr(db))
29501    }
29502}
29503#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29504pub struct TerminalRef<'db> {
29505    node: SyntaxNode<'db>,
29506}
29507impl<'db> Terminal<'db> for TerminalRef<'db> {
29508    const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29509    type TokenType = TokenRef<'db>;
29510    fn new_green(
29511        db: &'db dyn Database,
29512        leading_trivia: TriviaGreen<'db>,
29513        token: <<TerminalRef<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29514        trailing_trivia: TriviaGreen<'db>,
29515    ) -> Self::Green {
29516        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29517        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29518        TerminalRefGreen(
29519            GreenNode {
29520                kind: SyntaxKind::TerminalRef,
29521                details: GreenNodeDetails::Node { children: children.into(), width },
29522            }
29523            .intern(db),
29524        )
29525    }
29526    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29527        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29528        else {
29529            unreachable!("Expected a node, not a token");
29530        };
29531        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29532    }
29533}
29534impl<'db> TerminalRef<'db> {
29535    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29536        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29537    }
29538    pub fn token(&self, db: &'db dyn Database) -> TokenRef<'db> {
29539        TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29540    }
29541    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29542        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29543    }
29544}
29545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29546pub struct TerminalRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29547impl<'db> TerminalRefPtr<'db> {}
29548impl<'db> TypedStablePtr<'db> for TerminalRefPtr<'db> {
29549    type SyntaxNode = TerminalRef<'db>;
29550    fn untyped(self) -> SyntaxStablePtrId<'db> {
29551        self.0
29552    }
29553    fn lookup(&self, db: &'db dyn Database) -> TerminalRef<'db> {
29554        TerminalRef::from_syntax_node(db, self.0.lookup(db))
29555    }
29556}
29557impl<'db> From<TerminalRefPtr<'db>> for SyntaxStablePtrId<'db> {
29558    fn from(ptr: TerminalRefPtr<'db>) -> Self {
29559        ptr.untyped()
29560    }
29561}
29562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29563pub struct TerminalRefGreen<'db>(pub GreenId<'db>);
29564impl<'db> TypedSyntaxNode<'db> for TerminalRef<'db> {
29565    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29566    type StablePtr = TerminalRefPtr<'db>;
29567    type Green = TerminalRefGreen<'db>;
29568    fn missing(db: &'db dyn Database) -> Self::Green {
29569        TerminalRefGreen(
29570            GreenNode {
29571                kind: SyntaxKind::TerminalRef,
29572                details: GreenNodeDetails::Node {
29573                    children: [
29574                        Trivia::missing(db).0,
29575                        TokenRef::missing(db).0,
29576                        Trivia::missing(db).0,
29577                    ]
29578                    .into(),
29579                    width: TextWidth::default(),
29580                },
29581            }
29582            .intern(db),
29583        )
29584    }
29585    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29586        let kind = node.kind(db);
29587        assert_eq!(
29588            kind,
29589            SyntaxKind::TerminalRef,
29590            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29591            kind,
29592            SyntaxKind::TerminalRef
29593        );
29594        Self { node }
29595    }
29596    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29597        let kind = node.kind(db);
29598        if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29599    }
29600    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29601        self.node
29602    }
29603    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29604        TerminalRefPtr(self.node.stable_ptr(db))
29605    }
29606}
29607#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29608pub struct TokenContinue<'db> {
29609    node: SyntaxNode<'db>,
29610}
29611impl<'db> Token<'db> for TokenContinue<'db> {
29612    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29613        TokenContinueGreen(
29614            GreenNode { kind: SyntaxKind::TokenContinue, details: GreenNodeDetails::Token(text) }
29615                .intern(db),
29616        )
29617    }
29618    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29619        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29620    }
29621}
29622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29623pub struct TokenContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29624impl<'db> TypedStablePtr<'db> for TokenContinuePtr<'db> {
29625    type SyntaxNode = TokenContinue<'db>;
29626    fn untyped(self) -> SyntaxStablePtrId<'db> {
29627        self.0
29628    }
29629    fn lookup(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29630        TokenContinue::from_syntax_node(db, self.0.lookup(db))
29631    }
29632}
29633impl<'db> From<TokenContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29634    fn from(ptr: TokenContinuePtr<'db>) -> Self {
29635        ptr.untyped()
29636    }
29637}
29638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29639pub struct TokenContinueGreen<'db>(pub GreenId<'db>);
29640impl<'db> TokenContinueGreen<'db> {
29641    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29642        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29643    }
29644}
29645impl<'db> TypedSyntaxNode<'db> for TokenContinue<'db> {
29646    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29647    type StablePtr = TokenContinuePtr<'db>;
29648    type Green = TokenContinueGreen<'db>;
29649    fn missing(db: &'db dyn Database) -> Self::Green {
29650        TokenContinueGreen(
29651            GreenNode {
29652                kind: SyntaxKind::TokenMissing,
29653                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29654            }
29655            .intern(db),
29656        )
29657    }
29658    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29659        match node.long(db).green.long(db).details {
29660            GreenNodeDetails::Token(_) => Self { node },
29661            GreenNodeDetails::Node { .. } => {
29662                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29663            }
29664        }
29665    }
29666    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29667        match node.long(db).green.long(db).details {
29668            GreenNodeDetails::Token(_) => Some(Self { node }),
29669            GreenNodeDetails::Node { .. } => None,
29670        }
29671    }
29672    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29673        self.node
29674    }
29675    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29676        TokenContinuePtr(self.node.stable_ptr(db))
29677    }
29678}
29679#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29680pub struct TerminalContinue<'db> {
29681    node: SyntaxNode<'db>,
29682}
29683impl<'db> Terminal<'db> for TerminalContinue<'db> {
29684    const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29685    type TokenType = TokenContinue<'db>;
29686    fn new_green(
29687        db: &'db dyn Database,
29688        leading_trivia: TriviaGreen<'db>,
29689        token: <<TerminalContinue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29690        trailing_trivia: TriviaGreen<'db>,
29691    ) -> Self::Green {
29692        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29693        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29694        TerminalContinueGreen(
29695            GreenNode {
29696                kind: SyntaxKind::TerminalContinue,
29697                details: GreenNodeDetails::Node { children: children.into(), width },
29698            }
29699            .intern(db),
29700        )
29701    }
29702    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29703        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29704        else {
29705            unreachable!("Expected a node, not a token");
29706        };
29707        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29708    }
29709}
29710impl<'db> TerminalContinue<'db> {
29711    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29712        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29713    }
29714    pub fn token(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29715        TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29716    }
29717    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29718        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29719    }
29720}
29721#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29722pub struct TerminalContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29723impl<'db> TerminalContinuePtr<'db> {}
29724impl<'db> TypedStablePtr<'db> for TerminalContinuePtr<'db> {
29725    type SyntaxNode = TerminalContinue<'db>;
29726    fn untyped(self) -> SyntaxStablePtrId<'db> {
29727        self.0
29728    }
29729    fn lookup(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
29730        TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29731    }
29732}
29733impl<'db> From<TerminalContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29734    fn from(ptr: TerminalContinuePtr<'db>) -> Self {
29735        ptr.untyped()
29736    }
29737}
29738#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29739pub struct TerminalContinueGreen<'db>(pub GreenId<'db>);
29740impl<'db> TypedSyntaxNode<'db> for TerminalContinue<'db> {
29741    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29742    type StablePtr = TerminalContinuePtr<'db>;
29743    type Green = TerminalContinueGreen<'db>;
29744    fn missing(db: &'db dyn Database) -> Self::Green {
29745        TerminalContinueGreen(
29746            GreenNode {
29747                kind: SyntaxKind::TerminalContinue,
29748                details: GreenNodeDetails::Node {
29749                    children: [
29750                        Trivia::missing(db).0,
29751                        TokenContinue::missing(db).0,
29752                        Trivia::missing(db).0,
29753                    ]
29754                    .into(),
29755                    width: TextWidth::default(),
29756                },
29757            }
29758            .intern(db),
29759        )
29760    }
29761    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29762        let kind = node.kind(db);
29763        assert_eq!(
29764            kind,
29765            SyntaxKind::TerminalContinue,
29766            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29767            kind,
29768            SyntaxKind::TerminalContinue
29769        );
29770        Self { node }
29771    }
29772    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29773        let kind = node.kind(db);
29774        if kind == SyntaxKind::TerminalContinue {
29775            Some(Self::from_syntax_node(db, node))
29776        } else {
29777            None
29778        }
29779    }
29780    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29781        self.node
29782    }
29783    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29784        TerminalContinuePtr(self.node.stable_ptr(db))
29785    }
29786}
29787#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29788pub struct TokenReturn<'db> {
29789    node: SyntaxNode<'db>,
29790}
29791impl<'db> Token<'db> for TokenReturn<'db> {
29792    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29793        TokenReturnGreen(
29794            GreenNode { kind: SyntaxKind::TokenReturn, details: GreenNodeDetails::Token(text) }
29795                .intern(db),
29796        )
29797    }
29798    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29799        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29800    }
29801}
29802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29803pub struct TokenReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29804impl<'db> TypedStablePtr<'db> for TokenReturnPtr<'db> {
29805    type SyntaxNode = TokenReturn<'db>;
29806    fn untyped(self) -> SyntaxStablePtrId<'db> {
29807        self.0
29808    }
29809    fn lookup(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29810        TokenReturn::from_syntax_node(db, self.0.lookup(db))
29811    }
29812}
29813impl<'db> From<TokenReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29814    fn from(ptr: TokenReturnPtr<'db>) -> Self {
29815        ptr.untyped()
29816    }
29817}
29818#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29819pub struct TokenReturnGreen<'db>(pub GreenId<'db>);
29820impl<'db> TokenReturnGreen<'db> {
29821    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29822        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29823    }
29824}
29825impl<'db> TypedSyntaxNode<'db> for TokenReturn<'db> {
29826    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
29827    type StablePtr = TokenReturnPtr<'db>;
29828    type Green = TokenReturnGreen<'db>;
29829    fn missing(db: &'db dyn Database) -> Self::Green {
29830        TokenReturnGreen(
29831            GreenNode {
29832                kind: SyntaxKind::TokenMissing,
29833                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29834            }
29835            .intern(db),
29836        )
29837    }
29838    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29839        match node.long(db).green.long(db).details {
29840            GreenNodeDetails::Token(_) => Self { node },
29841            GreenNodeDetails::Node { .. } => {
29842                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
29843            }
29844        }
29845    }
29846    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29847        match node.long(db).green.long(db).details {
29848            GreenNodeDetails::Token(_) => Some(Self { node }),
29849            GreenNodeDetails::Node { .. } => None,
29850        }
29851    }
29852    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29853        self.node
29854    }
29855    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29856        TokenReturnPtr(self.node.stable_ptr(db))
29857    }
29858}
29859#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29860pub struct TerminalReturn<'db> {
29861    node: SyntaxNode<'db>,
29862}
29863impl<'db> Terminal<'db> for TerminalReturn<'db> {
29864    const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
29865    type TokenType = TokenReturn<'db>;
29866    fn new_green(
29867        db: &'db dyn Database,
29868        leading_trivia: TriviaGreen<'db>,
29869        token: <<TerminalReturn<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29870        trailing_trivia: TriviaGreen<'db>,
29871    ) -> Self::Green {
29872        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29873        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29874        TerminalReturnGreen(
29875            GreenNode {
29876                kind: SyntaxKind::TerminalReturn,
29877                details: GreenNodeDetails::Node { children: children.into(), width },
29878            }
29879            .intern(db),
29880        )
29881    }
29882    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29883        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
29884        else {
29885            unreachable!("Expected a node, not a token");
29886        };
29887        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29888    }
29889}
29890impl<'db> TerminalReturn<'db> {
29891    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29892        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29893    }
29894    pub fn token(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29895        TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
29896    }
29897    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29898        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29899    }
29900}
29901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29902pub struct TerminalReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29903impl<'db> TerminalReturnPtr<'db> {}
29904impl<'db> TypedStablePtr<'db> for TerminalReturnPtr<'db> {
29905    type SyntaxNode = TerminalReturn<'db>;
29906    fn untyped(self) -> SyntaxStablePtrId<'db> {
29907        self.0
29908    }
29909    fn lookup(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
29910        TerminalReturn::from_syntax_node(db, self.0.lookup(db))
29911    }
29912}
29913impl<'db> From<TerminalReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29914    fn from(ptr: TerminalReturnPtr<'db>) -> Self {
29915        ptr.untyped()
29916    }
29917}
29918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29919pub struct TerminalReturnGreen<'db>(pub GreenId<'db>);
29920impl<'db> TypedSyntaxNode<'db> for TerminalReturn<'db> {
29921    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
29922    type StablePtr = TerminalReturnPtr<'db>;
29923    type Green = TerminalReturnGreen<'db>;
29924    fn missing(db: &'db dyn Database) -> Self::Green {
29925        TerminalReturnGreen(
29926            GreenNode {
29927                kind: SyntaxKind::TerminalReturn,
29928                details: GreenNodeDetails::Node {
29929                    children: [
29930                        Trivia::missing(db).0,
29931                        TokenReturn::missing(db).0,
29932                        Trivia::missing(db).0,
29933                    ]
29934                    .into(),
29935                    width: TextWidth::default(),
29936                },
29937            }
29938            .intern(db),
29939        )
29940    }
29941    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29942        let kind = node.kind(db);
29943        assert_eq!(
29944            kind,
29945            SyntaxKind::TerminalReturn,
29946            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29947            kind,
29948            SyntaxKind::TerminalReturn
29949        );
29950        Self { node }
29951    }
29952    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29953        let kind = node.kind(db);
29954        if kind == SyntaxKind::TerminalReturn {
29955            Some(Self::from_syntax_node(db, node))
29956        } else {
29957            None
29958        }
29959    }
29960    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29961        self.node
29962    }
29963    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29964        TerminalReturnPtr(self.node.stable_ptr(db))
29965    }
29966}
29967#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29968pub struct TokenBreak<'db> {
29969    node: SyntaxNode<'db>,
29970}
29971impl<'db> Token<'db> for TokenBreak<'db> {
29972    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29973        TokenBreakGreen(
29974            GreenNode { kind: SyntaxKind::TokenBreak, details: GreenNodeDetails::Token(text) }
29975                .intern(db),
29976        )
29977    }
29978    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29979        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
29980    }
29981}
29982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29983pub struct TokenBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29984impl<'db> TypedStablePtr<'db> for TokenBreakPtr<'db> {
29985    type SyntaxNode = TokenBreak<'db>;
29986    fn untyped(self) -> SyntaxStablePtrId<'db> {
29987        self.0
29988    }
29989    fn lookup(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29990        TokenBreak::from_syntax_node(db, self.0.lookup(db))
29991    }
29992}
29993impl<'db> From<TokenBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29994    fn from(ptr: TokenBreakPtr<'db>) -> Self {
29995        ptr.untyped()
29996    }
29997}
29998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29999pub struct TokenBreakGreen<'db>(pub GreenId<'db>);
30000impl<'db> TokenBreakGreen<'db> {
30001    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30002        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30003    }
30004}
30005impl<'db> TypedSyntaxNode<'db> for TokenBreak<'db> {
30006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
30007    type StablePtr = TokenBreakPtr<'db>;
30008    type Green = TokenBreakGreen<'db>;
30009    fn missing(db: &'db dyn Database) -> Self::Green {
30010        TokenBreakGreen(
30011            GreenNode {
30012                kind: SyntaxKind::TokenMissing,
30013                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30014            }
30015            .intern(db),
30016        )
30017    }
30018    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30019        match node.long(db).green.long(db).details {
30020            GreenNodeDetails::Token(_) => Self { node },
30021            GreenNodeDetails::Node { .. } => {
30022                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
30023            }
30024        }
30025    }
30026    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30027        match node.long(db).green.long(db).details {
30028            GreenNodeDetails::Token(_) => Some(Self { node }),
30029            GreenNodeDetails::Node { .. } => None,
30030        }
30031    }
30032    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30033        self.node
30034    }
30035    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30036        TokenBreakPtr(self.node.stable_ptr(db))
30037    }
30038}
30039#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30040pub struct TerminalBreak<'db> {
30041    node: SyntaxNode<'db>,
30042}
30043impl<'db> Terminal<'db> for TerminalBreak<'db> {
30044    const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
30045    type TokenType = TokenBreak<'db>;
30046    fn new_green(
30047        db: &'db dyn Database,
30048        leading_trivia: TriviaGreen<'db>,
30049        token: <<TerminalBreak<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30050        trailing_trivia: TriviaGreen<'db>,
30051    ) -> Self::Green {
30052        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30053        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30054        TerminalBreakGreen(
30055            GreenNode {
30056                kind: SyntaxKind::TerminalBreak,
30057                details: GreenNodeDetails::Node { children: children.into(), width },
30058            }
30059            .intern(db),
30060        )
30061    }
30062    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30063        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30064        else {
30065            unreachable!("Expected a node, not a token");
30066        };
30067        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30068    }
30069}
30070impl<'db> TerminalBreak<'db> {
30071    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30072        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30073    }
30074    pub fn token(&self, db: &'db dyn Database) -> TokenBreak<'db> {
30075        TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
30076    }
30077    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30078        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30079    }
30080}
30081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30082pub struct TerminalBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
30083impl<'db> TerminalBreakPtr<'db> {}
30084impl<'db> TypedStablePtr<'db> for TerminalBreakPtr<'db> {
30085    type SyntaxNode = TerminalBreak<'db>;
30086    fn untyped(self) -> SyntaxStablePtrId<'db> {
30087        self.0
30088    }
30089    fn lookup(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
30090        TerminalBreak::from_syntax_node(db, self.0.lookup(db))
30091    }
30092}
30093impl<'db> From<TerminalBreakPtr<'db>> for SyntaxStablePtrId<'db> {
30094    fn from(ptr: TerminalBreakPtr<'db>) -> Self {
30095        ptr.untyped()
30096    }
30097}
30098#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30099pub struct TerminalBreakGreen<'db>(pub GreenId<'db>);
30100impl<'db> TypedSyntaxNode<'db> for TerminalBreak<'db> {
30101    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
30102    type StablePtr = TerminalBreakPtr<'db>;
30103    type Green = TerminalBreakGreen<'db>;
30104    fn missing(db: &'db dyn Database) -> Self::Green {
30105        TerminalBreakGreen(
30106            GreenNode {
30107                kind: SyntaxKind::TerminalBreak,
30108                details: GreenNodeDetails::Node {
30109                    children: [
30110                        Trivia::missing(db).0,
30111                        TokenBreak::missing(db).0,
30112                        Trivia::missing(db).0,
30113                    ]
30114                    .into(),
30115                    width: TextWidth::default(),
30116                },
30117            }
30118            .intern(db),
30119        )
30120    }
30121    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30122        let kind = node.kind(db);
30123        assert_eq!(
30124            kind,
30125            SyntaxKind::TerminalBreak,
30126            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30127            kind,
30128            SyntaxKind::TerminalBreak
30129        );
30130        Self { node }
30131    }
30132    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30133        let kind = node.kind(db);
30134        if kind == SyntaxKind::TerminalBreak {
30135            Some(Self::from_syntax_node(db, node))
30136        } else {
30137            None
30138        }
30139    }
30140    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30141        self.node
30142    }
30143    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30144        TerminalBreakPtr(self.node.stable_ptr(db))
30145    }
30146}
30147#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30148pub struct TokenStruct<'db> {
30149    node: SyntaxNode<'db>,
30150}
30151impl<'db> Token<'db> for TokenStruct<'db> {
30152    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30153        TokenStructGreen(
30154            GreenNode { kind: SyntaxKind::TokenStruct, details: GreenNodeDetails::Token(text) }
30155                .intern(db),
30156        )
30157    }
30158    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30159        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30160    }
30161}
30162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30163pub struct TokenStructPtr<'db>(pub SyntaxStablePtrId<'db>);
30164impl<'db> TypedStablePtr<'db> for TokenStructPtr<'db> {
30165    type SyntaxNode = TokenStruct<'db>;
30166    fn untyped(self) -> SyntaxStablePtrId<'db> {
30167        self.0
30168    }
30169    fn lookup(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30170        TokenStruct::from_syntax_node(db, self.0.lookup(db))
30171    }
30172}
30173impl<'db> From<TokenStructPtr<'db>> for SyntaxStablePtrId<'db> {
30174    fn from(ptr: TokenStructPtr<'db>) -> Self {
30175        ptr.untyped()
30176    }
30177}
30178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30179pub struct TokenStructGreen<'db>(pub GreenId<'db>);
30180impl<'db> TokenStructGreen<'db> {
30181    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30182        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30183    }
30184}
30185impl<'db> TypedSyntaxNode<'db> for TokenStruct<'db> {
30186    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
30187    type StablePtr = TokenStructPtr<'db>;
30188    type Green = TokenStructGreen<'db>;
30189    fn missing(db: &'db dyn Database) -> Self::Green {
30190        TokenStructGreen(
30191            GreenNode {
30192                kind: SyntaxKind::TokenMissing,
30193                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30194            }
30195            .intern(db),
30196        )
30197    }
30198    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30199        match node.long(db).green.long(db).details {
30200            GreenNodeDetails::Token(_) => Self { node },
30201            GreenNodeDetails::Node { .. } => {
30202                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
30203            }
30204        }
30205    }
30206    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30207        match node.long(db).green.long(db).details {
30208            GreenNodeDetails::Token(_) => Some(Self { node }),
30209            GreenNodeDetails::Node { .. } => None,
30210        }
30211    }
30212    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30213        self.node
30214    }
30215    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30216        TokenStructPtr(self.node.stable_ptr(db))
30217    }
30218}
30219#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30220pub struct TerminalStruct<'db> {
30221    node: SyntaxNode<'db>,
30222}
30223impl<'db> Terminal<'db> for TerminalStruct<'db> {
30224    const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
30225    type TokenType = TokenStruct<'db>;
30226    fn new_green(
30227        db: &'db dyn Database,
30228        leading_trivia: TriviaGreen<'db>,
30229        token: <<TerminalStruct<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30230        trailing_trivia: TriviaGreen<'db>,
30231    ) -> Self::Green {
30232        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30233        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30234        TerminalStructGreen(
30235            GreenNode {
30236                kind: SyntaxKind::TerminalStruct,
30237                details: GreenNodeDetails::Node { children: children.into(), width },
30238            }
30239            .intern(db),
30240        )
30241    }
30242    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30243        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30244        else {
30245            unreachable!("Expected a node, not a token");
30246        };
30247        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30248    }
30249}
30250impl<'db> TerminalStruct<'db> {
30251    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30252        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30253    }
30254    pub fn token(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30255        TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
30256    }
30257    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30258        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30259    }
30260}
30261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30262pub struct TerminalStructPtr<'db>(pub SyntaxStablePtrId<'db>);
30263impl<'db> TerminalStructPtr<'db> {}
30264impl<'db> TypedStablePtr<'db> for TerminalStructPtr<'db> {
30265    type SyntaxNode = TerminalStruct<'db>;
30266    fn untyped(self) -> SyntaxStablePtrId<'db> {
30267        self.0
30268    }
30269    fn lookup(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
30270        TerminalStruct::from_syntax_node(db, self.0.lookup(db))
30271    }
30272}
30273impl<'db> From<TerminalStructPtr<'db>> for SyntaxStablePtrId<'db> {
30274    fn from(ptr: TerminalStructPtr<'db>) -> Self {
30275        ptr.untyped()
30276    }
30277}
30278#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30279pub struct TerminalStructGreen<'db>(pub GreenId<'db>);
30280impl<'db> TypedSyntaxNode<'db> for TerminalStruct<'db> {
30281    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
30282    type StablePtr = TerminalStructPtr<'db>;
30283    type Green = TerminalStructGreen<'db>;
30284    fn missing(db: &'db dyn Database) -> Self::Green {
30285        TerminalStructGreen(
30286            GreenNode {
30287                kind: SyntaxKind::TerminalStruct,
30288                details: GreenNodeDetails::Node {
30289                    children: [
30290                        Trivia::missing(db).0,
30291                        TokenStruct::missing(db).0,
30292                        Trivia::missing(db).0,
30293                    ]
30294                    .into(),
30295                    width: TextWidth::default(),
30296                },
30297            }
30298            .intern(db),
30299        )
30300    }
30301    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30302        let kind = node.kind(db);
30303        assert_eq!(
30304            kind,
30305            SyntaxKind::TerminalStruct,
30306            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30307            kind,
30308            SyntaxKind::TerminalStruct
30309        );
30310        Self { node }
30311    }
30312    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30313        let kind = node.kind(db);
30314        if kind == SyntaxKind::TerminalStruct {
30315            Some(Self::from_syntax_node(db, node))
30316        } else {
30317            None
30318        }
30319    }
30320    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30321        self.node
30322    }
30323    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30324        TerminalStructPtr(self.node.stable_ptr(db))
30325    }
30326}
30327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30328pub struct TokenTrait<'db> {
30329    node: SyntaxNode<'db>,
30330}
30331impl<'db> Token<'db> for TokenTrait<'db> {
30332    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30333        TokenTraitGreen(
30334            GreenNode { kind: SyntaxKind::TokenTrait, details: GreenNodeDetails::Token(text) }
30335                .intern(db),
30336        )
30337    }
30338    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30339        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30340    }
30341}
30342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30343pub struct TokenTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30344impl<'db> TypedStablePtr<'db> for TokenTraitPtr<'db> {
30345    type SyntaxNode = TokenTrait<'db>;
30346    fn untyped(self) -> SyntaxStablePtrId<'db> {
30347        self.0
30348    }
30349    fn lookup(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30350        TokenTrait::from_syntax_node(db, self.0.lookup(db))
30351    }
30352}
30353impl<'db> From<TokenTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30354    fn from(ptr: TokenTraitPtr<'db>) -> Self {
30355        ptr.untyped()
30356    }
30357}
30358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30359pub struct TokenTraitGreen<'db>(pub GreenId<'db>);
30360impl<'db> TokenTraitGreen<'db> {
30361    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30362        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30363    }
30364}
30365impl<'db> TypedSyntaxNode<'db> for TokenTrait<'db> {
30366    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
30367    type StablePtr = TokenTraitPtr<'db>;
30368    type Green = TokenTraitGreen<'db>;
30369    fn missing(db: &'db dyn Database) -> Self::Green {
30370        TokenTraitGreen(
30371            GreenNode {
30372                kind: SyntaxKind::TokenMissing,
30373                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30374            }
30375            .intern(db),
30376        )
30377    }
30378    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30379        match node.long(db).green.long(db).details {
30380            GreenNodeDetails::Token(_) => Self { node },
30381            GreenNodeDetails::Node { .. } => {
30382                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
30383            }
30384        }
30385    }
30386    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30387        match node.long(db).green.long(db).details {
30388            GreenNodeDetails::Token(_) => Some(Self { node }),
30389            GreenNodeDetails::Node { .. } => None,
30390        }
30391    }
30392    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30393        self.node
30394    }
30395    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30396        TokenTraitPtr(self.node.stable_ptr(db))
30397    }
30398}
30399#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30400pub struct TerminalTrait<'db> {
30401    node: SyntaxNode<'db>,
30402}
30403impl<'db> Terminal<'db> for TerminalTrait<'db> {
30404    const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
30405    type TokenType = TokenTrait<'db>;
30406    fn new_green(
30407        db: &'db dyn Database,
30408        leading_trivia: TriviaGreen<'db>,
30409        token: <<TerminalTrait<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30410        trailing_trivia: TriviaGreen<'db>,
30411    ) -> Self::Green {
30412        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30413        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30414        TerminalTraitGreen(
30415            GreenNode {
30416                kind: SyntaxKind::TerminalTrait,
30417                details: GreenNodeDetails::Node { children: children.into(), width },
30418            }
30419            .intern(db),
30420        )
30421    }
30422    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30423        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30424        else {
30425            unreachable!("Expected a node, not a token");
30426        };
30427        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30428    }
30429}
30430impl<'db> TerminalTrait<'db> {
30431    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30432        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30433    }
30434    pub fn token(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30435        TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30436    }
30437    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30438        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30439    }
30440}
30441#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30442pub struct TerminalTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30443impl<'db> TerminalTraitPtr<'db> {}
30444impl<'db> TypedStablePtr<'db> for TerminalTraitPtr<'db> {
30445    type SyntaxNode = TerminalTrait<'db>;
30446    fn untyped(self) -> SyntaxStablePtrId<'db> {
30447        self.0
30448    }
30449    fn lookup(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
30450        TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30451    }
30452}
30453impl<'db> From<TerminalTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30454    fn from(ptr: TerminalTraitPtr<'db>) -> Self {
30455        ptr.untyped()
30456    }
30457}
30458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30459pub struct TerminalTraitGreen<'db>(pub GreenId<'db>);
30460impl<'db> TypedSyntaxNode<'db> for TerminalTrait<'db> {
30461    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30462    type StablePtr = TerminalTraitPtr<'db>;
30463    type Green = TerminalTraitGreen<'db>;
30464    fn missing(db: &'db dyn Database) -> Self::Green {
30465        TerminalTraitGreen(
30466            GreenNode {
30467                kind: SyntaxKind::TerminalTrait,
30468                details: GreenNodeDetails::Node {
30469                    children: [
30470                        Trivia::missing(db).0,
30471                        TokenTrait::missing(db).0,
30472                        Trivia::missing(db).0,
30473                    ]
30474                    .into(),
30475                    width: TextWidth::default(),
30476                },
30477            }
30478            .intern(db),
30479        )
30480    }
30481    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30482        let kind = node.kind(db);
30483        assert_eq!(
30484            kind,
30485            SyntaxKind::TerminalTrait,
30486            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30487            kind,
30488            SyntaxKind::TerminalTrait
30489        );
30490        Self { node }
30491    }
30492    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30493        let kind = node.kind(db);
30494        if kind == SyntaxKind::TerminalTrait {
30495            Some(Self::from_syntax_node(db, node))
30496        } else {
30497            None
30498        }
30499    }
30500    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30501        self.node
30502    }
30503    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30504        TerminalTraitPtr(self.node.stable_ptr(db))
30505    }
30506}
30507#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30508pub struct TokenTrue<'db> {
30509    node: SyntaxNode<'db>,
30510}
30511impl<'db> Token<'db> for TokenTrue<'db> {
30512    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30513        TokenTrueGreen(
30514            GreenNode { kind: SyntaxKind::TokenTrue, details: GreenNodeDetails::Token(text) }
30515                .intern(db),
30516        )
30517    }
30518    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30519        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30520    }
30521}
30522#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30523pub struct TokenTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30524impl<'db> TypedStablePtr<'db> for TokenTruePtr<'db> {
30525    type SyntaxNode = TokenTrue<'db>;
30526    fn untyped(self) -> SyntaxStablePtrId<'db> {
30527        self.0
30528    }
30529    fn lookup(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30530        TokenTrue::from_syntax_node(db, self.0.lookup(db))
30531    }
30532}
30533impl<'db> From<TokenTruePtr<'db>> for SyntaxStablePtrId<'db> {
30534    fn from(ptr: TokenTruePtr<'db>) -> Self {
30535        ptr.untyped()
30536    }
30537}
30538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30539pub struct TokenTrueGreen<'db>(pub GreenId<'db>);
30540impl<'db> TokenTrueGreen<'db> {
30541    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30542        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30543    }
30544}
30545impl<'db> TypedSyntaxNode<'db> for TokenTrue<'db> {
30546    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30547    type StablePtr = TokenTruePtr<'db>;
30548    type Green = TokenTrueGreen<'db>;
30549    fn missing(db: &'db dyn Database) -> Self::Green {
30550        TokenTrueGreen(
30551            GreenNode {
30552                kind: SyntaxKind::TokenMissing,
30553                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30554            }
30555            .intern(db),
30556        )
30557    }
30558    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30559        match node.long(db).green.long(db).details {
30560            GreenNodeDetails::Token(_) => Self { node },
30561            GreenNodeDetails::Node { .. } => {
30562                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30563            }
30564        }
30565    }
30566    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30567        match node.long(db).green.long(db).details {
30568            GreenNodeDetails::Token(_) => Some(Self { node }),
30569            GreenNodeDetails::Node { .. } => None,
30570        }
30571    }
30572    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30573        self.node
30574    }
30575    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30576        TokenTruePtr(self.node.stable_ptr(db))
30577    }
30578}
30579#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30580pub struct TerminalTrue<'db> {
30581    node: SyntaxNode<'db>,
30582}
30583impl<'db> Terminal<'db> for TerminalTrue<'db> {
30584    const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30585    type TokenType = TokenTrue<'db>;
30586    fn new_green(
30587        db: &'db dyn Database,
30588        leading_trivia: TriviaGreen<'db>,
30589        token: <<TerminalTrue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30590        trailing_trivia: TriviaGreen<'db>,
30591    ) -> Self::Green {
30592        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30593        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30594        TerminalTrueGreen(
30595            GreenNode {
30596                kind: SyntaxKind::TerminalTrue,
30597                details: GreenNodeDetails::Node { children: children.into(), width },
30598            }
30599            .intern(db),
30600        )
30601    }
30602    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30603        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30604        else {
30605            unreachable!("Expected a node, not a token");
30606        };
30607        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30608    }
30609}
30610impl<'db> TerminalTrue<'db> {
30611    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30612        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30613    }
30614    pub fn token(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30615        TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30616    }
30617    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30618        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30619    }
30620}
30621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30622pub struct TerminalTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30623impl<'db> TerminalTruePtr<'db> {}
30624impl<'db> TypedStablePtr<'db> for TerminalTruePtr<'db> {
30625    type SyntaxNode = TerminalTrue<'db>;
30626    fn untyped(self) -> SyntaxStablePtrId<'db> {
30627        self.0
30628    }
30629    fn lookup(&self, db: &'db dyn Database) -> TerminalTrue<'db> {
30630        TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30631    }
30632}
30633impl<'db> From<TerminalTruePtr<'db>> for SyntaxStablePtrId<'db> {
30634    fn from(ptr: TerminalTruePtr<'db>) -> Self {
30635        ptr.untyped()
30636    }
30637}
30638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30639pub struct TerminalTrueGreen<'db>(pub GreenId<'db>);
30640impl<'db> TypedSyntaxNode<'db> for TerminalTrue<'db> {
30641    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30642    type StablePtr = TerminalTruePtr<'db>;
30643    type Green = TerminalTrueGreen<'db>;
30644    fn missing(db: &'db dyn Database) -> Self::Green {
30645        TerminalTrueGreen(
30646            GreenNode {
30647                kind: SyntaxKind::TerminalTrue,
30648                details: GreenNodeDetails::Node {
30649                    children: [
30650                        Trivia::missing(db).0,
30651                        TokenTrue::missing(db).0,
30652                        Trivia::missing(db).0,
30653                    ]
30654                    .into(),
30655                    width: TextWidth::default(),
30656                },
30657            }
30658            .intern(db),
30659        )
30660    }
30661    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30662        let kind = node.kind(db);
30663        assert_eq!(
30664            kind,
30665            SyntaxKind::TerminalTrue,
30666            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30667            kind,
30668            SyntaxKind::TerminalTrue
30669        );
30670        Self { node }
30671    }
30672    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30673        let kind = node.kind(db);
30674        if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30675    }
30676    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30677        self.node
30678    }
30679    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30680        TerminalTruePtr(self.node.stable_ptr(db))
30681    }
30682}
30683#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30684pub struct TokenType<'db> {
30685    node: SyntaxNode<'db>,
30686}
30687impl<'db> Token<'db> for TokenType<'db> {
30688    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30689        TokenTypeGreen(
30690            GreenNode { kind: SyntaxKind::TokenType, details: GreenNodeDetails::Token(text) }
30691                .intern(db),
30692        )
30693    }
30694    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30695        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30696    }
30697}
30698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30699pub struct TokenTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30700impl<'db> TypedStablePtr<'db> for TokenTypePtr<'db> {
30701    type SyntaxNode = TokenType<'db>;
30702    fn untyped(self) -> SyntaxStablePtrId<'db> {
30703        self.0
30704    }
30705    fn lookup(&self, db: &'db dyn Database) -> TokenType<'db> {
30706        TokenType::from_syntax_node(db, self.0.lookup(db))
30707    }
30708}
30709impl<'db> From<TokenTypePtr<'db>> for SyntaxStablePtrId<'db> {
30710    fn from(ptr: TokenTypePtr<'db>) -> Self {
30711        ptr.untyped()
30712    }
30713}
30714#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30715pub struct TokenTypeGreen<'db>(pub GreenId<'db>);
30716impl<'db> TokenTypeGreen<'db> {
30717    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30718        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30719    }
30720}
30721impl<'db> TypedSyntaxNode<'db> for TokenType<'db> {
30722    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
30723    type StablePtr = TokenTypePtr<'db>;
30724    type Green = TokenTypeGreen<'db>;
30725    fn missing(db: &'db dyn Database) -> Self::Green {
30726        TokenTypeGreen(
30727            GreenNode {
30728                kind: SyntaxKind::TokenMissing,
30729                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30730            }
30731            .intern(db),
30732        )
30733    }
30734    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30735        match node.long(db).green.long(db).details {
30736            GreenNodeDetails::Token(_) => Self { node },
30737            GreenNodeDetails::Node { .. } => {
30738                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
30739            }
30740        }
30741    }
30742    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30743        match node.long(db).green.long(db).details {
30744            GreenNodeDetails::Token(_) => Some(Self { node }),
30745            GreenNodeDetails::Node { .. } => None,
30746        }
30747    }
30748    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30749        self.node
30750    }
30751    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30752        TokenTypePtr(self.node.stable_ptr(db))
30753    }
30754}
30755#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30756pub struct TerminalType<'db> {
30757    node: SyntaxNode<'db>,
30758}
30759impl<'db> Terminal<'db> for TerminalType<'db> {
30760    const KIND: SyntaxKind = SyntaxKind::TerminalType;
30761    type TokenType = TokenType<'db>;
30762    fn new_green(
30763        db: &'db dyn Database,
30764        leading_trivia: TriviaGreen<'db>,
30765        token: <<TerminalType<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30766        trailing_trivia: TriviaGreen<'db>,
30767    ) -> Self::Green {
30768        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30769        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30770        TerminalTypeGreen(
30771            GreenNode {
30772                kind: SyntaxKind::TerminalType,
30773                details: GreenNodeDetails::Node { children: children.into(), width },
30774            }
30775            .intern(db),
30776        )
30777    }
30778    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30779        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30780        else {
30781            unreachable!("Expected a node, not a token");
30782        };
30783        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30784    }
30785}
30786impl<'db> TerminalType<'db> {
30787    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30788        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30789    }
30790    pub fn token(&self, db: &'db dyn Database) -> TokenType<'db> {
30791        TokenType::from_syntax_node(db, self.node.get_children(db)[1])
30792    }
30793    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30794        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30795    }
30796}
30797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30798pub struct TerminalTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30799impl<'db> TerminalTypePtr<'db> {}
30800impl<'db> TypedStablePtr<'db> for TerminalTypePtr<'db> {
30801    type SyntaxNode = TerminalType<'db>;
30802    fn untyped(self) -> SyntaxStablePtrId<'db> {
30803        self.0
30804    }
30805    fn lookup(&self, db: &'db dyn Database) -> TerminalType<'db> {
30806        TerminalType::from_syntax_node(db, self.0.lookup(db))
30807    }
30808}
30809impl<'db> From<TerminalTypePtr<'db>> for SyntaxStablePtrId<'db> {
30810    fn from(ptr: TerminalTypePtr<'db>) -> Self {
30811        ptr.untyped()
30812    }
30813}
30814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30815pub struct TerminalTypeGreen<'db>(pub GreenId<'db>);
30816impl<'db> TypedSyntaxNode<'db> for TerminalType<'db> {
30817    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
30818    type StablePtr = TerminalTypePtr<'db>;
30819    type Green = TerminalTypeGreen<'db>;
30820    fn missing(db: &'db dyn Database) -> Self::Green {
30821        TerminalTypeGreen(
30822            GreenNode {
30823                kind: SyntaxKind::TerminalType,
30824                details: GreenNodeDetails::Node {
30825                    children: [
30826                        Trivia::missing(db).0,
30827                        TokenType::missing(db).0,
30828                        Trivia::missing(db).0,
30829                    ]
30830                    .into(),
30831                    width: TextWidth::default(),
30832                },
30833            }
30834            .intern(db),
30835        )
30836    }
30837    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30838        let kind = node.kind(db);
30839        assert_eq!(
30840            kind,
30841            SyntaxKind::TerminalType,
30842            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30843            kind,
30844            SyntaxKind::TerminalType
30845        );
30846        Self { node }
30847    }
30848    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30849        let kind = node.kind(db);
30850        if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
30851    }
30852    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30853        self.node
30854    }
30855    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30856        TerminalTypePtr(self.node.stable_ptr(db))
30857    }
30858}
30859#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30860pub struct TokenUse<'db> {
30861    node: SyntaxNode<'db>,
30862}
30863impl<'db> Token<'db> for TokenUse<'db> {
30864    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30865        TokenUseGreen(
30866            GreenNode { kind: SyntaxKind::TokenUse, details: GreenNodeDetails::Token(text) }
30867                .intern(db),
30868        )
30869    }
30870    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30871        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
30872    }
30873}
30874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30875pub struct TokenUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30876impl<'db> TypedStablePtr<'db> for TokenUsePtr<'db> {
30877    type SyntaxNode = TokenUse<'db>;
30878    fn untyped(self) -> SyntaxStablePtrId<'db> {
30879        self.0
30880    }
30881    fn lookup(&self, db: &'db dyn Database) -> TokenUse<'db> {
30882        TokenUse::from_syntax_node(db, self.0.lookup(db))
30883    }
30884}
30885impl<'db> From<TokenUsePtr<'db>> for SyntaxStablePtrId<'db> {
30886    fn from(ptr: TokenUsePtr<'db>) -> Self {
30887        ptr.untyped()
30888    }
30889}
30890#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30891pub struct TokenUseGreen<'db>(pub GreenId<'db>);
30892impl<'db> TokenUseGreen<'db> {
30893    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30894        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30895    }
30896}
30897impl<'db> TypedSyntaxNode<'db> for TokenUse<'db> {
30898    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
30899    type StablePtr = TokenUsePtr<'db>;
30900    type Green = TokenUseGreen<'db>;
30901    fn missing(db: &'db dyn Database) -> Self::Green {
30902        TokenUseGreen(
30903            GreenNode {
30904                kind: SyntaxKind::TokenMissing,
30905                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30906            }
30907            .intern(db),
30908        )
30909    }
30910    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30911        match node.long(db).green.long(db).details {
30912            GreenNodeDetails::Token(_) => Self { node },
30913            GreenNodeDetails::Node { .. } => {
30914                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
30915            }
30916        }
30917    }
30918    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30919        match node.long(db).green.long(db).details {
30920            GreenNodeDetails::Token(_) => Some(Self { node }),
30921            GreenNodeDetails::Node { .. } => None,
30922        }
30923    }
30924    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30925        self.node
30926    }
30927    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30928        TokenUsePtr(self.node.stable_ptr(db))
30929    }
30930}
30931#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30932pub struct TerminalUse<'db> {
30933    node: SyntaxNode<'db>,
30934}
30935impl<'db> Terminal<'db> for TerminalUse<'db> {
30936    const KIND: SyntaxKind = SyntaxKind::TerminalUse;
30937    type TokenType = TokenUse<'db>;
30938    fn new_green(
30939        db: &'db dyn Database,
30940        leading_trivia: TriviaGreen<'db>,
30941        token: <<TerminalUse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30942        trailing_trivia: TriviaGreen<'db>,
30943    ) -> Self::Green {
30944        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30945        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30946        TerminalUseGreen(
30947            GreenNode {
30948                kind: SyntaxKind::TerminalUse,
30949                details: GreenNodeDetails::Node { children: children.into(), width },
30950            }
30951            .intern(db),
30952        )
30953    }
30954    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30955        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
30956        else {
30957            unreachable!("Expected a node, not a token");
30958        };
30959        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30960    }
30961}
30962impl<'db> TerminalUse<'db> {
30963    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30964        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30965    }
30966    pub fn token(&self, db: &'db dyn Database) -> TokenUse<'db> {
30967        TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
30968    }
30969    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30970        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30971    }
30972}
30973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30974pub struct TerminalUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30975impl<'db> TerminalUsePtr<'db> {}
30976impl<'db> TypedStablePtr<'db> for TerminalUsePtr<'db> {
30977    type SyntaxNode = TerminalUse<'db>;
30978    fn untyped(self) -> SyntaxStablePtrId<'db> {
30979        self.0
30980    }
30981    fn lookup(&self, db: &'db dyn Database) -> TerminalUse<'db> {
30982        TerminalUse::from_syntax_node(db, self.0.lookup(db))
30983    }
30984}
30985impl<'db> From<TerminalUsePtr<'db>> for SyntaxStablePtrId<'db> {
30986    fn from(ptr: TerminalUsePtr<'db>) -> Self {
30987        ptr.untyped()
30988    }
30989}
30990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30991pub struct TerminalUseGreen<'db>(pub GreenId<'db>);
30992impl<'db> TypedSyntaxNode<'db> for TerminalUse<'db> {
30993    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
30994    type StablePtr = TerminalUsePtr<'db>;
30995    type Green = TerminalUseGreen<'db>;
30996    fn missing(db: &'db dyn Database) -> Self::Green {
30997        TerminalUseGreen(
30998            GreenNode {
30999                kind: SyntaxKind::TerminalUse,
31000                details: GreenNodeDetails::Node {
31001                    children: [
31002                        Trivia::missing(db).0,
31003                        TokenUse::missing(db).0,
31004                        Trivia::missing(db).0,
31005                    ]
31006                    .into(),
31007                    width: TextWidth::default(),
31008                },
31009            }
31010            .intern(db),
31011        )
31012    }
31013    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31014        let kind = node.kind(db);
31015        assert_eq!(
31016            kind,
31017            SyntaxKind::TerminalUse,
31018            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31019            kind,
31020            SyntaxKind::TerminalUse
31021        );
31022        Self { node }
31023    }
31024    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31025        let kind = node.kind(db);
31026        if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
31027    }
31028    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31029        self.node
31030    }
31031    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31032        TerminalUsePtr(self.node.stable_ptr(db))
31033    }
31034}
31035#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31036pub struct TokenPub<'db> {
31037    node: SyntaxNode<'db>,
31038}
31039impl<'db> Token<'db> for TokenPub<'db> {
31040    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31041        TokenPubGreen(
31042            GreenNode { kind: SyntaxKind::TokenPub, details: GreenNodeDetails::Token(text) }
31043                .intern(db),
31044        )
31045    }
31046    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31047        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31048    }
31049}
31050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31051pub struct TokenPubPtr<'db>(pub SyntaxStablePtrId<'db>);
31052impl<'db> TypedStablePtr<'db> for TokenPubPtr<'db> {
31053    type SyntaxNode = TokenPub<'db>;
31054    fn untyped(self) -> SyntaxStablePtrId<'db> {
31055        self.0
31056    }
31057    fn lookup(&self, db: &'db dyn Database) -> TokenPub<'db> {
31058        TokenPub::from_syntax_node(db, self.0.lookup(db))
31059    }
31060}
31061impl<'db> From<TokenPubPtr<'db>> for SyntaxStablePtrId<'db> {
31062    fn from(ptr: TokenPubPtr<'db>) -> Self {
31063        ptr.untyped()
31064    }
31065}
31066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31067pub struct TokenPubGreen<'db>(pub GreenId<'db>);
31068impl<'db> TokenPubGreen<'db> {
31069    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31070        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31071    }
31072}
31073impl<'db> TypedSyntaxNode<'db> for TokenPub<'db> {
31074    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
31075    type StablePtr = TokenPubPtr<'db>;
31076    type Green = TokenPubGreen<'db>;
31077    fn missing(db: &'db dyn Database) -> Self::Green {
31078        TokenPubGreen(
31079            GreenNode {
31080                kind: SyntaxKind::TokenMissing,
31081                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31082            }
31083            .intern(db),
31084        )
31085    }
31086    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31087        match node.long(db).green.long(db).details {
31088            GreenNodeDetails::Token(_) => Self { node },
31089            GreenNodeDetails::Node { .. } => {
31090                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
31091            }
31092        }
31093    }
31094    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31095        match node.long(db).green.long(db).details {
31096            GreenNodeDetails::Token(_) => Some(Self { node }),
31097            GreenNodeDetails::Node { .. } => None,
31098        }
31099    }
31100    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31101        self.node
31102    }
31103    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31104        TokenPubPtr(self.node.stable_ptr(db))
31105    }
31106}
31107#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31108pub struct TerminalPub<'db> {
31109    node: SyntaxNode<'db>,
31110}
31111impl<'db> Terminal<'db> for TerminalPub<'db> {
31112    const KIND: SyntaxKind = SyntaxKind::TerminalPub;
31113    type TokenType = TokenPub<'db>;
31114    fn new_green(
31115        db: &'db dyn Database,
31116        leading_trivia: TriviaGreen<'db>,
31117        token: <<TerminalPub<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31118        trailing_trivia: TriviaGreen<'db>,
31119    ) -> Self::Green {
31120        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31121        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31122        TerminalPubGreen(
31123            GreenNode {
31124                kind: SyntaxKind::TerminalPub,
31125                details: GreenNodeDetails::Node { children: children.into(), width },
31126            }
31127            .intern(db),
31128        )
31129    }
31130    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31131        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31132        else {
31133            unreachable!("Expected a node, not a token");
31134        };
31135        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31136    }
31137}
31138impl<'db> TerminalPub<'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) -> TokenPub<'db> {
31143        TokenPub::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 TerminalPubPtr<'db>(pub SyntaxStablePtrId<'db>);
31151impl<'db> TerminalPubPtr<'db> {}
31152impl<'db> TypedStablePtr<'db> for TerminalPubPtr<'db> {
31153    type SyntaxNode = TerminalPub<'db>;
31154    fn untyped(self) -> SyntaxStablePtrId<'db> {
31155        self.0
31156    }
31157    fn lookup(&self, db: &'db dyn Database) -> TerminalPub<'db> {
31158        TerminalPub::from_syntax_node(db, self.0.lookup(db))
31159    }
31160}
31161impl<'db> From<TerminalPubPtr<'db>> for SyntaxStablePtrId<'db> {
31162    fn from(ptr: TerminalPubPtr<'db>) -> Self {
31163        ptr.untyped()
31164    }
31165}
31166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31167pub struct TerminalPubGreen<'db>(pub GreenId<'db>);
31168impl<'db> TypedSyntaxNode<'db> for TerminalPub<'db> {
31169    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
31170    type StablePtr = TerminalPubPtr<'db>;
31171    type Green = TerminalPubGreen<'db>;
31172    fn missing(db: &'db dyn Database) -> Self::Green {
31173        TerminalPubGreen(
31174            GreenNode {
31175                kind: SyntaxKind::TerminalPub,
31176                details: GreenNodeDetails::Node {
31177                    children: [
31178                        Trivia::missing(db).0,
31179                        TokenPub::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::TerminalPub,
31194            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31195            kind,
31196            SyntaxKind::TerminalPub
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::TerminalPub { 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        TerminalPubPtr(self.node.stable_ptr(db))
31209    }
31210}
31211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31212pub struct TokenAnd<'db> {
31213    node: SyntaxNode<'db>,
31214}
31215impl<'db> Token<'db> for TokenAnd<'db> {
31216    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31217        TokenAndGreen(
31218            GreenNode { kind: SyntaxKind::TokenAnd, details: GreenNodeDetails::Token(text) }
31219                .intern(db),
31220        )
31221    }
31222    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31223        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31224    }
31225}
31226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31227pub struct TokenAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31228impl<'db> TypedStablePtr<'db> for TokenAndPtr<'db> {
31229    type SyntaxNode = TokenAnd<'db>;
31230    fn untyped(self) -> SyntaxStablePtrId<'db> {
31231        self.0
31232    }
31233    fn lookup(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31234        TokenAnd::from_syntax_node(db, self.0.lookup(db))
31235    }
31236}
31237impl<'db> From<TokenAndPtr<'db>> for SyntaxStablePtrId<'db> {
31238    fn from(ptr: TokenAndPtr<'db>) -> Self {
31239        ptr.untyped()
31240    }
31241}
31242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31243pub struct TokenAndGreen<'db>(pub GreenId<'db>);
31244impl<'db> TokenAndGreen<'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 TokenAnd<'db> {
31250    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
31251    type StablePtr = TokenAndPtr<'db>;
31252    type Green = TokenAndGreen<'db>;
31253    fn missing(db: &'db dyn Database) -> Self::Green {
31254        TokenAndGreen(
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.long(db).green.long(db).details {
31264            GreenNodeDetails::Token(_) => Self { node },
31265            GreenNodeDetails::Node { .. } => {
31266                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
31267            }
31268        }
31269    }
31270    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31271        match node.long(db).green.long(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        TokenAndPtr(self.node.stable_ptr(db))
31281    }
31282}
31283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31284pub struct TerminalAnd<'db> {
31285    node: SyntaxNode<'db>,
31286}
31287impl<'db> Terminal<'db> for TerminalAnd<'db> {
31288    const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
31289    type TokenType = TokenAnd<'db>;
31290    fn new_green(
31291        db: &'db dyn Database,
31292        leading_trivia: TriviaGreen<'db>,
31293        token: <<TerminalAnd<'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        TerminalAndGreen(
31299            GreenNode {
31300                kind: SyntaxKind::TerminalAnd,
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.long(db).green.long(db).details
31308        else {
31309            unreachable!("Expected a node, not a token");
31310        };
31311        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31312    }
31313}
31314impl<'db> TerminalAnd<'db> {
31315    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31316        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31317    }
31318    pub fn token(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31319        TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
31320    }
31321    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31322        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31323    }
31324}
31325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31326pub struct TerminalAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31327impl<'db> TerminalAndPtr<'db> {}
31328impl<'db> TypedStablePtr<'db> for TerminalAndPtr<'db> {
31329    type SyntaxNode = TerminalAnd<'db>;
31330    fn untyped(self) -> SyntaxStablePtrId<'db> {
31331        self.0
31332    }
31333    fn lookup(&self, db: &'db dyn Database) -> TerminalAnd<'db> {
31334        TerminalAnd::from_syntax_node(db, self.0.lookup(db))
31335    }
31336}
31337impl<'db> From<TerminalAndPtr<'db>> for SyntaxStablePtrId<'db> {
31338    fn from(ptr: TerminalAndPtr<'db>) -> Self {
31339        ptr.untyped()
31340    }
31341}
31342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31343pub struct TerminalAndGreen<'db>(pub GreenId<'db>);
31344impl<'db> TypedSyntaxNode<'db> for TerminalAnd<'db> {
31345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
31346    type StablePtr = TerminalAndPtr<'db>;
31347    type Green = TerminalAndGreen<'db>;
31348    fn missing(db: &'db dyn Database) -> Self::Green {
31349        TerminalAndGreen(
31350            GreenNode {
31351                kind: SyntaxKind::TerminalAnd,
31352                details: GreenNodeDetails::Node {
31353                    children: [
31354                        Trivia::missing(db).0,
31355                        TokenAnd::missing(db).0,
31356                        Trivia::missing(db).0,
31357                    ]
31358                    .into(),
31359                    width: TextWidth::default(),
31360                },
31361            }
31362            .intern(db),
31363        )
31364    }
31365    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31366        let kind = node.kind(db);
31367        assert_eq!(
31368            kind,
31369            SyntaxKind::TerminalAnd,
31370            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31371            kind,
31372            SyntaxKind::TerminalAnd
31373        );
31374        Self { node }
31375    }
31376    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31377        let kind = node.kind(db);
31378        if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
31379    }
31380    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31381        self.node
31382    }
31383    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31384        TerminalAndPtr(self.node.stable_ptr(db))
31385    }
31386}
31387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31388pub struct TokenAndAnd<'db> {
31389    node: SyntaxNode<'db>,
31390}
31391impl<'db> Token<'db> for TokenAndAnd<'db> {
31392    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31393        TokenAndAndGreen(
31394            GreenNode { kind: SyntaxKind::TokenAndAnd, details: GreenNodeDetails::Token(text) }
31395                .intern(db),
31396        )
31397    }
31398    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31399        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31400    }
31401}
31402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31403pub struct TokenAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31404impl<'db> TypedStablePtr<'db> for TokenAndAndPtr<'db> {
31405    type SyntaxNode = TokenAndAnd<'db>;
31406    fn untyped(self) -> SyntaxStablePtrId<'db> {
31407        self.0
31408    }
31409    fn lookup(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31410        TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
31411    }
31412}
31413impl<'db> From<TokenAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31414    fn from(ptr: TokenAndAndPtr<'db>) -> Self {
31415        ptr.untyped()
31416    }
31417}
31418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31419pub struct TokenAndAndGreen<'db>(pub GreenId<'db>);
31420impl<'db> TokenAndAndGreen<'db> {
31421    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31422        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31423    }
31424}
31425impl<'db> TypedSyntaxNode<'db> for TokenAndAnd<'db> {
31426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
31427    type StablePtr = TokenAndAndPtr<'db>;
31428    type Green = TokenAndAndGreen<'db>;
31429    fn missing(db: &'db dyn Database) -> Self::Green {
31430        TokenAndAndGreen(
31431            GreenNode {
31432                kind: SyntaxKind::TokenMissing,
31433                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31434            }
31435            .intern(db),
31436        )
31437    }
31438    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31439        match node.long(db).green.long(db).details {
31440            GreenNodeDetails::Token(_) => Self { node },
31441            GreenNodeDetails::Node { .. } => {
31442                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31443            }
31444        }
31445    }
31446    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31447        match node.long(db).green.long(db).details {
31448            GreenNodeDetails::Token(_) => Some(Self { node }),
31449            GreenNodeDetails::Node { .. } => None,
31450        }
31451    }
31452    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31453        self.node
31454    }
31455    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31456        TokenAndAndPtr(self.node.stable_ptr(db))
31457    }
31458}
31459#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31460pub struct TerminalAndAnd<'db> {
31461    node: SyntaxNode<'db>,
31462}
31463impl<'db> Terminal<'db> for TerminalAndAnd<'db> {
31464    const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31465    type TokenType = TokenAndAnd<'db>;
31466    fn new_green(
31467        db: &'db dyn Database,
31468        leading_trivia: TriviaGreen<'db>,
31469        token: <<TerminalAndAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31470        trailing_trivia: TriviaGreen<'db>,
31471    ) -> Self::Green {
31472        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31473        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31474        TerminalAndAndGreen(
31475            GreenNode {
31476                kind: SyntaxKind::TerminalAndAnd,
31477                details: GreenNodeDetails::Node { children: children.into(), width },
31478            }
31479            .intern(db),
31480        )
31481    }
31482    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31483        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31484        else {
31485            unreachable!("Expected a node, not a token");
31486        };
31487        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31488    }
31489}
31490impl<'db> TerminalAndAnd<'db> {
31491    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31492        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31493    }
31494    pub fn token(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31495        TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31496    }
31497    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31498        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31499    }
31500}
31501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31502pub struct TerminalAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31503impl<'db> TerminalAndAndPtr<'db> {}
31504impl<'db> TypedStablePtr<'db> for TerminalAndAndPtr<'db> {
31505    type SyntaxNode = TerminalAndAnd<'db>;
31506    fn untyped(self) -> SyntaxStablePtrId<'db> {
31507        self.0
31508    }
31509    fn lookup(&self, db: &'db dyn Database) -> TerminalAndAnd<'db> {
31510        TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31511    }
31512}
31513impl<'db> From<TerminalAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31514    fn from(ptr: TerminalAndAndPtr<'db>) -> Self {
31515        ptr.untyped()
31516    }
31517}
31518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31519pub struct TerminalAndAndGreen<'db>(pub GreenId<'db>);
31520impl<'db> TypedSyntaxNode<'db> for TerminalAndAnd<'db> {
31521    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31522    type StablePtr = TerminalAndAndPtr<'db>;
31523    type Green = TerminalAndAndGreen<'db>;
31524    fn missing(db: &'db dyn Database) -> Self::Green {
31525        TerminalAndAndGreen(
31526            GreenNode {
31527                kind: SyntaxKind::TerminalAndAnd,
31528                details: GreenNodeDetails::Node {
31529                    children: [
31530                        Trivia::missing(db).0,
31531                        TokenAndAnd::missing(db).0,
31532                        Trivia::missing(db).0,
31533                    ]
31534                    .into(),
31535                    width: TextWidth::default(),
31536                },
31537            }
31538            .intern(db),
31539        )
31540    }
31541    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31542        let kind = node.kind(db);
31543        assert_eq!(
31544            kind,
31545            SyntaxKind::TerminalAndAnd,
31546            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31547            kind,
31548            SyntaxKind::TerminalAndAnd
31549        );
31550        Self { node }
31551    }
31552    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31553        let kind = node.kind(db);
31554        if kind == SyntaxKind::TerminalAndAnd {
31555            Some(Self::from_syntax_node(db, node))
31556        } else {
31557            None
31558        }
31559    }
31560    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31561        self.node
31562    }
31563    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31564        TerminalAndAndPtr(self.node.stable_ptr(db))
31565    }
31566}
31567#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31568pub struct TokenArrow<'db> {
31569    node: SyntaxNode<'db>,
31570}
31571impl<'db> Token<'db> for TokenArrow<'db> {
31572    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31573        TokenArrowGreen(
31574            GreenNode { kind: SyntaxKind::TokenArrow, details: GreenNodeDetails::Token(text) }
31575                .intern(db),
31576        )
31577    }
31578    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31579        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31580    }
31581}
31582#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31583pub struct TokenArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31584impl<'db> TypedStablePtr<'db> for TokenArrowPtr<'db> {
31585    type SyntaxNode = TokenArrow<'db>;
31586    fn untyped(self) -> SyntaxStablePtrId<'db> {
31587        self.0
31588    }
31589    fn lookup(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31590        TokenArrow::from_syntax_node(db, self.0.lookup(db))
31591    }
31592}
31593impl<'db> From<TokenArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31594    fn from(ptr: TokenArrowPtr<'db>) -> Self {
31595        ptr.untyped()
31596    }
31597}
31598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31599pub struct TokenArrowGreen<'db>(pub GreenId<'db>);
31600impl<'db> TokenArrowGreen<'db> {
31601    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31602        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31603    }
31604}
31605impl<'db> TypedSyntaxNode<'db> for TokenArrow<'db> {
31606    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31607    type StablePtr = TokenArrowPtr<'db>;
31608    type Green = TokenArrowGreen<'db>;
31609    fn missing(db: &'db dyn Database) -> Self::Green {
31610        TokenArrowGreen(
31611            GreenNode {
31612                kind: SyntaxKind::TokenMissing,
31613                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31614            }
31615            .intern(db),
31616        )
31617    }
31618    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31619        match node.long(db).green.long(db).details {
31620            GreenNodeDetails::Token(_) => Self { node },
31621            GreenNodeDetails::Node { .. } => {
31622                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31623            }
31624        }
31625    }
31626    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31627        match node.long(db).green.long(db).details {
31628            GreenNodeDetails::Token(_) => Some(Self { node }),
31629            GreenNodeDetails::Node { .. } => None,
31630        }
31631    }
31632    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31633        self.node
31634    }
31635    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31636        TokenArrowPtr(self.node.stable_ptr(db))
31637    }
31638}
31639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31640pub struct TerminalArrow<'db> {
31641    node: SyntaxNode<'db>,
31642}
31643impl<'db> Terminal<'db> for TerminalArrow<'db> {
31644    const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31645    type TokenType = TokenArrow<'db>;
31646    fn new_green(
31647        db: &'db dyn Database,
31648        leading_trivia: TriviaGreen<'db>,
31649        token: <<TerminalArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31650        trailing_trivia: TriviaGreen<'db>,
31651    ) -> Self::Green {
31652        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31653        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31654        TerminalArrowGreen(
31655            GreenNode {
31656                kind: SyntaxKind::TerminalArrow,
31657                details: GreenNodeDetails::Node { children: children.into(), width },
31658            }
31659            .intern(db),
31660        )
31661    }
31662    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31663        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31664        else {
31665            unreachable!("Expected a node, not a token");
31666        };
31667        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31668    }
31669}
31670impl<'db> TerminalArrow<'db> {
31671    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31672        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31673    }
31674    pub fn token(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31675        TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31676    }
31677    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31678        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31679    }
31680}
31681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31682pub struct TerminalArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31683impl<'db> TerminalArrowPtr<'db> {}
31684impl<'db> TypedStablePtr<'db> for TerminalArrowPtr<'db> {
31685    type SyntaxNode = TerminalArrow<'db>;
31686    fn untyped(self) -> SyntaxStablePtrId<'db> {
31687        self.0
31688    }
31689    fn lookup(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
31690        TerminalArrow::from_syntax_node(db, self.0.lookup(db))
31691    }
31692}
31693impl<'db> From<TerminalArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31694    fn from(ptr: TerminalArrowPtr<'db>) -> Self {
31695        ptr.untyped()
31696    }
31697}
31698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31699pub struct TerminalArrowGreen<'db>(pub GreenId<'db>);
31700impl<'db> TypedSyntaxNode<'db> for TerminalArrow<'db> {
31701    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
31702    type StablePtr = TerminalArrowPtr<'db>;
31703    type Green = TerminalArrowGreen<'db>;
31704    fn missing(db: &'db dyn Database) -> Self::Green {
31705        TerminalArrowGreen(
31706            GreenNode {
31707                kind: SyntaxKind::TerminalArrow,
31708                details: GreenNodeDetails::Node {
31709                    children: [
31710                        Trivia::missing(db).0,
31711                        TokenArrow::missing(db).0,
31712                        Trivia::missing(db).0,
31713                    ]
31714                    .into(),
31715                    width: TextWidth::default(),
31716                },
31717            }
31718            .intern(db),
31719        )
31720    }
31721    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31722        let kind = node.kind(db);
31723        assert_eq!(
31724            kind,
31725            SyntaxKind::TerminalArrow,
31726            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31727            kind,
31728            SyntaxKind::TerminalArrow
31729        );
31730        Self { node }
31731    }
31732    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31733        let kind = node.kind(db);
31734        if kind == SyntaxKind::TerminalArrow {
31735            Some(Self::from_syntax_node(db, node))
31736        } else {
31737            None
31738        }
31739    }
31740    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31741        self.node
31742    }
31743    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31744        TerminalArrowPtr(self.node.stable_ptr(db))
31745    }
31746}
31747#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31748pub struct TokenAt<'db> {
31749    node: SyntaxNode<'db>,
31750}
31751impl<'db> Token<'db> for TokenAt<'db> {
31752    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31753        TokenAtGreen(
31754            GreenNode { kind: SyntaxKind::TokenAt, details: GreenNodeDetails::Token(text) }
31755                .intern(db),
31756        )
31757    }
31758    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31759        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31760    }
31761}
31762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31763pub struct TokenAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31764impl<'db> TypedStablePtr<'db> for TokenAtPtr<'db> {
31765    type SyntaxNode = TokenAt<'db>;
31766    fn untyped(self) -> SyntaxStablePtrId<'db> {
31767        self.0
31768    }
31769    fn lookup(&self, db: &'db dyn Database) -> TokenAt<'db> {
31770        TokenAt::from_syntax_node(db, self.0.lookup(db))
31771    }
31772}
31773impl<'db> From<TokenAtPtr<'db>> for SyntaxStablePtrId<'db> {
31774    fn from(ptr: TokenAtPtr<'db>) -> Self {
31775        ptr.untyped()
31776    }
31777}
31778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31779pub struct TokenAtGreen<'db>(pub GreenId<'db>);
31780impl<'db> TokenAtGreen<'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 TokenAt<'db> {
31786    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
31787    type StablePtr = TokenAtPtr<'db>;
31788    type Green = TokenAtGreen<'db>;
31789    fn missing(db: &'db dyn Database) -> Self::Green {
31790        TokenAtGreen(
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.long(db).green.long(db).details {
31800            GreenNodeDetails::Token(_) => Self { node },
31801            GreenNodeDetails::Node { .. } => {
31802                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
31803            }
31804        }
31805    }
31806    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31807        match node.long(db).green.long(db).details {
31808            GreenNodeDetails::Token(_) => Some(Self { node }),
31809            GreenNodeDetails::Node { .. } => None,
31810        }
31811    }
31812    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31813        self.node
31814    }
31815    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31816        TokenAtPtr(self.node.stable_ptr(db))
31817    }
31818}
31819#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31820pub struct TerminalAt<'db> {
31821    node: SyntaxNode<'db>,
31822}
31823impl<'db> Terminal<'db> for TerminalAt<'db> {
31824    const KIND: SyntaxKind = SyntaxKind::TerminalAt;
31825    type TokenType = TokenAt<'db>;
31826    fn new_green(
31827        db: &'db dyn Database,
31828        leading_trivia: TriviaGreen<'db>,
31829        token: <<TerminalAt<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31830        trailing_trivia: TriviaGreen<'db>,
31831    ) -> Self::Green {
31832        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31833        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31834        TerminalAtGreen(
31835            GreenNode {
31836                kind: SyntaxKind::TerminalAt,
31837                details: GreenNodeDetails::Node { children: children.into(), width },
31838            }
31839            .intern(db),
31840        )
31841    }
31842    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31843        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
31844        else {
31845            unreachable!("Expected a node, not a token");
31846        };
31847        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31848    }
31849}
31850impl<'db> TerminalAt<'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) -> TokenAt<'db> {
31855        TokenAt::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 TerminalAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31863impl<'db> TerminalAtPtr<'db> {}
31864impl<'db> TypedStablePtr<'db> for TerminalAtPtr<'db> {
31865    type SyntaxNode = TerminalAt<'db>;
31866    fn untyped(self) -> SyntaxStablePtrId<'db> {
31867        self.0
31868    }
31869    fn lookup(&self, db: &'db dyn Database) -> TerminalAt<'db> {
31870        TerminalAt::from_syntax_node(db, self.0.lookup(db))
31871    }
31872}
31873impl<'db> From<TerminalAtPtr<'db>> for SyntaxStablePtrId<'db> {
31874    fn from(ptr: TerminalAtPtr<'db>) -> Self {
31875        ptr.untyped()
31876    }
31877}
31878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31879pub struct TerminalAtGreen<'db>(pub GreenId<'db>);
31880impl<'db> TypedSyntaxNode<'db> for TerminalAt<'db> {
31881    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
31882    type StablePtr = TerminalAtPtr<'db>;
31883    type Green = TerminalAtGreen<'db>;
31884    fn missing(db: &'db dyn Database) -> Self::Green {
31885        TerminalAtGreen(
31886            GreenNode {
31887                kind: SyntaxKind::TerminalAt,
31888                details: GreenNodeDetails::Node {
31889                    children: [
31890                        Trivia::missing(db).0,
31891                        TokenAt::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::TerminalAt,
31906            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31907            kind,
31908            SyntaxKind::TerminalAt
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::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
31915    }
31916    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31917        self.node
31918    }
31919    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31920        TerminalAtPtr(self.node.stable_ptr(db))
31921    }
31922}
31923#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31924pub struct TokenBadCharacters<'db> {
31925    node: SyntaxNode<'db>,
31926}
31927impl<'db> Token<'db> for TokenBadCharacters<'db> {
31928    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31929        TokenBadCharactersGreen(
31930            GreenNode {
31931                kind: SyntaxKind::TokenBadCharacters,
31932                details: GreenNodeDetails::Token(text),
31933            }
31934            .intern(db),
31935        )
31936    }
31937    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31938        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
31939    }
31940}
31941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31942pub struct TokenBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31943impl<'db> TypedStablePtr<'db> for TokenBadCharactersPtr<'db> {
31944    type SyntaxNode = TokenBadCharacters<'db>;
31945    fn untyped(self) -> SyntaxStablePtrId<'db> {
31946        self.0
31947    }
31948    fn lookup(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31949        TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
31950    }
31951}
31952impl<'db> From<TokenBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31953    fn from(ptr: TokenBadCharactersPtr<'db>) -> Self {
31954        ptr.untyped()
31955    }
31956}
31957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31958pub struct TokenBadCharactersGreen<'db>(pub GreenId<'db>);
31959impl<'db> TokenBadCharactersGreen<'db> {
31960    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31961        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31962    }
31963}
31964impl<'db> TypedSyntaxNode<'db> for TokenBadCharacters<'db> {
31965    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
31966    type StablePtr = TokenBadCharactersPtr<'db>;
31967    type Green = TokenBadCharactersGreen<'db>;
31968    fn missing(db: &'db dyn Database) -> Self::Green {
31969        TokenBadCharactersGreen(
31970            GreenNode {
31971                kind: SyntaxKind::TokenMissing,
31972                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31973            }
31974            .intern(db),
31975        )
31976    }
31977    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31978        match node.long(db).green.long(db).details {
31979            GreenNodeDetails::Token(_) => Self { node },
31980            GreenNodeDetails::Node { .. } => panic!(
31981                "Expected a token {:?}, not an internal node",
31982                SyntaxKind::TokenBadCharacters
31983            ),
31984        }
31985    }
31986    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31987        match node.long(db).green.long(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        TokenBadCharactersPtr(self.node.stable_ptr(db))
31997    }
31998}
31999#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32000pub struct TerminalBadCharacters<'db> {
32001    node: SyntaxNode<'db>,
32002}
32003impl<'db> Terminal<'db> for TerminalBadCharacters<'db> {
32004    const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
32005    type TokenType = TokenBadCharacters<'db>;
32006    fn new_green(
32007        db: &'db dyn Database,
32008        leading_trivia: TriviaGreen<'db>,
32009        token: <<TerminalBadCharacters<'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        TerminalBadCharactersGreen(
32015            GreenNode {
32016                kind: SyntaxKind::TerminalBadCharacters,
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.long(db).green.long(db).details
32024        else {
32025            unreachable!("Expected a node, not a token");
32026        };
32027        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32028    }
32029}
32030impl<'db> TerminalBadCharacters<'db> {
32031    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32032        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32033    }
32034    pub fn token(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
32035        TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
32036    }
32037    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32038        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32039    }
32040}
32041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32042pub struct TerminalBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
32043impl<'db> TerminalBadCharactersPtr<'db> {}
32044impl<'db> TypedStablePtr<'db> for TerminalBadCharactersPtr<'db> {
32045    type SyntaxNode = TerminalBadCharacters<'db>;
32046    fn untyped(self) -> SyntaxStablePtrId<'db> {
32047        self.0
32048    }
32049    fn lookup(&self, db: &'db dyn Database) -> TerminalBadCharacters<'db> {
32050        TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
32051    }
32052}
32053impl<'db> From<TerminalBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
32054    fn from(ptr: TerminalBadCharactersPtr<'db>) -> Self {
32055        ptr.untyped()
32056    }
32057}
32058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32059pub struct TerminalBadCharactersGreen<'db>(pub GreenId<'db>);
32060impl<'db> TypedSyntaxNode<'db> for TerminalBadCharacters<'db> {
32061    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
32062    type StablePtr = TerminalBadCharactersPtr<'db>;
32063    type Green = TerminalBadCharactersGreen<'db>;
32064    fn missing(db: &'db dyn Database) -> Self::Green {
32065        TerminalBadCharactersGreen(
32066            GreenNode {
32067                kind: SyntaxKind::TerminalBadCharacters,
32068                details: GreenNodeDetails::Node {
32069                    children: [
32070                        Trivia::missing(db).0,
32071                        TokenBadCharacters::missing(db).0,
32072                        Trivia::missing(db).0,
32073                    ]
32074                    .into(),
32075                    width: TextWidth::default(),
32076                },
32077            }
32078            .intern(db),
32079        )
32080    }
32081    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32082        let kind = node.kind(db);
32083        assert_eq!(
32084            kind,
32085            SyntaxKind::TerminalBadCharacters,
32086            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32087            kind,
32088            SyntaxKind::TerminalBadCharacters
32089        );
32090        Self { node }
32091    }
32092    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32093        let kind = node.kind(db);
32094        if kind == SyntaxKind::TerminalBadCharacters {
32095            Some(Self::from_syntax_node(db, node))
32096        } else {
32097            None
32098        }
32099    }
32100    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32101        self.node
32102    }
32103    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32104        TerminalBadCharactersPtr(self.node.stable_ptr(db))
32105    }
32106}
32107#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32108pub struct TokenColon<'db> {
32109    node: SyntaxNode<'db>,
32110}
32111impl<'db> Token<'db> for TokenColon<'db> {
32112    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32113        TokenColonGreen(
32114            GreenNode { kind: SyntaxKind::TokenColon, details: GreenNodeDetails::Token(text) }
32115                .intern(db),
32116        )
32117    }
32118    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32119        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32120    }
32121}
32122#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32123pub struct TokenColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32124impl<'db> TypedStablePtr<'db> for TokenColonPtr<'db> {
32125    type SyntaxNode = TokenColon<'db>;
32126    fn untyped(self) -> SyntaxStablePtrId<'db> {
32127        self.0
32128    }
32129    fn lookup(&self, db: &'db dyn Database) -> TokenColon<'db> {
32130        TokenColon::from_syntax_node(db, self.0.lookup(db))
32131    }
32132}
32133impl<'db> From<TokenColonPtr<'db>> for SyntaxStablePtrId<'db> {
32134    fn from(ptr: TokenColonPtr<'db>) -> Self {
32135        ptr.untyped()
32136    }
32137}
32138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32139pub struct TokenColonGreen<'db>(pub GreenId<'db>);
32140impl<'db> TokenColonGreen<'db> {
32141    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32142        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32143    }
32144}
32145impl<'db> TypedSyntaxNode<'db> for TokenColon<'db> {
32146    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
32147    type StablePtr = TokenColonPtr<'db>;
32148    type Green = TokenColonGreen<'db>;
32149    fn missing(db: &'db dyn Database) -> Self::Green {
32150        TokenColonGreen(
32151            GreenNode {
32152                kind: SyntaxKind::TokenMissing,
32153                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32154            }
32155            .intern(db),
32156        )
32157    }
32158    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32159        match node.long(db).green.long(db).details {
32160            GreenNodeDetails::Token(_) => Self { node },
32161            GreenNodeDetails::Node { .. } => {
32162                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
32163            }
32164        }
32165    }
32166    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32167        match node.long(db).green.long(db).details {
32168            GreenNodeDetails::Token(_) => Some(Self { node }),
32169            GreenNodeDetails::Node { .. } => None,
32170        }
32171    }
32172    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32173        self.node
32174    }
32175    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32176        TokenColonPtr(self.node.stable_ptr(db))
32177    }
32178}
32179#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32180pub struct TerminalColon<'db> {
32181    node: SyntaxNode<'db>,
32182}
32183impl<'db> Terminal<'db> for TerminalColon<'db> {
32184    const KIND: SyntaxKind = SyntaxKind::TerminalColon;
32185    type TokenType = TokenColon<'db>;
32186    fn new_green(
32187        db: &'db dyn Database,
32188        leading_trivia: TriviaGreen<'db>,
32189        token: <<TerminalColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32190        trailing_trivia: TriviaGreen<'db>,
32191    ) -> Self::Green {
32192        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32193        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32194        TerminalColonGreen(
32195            GreenNode {
32196                kind: SyntaxKind::TerminalColon,
32197                details: GreenNodeDetails::Node { children: children.into(), width },
32198            }
32199            .intern(db),
32200        )
32201    }
32202    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32203        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32204        else {
32205            unreachable!("Expected a node, not a token");
32206        };
32207        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32208    }
32209}
32210impl<'db> TerminalColon<'db> {
32211    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32212        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32213    }
32214    pub fn token(&self, db: &'db dyn Database) -> TokenColon<'db> {
32215        TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
32216    }
32217    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32218        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32219    }
32220}
32221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32222pub struct TerminalColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32223impl<'db> TerminalColonPtr<'db> {}
32224impl<'db> TypedStablePtr<'db> for TerminalColonPtr<'db> {
32225    type SyntaxNode = TerminalColon<'db>;
32226    fn untyped(self) -> SyntaxStablePtrId<'db> {
32227        self.0
32228    }
32229    fn lookup(&self, db: &'db dyn Database) -> TerminalColon<'db> {
32230        TerminalColon::from_syntax_node(db, self.0.lookup(db))
32231    }
32232}
32233impl<'db> From<TerminalColonPtr<'db>> for SyntaxStablePtrId<'db> {
32234    fn from(ptr: TerminalColonPtr<'db>) -> Self {
32235        ptr.untyped()
32236    }
32237}
32238#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32239pub struct TerminalColonGreen<'db>(pub GreenId<'db>);
32240impl<'db> TypedSyntaxNode<'db> for TerminalColon<'db> {
32241    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
32242    type StablePtr = TerminalColonPtr<'db>;
32243    type Green = TerminalColonGreen<'db>;
32244    fn missing(db: &'db dyn Database) -> Self::Green {
32245        TerminalColonGreen(
32246            GreenNode {
32247                kind: SyntaxKind::TerminalColon,
32248                details: GreenNodeDetails::Node {
32249                    children: [
32250                        Trivia::missing(db).0,
32251                        TokenColon::missing(db).0,
32252                        Trivia::missing(db).0,
32253                    ]
32254                    .into(),
32255                    width: TextWidth::default(),
32256                },
32257            }
32258            .intern(db),
32259        )
32260    }
32261    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32262        let kind = node.kind(db);
32263        assert_eq!(
32264            kind,
32265            SyntaxKind::TerminalColon,
32266            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32267            kind,
32268            SyntaxKind::TerminalColon
32269        );
32270        Self { node }
32271    }
32272    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32273        let kind = node.kind(db);
32274        if kind == SyntaxKind::TerminalColon {
32275            Some(Self::from_syntax_node(db, node))
32276        } else {
32277            None
32278        }
32279    }
32280    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32281        self.node
32282    }
32283    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32284        TerminalColonPtr(self.node.stable_ptr(db))
32285    }
32286}
32287#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32288pub struct TokenColonColon<'db> {
32289    node: SyntaxNode<'db>,
32290}
32291impl<'db> Token<'db> for TokenColonColon<'db> {
32292    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32293        TokenColonColonGreen(
32294            GreenNode { kind: SyntaxKind::TokenColonColon, details: GreenNodeDetails::Token(text) }
32295                .intern(db),
32296        )
32297    }
32298    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32299        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32300    }
32301}
32302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32303pub struct TokenColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32304impl<'db> TypedStablePtr<'db> for TokenColonColonPtr<'db> {
32305    type SyntaxNode = TokenColonColon<'db>;
32306    fn untyped(self) -> SyntaxStablePtrId<'db> {
32307        self.0
32308    }
32309    fn lookup(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32310        TokenColonColon::from_syntax_node(db, self.0.lookup(db))
32311    }
32312}
32313impl<'db> From<TokenColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32314    fn from(ptr: TokenColonColonPtr<'db>) -> Self {
32315        ptr.untyped()
32316    }
32317}
32318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32319pub struct TokenColonColonGreen<'db>(pub GreenId<'db>);
32320impl<'db> TokenColonColonGreen<'db> {
32321    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32322        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32323    }
32324}
32325impl<'db> TypedSyntaxNode<'db> for TokenColonColon<'db> {
32326    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
32327    type StablePtr = TokenColonColonPtr<'db>;
32328    type Green = TokenColonColonGreen<'db>;
32329    fn missing(db: &'db dyn Database) -> Self::Green {
32330        TokenColonColonGreen(
32331            GreenNode {
32332                kind: SyntaxKind::TokenMissing,
32333                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32334            }
32335            .intern(db),
32336        )
32337    }
32338    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32339        match node.long(db).green.long(db).details {
32340            GreenNodeDetails::Token(_) => Self { node },
32341            GreenNodeDetails::Node { .. } => {
32342                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
32343            }
32344        }
32345    }
32346    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32347        match node.long(db).green.long(db).details {
32348            GreenNodeDetails::Token(_) => Some(Self { node }),
32349            GreenNodeDetails::Node { .. } => None,
32350        }
32351    }
32352    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32353        self.node
32354    }
32355    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32356        TokenColonColonPtr(self.node.stable_ptr(db))
32357    }
32358}
32359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32360pub struct TerminalColonColon<'db> {
32361    node: SyntaxNode<'db>,
32362}
32363impl<'db> Terminal<'db> for TerminalColonColon<'db> {
32364    const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
32365    type TokenType = TokenColonColon<'db>;
32366    fn new_green(
32367        db: &'db dyn Database,
32368        leading_trivia: TriviaGreen<'db>,
32369        token: <<TerminalColonColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32370        trailing_trivia: TriviaGreen<'db>,
32371    ) -> Self::Green {
32372        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32373        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32374        TerminalColonColonGreen(
32375            GreenNode {
32376                kind: SyntaxKind::TerminalColonColon,
32377                details: GreenNodeDetails::Node { children: children.into(), width },
32378            }
32379            .intern(db),
32380        )
32381    }
32382    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32383        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32384        else {
32385            unreachable!("Expected a node, not a token");
32386        };
32387        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32388    }
32389}
32390impl<'db> TerminalColonColon<'db> {
32391    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32392        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32393    }
32394    pub fn token(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32395        TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
32396    }
32397    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32398        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32399    }
32400}
32401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32402pub struct TerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32403impl<'db> TerminalColonColonPtr<'db> {}
32404impl<'db> TypedStablePtr<'db> for TerminalColonColonPtr<'db> {
32405    type SyntaxNode = TerminalColonColon<'db>;
32406    fn untyped(self) -> SyntaxStablePtrId<'db> {
32407        self.0
32408    }
32409    fn lookup(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
32410        TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
32411    }
32412}
32413impl<'db> From<TerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32414    fn from(ptr: TerminalColonColonPtr<'db>) -> Self {
32415        ptr.untyped()
32416    }
32417}
32418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32419pub struct TerminalColonColonGreen<'db>(pub GreenId<'db>);
32420impl<'db> TypedSyntaxNode<'db> for TerminalColonColon<'db> {
32421    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
32422    type StablePtr = TerminalColonColonPtr<'db>;
32423    type Green = TerminalColonColonGreen<'db>;
32424    fn missing(db: &'db dyn Database) -> Self::Green {
32425        TerminalColonColonGreen(
32426            GreenNode {
32427                kind: SyntaxKind::TerminalColonColon,
32428                details: GreenNodeDetails::Node {
32429                    children: [
32430                        Trivia::missing(db).0,
32431                        TokenColonColon::missing(db).0,
32432                        Trivia::missing(db).0,
32433                    ]
32434                    .into(),
32435                    width: TextWidth::default(),
32436                },
32437            }
32438            .intern(db),
32439        )
32440    }
32441    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32442        let kind = node.kind(db);
32443        assert_eq!(
32444            kind,
32445            SyntaxKind::TerminalColonColon,
32446            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32447            kind,
32448            SyntaxKind::TerminalColonColon
32449        );
32450        Self { node }
32451    }
32452    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32453        let kind = node.kind(db);
32454        if kind == SyntaxKind::TerminalColonColon {
32455            Some(Self::from_syntax_node(db, node))
32456        } else {
32457            None
32458        }
32459    }
32460    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32461        self.node
32462    }
32463    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32464        TerminalColonColonPtr(self.node.stable_ptr(db))
32465    }
32466}
32467#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32468pub struct TokenComma<'db> {
32469    node: SyntaxNode<'db>,
32470}
32471impl<'db> Token<'db> for TokenComma<'db> {
32472    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32473        TokenCommaGreen(
32474            GreenNode { kind: SyntaxKind::TokenComma, details: GreenNodeDetails::Token(text) }
32475                .intern(db),
32476        )
32477    }
32478    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32479        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32480    }
32481}
32482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32483pub struct TokenCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32484impl<'db> TypedStablePtr<'db> for TokenCommaPtr<'db> {
32485    type SyntaxNode = TokenComma<'db>;
32486    fn untyped(self) -> SyntaxStablePtrId<'db> {
32487        self.0
32488    }
32489    fn lookup(&self, db: &'db dyn Database) -> TokenComma<'db> {
32490        TokenComma::from_syntax_node(db, self.0.lookup(db))
32491    }
32492}
32493impl<'db> From<TokenCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32494    fn from(ptr: TokenCommaPtr<'db>) -> Self {
32495        ptr.untyped()
32496    }
32497}
32498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32499pub struct TokenCommaGreen<'db>(pub GreenId<'db>);
32500impl<'db> TokenCommaGreen<'db> {
32501    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32502        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32503    }
32504}
32505impl<'db> TypedSyntaxNode<'db> for TokenComma<'db> {
32506    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32507    type StablePtr = TokenCommaPtr<'db>;
32508    type Green = TokenCommaGreen<'db>;
32509    fn missing(db: &'db dyn Database) -> Self::Green {
32510        TokenCommaGreen(
32511            GreenNode {
32512                kind: SyntaxKind::TokenMissing,
32513                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32514            }
32515            .intern(db),
32516        )
32517    }
32518    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32519        match node.long(db).green.long(db).details {
32520            GreenNodeDetails::Token(_) => Self { node },
32521            GreenNodeDetails::Node { .. } => {
32522                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32523            }
32524        }
32525    }
32526    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32527        match node.long(db).green.long(db).details {
32528            GreenNodeDetails::Token(_) => Some(Self { node }),
32529            GreenNodeDetails::Node { .. } => None,
32530        }
32531    }
32532    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32533        self.node
32534    }
32535    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32536        TokenCommaPtr(self.node.stable_ptr(db))
32537    }
32538}
32539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32540pub struct TerminalComma<'db> {
32541    node: SyntaxNode<'db>,
32542}
32543impl<'db> Terminal<'db> for TerminalComma<'db> {
32544    const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32545    type TokenType = TokenComma<'db>;
32546    fn new_green(
32547        db: &'db dyn Database,
32548        leading_trivia: TriviaGreen<'db>,
32549        token: <<TerminalComma<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32550        trailing_trivia: TriviaGreen<'db>,
32551    ) -> Self::Green {
32552        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32553        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32554        TerminalCommaGreen(
32555            GreenNode {
32556                kind: SyntaxKind::TerminalComma,
32557                details: GreenNodeDetails::Node { children: children.into(), width },
32558            }
32559            .intern(db),
32560        )
32561    }
32562    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32563        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32564        else {
32565            unreachable!("Expected a node, not a token");
32566        };
32567        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32568    }
32569}
32570impl<'db> TerminalComma<'db> {
32571    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32572        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32573    }
32574    pub fn token(&self, db: &'db dyn Database) -> TokenComma<'db> {
32575        TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32576    }
32577    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32578        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32579    }
32580}
32581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32582pub struct TerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32583impl<'db> TerminalCommaPtr<'db> {}
32584impl<'db> TypedStablePtr<'db> for TerminalCommaPtr<'db> {
32585    type SyntaxNode = TerminalComma<'db>;
32586    fn untyped(self) -> SyntaxStablePtrId<'db> {
32587        self.0
32588    }
32589    fn lookup(&self, db: &'db dyn Database) -> TerminalComma<'db> {
32590        TerminalComma::from_syntax_node(db, self.0.lookup(db))
32591    }
32592}
32593impl<'db> From<TerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32594    fn from(ptr: TerminalCommaPtr<'db>) -> Self {
32595        ptr.untyped()
32596    }
32597}
32598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32599pub struct TerminalCommaGreen<'db>(pub GreenId<'db>);
32600impl<'db> TypedSyntaxNode<'db> for TerminalComma<'db> {
32601    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32602    type StablePtr = TerminalCommaPtr<'db>;
32603    type Green = TerminalCommaGreen<'db>;
32604    fn missing(db: &'db dyn Database) -> Self::Green {
32605        TerminalCommaGreen(
32606            GreenNode {
32607                kind: SyntaxKind::TerminalComma,
32608                details: GreenNodeDetails::Node {
32609                    children: [
32610                        Trivia::missing(db).0,
32611                        TokenComma::missing(db).0,
32612                        Trivia::missing(db).0,
32613                    ]
32614                    .into(),
32615                    width: TextWidth::default(),
32616                },
32617            }
32618            .intern(db),
32619        )
32620    }
32621    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32622        let kind = node.kind(db);
32623        assert_eq!(
32624            kind,
32625            SyntaxKind::TerminalComma,
32626            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32627            kind,
32628            SyntaxKind::TerminalComma
32629        );
32630        Self { node }
32631    }
32632    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32633        let kind = node.kind(db);
32634        if kind == SyntaxKind::TerminalComma {
32635            Some(Self::from_syntax_node(db, node))
32636        } else {
32637            None
32638        }
32639    }
32640    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32641        self.node
32642    }
32643    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32644        TerminalCommaPtr(self.node.stable_ptr(db))
32645    }
32646}
32647#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32648pub struct TokenDiv<'db> {
32649    node: SyntaxNode<'db>,
32650}
32651impl<'db> Token<'db> for TokenDiv<'db> {
32652    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32653        TokenDivGreen(
32654            GreenNode { kind: SyntaxKind::TokenDiv, details: GreenNodeDetails::Token(text) }
32655                .intern(db),
32656        )
32657    }
32658    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32659        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32660    }
32661}
32662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32663pub struct TokenDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32664impl<'db> TypedStablePtr<'db> for TokenDivPtr<'db> {
32665    type SyntaxNode = TokenDiv<'db>;
32666    fn untyped(self) -> SyntaxStablePtrId<'db> {
32667        self.0
32668    }
32669    fn lookup(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32670        TokenDiv::from_syntax_node(db, self.0.lookup(db))
32671    }
32672}
32673impl<'db> From<TokenDivPtr<'db>> for SyntaxStablePtrId<'db> {
32674    fn from(ptr: TokenDivPtr<'db>) -> Self {
32675        ptr.untyped()
32676    }
32677}
32678#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32679pub struct TokenDivGreen<'db>(pub GreenId<'db>);
32680impl<'db> TokenDivGreen<'db> {
32681    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32682        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32683    }
32684}
32685impl<'db> TypedSyntaxNode<'db> for TokenDiv<'db> {
32686    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
32687    type StablePtr = TokenDivPtr<'db>;
32688    type Green = TokenDivGreen<'db>;
32689    fn missing(db: &'db dyn Database) -> Self::Green {
32690        TokenDivGreen(
32691            GreenNode {
32692                kind: SyntaxKind::TokenMissing,
32693                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32694            }
32695            .intern(db),
32696        )
32697    }
32698    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32699        match node.long(db).green.long(db).details {
32700            GreenNodeDetails::Token(_) => Self { node },
32701            GreenNodeDetails::Node { .. } => {
32702                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
32703            }
32704        }
32705    }
32706    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32707        match node.long(db).green.long(db).details {
32708            GreenNodeDetails::Token(_) => Some(Self { node }),
32709            GreenNodeDetails::Node { .. } => None,
32710        }
32711    }
32712    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32713        self.node
32714    }
32715    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32716        TokenDivPtr(self.node.stable_ptr(db))
32717    }
32718}
32719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32720pub struct TerminalDiv<'db> {
32721    node: SyntaxNode<'db>,
32722}
32723impl<'db> Terminal<'db> for TerminalDiv<'db> {
32724    const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
32725    type TokenType = TokenDiv<'db>;
32726    fn new_green(
32727        db: &'db dyn Database,
32728        leading_trivia: TriviaGreen<'db>,
32729        token: <<TerminalDiv<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32730        trailing_trivia: TriviaGreen<'db>,
32731    ) -> Self::Green {
32732        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32733        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32734        TerminalDivGreen(
32735            GreenNode {
32736                kind: SyntaxKind::TerminalDiv,
32737                details: GreenNodeDetails::Node { children: children.into(), width },
32738            }
32739            .intern(db),
32740        )
32741    }
32742    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32743        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32744        else {
32745            unreachable!("Expected a node, not a token");
32746        };
32747        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32748    }
32749}
32750impl<'db> TerminalDiv<'db> {
32751    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32752        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32753    }
32754    pub fn token(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32755        TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
32756    }
32757    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32758        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32759    }
32760}
32761#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32762pub struct TerminalDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32763impl<'db> TerminalDivPtr<'db> {}
32764impl<'db> TypedStablePtr<'db> for TerminalDivPtr<'db> {
32765    type SyntaxNode = TerminalDiv<'db>;
32766    fn untyped(self) -> SyntaxStablePtrId<'db> {
32767        self.0
32768    }
32769    fn lookup(&self, db: &'db dyn Database) -> TerminalDiv<'db> {
32770        TerminalDiv::from_syntax_node(db, self.0.lookup(db))
32771    }
32772}
32773impl<'db> From<TerminalDivPtr<'db>> for SyntaxStablePtrId<'db> {
32774    fn from(ptr: TerminalDivPtr<'db>) -> Self {
32775        ptr.untyped()
32776    }
32777}
32778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32779pub struct TerminalDivGreen<'db>(pub GreenId<'db>);
32780impl<'db> TypedSyntaxNode<'db> for TerminalDiv<'db> {
32781    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
32782    type StablePtr = TerminalDivPtr<'db>;
32783    type Green = TerminalDivGreen<'db>;
32784    fn missing(db: &'db dyn Database) -> Self::Green {
32785        TerminalDivGreen(
32786            GreenNode {
32787                kind: SyntaxKind::TerminalDiv,
32788                details: GreenNodeDetails::Node {
32789                    children: [
32790                        Trivia::missing(db).0,
32791                        TokenDiv::missing(db).0,
32792                        Trivia::missing(db).0,
32793                    ]
32794                    .into(),
32795                    width: TextWidth::default(),
32796                },
32797            }
32798            .intern(db),
32799        )
32800    }
32801    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32802        let kind = node.kind(db);
32803        assert_eq!(
32804            kind,
32805            SyntaxKind::TerminalDiv,
32806            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32807            kind,
32808            SyntaxKind::TerminalDiv
32809        );
32810        Self { node }
32811    }
32812    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32813        let kind = node.kind(db);
32814        if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
32815    }
32816    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32817        self.node
32818    }
32819    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32820        TerminalDivPtr(self.node.stable_ptr(db))
32821    }
32822}
32823#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32824pub struct TokenDivEq<'db> {
32825    node: SyntaxNode<'db>,
32826}
32827impl<'db> Token<'db> for TokenDivEq<'db> {
32828    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32829        TokenDivEqGreen(
32830            GreenNode { kind: SyntaxKind::TokenDivEq, details: GreenNodeDetails::Token(text) }
32831                .intern(db),
32832        )
32833    }
32834    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32835        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
32836    }
32837}
32838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32839pub struct TokenDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32840impl<'db> TypedStablePtr<'db> for TokenDivEqPtr<'db> {
32841    type SyntaxNode = TokenDivEq<'db>;
32842    fn untyped(self) -> SyntaxStablePtrId<'db> {
32843        self.0
32844    }
32845    fn lookup(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32846        TokenDivEq::from_syntax_node(db, self.0.lookup(db))
32847    }
32848}
32849impl<'db> From<TokenDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32850    fn from(ptr: TokenDivEqPtr<'db>) -> Self {
32851        ptr.untyped()
32852    }
32853}
32854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32855pub struct TokenDivEqGreen<'db>(pub GreenId<'db>);
32856impl<'db> TokenDivEqGreen<'db> {
32857    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32858        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32859    }
32860}
32861impl<'db> TypedSyntaxNode<'db> for TokenDivEq<'db> {
32862    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
32863    type StablePtr = TokenDivEqPtr<'db>;
32864    type Green = TokenDivEqGreen<'db>;
32865    fn missing(db: &'db dyn Database) -> Self::Green {
32866        TokenDivEqGreen(
32867            GreenNode {
32868                kind: SyntaxKind::TokenMissing,
32869                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32870            }
32871            .intern(db),
32872        )
32873    }
32874    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32875        match node.long(db).green.long(db).details {
32876            GreenNodeDetails::Token(_) => Self { node },
32877            GreenNodeDetails::Node { .. } => {
32878                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
32879            }
32880        }
32881    }
32882    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32883        match node.long(db).green.long(db).details {
32884            GreenNodeDetails::Token(_) => Some(Self { node }),
32885            GreenNodeDetails::Node { .. } => None,
32886        }
32887    }
32888    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32889        self.node
32890    }
32891    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32892        TokenDivEqPtr(self.node.stable_ptr(db))
32893    }
32894}
32895#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32896pub struct TerminalDivEq<'db> {
32897    node: SyntaxNode<'db>,
32898}
32899impl<'db> Terminal<'db> for TerminalDivEq<'db> {
32900    const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
32901    type TokenType = TokenDivEq<'db>;
32902    fn new_green(
32903        db: &'db dyn Database,
32904        leading_trivia: TriviaGreen<'db>,
32905        token: <<TerminalDivEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32906        trailing_trivia: TriviaGreen<'db>,
32907    ) -> Self::Green {
32908        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32909        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32910        TerminalDivEqGreen(
32911            GreenNode {
32912                kind: SyntaxKind::TerminalDivEq,
32913                details: GreenNodeDetails::Node { children: children.into(), width },
32914            }
32915            .intern(db),
32916        )
32917    }
32918    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32919        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
32920        else {
32921            unreachable!("Expected a node, not a token");
32922        };
32923        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32924    }
32925}
32926impl<'db> TerminalDivEq<'db> {
32927    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32928        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32929    }
32930    pub fn token(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32931        TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
32932    }
32933    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32934        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32935    }
32936}
32937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32938pub struct TerminalDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32939impl<'db> TerminalDivEqPtr<'db> {}
32940impl<'db> TypedStablePtr<'db> for TerminalDivEqPtr<'db> {
32941    type SyntaxNode = TerminalDivEq<'db>;
32942    fn untyped(self) -> SyntaxStablePtrId<'db> {
32943        self.0
32944    }
32945    fn lookup(&self, db: &'db dyn Database) -> TerminalDivEq<'db> {
32946        TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
32947    }
32948}
32949impl<'db> From<TerminalDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32950    fn from(ptr: TerminalDivEqPtr<'db>) -> Self {
32951        ptr.untyped()
32952    }
32953}
32954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32955pub struct TerminalDivEqGreen<'db>(pub GreenId<'db>);
32956impl<'db> TypedSyntaxNode<'db> for TerminalDivEq<'db> {
32957    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
32958    type StablePtr = TerminalDivEqPtr<'db>;
32959    type Green = TerminalDivEqGreen<'db>;
32960    fn missing(db: &'db dyn Database) -> Self::Green {
32961        TerminalDivEqGreen(
32962            GreenNode {
32963                kind: SyntaxKind::TerminalDivEq,
32964                details: GreenNodeDetails::Node {
32965                    children: [
32966                        Trivia::missing(db).0,
32967                        TokenDivEq::missing(db).0,
32968                        Trivia::missing(db).0,
32969                    ]
32970                    .into(),
32971                    width: TextWidth::default(),
32972                },
32973            }
32974            .intern(db),
32975        )
32976    }
32977    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32978        let kind = node.kind(db);
32979        assert_eq!(
32980            kind,
32981            SyntaxKind::TerminalDivEq,
32982            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32983            kind,
32984            SyntaxKind::TerminalDivEq
32985        );
32986        Self { node }
32987    }
32988    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32989        let kind = node.kind(db);
32990        if kind == SyntaxKind::TerminalDivEq {
32991            Some(Self::from_syntax_node(db, node))
32992        } else {
32993            None
32994        }
32995    }
32996    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32997        self.node
32998    }
32999    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33000        TerminalDivEqPtr(self.node.stable_ptr(db))
33001    }
33002}
33003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33004pub struct TokenDollar<'db> {
33005    node: SyntaxNode<'db>,
33006}
33007impl<'db> Token<'db> for TokenDollar<'db> {
33008    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33009        TokenDollarGreen(
33010            GreenNode { kind: SyntaxKind::TokenDollar, details: GreenNodeDetails::Token(text) }
33011                .intern(db),
33012        )
33013    }
33014    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33015        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33016    }
33017}
33018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33019pub struct TokenDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
33020impl<'db> TypedStablePtr<'db> for TokenDollarPtr<'db> {
33021    type SyntaxNode = TokenDollar<'db>;
33022    fn untyped(self) -> SyntaxStablePtrId<'db> {
33023        self.0
33024    }
33025    fn lookup(&self, db: &'db dyn Database) -> TokenDollar<'db> {
33026        TokenDollar::from_syntax_node(db, self.0.lookup(db))
33027    }
33028}
33029impl<'db> From<TokenDollarPtr<'db>> for SyntaxStablePtrId<'db> {
33030    fn from(ptr: TokenDollarPtr<'db>) -> Self {
33031        ptr.untyped()
33032    }
33033}
33034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33035pub struct TokenDollarGreen<'db>(pub GreenId<'db>);
33036impl<'db> TokenDollarGreen<'db> {
33037    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33038        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33039    }
33040}
33041impl<'db> TypedSyntaxNode<'db> for TokenDollar<'db> {
33042    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
33043    type StablePtr = TokenDollarPtr<'db>;
33044    type Green = TokenDollarGreen<'db>;
33045    fn missing(db: &'db dyn Database) -> Self::Green {
33046        TokenDollarGreen(
33047            GreenNode {
33048                kind: SyntaxKind::TokenMissing,
33049                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33050            }
33051            .intern(db),
33052        )
33053    }
33054    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33055        match node.long(db).green.long(db).details {
33056            GreenNodeDetails::Token(_) => Self { node },
33057            GreenNodeDetails::Node { .. } => {
33058                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
33059            }
33060        }
33061    }
33062    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33063        match node.long(db).green.long(db).details {
33064            GreenNodeDetails::Token(_) => Some(Self { node }),
33065            GreenNodeDetails::Node { .. } => None,
33066        }
33067    }
33068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33069        self.node
33070    }
33071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33072        TokenDollarPtr(self.node.stable_ptr(db))
33073    }
33074}
33075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33076pub struct TerminalDollar<'db> {
33077    node: SyntaxNode<'db>,
33078}
33079impl<'db> Terminal<'db> for TerminalDollar<'db> {
33080    const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
33081    type TokenType = TokenDollar<'db>;
33082    fn new_green(
33083        db: &'db dyn Database,
33084        leading_trivia: TriviaGreen<'db>,
33085        token: <<TerminalDollar<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33086        trailing_trivia: TriviaGreen<'db>,
33087    ) -> Self::Green {
33088        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33089        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33090        TerminalDollarGreen(
33091            GreenNode {
33092                kind: SyntaxKind::TerminalDollar,
33093                details: GreenNodeDetails::Node { children: children.into(), width },
33094            }
33095            .intern(db),
33096        )
33097    }
33098    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33099        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33100        else {
33101            unreachable!("Expected a node, not a token");
33102        };
33103        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33104    }
33105}
33106impl<'db> TerminalDollar<'db> {
33107    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33108        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33109    }
33110    pub fn token(&self, db: &'db dyn Database) -> TokenDollar<'db> {
33111        TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
33112    }
33113    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33114        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33115    }
33116}
33117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33118pub struct TerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
33119impl<'db> TerminalDollarPtr<'db> {}
33120impl<'db> TypedStablePtr<'db> for TerminalDollarPtr<'db> {
33121    type SyntaxNode = TerminalDollar<'db>;
33122    fn untyped(self) -> SyntaxStablePtrId<'db> {
33123        self.0
33124    }
33125    fn lookup(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
33126        TerminalDollar::from_syntax_node(db, self.0.lookup(db))
33127    }
33128}
33129impl<'db> From<TerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
33130    fn from(ptr: TerminalDollarPtr<'db>) -> Self {
33131        ptr.untyped()
33132    }
33133}
33134#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33135pub struct TerminalDollarGreen<'db>(pub GreenId<'db>);
33136impl<'db> TypedSyntaxNode<'db> for TerminalDollar<'db> {
33137    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
33138    type StablePtr = TerminalDollarPtr<'db>;
33139    type Green = TerminalDollarGreen<'db>;
33140    fn missing(db: &'db dyn Database) -> Self::Green {
33141        TerminalDollarGreen(
33142            GreenNode {
33143                kind: SyntaxKind::TerminalDollar,
33144                details: GreenNodeDetails::Node {
33145                    children: [
33146                        Trivia::missing(db).0,
33147                        TokenDollar::missing(db).0,
33148                        Trivia::missing(db).0,
33149                    ]
33150                    .into(),
33151                    width: TextWidth::default(),
33152                },
33153            }
33154            .intern(db),
33155        )
33156    }
33157    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33158        let kind = node.kind(db);
33159        assert_eq!(
33160            kind,
33161            SyntaxKind::TerminalDollar,
33162            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33163            kind,
33164            SyntaxKind::TerminalDollar
33165        );
33166        Self { node }
33167    }
33168    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33169        let kind = node.kind(db);
33170        if kind == SyntaxKind::TerminalDollar {
33171            Some(Self::from_syntax_node(db, node))
33172        } else {
33173            None
33174        }
33175    }
33176    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33177        self.node
33178    }
33179    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33180        TerminalDollarPtr(self.node.stable_ptr(db))
33181    }
33182}
33183#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33184pub struct TokenDot<'db> {
33185    node: SyntaxNode<'db>,
33186}
33187impl<'db> Token<'db> for TokenDot<'db> {
33188    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33189        TokenDotGreen(
33190            GreenNode { kind: SyntaxKind::TokenDot, details: GreenNodeDetails::Token(text) }
33191                .intern(db),
33192        )
33193    }
33194    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33195        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33196    }
33197}
33198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33199pub struct TokenDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33200impl<'db> TypedStablePtr<'db> for TokenDotPtr<'db> {
33201    type SyntaxNode = TokenDot<'db>;
33202    fn untyped(self) -> SyntaxStablePtrId<'db> {
33203        self.0
33204    }
33205    fn lookup(&self, db: &'db dyn Database) -> TokenDot<'db> {
33206        TokenDot::from_syntax_node(db, self.0.lookup(db))
33207    }
33208}
33209impl<'db> From<TokenDotPtr<'db>> for SyntaxStablePtrId<'db> {
33210    fn from(ptr: TokenDotPtr<'db>) -> Self {
33211        ptr.untyped()
33212    }
33213}
33214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33215pub struct TokenDotGreen<'db>(pub GreenId<'db>);
33216impl<'db> TokenDotGreen<'db> {
33217    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33218        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33219    }
33220}
33221impl<'db> TypedSyntaxNode<'db> for TokenDot<'db> {
33222    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
33223    type StablePtr = TokenDotPtr<'db>;
33224    type Green = TokenDotGreen<'db>;
33225    fn missing(db: &'db dyn Database) -> Self::Green {
33226        TokenDotGreen(
33227            GreenNode {
33228                kind: SyntaxKind::TokenMissing,
33229                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33230            }
33231            .intern(db),
33232        )
33233    }
33234    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33235        match node.long(db).green.long(db).details {
33236            GreenNodeDetails::Token(_) => Self { node },
33237            GreenNodeDetails::Node { .. } => {
33238                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
33239            }
33240        }
33241    }
33242    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33243        match node.long(db).green.long(db).details {
33244            GreenNodeDetails::Token(_) => Some(Self { node }),
33245            GreenNodeDetails::Node { .. } => None,
33246        }
33247    }
33248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33249        self.node
33250    }
33251    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33252        TokenDotPtr(self.node.stable_ptr(db))
33253    }
33254}
33255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33256pub struct TerminalDot<'db> {
33257    node: SyntaxNode<'db>,
33258}
33259impl<'db> Terminal<'db> for TerminalDot<'db> {
33260    const KIND: SyntaxKind = SyntaxKind::TerminalDot;
33261    type TokenType = TokenDot<'db>;
33262    fn new_green(
33263        db: &'db dyn Database,
33264        leading_trivia: TriviaGreen<'db>,
33265        token: <<TerminalDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33266        trailing_trivia: TriviaGreen<'db>,
33267    ) -> Self::Green {
33268        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33269        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33270        TerminalDotGreen(
33271            GreenNode {
33272                kind: SyntaxKind::TerminalDot,
33273                details: GreenNodeDetails::Node { children: children.into(), width },
33274            }
33275            .intern(db),
33276        )
33277    }
33278    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33279        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33280        else {
33281            unreachable!("Expected a node, not a token");
33282        };
33283        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33284    }
33285}
33286impl<'db> TerminalDot<'db> {
33287    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33288        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33289    }
33290    pub fn token(&self, db: &'db dyn Database) -> TokenDot<'db> {
33291        TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
33292    }
33293    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33294        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33295    }
33296}
33297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33298pub struct TerminalDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33299impl<'db> TerminalDotPtr<'db> {}
33300impl<'db> TypedStablePtr<'db> for TerminalDotPtr<'db> {
33301    type SyntaxNode = TerminalDot<'db>;
33302    fn untyped(self) -> SyntaxStablePtrId<'db> {
33303        self.0
33304    }
33305    fn lookup(&self, db: &'db dyn Database) -> TerminalDot<'db> {
33306        TerminalDot::from_syntax_node(db, self.0.lookup(db))
33307    }
33308}
33309impl<'db> From<TerminalDotPtr<'db>> for SyntaxStablePtrId<'db> {
33310    fn from(ptr: TerminalDotPtr<'db>) -> Self {
33311        ptr.untyped()
33312    }
33313}
33314#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33315pub struct TerminalDotGreen<'db>(pub GreenId<'db>);
33316impl<'db> TypedSyntaxNode<'db> for TerminalDot<'db> {
33317    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
33318    type StablePtr = TerminalDotPtr<'db>;
33319    type Green = TerminalDotGreen<'db>;
33320    fn missing(db: &'db dyn Database) -> Self::Green {
33321        TerminalDotGreen(
33322            GreenNode {
33323                kind: SyntaxKind::TerminalDot,
33324                details: GreenNodeDetails::Node {
33325                    children: [
33326                        Trivia::missing(db).0,
33327                        TokenDot::missing(db).0,
33328                        Trivia::missing(db).0,
33329                    ]
33330                    .into(),
33331                    width: TextWidth::default(),
33332                },
33333            }
33334            .intern(db),
33335        )
33336    }
33337    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33338        let kind = node.kind(db);
33339        assert_eq!(
33340            kind,
33341            SyntaxKind::TerminalDot,
33342            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33343            kind,
33344            SyntaxKind::TerminalDot
33345        );
33346        Self { node }
33347    }
33348    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33349        let kind = node.kind(db);
33350        if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
33351    }
33352    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33353        self.node
33354    }
33355    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33356        TerminalDotPtr(self.node.stable_ptr(db))
33357    }
33358}
33359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33360pub struct TokenDotDot<'db> {
33361    node: SyntaxNode<'db>,
33362}
33363impl<'db> Token<'db> for TokenDotDot<'db> {
33364    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33365        TokenDotDotGreen(
33366            GreenNode { kind: SyntaxKind::TokenDotDot, details: GreenNodeDetails::Token(text) }
33367                .intern(db),
33368        )
33369    }
33370    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33371        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33372    }
33373}
33374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33375pub struct TokenDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33376impl<'db> TypedStablePtr<'db> for TokenDotDotPtr<'db> {
33377    type SyntaxNode = TokenDotDot<'db>;
33378    fn untyped(self) -> SyntaxStablePtrId<'db> {
33379        self.0
33380    }
33381    fn lookup(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33382        TokenDotDot::from_syntax_node(db, self.0.lookup(db))
33383    }
33384}
33385impl<'db> From<TokenDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33386    fn from(ptr: TokenDotDotPtr<'db>) -> Self {
33387        ptr.untyped()
33388    }
33389}
33390#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33391pub struct TokenDotDotGreen<'db>(pub GreenId<'db>);
33392impl<'db> TokenDotDotGreen<'db> {
33393    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33394        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33395    }
33396}
33397impl<'db> TypedSyntaxNode<'db> for TokenDotDot<'db> {
33398    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
33399    type StablePtr = TokenDotDotPtr<'db>;
33400    type Green = TokenDotDotGreen<'db>;
33401    fn missing(db: &'db dyn Database) -> Self::Green {
33402        TokenDotDotGreen(
33403            GreenNode {
33404                kind: SyntaxKind::TokenMissing,
33405                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33406            }
33407            .intern(db),
33408        )
33409    }
33410    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33411        match node.long(db).green.long(db).details {
33412            GreenNodeDetails::Token(_) => Self { node },
33413            GreenNodeDetails::Node { .. } => {
33414                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
33415            }
33416        }
33417    }
33418    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33419        match node.long(db).green.long(db).details {
33420            GreenNodeDetails::Token(_) => Some(Self { node }),
33421            GreenNodeDetails::Node { .. } => None,
33422        }
33423    }
33424    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33425        self.node
33426    }
33427    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33428        TokenDotDotPtr(self.node.stable_ptr(db))
33429    }
33430}
33431#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33432pub struct TerminalDotDot<'db> {
33433    node: SyntaxNode<'db>,
33434}
33435impl<'db> Terminal<'db> for TerminalDotDot<'db> {
33436    const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
33437    type TokenType = TokenDotDot<'db>;
33438    fn new_green(
33439        db: &'db dyn Database,
33440        leading_trivia: TriviaGreen<'db>,
33441        token: <<TerminalDotDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33442        trailing_trivia: TriviaGreen<'db>,
33443    ) -> Self::Green {
33444        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33445        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33446        TerminalDotDotGreen(
33447            GreenNode {
33448                kind: SyntaxKind::TerminalDotDot,
33449                details: GreenNodeDetails::Node { children: children.into(), width },
33450            }
33451            .intern(db),
33452        )
33453    }
33454    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33455        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33456        else {
33457            unreachable!("Expected a node, not a token");
33458        };
33459        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33460    }
33461}
33462impl<'db> TerminalDotDot<'db> {
33463    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33464        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33465    }
33466    pub fn token(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33467        TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33468    }
33469    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33470        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33471    }
33472}
33473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33474pub struct TerminalDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33475impl<'db> TerminalDotDotPtr<'db> {}
33476impl<'db> TypedStablePtr<'db> for TerminalDotDotPtr<'db> {
33477    type SyntaxNode = TerminalDotDot<'db>;
33478    fn untyped(self) -> SyntaxStablePtrId<'db> {
33479        self.0
33480    }
33481    fn lookup(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
33482        TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33483    }
33484}
33485impl<'db> From<TerminalDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33486    fn from(ptr: TerminalDotDotPtr<'db>) -> Self {
33487        ptr.untyped()
33488    }
33489}
33490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33491pub struct TerminalDotDotGreen<'db>(pub GreenId<'db>);
33492impl<'db> TypedSyntaxNode<'db> for TerminalDotDot<'db> {
33493    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33494    type StablePtr = TerminalDotDotPtr<'db>;
33495    type Green = TerminalDotDotGreen<'db>;
33496    fn missing(db: &'db dyn Database) -> Self::Green {
33497        TerminalDotDotGreen(
33498            GreenNode {
33499                kind: SyntaxKind::TerminalDotDot,
33500                details: GreenNodeDetails::Node {
33501                    children: [
33502                        Trivia::missing(db).0,
33503                        TokenDotDot::missing(db).0,
33504                        Trivia::missing(db).0,
33505                    ]
33506                    .into(),
33507                    width: TextWidth::default(),
33508                },
33509            }
33510            .intern(db),
33511        )
33512    }
33513    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33514        let kind = node.kind(db);
33515        assert_eq!(
33516            kind,
33517            SyntaxKind::TerminalDotDot,
33518            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33519            kind,
33520            SyntaxKind::TerminalDotDot
33521        );
33522        Self { node }
33523    }
33524    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33525        let kind = node.kind(db);
33526        if kind == SyntaxKind::TerminalDotDot {
33527            Some(Self::from_syntax_node(db, node))
33528        } else {
33529            None
33530        }
33531    }
33532    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33533        self.node
33534    }
33535    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33536        TerminalDotDotPtr(self.node.stable_ptr(db))
33537    }
33538}
33539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33540pub struct TokenDotDotEq<'db> {
33541    node: SyntaxNode<'db>,
33542}
33543impl<'db> Token<'db> for TokenDotDotEq<'db> {
33544    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33545        TokenDotDotEqGreen(
33546            GreenNode { kind: SyntaxKind::TokenDotDotEq, details: GreenNodeDetails::Token(text) }
33547                .intern(db),
33548        )
33549    }
33550    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33551        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33552    }
33553}
33554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33555pub struct TokenDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33556impl<'db> TypedStablePtr<'db> for TokenDotDotEqPtr<'db> {
33557    type SyntaxNode = TokenDotDotEq<'db>;
33558    fn untyped(self) -> SyntaxStablePtrId<'db> {
33559        self.0
33560    }
33561    fn lookup(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33562        TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33563    }
33564}
33565impl<'db> From<TokenDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33566    fn from(ptr: TokenDotDotEqPtr<'db>) -> Self {
33567        ptr.untyped()
33568    }
33569}
33570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33571pub struct TokenDotDotEqGreen<'db>(pub GreenId<'db>);
33572impl<'db> TokenDotDotEqGreen<'db> {
33573    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33574        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33575    }
33576}
33577impl<'db> TypedSyntaxNode<'db> for TokenDotDotEq<'db> {
33578    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33579    type StablePtr = TokenDotDotEqPtr<'db>;
33580    type Green = TokenDotDotEqGreen<'db>;
33581    fn missing(db: &'db dyn Database) -> Self::Green {
33582        TokenDotDotEqGreen(
33583            GreenNode {
33584                kind: SyntaxKind::TokenMissing,
33585                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33586            }
33587            .intern(db),
33588        )
33589    }
33590    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33591        match node.long(db).green.long(db).details {
33592            GreenNodeDetails::Token(_) => Self { node },
33593            GreenNodeDetails::Node { .. } => {
33594                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33595            }
33596        }
33597    }
33598    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33599        match node.long(db).green.long(db).details {
33600            GreenNodeDetails::Token(_) => Some(Self { node }),
33601            GreenNodeDetails::Node { .. } => None,
33602        }
33603    }
33604    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33605        self.node
33606    }
33607    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33608        TokenDotDotEqPtr(self.node.stable_ptr(db))
33609    }
33610}
33611#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33612pub struct TerminalDotDotEq<'db> {
33613    node: SyntaxNode<'db>,
33614}
33615impl<'db> Terminal<'db> for TerminalDotDotEq<'db> {
33616    const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
33617    type TokenType = TokenDotDotEq<'db>;
33618    fn new_green(
33619        db: &'db dyn Database,
33620        leading_trivia: TriviaGreen<'db>,
33621        token: <<TerminalDotDotEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33622        trailing_trivia: TriviaGreen<'db>,
33623    ) -> Self::Green {
33624        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33625        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33626        TerminalDotDotEqGreen(
33627            GreenNode {
33628                kind: SyntaxKind::TerminalDotDotEq,
33629                details: GreenNodeDetails::Node { children: children.into(), width },
33630            }
33631            .intern(db),
33632        )
33633    }
33634    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33635        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33636        else {
33637            unreachable!("Expected a node, not a token");
33638        };
33639        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33640    }
33641}
33642impl<'db> TerminalDotDotEq<'db> {
33643    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33644        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33645    }
33646    pub fn token(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33647        TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
33648    }
33649    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33650        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33651    }
33652}
33653#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33654pub struct TerminalDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33655impl<'db> TerminalDotDotEqPtr<'db> {}
33656impl<'db> TypedStablePtr<'db> for TerminalDotDotEqPtr<'db> {
33657    type SyntaxNode = TerminalDotDotEq<'db>;
33658    fn untyped(self) -> SyntaxStablePtrId<'db> {
33659        self.0
33660    }
33661    fn lookup(&self, db: &'db dyn Database) -> TerminalDotDotEq<'db> {
33662        TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
33663    }
33664}
33665impl<'db> From<TerminalDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33666    fn from(ptr: TerminalDotDotEqPtr<'db>) -> Self {
33667        ptr.untyped()
33668    }
33669}
33670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33671pub struct TerminalDotDotEqGreen<'db>(pub GreenId<'db>);
33672impl<'db> TypedSyntaxNode<'db> for TerminalDotDotEq<'db> {
33673    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
33674    type StablePtr = TerminalDotDotEqPtr<'db>;
33675    type Green = TerminalDotDotEqGreen<'db>;
33676    fn missing(db: &'db dyn Database) -> Self::Green {
33677        TerminalDotDotEqGreen(
33678            GreenNode {
33679                kind: SyntaxKind::TerminalDotDotEq,
33680                details: GreenNodeDetails::Node {
33681                    children: [
33682                        Trivia::missing(db).0,
33683                        TokenDotDotEq::missing(db).0,
33684                        Trivia::missing(db).0,
33685                    ]
33686                    .into(),
33687                    width: TextWidth::default(),
33688                },
33689            }
33690            .intern(db),
33691        )
33692    }
33693    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33694        let kind = node.kind(db);
33695        assert_eq!(
33696            kind,
33697            SyntaxKind::TerminalDotDotEq,
33698            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33699            kind,
33700            SyntaxKind::TerminalDotDotEq
33701        );
33702        Self { node }
33703    }
33704    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33705        let kind = node.kind(db);
33706        if kind == SyntaxKind::TerminalDotDotEq {
33707            Some(Self::from_syntax_node(db, node))
33708        } else {
33709            None
33710        }
33711    }
33712    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33713        self.node
33714    }
33715    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33716        TerminalDotDotEqPtr(self.node.stable_ptr(db))
33717    }
33718}
33719#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33720pub struct TokenEndOfFile<'db> {
33721    node: SyntaxNode<'db>,
33722}
33723impl<'db> Token<'db> for TokenEndOfFile<'db> {
33724    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33725        TokenEndOfFileGreen(
33726            GreenNode { kind: SyntaxKind::TokenEndOfFile, details: GreenNodeDetails::Token(text) }
33727                .intern(db),
33728        )
33729    }
33730    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33731        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33732    }
33733}
33734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33735pub struct TokenEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33736impl<'db> TypedStablePtr<'db> for TokenEndOfFilePtr<'db> {
33737    type SyntaxNode = TokenEndOfFile<'db>;
33738    fn untyped(self) -> SyntaxStablePtrId<'db> {
33739        self.0
33740    }
33741    fn lookup(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33742        TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
33743    }
33744}
33745impl<'db> From<TokenEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33746    fn from(ptr: TokenEndOfFilePtr<'db>) -> Self {
33747        ptr.untyped()
33748    }
33749}
33750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33751pub struct TokenEndOfFileGreen<'db>(pub GreenId<'db>);
33752impl<'db> TokenEndOfFileGreen<'db> {
33753    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33754        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33755    }
33756}
33757impl<'db> TypedSyntaxNode<'db> for TokenEndOfFile<'db> {
33758    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
33759    type StablePtr = TokenEndOfFilePtr<'db>;
33760    type Green = TokenEndOfFileGreen<'db>;
33761    fn missing(db: &'db dyn Database) -> Self::Green {
33762        TokenEndOfFileGreen(
33763            GreenNode {
33764                kind: SyntaxKind::TokenMissing,
33765                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33766            }
33767            .intern(db),
33768        )
33769    }
33770    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33771        match node.long(db).green.long(db).details {
33772            GreenNodeDetails::Token(_) => Self { node },
33773            GreenNodeDetails::Node { .. } => {
33774                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
33775            }
33776        }
33777    }
33778    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33779        match node.long(db).green.long(db).details {
33780            GreenNodeDetails::Token(_) => Some(Self { node }),
33781            GreenNodeDetails::Node { .. } => None,
33782        }
33783    }
33784    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33785        self.node
33786    }
33787    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33788        TokenEndOfFilePtr(self.node.stable_ptr(db))
33789    }
33790}
33791#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33792pub struct TerminalEndOfFile<'db> {
33793    node: SyntaxNode<'db>,
33794}
33795impl<'db> Terminal<'db> for TerminalEndOfFile<'db> {
33796    const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
33797    type TokenType = TokenEndOfFile<'db>;
33798    fn new_green(
33799        db: &'db dyn Database,
33800        leading_trivia: TriviaGreen<'db>,
33801        token: <<TerminalEndOfFile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33802        trailing_trivia: TriviaGreen<'db>,
33803    ) -> Self::Green {
33804        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33805        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33806        TerminalEndOfFileGreen(
33807            GreenNode {
33808                kind: SyntaxKind::TerminalEndOfFile,
33809                details: GreenNodeDetails::Node { children: children.into(), width },
33810            }
33811            .intern(db),
33812        )
33813    }
33814    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33815        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33816        else {
33817            unreachable!("Expected a node, not a token");
33818        };
33819        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33820    }
33821}
33822impl<'db> TerminalEndOfFile<'db> {
33823    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33824        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33825    }
33826    pub fn token(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33827        TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
33828    }
33829    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33830        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33831    }
33832}
33833#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33834pub struct TerminalEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33835impl<'db> TerminalEndOfFilePtr<'db> {}
33836impl<'db> TypedStablePtr<'db> for TerminalEndOfFilePtr<'db> {
33837    type SyntaxNode = TerminalEndOfFile<'db>;
33838    fn untyped(self) -> SyntaxStablePtrId<'db> {
33839        self.0
33840    }
33841    fn lookup(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
33842        TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
33843    }
33844}
33845impl<'db> From<TerminalEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33846    fn from(ptr: TerminalEndOfFilePtr<'db>) -> Self {
33847        ptr.untyped()
33848    }
33849}
33850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33851pub struct TerminalEndOfFileGreen<'db>(pub GreenId<'db>);
33852impl<'db> TypedSyntaxNode<'db> for TerminalEndOfFile<'db> {
33853    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
33854    type StablePtr = TerminalEndOfFilePtr<'db>;
33855    type Green = TerminalEndOfFileGreen<'db>;
33856    fn missing(db: &'db dyn Database) -> Self::Green {
33857        TerminalEndOfFileGreen(
33858            GreenNode {
33859                kind: SyntaxKind::TerminalEndOfFile,
33860                details: GreenNodeDetails::Node {
33861                    children: [
33862                        Trivia::missing(db).0,
33863                        TokenEndOfFile::missing(db).0,
33864                        Trivia::missing(db).0,
33865                    ]
33866                    .into(),
33867                    width: TextWidth::default(),
33868                },
33869            }
33870            .intern(db),
33871        )
33872    }
33873    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33874        let kind = node.kind(db);
33875        assert_eq!(
33876            kind,
33877            SyntaxKind::TerminalEndOfFile,
33878            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33879            kind,
33880            SyntaxKind::TerminalEndOfFile
33881        );
33882        Self { node }
33883    }
33884    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33885        let kind = node.kind(db);
33886        if kind == SyntaxKind::TerminalEndOfFile {
33887            Some(Self::from_syntax_node(db, node))
33888        } else {
33889            None
33890        }
33891    }
33892    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33893        self.node
33894    }
33895    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33896        TerminalEndOfFilePtr(self.node.stable_ptr(db))
33897    }
33898}
33899#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33900pub struct TokenEq<'db> {
33901    node: SyntaxNode<'db>,
33902}
33903impl<'db> Token<'db> for TokenEq<'db> {
33904    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33905        TokenEqGreen(
33906            GreenNode { kind: SyntaxKind::TokenEq, details: GreenNodeDetails::Token(text) }
33907                .intern(db),
33908        )
33909    }
33910    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33911        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
33912    }
33913}
33914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33915pub struct TokenEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33916impl<'db> TypedStablePtr<'db> for TokenEqPtr<'db> {
33917    type SyntaxNode = TokenEq<'db>;
33918    fn untyped(self) -> SyntaxStablePtrId<'db> {
33919        self.0
33920    }
33921    fn lookup(&self, db: &'db dyn Database) -> TokenEq<'db> {
33922        TokenEq::from_syntax_node(db, self.0.lookup(db))
33923    }
33924}
33925impl<'db> From<TokenEqPtr<'db>> for SyntaxStablePtrId<'db> {
33926    fn from(ptr: TokenEqPtr<'db>) -> Self {
33927        ptr.untyped()
33928    }
33929}
33930#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33931pub struct TokenEqGreen<'db>(pub GreenId<'db>);
33932impl<'db> TokenEqGreen<'db> {
33933    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33934        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33935    }
33936}
33937impl<'db> TypedSyntaxNode<'db> for TokenEq<'db> {
33938    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
33939    type StablePtr = TokenEqPtr<'db>;
33940    type Green = TokenEqGreen<'db>;
33941    fn missing(db: &'db dyn Database) -> Self::Green {
33942        TokenEqGreen(
33943            GreenNode {
33944                kind: SyntaxKind::TokenMissing,
33945                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33946            }
33947            .intern(db),
33948        )
33949    }
33950    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33951        match node.long(db).green.long(db).details {
33952            GreenNodeDetails::Token(_) => Self { node },
33953            GreenNodeDetails::Node { .. } => {
33954                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
33955            }
33956        }
33957    }
33958    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33959        match node.long(db).green.long(db).details {
33960            GreenNodeDetails::Token(_) => Some(Self { node }),
33961            GreenNodeDetails::Node { .. } => None,
33962        }
33963    }
33964    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33965        self.node
33966    }
33967    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33968        TokenEqPtr(self.node.stable_ptr(db))
33969    }
33970}
33971#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33972pub struct TerminalEq<'db> {
33973    node: SyntaxNode<'db>,
33974}
33975impl<'db> Terminal<'db> for TerminalEq<'db> {
33976    const KIND: SyntaxKind = SyntaxKind::TerminalEq;
33977    type TokenType = TokenEq<'db>;
33978    fn new_green(
33979        db: &'db dyn Database,
33980        leading_trivia: TriviaGreen<'db>,
33981        token: <<TerminalEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33982        trailing_trivia: TriviaGreen<'db>,
33983    ) -> Self::Green {
33984        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33985        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33986        TerminalEqGreen(
33987            GreenNode {
33988                kind: SyntaxKind::TerminalEq,
33989                details: GreenNodeDetails::Node { children: children.into(), width },
33990            }
33991            .intern(db),
33992        )
33993    }
33994    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33995        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
33996        else {
33997            unreachable!("Expected a node, not a token");
33998        };
33999        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34000    }
34001}
34002impl<'db> TerminalEq<'db> {
34003    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34004        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34005    }
34006    pub fn token(&self, db: &'db dyn Database) -> TokenEq<'db> {
34007        TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
34008    }
34009    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34010        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34011    }
34012}
34013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34014pub struct TerminalEqPtr<'db>(pub SyntaxStablePtrId<'db>);
34015impl<'db> TerminalEqPtr<'db> {}
34016impl<'db> TypedStablePtr<'db> for TerminalEqPtr<'db> {
34017    type SyntaxNode = TerminalEq<'db>;
34018    fn untyped(self) -> SyntaxStablePtrId<'db> {
34019        self.0
34020    }
34021    fn lookup(&self, db: &'db dyn Database) -> TerminalEq<'db> {
34022        TerminalEq::from_syntax_node(db, self.0.lookup(db))
34023    }
34024}
34025impl<'db> From<TerminalEqPtr<'db>> for SyntaxStablePtrId<'db> {
34026    fn from(ptr: TerminalEqPtr<'db>) -> Self {
34027        ptr.untyped()
34028    }
34029}
34030#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34031pub struct TerminalEqGreen<'db>(pub GreenId<'db>);
34032impl<'db> TypedSyntaxNode<'db> for TerminalEq<'db> {
34033    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
34034    type StablePtr = TerminalEqPtr<'db>;
34035    type Green = TerminalEqGreen<'db>;
34036    fn missing(db: &'db dyn Database) -> Self::Green {
34037        TerminalEqGreen(
34038            GreenNode {
34039                kind: SyntaxKind::TerminalEq,
34040                details: GreenNodeDetails::Node {
34041                    children: [
34042                        Trivia::missing(db).0,
34043                        TokenEq::missing(db).0,
34044                        Trivia::missing(db).0,
34045                    ]
34046                    .into(),
34047                    width: TextWidth::default(),
34048                },
34049            }
34050            .intern(db),
34051        )
34052    }
34053    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34054        let kind = node.kind(db);
34055        assert_eq!(
34056            kind,
34057            SyntaxKind::TerminalEq,
34058            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34059            kind,
34060            SyntaxKind::TerminalEq
34061        );
34062        Self { node }
34063    }
34064    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34065        let kind = node.kind(db);
34066        if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
34067    }
34068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34069        self.node
34070    }
34071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34072        TerminalEqPtr(self.node.stable_ptr(db))
34073    }
34074}
34075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34076pub struct TokenEqEq<'db> {
34077    node: SyntaxNode<'db>,
34078}
34079impl<'db> Token<'db> for TokenEqEq<'db> {
34080    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34081        TokenEqEqGreen(
34082            GreenNode { kind: SyntaxKind::TokenEqEq, details: GreenNodeDetails::Token(text) }
34083                .intern(db),
34084        )
34085    }
34086    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34087        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34088    }
34089}
34090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34091pub struct TokenEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
34092impl<'db> TypedStablePtr<'db> for TokenEqEqPtr<'db> {
34093    type SyntaxNode = TokenEqEq<'db>;
34094    fn untyped(self) -> SyntaxStablePtrId<'db> {
34095        self.0
34096    }
34097    fn lookup(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
34098        TokenEqEq::from_syntax_node(db, self.0.lookup(db))
34099    }
34100}
34101impl<'db> From<TokenEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
34102    fn from(ptr: TokenEqEqPtr<'db>) -> Self {
34103        ptr.untyped()
34104    }
34105}
34106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34107pub struct TokenEqEqGreen<'db>(pub GreenId<'db>);
34108impl<'db> TokenEqEqGreen<'db> {
34109    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34110        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34111    }
34112}
34113impl<'db> TypedSyntaxNode<'db> for TokenEqEq<'db> {
34114    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
34115    type StablePtr = TokenEqEqPtr<'db>;
34116    type Green = TokenEqEqGreen<'db>;
34117    fn missing(db: &'db dyn Database) -> Self::Green {
34118        TokenEqEqGreen(
34119            GreenNode {
34120                kind: SyntaxKind::TokenMissing,
34121                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34122            }
34123            .intern(db),
34124        )
34125    }
34126    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34127        match node.long(db).green.long(db).details {
34128            GreenNodeDetails::Token(_) => Self { node },
34129            GreenNodeDetails::Node { .. } => {
34130                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
34131            }
34132        }
34133    }
34134    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34135        match node.long(db).green.long(db).details {
34136            GreenNodeDetails::Token(_) => Some(Self { node }),
34137            GreenNodeDetails::Node { .. } => None,
34138        }
34139    }
34140    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34141        self.node
34142    }
34143    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34144        TokenEqEqPtr(self.node.stable_ptr(db))
34145    }
34146}
34147#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34148pub struct TerminalEqEq<'db> {
34149    node: SyntaxNode<'db>,
34150}
34151impl<'db> Terminal<'db> for TerminalEqEq<'db> {
34152    const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
34153    type TokenType = TokenEqEq<'db>;
34154    fn new_green(
34155        db: &'db dyn Database,
34156        leading_trivia: TriviaGreen<'db>,
34157        token: <<TerminalEqEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34158        trailing_trivia: TriviaGreen<'db>,
34159    ) -> Self::Green {
34160        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34161        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34162        TerminalEqEqGreen(
34163            GreenNode {
34164                kind: SyntaxKind::TerminalEqEq,
34165                details: GreenNodeDetails::Node { children: children.into(), width },
34166            }
34167            .intern(db),
34168        )
34169    }
34170    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34171        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34172        else {
34173            unreachable!("Expected a node, not a token");
34174        };
34175        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34176    }
34177}
34178impl<'db> TerminalEqEq<'db> {
34179    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34180        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34181    }
34182    pub fn token(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
34183        TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
34184    }
34185    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34186        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34187    }
34188}
34189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34190pub struct TerminalEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
34191impl<'db> TerminalEqEqPtr<'db> {}
34192impl<'db> TypedStablePtr<'db> for TerminalEqEqPtr<'db> {
34193    type SyntaxNode = TerminalEqEq<'db>;
34194    fn untyped(self) -> SyntaxStablePtrId<'db> {
34195        self.0
34196    }
34197    fn lookup(&self, db: &'db dyn Database) -> TerminalEqEq<'db> {
34198        TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
34199    }
34200}
34201impl<'db> From<TerminalEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
34202    fn from(ptr: TerminalEqEqPtr<'db>) -> Self {
34203        ptr.untyped()
34204    }
34205}
34206#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34207pub struct TerminalEqEqGreen<'db>(pub GreenId<'db>);
34208impl<'db> TypedSyntaxNode<'db> for TerminalEqEq<'db> {
34209    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
34210    type StablePtr = TerminalEqEqPtr<'db>;
34211    type Green = TerminalEqEqGreen<'db>;
34212    fn missing(db: &'db dyn Database) -> Self::Green {
34213        TerminalEqEqGreen(
34214            GreenNode {
34215                kind: SyntaxKind::TerminalEqEq,
34216                details: GreenNodeDetails::Node {
34217                    children: [
34218                        Trivia::missing(db).0,
34219                        TokenEqEq::missing(db).0,
34220                        Trivia::missing(db).0,
34221                    ]
34222                    .into(),
34223                    width: TextWidth::default(),
34224                },
34225            }
34226            .intern(db),
34227        )
34228    }
34229    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34230        let kind = node.kind(db);
34231        assert_eq!(
34232            kind,
34233            SyntaxKind::TerminalEqEq,
34234            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34235            kind,
34236            SyntaxKind::TerminalEqEq
34237        );
34238        Self { node }
34239    }
34240    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34241        let kind = node.kind(db);
34242        if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
34243    }
34244    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34245        self.node
34246    }
34247    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34248        TerminalEqEqPtr(self.node.stable_ptr(db))
34249    }
34250}
34251#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34252pub struct TokenGE<'db> {
34253    node: SyntaxNode<'db>,
34254}
34255impl<'db> Token<'db> for TokenGE<'db> {
34256    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34257        TokenGEGreen(
34258            GreenNode { kind: SyntaxKind::TokenGE, details: GreenNodeDetails::Token(text) }
34259                .intern(db),
34260        )
34261    }
34262    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34263        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34264    }
34265}
34266#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34267pub struct TokenGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34268impl<'db> TypedStablePtr<'db> for TokenGEPtr<'db> {
34269    type SyntaxNode = TokenGE<'db>;
34270    fn untyped(self) -> SyntaxStablePtrId<'db> {
34271        self.0
34272    }
34273    fn lookup(&self, db: &'db dyn Database) -> TokenGE<'db> {
34274        TokenGE::from_syntax_node(db, self.0.lookup(db))
34275    }
34276}
34277impl<'db> From<TokenGEPtr<'db>> for SyntaxStablePtrId<'db> {
34278    fn from(ptr: TokenGEPtr<'db>) -> Self {
34279        ptr.untyped()
34280    }
34281}
34282#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34283pub struct TokenGEGreen<'db>(pub GreenId<'db>);
34284impl<'db> TokenGEGreen<'db> {
34285    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34286        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34287    }
34288}
34289impl<'db> TypedSyntaxNode<'db> for TokenGE<'db> {
34290    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
34291    type StablePtr = TokenGEPtr<'db>;
34292    type Green = TokenGEGreen<'db>;
34293    fn missing(db: &'db dyn Database) -> Self::Green {
34294        TokenGEGreen(
34295            GreenNode {
34296                kind: SyntaxKind::TokenMissing,
34297                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34298            }
34299            .intern(db),
34300        )
34301    }
34302    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34303        match node.long(db).green.long(db).details {
34304            GreenNodeDetails::Token(_) => Self { node },
34305            GreenNodeDetails::Node { .. } => {
34306                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
34307            }
34308        }
34309    }
34310    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34311        match node.long(db).green.long(db).details {
34312            GreenNodeDetails::Token(_) => Some(Self { node }),
34313            GreenNodeDetails::Node { .. } => None,
34314        }
34315    }
34316    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34317        self.node
34318    }
34319    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34320        TokenGEPtr(self.node.stable_ptr(db))
34321    }
34322}
34323#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34324pub struct TerminalGE<'db> {
34325    node: SyntaxNode<'db>,
34326}
34327impl<'db> Terminal<'db> for TerminalGE<'db> {
34328    const KIND: SyntaxKind = SyntaxKind::TerminalGE;
34329    type TokenType = TokenGE<'db>;
34330    fn new_green(
34331        db: &'db dyn Database,
34332        leading_trivia: TriviaGreen<'db>,
34333        token: <<TerminalGE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34334        trailing_trivia: TriviaGreen<'db>,
34335    ) -> Self::Green {
34336        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34337        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34338        TerminalGEGreen(
34339            GreenNode {
34340                kind: SyntaxKind::TerminalGE,
34341                details: GreenNodeDetails::Node { children: children.into(), width },
34342            }
34343            .intern(db),
34344        )
34345    }
34346    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34347        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34348        else {
34349            unreachable!("Expected a node, not a token");
34350        };
34351        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34352    }
34353}
34354impl<'db> TerminalGE<'db> {
34355    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34356        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34357    }
34358    pub fn token(&self, db: &'db dyn Database) -> TokenGE<'db> {
34359        TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
34360    }
34361    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34362        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34363    }
34364}
34365#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34366pub struct TerminalGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34367impl<'db> TerminalGEPtr<'db> {}
34368impl<'db> TypedStablePtr<'db> for TerminalGEPtr<'db> {
34369    type SyntaxNode = TerminalGE<'db>;
34370    fn untyped(self) -> SyntaxStablePtrId<'db> {
34371        self.0
34372    }
34373    fn lookup(&self, db: &'db dyn Database) -> TerminalGE<'db> {
34374        TerminalGE::from_syntax_node(db, self.0.lookup(db))
34375    }
34376}
34377impl<'db> From<TerminalGEPtr<'db>> for SyntaxStablePtrId<'db> {
34378    fn from(ptr: TerminalGEPtr<'db>) -> Self {
34379        ptr.untyped()
34380    }
34381}
34382#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34383pub struct TerminalGEGreen<'db>(pub GreenId<'db>);
34384impl<'db> TypedSyntaxNode<'db> for TerminalGE<'db> {
34385    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
34386    type StablePtr = TerminalGEPtr<'db>;
34387    type Green = TerminalGEGreen<'db>;
34388    fn missing(db: &'db dyn Database) -> Self::Green {
34389        TerminalGEGreen(
34390            GreenNode {
34391                kind: SyntaxKind::TerminalGE,
34392                details: GreenNodeDetails::Node {
34393                    children: [
34394                        Trivia::missing(db).0,
34395                        TokenGE::missing(db).0,
34396                        Trivia::missing(db).0,
34397                    ]
34398                    .into(),
34399                    width: TextWidth::default(),
34400                },
34401            }
34402            .intern(db),
34403        )
34404    }
34405    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34406        let kind = node.kind(db);
34407        assert_eq!(
34408            kind,
34409            SyntaxKind::TerminalGE,
34410            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34411            kind,
34412            SyntaxKind::TerminalGE
34413        );
34414        Self { node }
34415    }
34416    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34417        let kind = node.kind(db);
34418        if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
34419    }
34420    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34421        self.node
34422    }
34423    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34424        TerminalGEPtr(self.node.stable_ptr(db))
34425    }
34426}
34427#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34428pub struct TokenGT<'db> {
34429    node: SyntaxNode<'db>,
34430}
34431impl<'db> Token<'db> for TokenGT<'db> {
34432    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34433        TokenGTGreen(
34434            GreenNode { kind: SyntaxKind::TokenGT, details: GreenNodeDetails::Token(text) }
34435                .intern(db),
34436        )
34437    }
34438    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34439        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34440    }
34441}
34442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34443pub struct TokenGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34444impl<'db> TypedStablePtr<'db> for TokenGTPtr<'db> {
34445    type SyntaxNode = TokenGT<'db>;
34446    fn untyped(self) -> SyntaxStablePtrId<'db> {
34447        self.0
34448    }
34449    fn lookup(&self, db: &'db dyn Database) -> TokenGT<'db> {
34450        TokenGT::from_syntax_node(db, self.0.lookup(db))
34451    }
34452}
34453impl<'db> From<TokenGTPtr<'db>> for SyntaxStablePtrId<'db> {
34454    fn from(ptr: TokenGTPtr<'db>) -> Self {
34455        ptr.untyped()
34456    }
34457}
34458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34459pub struct TokenGTGreen<'db>(pub GreenId<'db>);
34460impl<'db> TokenGTGreen<'db> {
34461    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34462        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34463    }
34464}
34465impl<'db> TypedSyntaxNode<'db> for TokenGT<'db> {
34466    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34467    type StablePtr = TokenGTPtr<'db>;
34468    type Green = TokenGTGreen<'db>;
34469    fn missing(db: &'db dyn Database) -> Self::Green {
34470        TokenGTGreen(
34471            GreenNode {
34472                kind: SyntaxKind::TokenMissing,
34473                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34474            }
34475            .intern(db),
34476        )
34477    }
34478    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34479        match node.long(db).green.long(db).details {
34480            GreenNodeDetails::Token(_) => Self { node },
34481            GreenNodeDetails::Node { .. } => {
34482                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34483            }
34484        }
34485    }
34486    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34487        match node.long(db).green.long(db).details {
34488            GreenNodeDetails::Token(_) => Some(Self { node }),
34489            GreenNodeDetails::Node { .. } => None,
34490        }
34491    }
34492    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34493        self.node
34494    }
34495    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34496        TokenGTPtr(self.node.stable_ptr(db))
34497    }
34498}
34499#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34500pub struct TerminalGT<'db> {
34501    node: SyntaxNode<'db>,
34502}
34503impl<'db> Terminal<'db> for TerminalGT<'db> {
34504    const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34505    type TokenType = TokenGT<'db>;
34506    fn new_green(
34507        db: &'db dyn Database,
34508        leading_trivia: TriviaGreen<'db>,
34509        token: <<TerminalGT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34510        trailing_trivia: TriviaGreen<'db>,
34511    ) -> Self::Green {
34512        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34513        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34514        TerminalGTGreen(
34515            GreenNode {
34516                kind: SyntaxKind::TerminalGT,
34517                details: GreenNodeDetails::Node { children: children.into(), width },
34518            }
34519            .intern(db),
34520        )
34521    }
34522    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34523        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34524        else {
34525            unreachable!("Expected a node, not a token");
34526        };
34527        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34528    }
34529}
34530impl<'db> TerminalGT<'db> {
34531    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34532        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34533    }
34534    pub fn token(&self, db: &'db dyn Database) -> TokenGT<'db> {
34535        TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34536    }
34537    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34538        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34539    }
34540}
34541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34542pub struct TerminalGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34543impl<'db> TerminalGTPtr<'db> {}
34544impl<'db> TypedStablePtr<'db> for TerminalGTPtr<'db> {
34545    type SyntaxNode = TerminalGT<'db>;
34546    fn untyped(self) -> SyntaxStablePtrId<'db> {
34547        self.0
34548    }
34549    fn lookup(&self, db: &'db dyn Database) -> TerminalGT<'db> {
34550        TerminalGT::from_syntax_node(db, self.0.lookup(db))
34551    }
34552}
34553impl<'db> From<TerminalGTPtr<'db>> for SyntaxStablePtrId<'db> {
34554    fn from(ptr: TerminalGTPtr<'db>) -> Self {
34555        ptr.untyped()
34556    }
34557}
34558#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34559pub struct TerminalGTGreen<'db>(pub GreenId<'db>);
34560impl<'db> TypedSyntaxNode<'db> for TerminalGT<'db> {
34561    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
34562    type StablePtr = TerminalGTPtr<'db>;
34563    type Green = TerminalGTGreen<'db>;
34564    fn missing(db: &'db dyn Database) -> Self::Green {
34565        TerminalGTGreen(
34566            GreenNode {
34567                kind: SyntaxKind::TerminalGT,
34568                details: GreenNodeDetails::Node {
34569                    children: [
34570                        Trivia::missing(db).0,
34571                        TokenGT::missing(db).0,
34572                        Trivia::missing(db).0,
34573                    ]
34574                    .into(),
34575                    width: TextWidth::default(),
34576                },
34577            }
34578            .intern(db),
34579        )
34580    }
34581    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34582        let kind = node.kind(db);
34583        assert_eq!(
34584            kind,
34585            SyntaxKind::TerminalGT,
34586            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34587            kind,
34588            SyntaxKind::TerminalGT
34589        );
34590        Self { node }
34591    }
34592    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34593        let kind = node.kind(db);
34594        if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
34595    }
34596    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34597        self.node
34598    }
34599    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34600        TerminalGTPtr(self.node.stable_ptr(db))
34601    }
34602}
34603#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34604pub struct TokenHash<'db> {
34605    node: SyntaxNode<'db>,
34606}
34607impl<'db> Token<'db> for TokenHash<'db> {
34608    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34609        TokenHashGreen(
34610            GreenNode { kind: SyntaxKind::TokenHash, details: GreenNodeDetails::Token(text) }
34611                .intern(db),
34612        )
34613    }
34614    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34615        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34616    }
34617}
34618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34619pub struct TokenHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34620impl<'db> TypedStablePtr<'db> for TokenHashPtr<'db> {
34621    type SyntaxNode = TokenHash<'db>;
34622    fn untyped(self) -> SyntaxStablePtrId<'db> {
34623        self.0
34624    }
34625    fn lookup(&self, db: &'db dyn Database) -> TokenHash<'db> {
34626        TokenHash::from_syntax_node(db, self.0.lookup(db))
34627    }
34628}
34629impl<'db> From<TokenHashPtr<'db>> for SyntaxStablePtrId<'db> {
34630    fn from(ptr: TokenHashPtr<'db>) -> Self {
34631        ptr.untyped()
34632    }
34633}
34634#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34635pub struct TokenHashGreen<'db>(pub GreenId<'db>);
34636impl<'db> TokenHashGreen<'db> {
34637    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34638        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34639    }
34640}
34641impl<'db> TypedSyntaxNode<'db> for TokenHash<'db> {
34642    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
34643    type StablePtr = TokenHashPtr<'db>;
34644    type Green = TokenHashGreen<'db>;
34645    fn missing(db: &'db dyn Database) -> Self::Green {
34646        TokenHashGreen(
34647            GreenNode {
34648                kind: SyntaxKind::TokenMissing,
34649                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34650            }
34651            .intern(db),
34652        )
34653    }
34654    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34655        match node.long(db).green.long(db).details {
34656            GreenNodeDetails::Token(_) => Self { node },
34657            GreenNodeDetails::Node { .. } => {
34658                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
34659            }
34660        }
34661    }
34662    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34663        match node.long(db).green.long(db).details {
34664            GreenNodeDetails::Token(_) => Some(Self { node }),
34665            GreenNodeDetails::Node { .. } => None,
34666        }
34667    }
34668    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34669        self.node
34670    }
34671    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34672        TokenHashPtr(self.node.stable_ptr(db))
34673    }
34674}
34675#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34676pub struct TerminalHash<'db> {
34677    node: SyntaxNode<'db>,
34678}
34679impl<'db> Terminal<'db> for TerminalHash<'db> {
34680    const KIND: SyntaxKind = SyntaxKind::TerminalHash;
34681    type TokenType = TokenHash<'db>;
34682    fn new_green(
34683        db: &'db dyn Database,
34684        leading_trivia: TriviaGreen<'db>,
34685        token: <<TerminalHash<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34686        trailing_trivia: TriviaGreen<'db>,
34687    ) -> Self::Green {
34688        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34689        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34690        TerminalHashGreen(
34691            GreenNode {
34692                kind: SyntaxKind::TerminalHash,
34693                details: GreenNodeDetails::Node { children: children.into(), width },
34694            }
34695            .intern(db),
34696        )
34697    }
34698    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34699        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34700        else {
34701            unreachable!("Expected a node, not a token");
34702        };
34703        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34704    }
34705}
34706impl<'db> TerminalHash<'db> {
34707    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34708        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34709    }
34710    pub fn token(&self, db: &'db dyn Database) -> TokenHash<'db> {
34711        TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
34712    }
34713    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34714        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34715    }
34716}
34717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34718pub struct TerminalHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34719impl<'db> TerminalHashPtr<'db> {}
34720impl<'db> TypedStablePtr<'db> for TerminalHashPtr<'db> {
34721    type SyntaxNode = TerminalHash<'db>;
34722    fn untyped(self) -> SyntaxStablePtrId<'db> {
34723        self.0
34724    }
34725    fn lookup(&self, db: &'db dyn Database) -> TerminalHash<'db> {
34726        TerminalHash::from_syntax_node(db, self.0.lookup(db))
34727    }
34728}
34729impl<'db> From<TerminalHashPtr<'db>> for SyntaxStablePtrId<'db> {
34730    fn from(ptr: TerminalHashPtr<'db>) -> Self {
34731        ptr.untyped()
34732    }
34733}
34734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34735pub struct TerminalHashGreen<'db>(pub GreenId<'db>);
34736impl<'db> TypedSyntaxNode<'db> for TerminalHash<'db> {
34737    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
34738    type StablePtr = TerminalHashPtr<'db>;
34739    type Green = TerminalHashGreen<'db>;
34740    fn missing(db: &'db dyn Database) -> Self::Green {
34741        TerminalHashGreen(
34742            GreenNode {
34743                kind: SyntaxKind::TerminalHash,
34744                details: GreenNodeDetails::Node {
34745                    children: [
34746                        Trivia::missing(db).0,
34747                        TokenHash::missing(db).0,
34748                        Trivia::missing(db).0,
34749                    ]
34750                    .into(),
34751                    width: TextWidth::default(),
34752                },
34753            }
34754            .intern(db),
34755        )
34756    }
34757    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34758        let kind = node.kind(db);
34759        assert_eq!(
34760            kind,
34761            SyntaxKind::TerminalHash,
34762            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34763            kind,
34764            SyntaxKind::TerminalHash
34765        );
34766        Self { node }
34767    }
34768    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34769        let kind = node.kind(db);
34770        if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
34771    }
34772    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34773        self.node
34774    }
34775    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34776        TerminalHashPtr(self.node.stable_ptr(db))
34777    }
34778}
34779#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34780pub struct TokenLBrace<'db> {
34781    node: SyntaxNode<'db>,
34782}
34783impl<'db> Token<'db> for TokenLBrace<'db> {
34784    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34785        TokenLBraceGreen(
34786            GreenNode { kind: SyntaxKind::TokenLBrace, details: GreenNodeDetails::Token(text) }
34787                .intern(db),
34788        )
34789    }
34790    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34791        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34792    }
34793}
34794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34795pub struct TokenLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34796impl<'db> TypedStablePtr<'db> for TokenLBracePtr<'db> {
34797    type SyntaxNode = TokenLBrace<'db>;
34798    fn untyped(self) -> SyntaxStablePtrId<'db> {
34799        self.0
34800    }
34801    fn lookup(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34802        TokenLBrace::from_syntax_node(db, self.0.lookup(db))
34803    }
34804}
34805impl<'db> From<TokenLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34806    fn from(ptr: TokenLBracePtr<'db>) -> Self {
34807        ptr.untyped()
34808    }
34809}
34810#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34811pub struct TokenLBraceGreen<'db>(pub GreenId<'db>);
34812impl<'db> TokenLBraceGreen<'db> {
34813    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34814        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34815    }
34816}
34817impl<'db> TypedSyntaxNode<'db> for TokenLBrace<'db> {
34818    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
34819    type StablePtr = TokenLBracePtr<'db>;
34820    type Green = TokenLBraceGreen<'db>;
34821    fn missing(db: &'db dyn Database) -> Self::Green {
34822        TokenLBraceGreen(
34823            GreenNode {
34824                kind: SyntaxKind::TokenMissing,
34825                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34826            }
34827            .intern(db),
34828        )
34829    }
34830    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34831        match node.long(db).green.long(db).details {
34832            GreenNodeDetails::Token(_) => Self { node },
34833            GreenNodeDetails::Node { .. } => {
34834                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
34835            }
34836        }
34837    }
34838    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34839        match node.long(db).green.long(db).details {
34840            GreenNodeDetails::Token(_) => Some(Self { node }),
34841            GreenNodeDetails::Node { .. } => None,
34842        }
34843    }
34844    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34845        self.node
34846    }
34847    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34848        TokenLBracePtr(self.node.stable_ptr(db))
34849    }
34850}
34851#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34852pub struct TerminalLBrace<'db> {
34853    node: SyntaxNode<'db>,
34854}
34855impl<'db> Terminal<'db> for TerminalLBrace<'db> {
34856    const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
34857    type TokenType = TokenLBrace<'db>;
34858    fn new_green(
34859        db: &'db dyn Database,
34860        leading_trivia: TriviaGreen<'db>,
34861        token: <<TerminalLBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34862        trailing_trivia: TriviaGreen<'db>,
34863    ) -> Self::Green {
34864        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34865        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34866        TerminalLBraceGreen(
34867            GreenNode {
34868                kind: SyntaxKind::TerminalLBrace,
34869                details: GreenNodeDetails::Node { children: children.into(), width },
34870            }
34871            .intern(db),
34872        )
34873    }
34874    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34875        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
34876        else {
34877            unreachable!("Expected a node, not a token");
34878        };
34879        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34880    }
34881}
34882impl<'db> TerminalLBrace<'db> {
34883    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34884        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34885    }
34886    pub fn token(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34887        TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
34888    }
34889    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34890        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34891    }
34892}
34893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34894pub struct TerminalLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34895impl<'db> TerminalLBracePtr<'db> {}
34896impl<'db> TypedStablePtr<'db> for TerminalLBracePtr<'db> {
34897    type SyntaxNode = TerminalLBrace<'db>;
34898    fn untyped(self) -> SyntaxStablePtrId<'db> {
34899        self.0
34900    }
34901    fn lookup(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
34902        TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
34903    }
34904}
34905impl<'db> From<TerminalLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34906    fn from(ptr: TerminalLBracePtr<'db>) -> Self {
34907        ptr.untyped()
34908    }
34909}
34910#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34911pub struct TerminalLBraceGreen<'db>(pub GreenId<'db>);
34912impl<'db> TypedSyntaxNode<'db> for TerminalLBrace<'db> {
34913    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
34914    type StablePtr = TerminalLBracePtr<'db>;
34915    type Green = TerminalLBraceGreen<'db>;
34916    fn missing(db: &'db dyn Database) -> Self::Green {
34917        TerminalLBraceGreen(
34918            GreenNode {
34919                kind: SyntaxKind::TerminalLBrace,
34920                details: GreenNodeDetails::Node {
34921                    children: [
34922                        Trivia::missing(db).0,
34923                        TokenLBrace::missing(db).0,
34924                        Trivia::missing(db).0,
34925                    ]
34926                    .into(),
34927                    width: TextWidth::default(),
34928                },
34929            }
34930            .intern(db),
34931        )
34932    }
34933    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34934        let kind = node.kind(db);
34935        assert_eq!(
34936            kind,
34937            SyntaxKind::TerminalLBrace,
34938            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34939            kind,
34940            SyntaxKind::TerminalLBrace
34941        );
34942        Self { node }
34943    }
34944    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34945        let kind = node.kind(db);
34946        if kind == SyntaxKind::TerminalLBrace {
34947            Some(Self::from_syntax_node(db, node))
34948        } else {
34949            None
34950        }
34951    }
34952    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34953        self.node
34954    }
34955    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34956        TerminalLBracePtr(self.node.stable_ptr(db))
34957    }
34958}
34959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34960pub struct TokenLBrack<'db> {
34961    node: SyntaxNode<'db>,
34962}
34963impl<'db> Token<'db> for TokenLBrack<'db> {
34964    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34965        TokenLBrackGreen(
34966            GreenNode { kind: SyntaxKind::TokenLBrack, details: GreenNodeDetails::Token(text) }
34967                .intern(db),
34968        )
34969    }
34970    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34971        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
34972    }
34973}
34974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34975pub struct TokenLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34976impl<'db> TypedStablePtr<'db> for TokenLBrackPtr<'db> {
34977    type SyntaxNode = TokenLBrack<'db>;
34978    fn untyped(self) -> SyntaxStablePtrId<'db> {
34979        self.0
34980    }
34981    fn lookup(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34982        TokenLBrack::from_syntax_node(db, self.0.lookup(db))
34983    }
34984}
34985impl<'db> From<TokenLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34986    fn from(ptr: TokenLBrackPtr<'db>) -> Self {
34987        ptr.untyped()
34988    }
34989}
34990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34991pub struct TokenLBrackGreen<'db>(pub GreenId<'db>);
34992impl<'db> TokenLBrackGreen<'db> {
34993    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34994        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34995    }
34996}
34997impl<'db> TypedSyntaxNode<'db> for TokenLBrack<'db> {
34998    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
34999    type StablePtr = TokenLBrackPtr<'db>;
35000    type Green = TokenLBrackGreen<'db>;
35001    fn missing(db: &'db dyn Database) -> Self::Green {
35002        TokenLBrackGreen(
35003            GreenNode {
35004                kind: SyntaxKind::TokenMissing,
35005                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35006            }
35007            .intern(db),
35008        )
35009    }
35010    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35011        match node.long(db).green.long(db).details {
35012            GreenNodeDetails::Token(_) => Self { node },
35013            GreenNodeDetails::Node { .. } => {
35014                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
35015            }
35016        }
35017    }
35018    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35019        match node.long(db).green.long(db).details {
35020            GreenNodeDetails::Token(_) => Some(Self { node }),
35021            GreenNodeDetails::Node { .. } => None,
35022        }
35023    }
35024    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35025        self.node
35026    }
35027    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35028        TokenLBrackPtr(self.node.stable_ptr(db))
35029    }
35030}
35031#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35032pub struct TerminalLBrack<'db> {
35033    node: SyntaxNode<'db>,
35034}
35035impl<'db> Terminal<'db> for TerminalLBrack<'db> {
35036    const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
35037    type TokenType = TokenLBrack<'db>;
35038    fn new_green(
35039        db: &'db dyn Database,
35040        leading_trivia: TriviaGreen<'db>,
35041        token: <<TerminalLBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35042        trailing_trivia: TriviaGreen<'db>,
35043    ) -> Self::Green {
35044        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35045        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35046        TerminalLBrackGreen(
35047            GreenNode {
35048                kind: SyntaxKind::TerminalLBrack,
35049                details: GreenNodeDetails::Node { children: children.into(), width },
35050            }
35051            .intern(db),
35052        )
35053    }
35054    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35055        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35056        else {
35057            unreachable!("Expected a node, not a token");
35058        };
35059        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35060    }
35061}
35062impl<'db> TerminalLBrack<'db> {
35063    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35064        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35065    }
35066    pub fn token(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
35067        TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
35068    }
35069    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35070        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35071    }
35072}
35073#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35074pub struct TerminalLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
35075impl<'db> TerminalLBrackPtr<'db> {}
35076impl<'db> TypedStablePtr<'db> for TerminalLBrackPtr<'db> {
35077    type SyntaxNode = TerminalLBrack<'db>;
35078    fn untyped(self) -> SyntaxStablePtrId<'db> {
35079        self.0
35080    }
35081    fn lookup(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
35082        TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
35083    }
35084}
35085impl<'db> From<TerminalLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
35086    fn from(ptr: TerminalLBrackPtr<'db>) -> Self {
35087        ptr.untyped()
35088    }
35089}
35090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35091pub struct TerminalLBrackGreen<'db>(pub GreenId<'db>);
35092impl<'db> TypedSyntaxNode<'db> for TerminalLBrack<'db> {
35093    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
35094    type StablePtr = TerminalLBrackPtr<'db>;
35095    type Green = TerminalLBrackGreen<'db>;
35096    fn missing(db: &'db dyn Database) -> Self::Green {
35097        TerminalLBrackGreen(
35098            GreenNode {
35099                kind: SyntaxKind::TerminalLBrack,
35100                details: GreenNodeDetails::Node {
35101                    children: [
35102                        Trivia::missing(db).0,
35103                        TokenLBrack::missing(db).0,
35104                        Trivia::missing(db).0,
35105                    ]
35106                    .into(),
35107                    width: TextWidth::default(),
35108                },
35109            }
35110            .intern(db),
35111        )
35112    }
35113    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35114        let kind = node.kind(db);
35115        assert_eq!(
35116            kind,
35117            SyntaxKind::TerminalLBrack,
35118            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35119            kind,
35120            SyntaxKind::TerminalLBrack
35121        );
35122        Self { node }
35123    }
35124    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35125        let kind = node.kind(db);
35126        if kind == SyntaxKind::TerminalLBrack {
35127            Some(Self::from_syntax_node(db, node))
35128        } else {
35129            None
35130        }
35131    }
35132    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35133        self.node
35134    }
35135    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35136        TerminalLBrackPtr(self.node.stable_ptr(db))
35137    }
35138}
35139#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35140pub struct TokenLE<'db> {
35141    node: SyntaxNode<'db>,
35142}
35143impl<'db> Token<'db> for TokenLE<'db> {
35144    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35145        TokenLEGreen(
35146            GreenNode { kind: SyntaxKind::TokenLE, details: GreenNodeDetails::Token(text) }
35147                .intern(db),
35148        )
35149    }
35150    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35151        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35152    }
35153}
35154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35155pub struct TokenLEPtr<'db>(pub SyntaxStablePtrId<'db>);
35156impl<'db> TypedStablePtr<'db> for TokenLEPtr<'db> {
35157    type SyntaxNode = TokenLE<'db>;
35158    fn untyped(self) -> SyntaxStablePtrId<'db> {
35159        self.0
35160    }
35161    fn lookup(&self, db: &'db dyn Database) -> TokenLE<'db> {
35162        TokenLE::from_syntax_node(db, self.0.lookup(db))
35163    }
35164}
35165impl<'db> From<TokenLEPtr<'db>> for SyntaxStablePtrId<'db> {
35166    fn from(ptr: TokenLEPtr<'db>) -> Self {
35167        ptr.untyped()
35168    }
35169}
35170#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35171pub struct TokenLEGreen<'db>(pub GreenId<'db>);
35172impl<'db> TokenLEGreen<'db> {
35173    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35174        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35175    }
35176}
35177impl<'db> TypedSyntaxNode<'db> for TokenLE<'db> {
35178    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
35179    type StablePtr = TokenLEPtr<'db>;
35180    type Green = TokenLEGreen<'db>;
35181    fn missing(db: &'db dyn Database) -> Self::Green {
35182        TokenLEGreen(
35183            GreenNode {
35184                kind: SyntaxKind::TokenMissing,
35185                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35186            }
35187            .intern(db),
35188        )
35189    }
35190    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35191        match node.long(db).green.long(db).details {
35192            GreenNodeDetails::Token(_) => Self { node },
35193            GreenNodeDetails::Node { .. } => {
35194                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
35195            }
35196        }
35197    }
35198    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35199        match node.long(db).green.long(db).details {
35200            GreenNodeDetails::Token(_) => Some(Self { node }),
35201            GreenNodeDetails::Node { .. } => None,
35202        }
35203    }
35204    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35205        self.node
35206    }
35207    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35208        TokenLEPtr(self.node.stable_ptr(db))
35209    }
35210}
35211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35212pub struct TerminalLE<'db> {
35213    node: SyntaxNode<'db>,
35214}
35215impl<'db> Terminal<'db> for TerminalLE<'db> {
35216    const KIND: SyntaxKind = SyntaxKind::TerminalLE;
35217    type TokenType = TokenLE<'db>;
35218    fn new_green(
35219        db: &'db dyn Database,
35220        leading_trivia: TriviaGreen<'db>,
35221        token: <<TerminalLE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35222        trailing_trivia: TriviaGreen<'db>,
35223    ) -> Self::Green {
35224        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35225        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35226        TerminalLEGreen(
35227            GreenNode {
35228                kind: SyntaxKind::TerminalLE,
35229                details: GreenNodeDetails::Node { children: children.into(), width },
35230            }
35231            .intern(db),
35232        )
35233    }
35234    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35235        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35236        else {
35237            unreachable!("Expected a node, not a token");
35238        };
35239        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35240    }
35241}
35242impl<'db> TerminalLE<'db> {
35243    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35244        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35245    }
35246    pub fn token(&self, db: &'db dyn Database) -> TokenLE<'db> {
35247        TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
35248    }
35249    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35250        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35251    }
35252}
35253#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35254pub struct TerminalLEPtr<'db>(pub SyntaxStablePtrId<'db>);
35255impl<'db> TerminalLEPtr<'db> {}
35256impl<'db> TypedStablePtr<'db> for TerminalLEPtr<'db> {
35257    type SyntaxNode = TerminalLE<'db>;
35258    fn untyped(self) -> SyntaxStablePtrId<'db> {
35259        self.0
35260    }
35261    fn lookup(&self, db: &'db dyn Database) -> TerminalLE<'db> {
35262        TerminalLE::from_syntax_node(db, self.0.lookup(db))
35263    }
35264}
35265impl<'db> From<TerminalLEPtr<'db>> for SyntaxStablePtrId<'db> {
35266    fn from(ptr: TerminalLEPtr<'db>) -> Self {
35267        ptr.untyped()
35268    }
35269}
35270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35271pub struct TerminalLEGreen<'db>(pub GreenId<'db>);
35272impl<'db> TypedSyntaxNode<'db> for TerminalLE<'db> {
35273    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
35274    type StablePtr = TerminalLEPtr<'db>;
35275    type Green = TerminalLEGreen<'db>;
35276    fn missing(db: &'db dyn Database) -> Self::Green {
35277        TerminalLEGreen(
35278            GreenNode {
35279                kind: SyntaxKind::TerminalLE,
35280                details: GreenNodeDetails::Node {
35281                    children: [
35282                        Trivia::missing(db).0,
35283                        TokenLE::missing(db).0,
35284                        Trivia::missing(db).0,
35285                    ]
35286                    .into(),
35287                    width: TextWidth::default(),
35288                },
35289            }
35290            .intern(db),
35291        )
35292    }
35293    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35294        let kind = node.kind(db);
35295        assert_eq!(
35296            kind,
35297            SyntaxKind::TerminalLE,
35298            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35299            kind,
35300            SyntaxKind::TerminalLE
35301        );
35302        Self { node }
35303    }
35304    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35305        let kind = node.kind(db);
35306        if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
35307    }
35308    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35309        self.node
35310    }
35311    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35312        TerminalLEPtr(self.node.stable_ptr(db))
35313    }
35314}
35315#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35316pub struct TokenLParen<'db> {
35317    node: SyntaxNode<'db>,
35318}
35319impl<'db> Token<'db> for TokenLParen<'db> {
35320    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35321        TokenLParenGreen(
35322            GreenNode { kind: SyntaxKind::TokenLParen, details: GreenNodeDetails::Token(text) }
35323                .intern(db),
35324        )
35325    }
35326    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35327        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35328    }
35329}
35330#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35331pub struct TokenLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35332impl<'db> TypedStablePtr<'db> for TokenLParenPtr<'db> {
35333    type SyntaxNode = TokenLParen<'db>;
35334    fn untyped(self) -> SyntaxStablePtrId<'db> {
35335        self.0
35336    }
35337    fn lookup(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35338        TokenLParen::from_syntax_node(db, self.0.lookup(db))
35339    }
35340}
35341impl<'db> From<TokenLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35342    fn from(ptr: TokenLParenPtr<'db>) -> Self {
35343        ptr.untyped()
35344    }
35345}
35346#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35347pub struct TokenLParenGreen<'db>(pub GreenId<'db>);
35348impl<'db> TokenLParenGreen<'db> {
35349    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35350        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35351    }
35352}
35353impl<'db> TypedSyntaxNode<'db> for TokenLParen<'db> {
35354    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
35355    type StablePtr = TokenLParenPtr<'db>;
35356    type Green = TokenLParenGreen<'db>;
35357    fn missing(db: &'db dyn Database) -> Self::Green {
35358        TokenLParenGreen(
35359            GreenNode {
35360                kind: SyntaxKind::TokenMissing,
35361                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35362            }
35363            .intern(db),
35364        )
35365    }
35366    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35367        match node.long(db).green.long(db).details {
35368            GreenNodeDetails::Token(_) => Self { node },
35369            GreenNodeDetails::Node { .. } => {
35370                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
35371            }
35372        }
35373    }
35374    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35375        match node.long(db).green.long(db).details {
35376            GreenNodeDetails::Token(_) => Some(Self { node }),
35377            GreenNodeDetails::Node { .. } => None,
35378        }
35379    }
35380    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35381        self.node
35382    }
35383    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35384        TokenLParenPtr(self.node.stable_ptr(db))
35385    }
35386}
35387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35388pub struct TerminalLParen<'db> {
35389    node: SyntaxNode<'db>,
35390}
35391impl<'db> Terminal<'db> for TerminalLParen<'db> {
35392    const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
35393    type TokenType = TokenLParen<'db>;
35394    fn new_green(
35395        db: &'db dyn Database,
35396        leading_trivia: TriviaGreen<'db>,
35397        token: <<TerminalLParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35398        trailing_trivia: TriviaGreen<'db>,
35399    ) -> Self::Green {
35400        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35401        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35402        TerminalLParenGreen(
35403            GreenNode {
35404                kind: SyntaxKind::TerminalLParen,
35405                details: GreenNodeDetails::Node { children: children.into(), width },
35406            }
35407            .intern(db),
35408        )
35409    }
35410    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35411        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35412        else {
35413            unreachable!("Expected a node, not a token");
35414        };
35415        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35416    }
35417}
35418impl<'db> TerminalLParen<'db> {
35419    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35420        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35421    }
35422    pub fn token(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35423        TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
35424    }
35425    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35426        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35427    }
35428}
35429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35430pub struct TerminalLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35431impl<'db> TerminalLParenPtr<'db> {}
35432impl<'db> TypedStablePtr<'db> for TerminalLParenPtr<'db> {
35433    type SyntaxNode = TerminalLParen<'db>;
35434    fn untyped(self) -> SyntaxStablePtrId<'db> {
35435        self.0
35436    }
35437    fn lookup(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
35438        TerminalLParen::from_syntax_node(db, self.0.lookup(db))
35439    }
35440}
35441impl<'db> From<TerminalLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35442    fn from(ptr: TerminalLParenPtr<'db>) -> Self {
35443        ptr.untyped()
35444    }
35445}
35446#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35447pub struct TerminalLParenGreen<'db>(pub GreenId<'db>);
35448impl<'db> TypedSyntaxNode<'db> for TerminalLParen<'db> {
35449    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
35450    type StablePtr = TerminalLParenPtr<'db>;
35451    type Green = TerminalLParenGreen<'db>;
35452    fn missing(db: &'db dyn Database) -> Self::Green {
35453        TerminalLParenGreen(
35454            GreenNode {
35455                kind: SyntaxKind::TerminalLParen,
35456                details: GreenNodeDetails::Node {
35457                    children: [
35458                        Trivia::missing(db).0,
35459                        TokenLParen::missing(db).0,
35460                        Trivia::missing(db).0,
35461                    ]
35462                    .into(),
35463                    width: TextWidth::default(),
35464                },
35465            }
35466            .intern(db),
35467        )
35468    }
35469    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35470        let kind = node.kind(db);
35471        assert_eq!(
35472            kind,
35473            SyntaxKind::TerminalLParen,
35474            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35475            kind,
35476            SyntaxKind::TerminalLParen
35477        );
35478        Self { node }
35479    }
35480    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35481        let kind = node.kind(db);
35482        if kind == SyntaxKind::TerminalLParen {
35483            Some(Self::from_syntax_node(db, node))
35484        } else {
35485            None
35486        }
35487    }
35488    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35489        self.node
35490    }
35491    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35492        TerminalLParenPtr(self.node.stable_ptr(db))
35493    }
35494}
35495#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35496pub struct TokenLT<'db> {
35497    node: SyntaxNode<'db>,
35498}
35499impl<'db> Token<'db> for TokenLT<'db> {
35500    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35501        TokenLTGreen(
35502            GreenNode { kind: SyntaxKind::TokenLT, details: GreenNodeDetails::Token(text) }
35503                .intern(db),
35504        )
35505    }
35506    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35507        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35508    }
35509}
35510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35511pub struct TokenLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35512impl<'db> TypedStablePtr<'db> for TokenLTPtr<'db> {
35513    type SyntaxNode = TokenLT<'db>;
35514    fn untyped(self) -> SyntaxStablePtrId<'db> {
35515        self.0
35516    }
35517    fn lookup(&self, db: &'db dyn Database) -> TokenLT<'db> {
35518        TokenLT::from_syntax_node(db, self.0.lookup(db))
35519    }
35520}
35521impl<'db> From<TokenLTPtr<'db>> for SyntaxStablePtrId<'db> {
35522    fn from(ptr: TokenLTPtr<'db>) -> Self {
35523        ptr.untyped()
35524    }
35525}
35526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35527pub struct TokenLTGreen<'db>(pub GreenId<'db>);
35528impl<'db> TokenLTGreen<'db> {
35529    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35530        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35531    }
35532}
35533impl<'db> TypedSyntaxNode<'db> for TokenLT<'db> {
35534    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
35535    type StablePtr = TokenLTPtr<'db>;
35536    type Green = TokenLTGreen<'db>;
35537    fn missing(db: &'db dyn Database) -> Self::Green {
35538        TokenLTGreen(
35539            GreenNode {
35540                kind: SyntaxKind::TokenMissing,
35541                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35542            }
35543            .intern(db),
35544        )
35545    }
35546    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35547        match node.long(db).green.long(db).details {
35548            GreenNodeDetails::Token(_) => Self { node },
35549            GreenNodeDetails::Node { .. } => {
35550                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
35551            }
35552        }
35553    }
35554    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35555        match node.long(db).green.long(db).details {
35556            GreenNodeDetails::Token(_) => Some(Self { node }),
35557            GreenNodeDetails::Node { .. } => None,
35558        }
35559    }
35560    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35561        self.node
35562    }
35563    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35564        TokenLTPtr(self.node.stable_ptr(db))
35565    }
35566}
35567#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35568pub struct TerminalLT<'db> {
35569    node: SyntaxNode<'db>,
35570}
35571impl<'db> Terminal<'db> for TerminalLT<'db> {
35572    const KIND: SyntaxKind = SyntaxKind::TerminalLT;
35573    type TokenType = TokenLT<'db>;
35574    fn new_green(
35575        db: &'db dyn Database,
35576        leading_trivia: TriviaGreen<'db>,
35577        token: <<TerminalLT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35578        trailing_trivia: TriviaGreen<'db>,
35579    ) -> Self::Green {
35580        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35581        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35582        TerminalLTGreen(
35583            GreenNode {
35584                kind: SyntaxKind::TerminalLT,
35585                details: GreenNodeDetails::Node { children: children.into(), width },
35586            }
35587            .intern(db),
35588        )
35589    }
35590    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35591        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35592        else {
35593            unreachable!("Expected a node, not a token");
35594        };
35595        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35596    }
35597}
35598impl<'db> TerminalLT<'db> {
35599    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35600        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35601    }
35602    pub fn token(&self, db: &'db dyn Database) -> TokenLT<'db> {
35603        TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
35604    }
35605    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35606        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35607    }
35608}
35609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35610pub struct TerminalLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35611impl<'db> TerminalLTPtr<'db> {}
35612impl<'db> TypedStablePtr<'db> for TerminalLTPtr<'db> {
35613    type SyntaxNode = TerminalLT<'db>;
35614    fn untyped(self) -> SyntaxStablePtrId<'db> {
35615        self.0
35616    }
35617    fn lookup(&self, db: &'db dyn Database) -> TerminalLT<'db> {
35618        TerminalLT::from_syntax_node(db, self.0.lookup(db))
35619    }
35620}
35621impl<'db> From<TerminalLTPtr<'db>> for SyntaxStablePtrId<'db> {
35622    fn from(ptr: TerminalLTPtr<'db>) -> Self {
35623        ptr.untyped()
35624    }
35625}
35626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35627pub struct TerminalLTGreen<'db>(pub GreenId<'db>);
35628impl<'db> TypedSyntaxNode<'db> for TerminalLT<'db> {
35629    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
35630    type StablePtr = TerminalLTPtr<'db>;
35631    type Green = TerminalLTGreen<'db>;
35632    fn missing(db: &'db dyn Database) -> Self::Green {
35633        TerminalLTGreen(
35634            GreenNode {
35635                kind: SyntaxKind::TerminalLT,
35636                details: GreenNodeDetails::Node {
35637                    children: [
35638                        Trivia::missing(db).0,
35639                        TokenLT::missing(db).0,
35640                        Trivia::missing(db).0,
35641                    ]
35642                    .into(),
35643                    width: TextWidth::default(),
35644                },
35645            }
35646            .intern(db),
35647        )
35648    }
35649    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35650        let kind = node.kind(db);
35651        assert_eq!(
35652            kind,
35653            SyntaxKind::TerminalLT,
35654            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35655            kind,
35656            SyntaxKind::TerminalLT
35657        );
35658        Self { node }
35659    }
35660    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35661        let kind = node.kind(db);
35662        if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
35663    }
35664    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35665        self.node
35666    }
35667    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35668        TerminalLTPtr(self.node.stable_ptr(db))
35669    }
35670}
35671#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35672pub struct TokenMatchArrow<'db> {
35673    node: SyntaxNode<'db>,
35674}
35675impl<'db> Token<'db> for TokenMatchArrow<'db> {
35676    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35677        TokenMatchArrowGreen(
35678            GreenNode { kind: SyntaxKind::TokenMatchArrow, details: GreenNodeDetails::Token(text) }
35679                .intern(db),
35680        )
35681    }
35682    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35683        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35684    }
35685}
35686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35687pub struct TokenMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35688impl<'db> TypedStablePtr<'db> for TokenMatchArrowPtr<'db> {
35689    type SyntaxNode = TokenMatchArrow<'db>;
35690    fn untyped(self) -> SyntaxStablePtrId<'db> {
35691        self.0
35692    }
35693    fn lookup(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35694        TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
35695    }
35696}
35697impl<'db> From<TokenMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35698    fn from(ptr: TokenMatchArrowPtr<'db>) -> Self {
35699        ptr.untyped()
35700    }
35701}
35702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35703pub struct TokenMatchArrowGreen<'db>(pub GreenId<'db>);
35704impl<'db> TokenMatchArrowGreen<'db> {
35705    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35706        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35707    }
35708}
35709impl<'db> TypedSyntaxNode<'db> for TokenMatchArrow<'db> {
35710    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
35711    type StablePtr = TokenMatchArrowPtr<'db>;
35712    type Green = TokenMatchArrowGreen<'db>;
35713    fn missing(db: &'db dyn Database) -> Self::Green {
35714        TokenMatchArrowGreen(
35715            GreenNode {
35716                kind: SyntaxKind::TokenMissing,
35717                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35718            }
35719            .intern(db),
35720        )
35721    }
35722    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35723        match node.long(db).green.long(db).details {
35724            GreenNodeDetails::Token(_) => Self { node },
35725            GreenNodeDetails::Node { .. } => {
35726                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
35727            }
35728        }
35729    }
35730    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35731        match node.long(db).green.long(db).details {
35732            GreenNodeDetails::Token(_) => Some(Self { node }),
35733            GreenNodeDetails::Node { .. } => None,
35734        }
35735    }
35736    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35737        self.node
35738    }
35739    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35740        TokenMatchArrowPtr(self.node.stable_ptr(db))
35741    }
35742}
35743#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35744pub struct TerminalMatchArrow<'db> {
35745    node: SyntaxNode<'db>,
35746}
35747impl<'db> Terminal<'db> for TerminalMatchArrow<'db> {
35748    const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
35749    type TokenType = TokenMatchArrow<'db>;
35750    fn new_green(
35751        db: &'db dyn Database,
35752        leading_trivia: TriviaGreen<'db>,
35753        token: <<TerminalMatchArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35754        trailing_trivia: TriviaGreen<'db>,
35755    ) -> Self::Green {
35756        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35757        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35758        TerminalMatchArrowGreen(
35759            GreenNode {
35760                kind: SyntaxKind::TerminalMatchArrow,
35761                details: GreenNodeDetails::Node { children: children.into(), width },
35762            }
35763            .intern(db),
35764        )
35765    }
35766    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35767        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35768        else {
35769            unreachable!("Expected a node, not a token");
35770        };
35771        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35772    }
35773}
35774impl<'db> TerminalMatchArrow<'db> {
35775    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35776        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35777    }
35778    pub fn token(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35779        TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
35780    }
35781    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35782        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35783    }
35784}
35785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35786pub struct TerminalMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35787impl<'db> TerminalMatchArrowPtr<'db> {}
35788impl<'db> TypedStablePtr<'db> for TerminalMatchArrowPtr<'db> {
35789    type SyntaxNode = TerminalMatchArrow<'db>;
35790    fn untyped(self) -> SyntaxStablePtrId<'db> {
35791        self.0
35792    }
35793    fn lookup(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
35794        TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
35795    }
35796}
35797impl<'db> From<TerminalMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35798    fn from(ptr: TerminalMatchArrowPtr<'db>) -> Self {
35799        ptr.untyped()
35800    }
35801}
35802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35803pub struct TerminalMatchArrowGreen<'db>(pub GreenId<'db>);
35804impl<'db> TypedSyntaxNode<'db> for TerminalMatchArrow<'db> {
35805    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
35806    type StablePtr = TerminalMatchArrowPtr<'db>;
35807    type Green = TerminalMatchArrowGreen<'db>;
35808    fn missing(db: &'db dyn Database) -> Self::Green {
35809        TerminalMatchArrowGreen(
35810            GreenNode {
35811                kind: SyntaxKind::TerminalMatchArrow,
35812                details: GreenNodeDetails::Node {
35813                    children: [
35814                        Trivia::missing(db).0,
35815                        TokenMatchArrow::missing(db).0,
35816                        Trivia::missing(db).0,
35817                    ]
35818                    .into(),
35819                    width: TextWidth::default(),
35820                },
35821            }
35822            .intern(db),
35823        )
35824    }
35825    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35826        let kind = node.kind(db);
35827        assert_eq!(
35828            kind,
35829            SyntaxKind::TerminalMatchArrow,
35830            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35831            kind,
35832            SyntaxKind::TerminalMatchArrow
35833        );
35834        Self { node }
35835    }
35836    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35837        let kind = node.kind(db);
35838        if kind == SyntaxKind::TerminalMatchArrow {
35839            Some(Self::from_syntax_node(db, node))
35840        } else {
35841            None
35842        }
35843    }
35844    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35845        self.node
35846    }
35847    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35848        TerminalMatchArrowPtr(self.node.stable_ptr(db))
35849    }
35850}
35851#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35852pub struct TokenMinus<'db> {
35853    node: SyntaxNode<'db>,
35854}
35855impl<'db> Token<'db> for TokenMinus<'db> {
35856    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35857        TokenMinusGreen(
35858            GreenNode { kind: SyntaxKind::TokenMinus, details: GreenNodeDetails::Token(text) }
35859                .intern(db),
35860        )
35861    }
35862    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35863        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
35864    }
35865}
35866#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35867pub struct TokenMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35868impl<'db> TypedStablePtr<'db> for TokenMinusPtr<'db> {
35869    type SyntaxNode = TokenMinus<'db>;
35870    fn untyped(self) -> SyntaxStablePtrId<'db> {
35871        self.0
35872    }
35873    fn lookup(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35874        TokenMinus::from_syntax_node(db, self.0.lookup(db))
35875    }
35876}
35877impl<'db> From<TokenMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35878    fn from(ptr: TokenMinusPtr<'db>) -> Self {
35879        ptr.untyped()
35880    }
35881}
35882#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35883pub struct TokenMinusGreen<'db>(pub GreenId<'db>);
35884impl<'db> TokenMinusGreen<'db> {
35885    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35886        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35887    }
35888}
35889impl<'db> TypedSyntaxNode<'db> for TokenMinus<'db> {
35890    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
35891    type StablePtr = TokenMinusPtr<'db>;
35892    type Green = TokenMinusGreen<'db>;
35893    fn missing(db: &'db dyn Database) -> Self::Green {
35894        TokenMinusGreen(
35895            GreenNode {
35896                kind: SyntaxKind::TokenMissing,
35897                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35898            }
35899            .intern(db),
35900        )
35901    }
35902    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35903        match node.long(db).green.long(db).details {
35904            GreenNodeDetails::Token(_) => Self { node },
35905            GreenNodeDetails::Node { .. } => {
35906                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
35907            }
35908        }
35909    }
35910    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35911        match node.long(db).green.long(db).details {
35912            GreenNodeDetails::Token(_) => Some(Self { node }),
35913            GreenNodeDetails::Node { .. } => None,
35914        }
35915    }
35916    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35917        self.node
35918    }
35919    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35920        TokenMinusPtr(self.node.stable_ptr(db))
35921    }
35922}
35923#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35924pub struct TerminalMinus<'db> {
35925    node: SyntaxNode<'db>,
35926}
35927impl<'db> Terminal<'db> for TerminalMinus<'db> {
35928    const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
35929    type TokenType = TokenMinus<'db>;
35930    fn new_green(
35931        db: &'db dyn Database,
35932        leading_trivia: TriviaGreen<'db>,
35933        token: <<TerminalMinus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35934        trailing_trivia: TriviaGreen<'db>,
35935    ) -> Self::Green {
35936        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35937        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35938        TerminalMinusGreen(
35939            GreenNode {
35940                kind: SyntaxKind::TerminalMinus,
35941                details: GreenNodeDetails::Node { children: children.into(), width },
35942            }
35943            .intern(db),
35944        )
35945    }
35946    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35947        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
35948        else {
35949            unreachable!("Expected a node, not a token");
35950        };
35951        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35952    }
35953}
35954impl<'db> TerminalMinus<'db> {
35955    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35956        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35957    }
35958    pub fn token(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35959        TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
35960    }
35961    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35962        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35963    }
35964}
35965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35966pub struct TerminalMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35967impl<'db> TerminalMinusPtr<'db> {}
35968impl<'db> TypedStablePtr<'db> for TerminalMinusPtr<'db> {
35969    type SyntaxNode = TerminalMinus<'db>;
35970    fn untyped(self) -> SyntaxStablePtrId<'db> {
35971        self.0
35972    }
35973    fn lookup(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
35974        TerminalMinus::from_syntax_node(db, self.0.lookup(db))
35975    }
35976}
35977impl<'db> From<TerminalMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35978    fn from(ptr: TerminalMinusPtr<'db>) -> Self {
35979        ptr.untyped()
35980    }
35981}
35982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35983pub struct TerminalMinusGreen<'db>(pub GreenId<'db>);
35984impl<'db> TypedSyntaxNode<'db> for TerminalMinus<'db> {
35985    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
35986    type StablePtr = TerminalMinusPtr<'db>;
35987    type Green = TerminalMinusGreen<'db>;
35988    fn missing(db: &'db dyn Database) -> Self::Green {
35989        TerminalMinusGreen(
35990            GreenNode {
35991                kind: SyntaxKind::TerminalMinus,
35992                details: GreenNodeDetails::Node {
35993                    children: [
35994                        Trivia::missing(db).0,
35995                        TokenMinus::missing(db).0,
35996                        Trivia::missing(db).0,
35997                    ]
35998                    .into(),
35999                    width: TextWidth::default(),
36000                },
36001            }
36002            .intern(db),
36003        )
36004    }
36005    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36006        let kind = node.kind(db);
36007        assert_eq!(
36008            kind,
36009            SyntaxKind::TerminalMinus,
36010            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36011            kind,
36012            SyntaxKind::TerminalMinus
36013        );
36014        Self { node }
36015    }
36016    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36017        let kind = node.kind(db);
36018        if kind == SyntaxKind::TerminalMinus {
36019            Some(Self::from_syntax_node(db, node))
36020        } else {
36021            None
36022        }
36023    }
36024    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36025        self.node
36026    }
36027    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36028        TerminalMinusPtr(self.node.stable_ptr(db))
36029    }
36030}
36031#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36032pub struct TokenMinusEq<'db> {
36033    node: SyntaxNode<'db>,
36034}
36035impl<'db> Token<'db> for TokenMinusEq<'db> {
36036    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36037        TokenMinusEqGreen(
36038            GreenNode { kind: SyntaxKind::TokenMinusEq, details: GreenNodeDetails::Token(text) }
36039                .intern(db),
36040        )
36041    }
36042    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36043        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36044    }
36045}
36046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36047pub struct TokenMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36048impl<'db> TypedStablePtr<'db> for TokenMinusEqPtr<'db> {
36049    type SyntaxNode = TokenMinusEq<'db>;
36050    fn untyped(self) -> SyntaxStablePtrId<'db> {
36051        self.0
36052    }
36053    fn lookup(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
36054        TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
36055    }
36056}
36057impl<'db> From<TokenMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
36058    fn from(ptr: TokenMinusEqPtr<'db>) -> Self {
36059        ptr.untyped()
36060    }
36061}
36062#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36063pub struct TokenMinusEqGreen<'db>(pub GreenId<'db>);
36064impl<'db> TokenMinusEqGreen<'db> {
36065    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36066        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36067    }
36068}
36069impl<'db> TypedSyntaxNode<'db> for TokenMinusEq<'db> {
36070    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
36071    type StablePtr = TokenMinusEqPtr<'db>;
36072    type Green = TokenMinusEqGreen<'db>;
36073    fn missing(db: &'db dyn Database) -> Self::Green {
36074        TokenMinusEqGreen(
36075            GreenNode {
36076                kind: SyntaxKind::TokenMissing,
36077                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36078            }
36079            .intern(db),
36080        )
36081    }
36082    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36083        match node.long(db).green.long(db).details {
36084            GreenNodeDetails::Token(_) => Self { node },
36085            GreenNodeDetails::Node { .. } => {
36086                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
36087            }
36088        }
36089    }
36090    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36091        match node.long(db).green.long(db).details {
36092            GreenNodeDetails::Token(_) => Some(Self { node }),
36093            GreenNodeDetails::Node { .. } => None,
36094        }
36095    }
36096    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36097        self.node
36098    }
36099    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36100        TokenMinusEqPtr(self.node.stable_ptr(db))
36101    }
36102}
36103#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36104pub struct TerminalMinusEq<'db> {
36105    node: SyntaxNode<'db>,
36106}
36107impl<'db> Terminal<'db> for TerminalMinusEq<'db> {
36108    const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
36109    type TokenType = TokenMinusEq<'db>;
36110    fn new_green(
36111        db: &'db dyn Database,
36112        leading_trivia: TriviaGreen<'db>,
36113        token: <<TerminalMinusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36114        trailing_trivia: TriviaGreen<'db>,
36115    ) -> Self::Green {
36116        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36117        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36118        TerminalMinusEqGreen(
36119            GreenNode {
36120                kind: SyntaxKind::TerminalMinusEq,
36121                details: GreenNodeDetails::Node { children: children.into(), width },
36122            }
36123            .intern(db),
36124        )
36125    }
36126    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36127        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36128        else {
36129            unreachable!("Expected a node, not a token");
36130        };
36131        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36132    }
36133}
36134impl<'db> TerminalMinusEq<'db> {
36135    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36136        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36137    }
36138    pub fn token(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
36139        TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
36140    }
36141    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36142        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36143    }
36144}
36145#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36146pub struct TerminalMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36147impl<'db> TerminalMinusEqPtr<'db> {}
36148impl<'db> TypedStablePtr<'db> for TerminalMinusEqPtr<'db> {
36149    type SyntaxNode = TerminalMinusEq<'db>;
36150    fn untyped(self) -> SyntaxStablePtrId<'db> {
36151        self.0
36152    }
36153    fn lookup(&self, db: &'db dyn Database) -> TerminalMinusEq<'db> {
36154        TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
36155    }
36156}
36157impl<'db> From<TerminalMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
36158    fn from(ptr: TerminalMinusEqPtr<'db>) -> Self {
36159        ptr.untyped()
36160    }
36161}
36162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36163pub struct TerminalMinusEqGreen<'db>(pub GreenId<'db>);
36164impl<'db> TypedSyntaxNode<'db> for TerminalMinusEq<'db> {
36165    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
36166    type StablePtr = TerminalMinusEqPtr<'db>;
36167    type Green = TerminalMinusEqGreen<'db>;
36168    fn missing(db: &'db dyn Database) -> Self::Green {
36169        TerminalMinusEqGreen(
36170            GreenNode {
36171                kind: SyntaxKind::TerminalMinusEq,
36172                details: GreenNodeDetails::Node {
36173                    children: [
36174                        Trivia::missing(db).0,
36175                        TokenMinusEq::missing(db).0,
36176                        Trivia::missing(db).0,
36177                    ]
36178                    .into(),
36179                    width: TextWidth::default(),
36180                },
36181            }
36182            .intern(db),
36183        )
36184    }
36185    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36186        let kind = node.kind(db);
36187        assert_eq!(
36188            kind,
36189            SyntaxKind::TerminalMinusEq,
36190            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36191            kind,
36192            SyntaxKind::TerminalMinusEq
36193        );
36194        Self { node }
36195    }
36196    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36197        let kind = node.kind(db);
36198        if kind == SyntaxKind::TerminalMinusEq {
36199            Some(Self::from_syntax_node(db, node))
36200        } else {
36201            None
36202        }
36203    }
36204    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36205        self.node
36206    }
36207    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36208        TerminalMinusEqPtr(self.node.stable_ptr(db))
36209    }
36210}
36211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36212pub struct TokenMod<'db> {
36213    node: SyntaxNode<'db>,
36214}
36215impl<'db> Token<'db> for TokenMod<'db> {
36216    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36217        TokenModGreen(
36218            GreenNode { kind: SyntaxKind::TokenMod, details: GreenNodeDetails::Token(text) }
36219                .intern(db),
36220        )
36221    }
36222    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36223        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36224    }
36225}
36226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36227pub struct TokenModPtr<'db>(pub SyntaxStablePtrId<'db>);
36228impl<'db> TypedStablePtr<'db> for TokenModPtr<'db> {
36229    type SyntaxNode = TokenMod<'db>;
36230    fn untyped(self) -> SyntaxStablePtrId<'db> {
36231        self.0
36232    }
36233    fn lookup(&self, db: &'db dyn Database) -> TokenMod<'db> {
36234        TokenMod::from_syntax_node(db, self.0.lookup(db))
36235    }
36236}
36237impl<'db> From<TokenModPtr<'db>> for SyntaxStablePtrId<'db> {
36238    fn from(ptr: TokenModPtr<'db>) -> Self {
36239        ptr.untyped()
36240    }
36241}
36242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36243pub struct TokenModGreen<'db>(pub GreenId<'db>);
36244impl<'db> TokenModGreen<'db> {
36245    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36246        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36247    }
36248}
36249impl<'db> TypedSyntaxNode<'db> for TokenMod<'db> {
36250    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
36251    type StablePtr = TokenModPtr<'db>;
36252    type Green = TokenModGreen<'db>;
36253    fn missing(db: &'db dyn Database) -> Self::Green {
36254        TokenModGreen(
36255            GreenNode {
36256                kind: SyntaxKind::TokenMissing,
36257                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36258            }
36259            .intern(db),
36260        )
36261    }
36262    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36263        match node.long(db).green.long(db).details {
36264            GreenNodeDetails::Token(_) => Self { node },
36265            GreenNodeDetails::Node { .. } => {
36266                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
36267            }
36268        }
36269    }
36270    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36271        match node.long(db).green.long(db).details {
36272            GreenNodeDetails::Token(_) => Some(Self { node }),
36273            GreenNodeDetails::Node { .. } => None,
36274        }
36275    }
36276    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36277        self.node
36278    }
36279    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36280        TokenModPtr(self.node.stable_ptr(db))
36281    }
36282}
36283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36284pub struct TerminalMod<'db> {
36285    node: SyntaxNode<'db>,
36286}
36287impl<'db> Terminal<'db> for TerminalMod<'db> {
36288    const KIND: SyntaxKind = SyntaxKind::TerminalMod;
36289    type TokenType = TokenMod<'db>;
36290    fn new_green(
36291        db: &'db dyn Database,
36292        leading_trivia: TriviaGreen<'db>,
36293        token: <<TerminalMod<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36294        trailing_trivia: TriviaGreen<'db>,
36295    ) -> Self::Green {
36296        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36297        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36298        TerminalModGreen(
36299            GreenNode {
36300                kind: SyntaxKind::TerminalMod,
36301                details: GreenNodeDetails::Node { children: children.into(), width },
36302            }
36303            .intern(db),
36304        )
36305    }
36306    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36307        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36308        else {
36309            unreachable!("Expected a node, not a token");
36310        };
36311        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36312    }
36313}
36314impl<'db> TerminalMod<'db> {
36315    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36316        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36317    }
36318    pub fn token(&self, db: &'db dyn Database) -> TokenMod<'db> {
36319        TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
36320    }
36321    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36322        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36323    }
36324}
36325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36326pub struct TerminalModPtr<'db>(pub SyntaxStablePtrId<'db>);
36327impl<'db> TerminalModPtr<'db> {}
36328impl<'db> TypedStablePtr<'db> for TerminalModPtr<'db> {
36329    type SyntaxNode = TerminalMod<'db>;
36330    fn untyped(self) -> SyntaxStablePtrId<'db> {
36331        self.0
36332    }
36333    fn lookup(&self, db: &'db dyn Database) -> TerminalMod<'db> {
36334        TerminalMod::from_syntax_node(db, self.0.lookup(db))
36335    }
36336}
36337impl<'db> From<TerminalModPtr<'db>> for SyntaxStablePtrId<'db> {
36338    fn from(ptr: TerminalModPtr<'db>) -> Self {
36339        ptr.untyped()
36340    }
36341}
36342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36343pub struct TerminalModGreen<'db>(pub GreenId<'db>);
36344impl<'db> TypedSyntaxNode<'db> for TerminalMod<'db> {
36345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
36346    type StablePtr = TerminalModPtr<'db>;
36347    type Green = TerminalModGreen<'db>;
36348    fn missing(db: &'db dyn Database) -> Self::Green {
36349        TerminalModGreen(
36350            GreenNode {
36351                kind: SyntaxKind::TerminalMod,
36352                details: GreenNodeDetails::Node {
36353                    children: [
36354                        Trivia::missing(db).0,
36355                        TokenMod::missing(db).0,
36356                        Trivia::missing(db).0,
36357                    ]
36358                    .into(),
36359                    width: TextWidth::default(),
36360                },
36361            }
36362            .intern(db),
36363        )
36364    }
36365    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36366        let kind = node.kind(db);
36367        assert_eq!(
36368            kind,
36369            SyntaxKind::TerminalMod,
36370            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36371            kind,
36372            SyntaxKind::TerminalMod
36373        );
36374        Self { node }
36375    }
36376    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36377        let kind = node.kind(db);
36378        if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
36379    }
36380    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36381        self.node
36382    }
36383    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36384        TerminalModPtr(self.node.stable_ptr(db))
36385    }
36386}
36387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36388pub struct TokenModEq<'db> {
36389    node: SyntaxNode<'db>,
36390}
36391impl<'db> Token<'db> for TokenModEq<'db> {
36392    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36393        TokenModEqGreen(
36394            GreenNode { kind: SyntaxKind::TokenModEq, details: GreenNodeDetails::Token(text) }
36395                .intern(db),
36396        )
36397    }
36398    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36399        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36400    }
36401}
36402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36403pub struct TokenModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36404impl<'db> TypedStablePtr<'db> for TokenModEqPtr<'db> {
36405    type SyntaxNode = TokenModEq<'db>;
36406    fn untyped(self) -> SyntaxStablePtrId<'db> {
36407        self.0
36408    }
36409    fn lookup(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36410        TokenModEq::from_syntax_node(db, self.0.lookup(db))
36411    }
36412}
36413impl<'db> From<TokenModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36414    fn from(ptr: TokenModEqPtr<'db>) -> Self {
36415        ptr.untyped()
36416    }
36417}
36418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36419pub struct TokenModEqGreen<'db>(pub GreenId<'db>);
36420impl<'db> TokenModEqGreen<'db> {
36421    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36422        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36423    }
36424}
36425impl<'db> TypedSyntaxNode<'db> for TokenModEq<'db> {
36426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
36427    type StablePtr = TokenModEqPtr<'db>;
36428    type Green = TokenModEqGreen<'db>;
36429    fn missing(db: &'db dyn Database) -> Self::Green {
36430        TokenModEqGreen(
36431            GreenNode {
36432                kind: SyntaxKind::TokenMissing,
36433                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36434            }
36435            .intern(db),
36436        )
36437    }
36438    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36439        match node.long(db).green.long(db).details {
36440            GreenNodeDetails::Token(_) => Self { node },
36441            GreenNodeDetails::Node { .. } => {
36442                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
36443            }
36444        }
36445    }
36446    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36447        match node.long(db).green.long(db).details {
36448            GreenNodeDetails::Token(_) => Some(Self { node }),
36449            GreenNodeDetails::Node { .. } => None,
36450        }
36451    }
36452    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36453        self.node
36454    }
36455    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36456        TokenModEqPtr(self.node.stable_ptr(db))
36457    }
36458}
36459#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36460pub struct TerminalModEq<'db> {
36461    node: SyntaxNode<'db>,
36462}
36463impl<'db> Terminal<'db> for TerminalModEq<'db> {
36464    const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36465    type TokenType = TokenModEq<'db>;
36466    fn new_green(
36467        db: &'db dyn Database,
36468        leading_trivia: TriviaGreen<'db>,
36469        token: <<TerminalModEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36470        trailing_trivia: TriviaGreen<'db>,
36471    ) -> Self::Green {
36472        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36473        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36474        TerminalModEqGreen(
36475            GreenNode {
36476                kind: SyntaxKind::TerminalModEq,
36477                details: GreenNodeDetails::Node { children: children.into(), width },
36478            }
36479            .intern(db),
36480        )
36481    }
36482    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36483        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36484        else {
36485            unreachable!("Expected a node, not a token");
36486        };
36487        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36488    }
36489}
36490impl<'db> TerminalModEq<'db> {
36491    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36492        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36493    }
36494    pub fn token(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36495        TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
36496    }
36497    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36498        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36499    }
36500}
36501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36502pub struct TerminalModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36503impl<'db> TerminalModEqPtr<'db> {}
36504impl<'db> TypedStablePtr<'db> for TerminalModEqPtr<'db> {
36505    type SyntaxNode = TerminalModEq<'db>;
36506    fn untyped(self) -> SyntaxStablePtrId<'db> {
36507        self.0
36508    }
36509    fn lookup(&self, db: &'db dyn Database) -> TerminalModEq<'db> {
36510        TerminalModEq::from_syntax_node(db, self.0.lookup(db))
36511    }
36512}
36513impl<'db> From<TerminalModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36514    fn from(ptr: TerminalModEqPtr<'db>) -> Self {
36515        ptr.untyped()
36516    }
36517}
36518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36519pub struct TerminalModEqGreen<'db>(pub GreenId<'db>);
36520impl<'db> TypedSyntaxNode<'db> for TerminalModEq<'db> {
36521    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
36522    type StablePtr = TerminalModEqPtr<'db>;
36523    type Green = TerminalModEqGreen<'db>;
36524    fn missing(db: &'db dyn Database) -> Self::Green {
36525        TerminalModEqGreen(
36526            GreenNode {
36527                kind: SyntaxKind::TerminalModEq,
36528                details: GreenNodeDetails::Node {
36529                    children: [
36530                        Trivia::missing(db).0,
36531                        TokenModEq::missing(db).0,
36532                        Trivia::missing(db).0,
36533                    ]
36534                    .into(),
36535                    width: TextWidth::default(),
36536                },
36537            }
36538            .intern(db),
36539        )
36540    }
36541    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36542        let kind = node.kind(db);
36543        assert_eq!(
36544            kind,
36545            SyntaxKind::TerminalModEq,
36546            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36547            kind,
36548            SyntaxKind::TerminalModEq
36549        );
36550        Self { node }
36551    }
36552    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36553        let kind = node.kind(db);
36554        if kind == SyntaxKind::TerminalModEq {
36555            Some(Self::from_syntax_node(db, node))
36556        } else {
36557            None
36558        }
36559    }
36560    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36561        self.node
36562    }
36563    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36564        TerminalModEqPtr(self.node.stable_ptr(db))
36565    }
36566}
36567#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36568pub struct TokenMul<'db> {
36569    node: SyntaxNode<'db>,
36570}
36571impl<'db> Token<'db> for TokenMul<'db> {
36572    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36573        TokenMulGreen(
36574            GreenNode { kind: SyntaxKind::TokenMul, details: GreenNodeDetails::Token(text) }
36575                .intern(db),
36576        )
36577    }
36578    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36579        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36580    }
36581}
36582#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36583pub struct TokenMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36584impl<'db> TypedStablePtr<'db> for TokenMulPtr<'db> {
36585    type SyntaxNode = TokenMul<'db>;
36586    fn untyped(self) -> SyntaxStablePtrId<'db> {
36587        self.0
36588    }
36589    fn lookup(&self, db: &'db dyn Database) -> TokenMul<'db> {
36590        TokenMul::from_syntax_node(db, self.0.lookup(db))
36591    }
36592}
36593impl<'db> From<TokenMulPtr<'db>> for SyntaxStablePtrId<'db> {
36594    fn from(ptr: TokenMulPtr<'db>) -> Self {
36595        ptr.untyped()
36596    }
36597}
36598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36599pub struct TokenMulGreen<'db>(pub GreenId<'db>);
36600impl<'db> TokenMulGreen<'db> {
36601    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36602        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36603    }
36604}
36605impl<'db> TypedSyntaxNode<'db> for TokenMul<'db> {
36606    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
36607    type StablePtr = TokenMulPtr<'db>;
36608    type Green = TokenMulGreen<'db>;
36609    fn missing(db: &'db dyn Database) -> Self::Green {
36610        TokenMulGreen(
36611            GreenNode {
36612                kind: SyntaxKind::TokenMissing,
36613                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36614            }
36615            .intern(db),
36616        )
36617    }
36618    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36619        match node.long(db).green.long(db).details {
36620            GreenNodeDetails::Token(_) => Self { node },
36621            GreenNodeDetails::Node { .. } => {
36622                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
36623            }
36624        }
36625    }
36626    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36627        match node.long(db).green.long(db).details {
36628            GreenNodeDetails::Token(_) => Some(Self { node }),
36629            GreenNodeDetails::Node { .. } => None,
36630        }
36631    }
36632    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36633        self.node
36634    }
36635    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36636        TokenMulPtr(self.node.stable_ptr(db))
36637    }
36638}
36639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36640pub struct TerminalMul<'db> {
36641    node: SyntaxNode<'db>,
36642}
36643impl<'db> Terminal<'db> for TerminalMul<'db> {
36644    const KIND: SyntaxKind = SyntaxKind::TerminalMul;
36645    type TokenType = TokenMul<'db>;
36646    fn new_green(
36647        db: &'db dyn Database,
36648        leading_trivia: TriviaGreen<'db>,
36649        token: <<TerminalMul<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36650        trailing_trivia: TriviaGreen<'db>,
36651    ) -> Self::Green {
36652        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36653        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36654        TerminalMulGreen(
36655            GreenNode {
36656                kind: SyntaxKind::TerminalMul,
36657                details: GreenNodeDetails::Node { children: children.into(), width },
36658            }
36659            .intern(db),
36660        )
36661    }
36662    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36663        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36664        else {
36665            unreachable!("Expected a node, not a token");
36666        };
36667        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36668    }
36669}
36670impl<'db> TerminalMul<'db> {
36671    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36672        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36673    }
36674    pub fn token(&self, db: &'db dyn Database) -> TokenMul<'db> {
36675        TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
36676    }
36677    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36678        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36679    }
36680}
36681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36682pub struct TerminalMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36683impl<'db> TerminalMulPtr<'db> {}
36684impl<'db> TypedStablePtr<'db> for TerminalMulPtr<'db> {
36685    type SyntaxNode = TerminalMul<'db>;
36686    fn untyped(self) -> SyntaxStablePtrId<'db> {
36687        self.0
36688    }
36689    fn lookup(&self, db: &'db dyn Database) -> TerminalMul<'db> {
36690        TerminalMul::from_syntax_node(db, self.0.lookup(db))
36691    }
36692}
36693impl<'db> From<TerminalMulPtr<'db>> for SyntaxStablePtrId<'db> {
36694    fn from(ptr: TerminalMulPtr<'db>) -> Self {
36695        ptr.untyped()
36696    }
36697}
36698#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36699pub struct TerminalMulGreen<'db>(pub GreenId<'db>);
36700impl<'db> TypedSyntaxNode<'db> for TerminalMul<'db> {
36701    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
36702    type StablePtr = TerminalMulPtr<'db>;
36703    type Green = TerminalMulGreen<'db>;
36704    fn missing(db: &'db dyn Database) -> Self::Green {
36705        TerminalMulGreen(
36706            GreenNode {
36707                kind: SyntaxKind::TerminalMul,
36708                details: GreenNodeDetails::Node {
36709                    children: [
36710                        Trivia::missing(db).0,
36711                        TokenMul::missing(db).0,
36712                        Trivia::missing(db).0,
36713                    ]
36714                    .into(),
36715                    width: TextWidth::default(),
36716                },
36717            }
36718            .intern(db),
36719        )
36720    }
36721    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36722        let kind = node.kind(db);
36723        assert_eq!(
36724            kind,
36725            SyntaxKind::TerminalMul,
36726            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36727            kind,
36728            SyntaxKind::TerminalMul
36729        );
36730        Self { node }
36731    }
36732    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36733        let kind = node.kind(db);
36734        if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
36735    }
36736    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36737        self.node
36738    }
36739    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36740        TerminalMulPtr(self.node.stable_ptr(db))
36741    }
36742}
36743#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36744pub struct TokenMulEq<'db> {
36745    node: SyntaxNode<'db>,
36746}
36747impl<'db> Token<'db> for TokenMulEq<'db> {
36748    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36749        TokenMulEqGreen(
36750            GreenNode { kind: SyntaxKind::TokenMulEq, details: GreenNodeDetails::Token(text) }
36751                .intern(db),
36752        )
36753    }
36754    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36755        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36756    }
36757}
36758#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36759pub struct TokenMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36760impl<'db> TypedStablePtr<'db> for TokenMulEqPtr<'db> {
36761    type SyntaxNode = TokenMulEq<'db>;
36762    fn untyped(self) -> SyntaxStablePtrId<'db> {
36763        self.0
36764    }
36765    fn lookup(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36766        TokenMulEq::from_syntax_node(db, self.0.lookup(db))
36767    }
36768}
36769impl<'db> From<TokenMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36770    fn from(ptr: TokenMulEqPtr<'db>) -> Self {
36771        ptr.untyped()
36772    }
36773}
36774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36775pub struct TokenMulEqGreen<'db>(pub GreenId<'db>);
36776impl<'db> TokenMulEqGreen<'db> {
36777    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36778        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36779    }
36780}
36781impl<'db> TypedSyntaxNode<'db> for TokenMulEq<'db> {
36782    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
36783    type StablePtr = TokenMulEqPtr<'db>;
36784    type Green = TokenMulEqGreen<'db>;
36785    fn missing(db: &'db dyn Database) -> Self::Green {
36786        TokenMulEqGreen(
36787            GreenNode {
36788                kind: SyntaxKind::TokenMissing,
36789                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36790            }
36791            .intern(db),
36792        )
36793    }
36794    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36795        match node.long(db).green.long(db).details {
36796            GreenNodeDetails::Token(_) => Self { node },
36797            GreenNodeDetails::Node { .. } => {
36798                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
36799            }
36800        }
36801    }
36802    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36803        match node.long(db).green.long(db).details {
36804            GreenNodeDetails::Token(_) => Some(Self { node }),
36805            GreenNodeDetails::Node { .. } => None,
36806        }
36807    }
36808    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36809        self.node
36810    }
36811    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36812        TokenMulEqPtr(self.node.stable_ptr(db))
36813    }
36814}
36815#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36816pub struct TerminalMulEq<'db> {
36817    node: SyntaxNode<'db>,
36818}
36819impl<'db> Terminal<'db> for TerminalMulEq<'db> {
36820    const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
36821    type TokenType = TokenMulEq<'db>;
36822    fn new_green(
36823        db: &'db dyn Database,
36824        leading_trivia: TriviaGreen<'db>,
36825        token: <<TerminalMulEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36826        trailing_trivia: TriviaGreen<'db>,
36827    ) -> Self::Green {
36828        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36829        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36830        TerminalMulEqGreen(
36831            GreenNode {
36832                kind: SyntaxKind::TerminalMulEq,
36833                details: GreenNodeDetails::Node { children: children.into(), width },
36834            }
36835            .intern(db),
36836        )
36837    }
36838    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36839        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
36840        else {
36841            unreachable!("Expected a node, not a token");
36842        };
36843        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36844    }
36845}
36846impl<'db> TerminalMulEq<'db> {
36847    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36848        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36849    }
36850    pub fn token(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36851        TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
36852    }
36853    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36854        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36855    }
36856}
36857#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36858pub struct TerminalMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36859impl<'db> TerminalMulEqPtr<'db> {}
36860impl<'db> TypedStablePtr<'db> for TerminalMulEqPtr<'db> {
36861    type SyntaxNode = TerminalMulEq<'db>;
36862    fn untyped(self) -> SyntaxStablePtrId<'db> {
36863        self.0
36864    }
36865    fn lookup(&self, db: &'db dyn Database) -> TerminalMulEq<'db> {
36866        TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
36867    }
36868}
36869impl<'db> From<TerminalMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36870    fn from(ptr: TerminalMulEqPtr<'db>) -> Self {
36871        ptr.untyped()
36872    }
36873}
36874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36875pub struct TerminalMulEqGreen<'db>(pub GreenId<'db>);
36876impl<'db> TypedSyntaxNode<'db> for TerminalMulEq<'db> {
36877    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
36878    type StablePtr = TerminalMulEqPtr<'db>;
36879    type Green = TerminalMulEqGreen<'db>;
36880    fn missing(db: &'db dyn Database) -> Self::Green {
36881        TerminalMulEqGreen(
36882            GreenNode {
36883                kind: SyntaxKind::TerminalMulEq,
36884                details: GreenNodeDetails::Node {
36885                    children: [
36886                        Trivia::missing(db).0,
36887                        TokenMulEq::missing(db).0,
36888                        Trivia::missing(db).0,
36889                    ]
36890                    .into(),
36891                    width: TextWidth::default(),
36892                },
36893            }
36894            .intern(db),
36895        )
36896    }
36897    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36898        let kind = node.kind(db);
36899        assert_eq!(
36900            kind,
36901            SyntaxKind::TerminalMulEq,
36902            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36903            kind,
36904            SyntaxKind::TerminalMulEq
36905        );
36906        Self { node }
36907    }
36908    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36909        let kind = node.kind(db);
36910        if kind == SyntaxKind::TerminalMulEq {
36911            Some(Self::from_syntax_node(db, node))
36912        } else {
36913            None
36914        }
36915    }
36916    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36917        self.node
36918    }
36919    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36920        TerminalMulEqPtr(self.node.stable_ptr(db))
36921    }
36922}
36923#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36924pub struct TokenNeq<'db> {
36925    node: SyntaxNode<'db>,
36926}
36927impl<'db> Token<'db> for TokenNeq<'db> {
36928    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36929        TokenNeqGreen(
36930            GreenNode { kind: SyntaxKind::TokenNeq, details: GreenNodeDetails::Token(text) }
36931                .intern(db),
36932        )
36933    }
36934    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36935        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
36936    }
36937}
36938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36939pub struct TokenNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36940impl<'db> TypedStablePtr<'db> for TokenNeqPtr<'db> {
36941    type SyntaxNode = TokenNeq<'db>;
36942    fn untyped(self) -> SyntaxStablePtrId<'db> {
36943        self.0
36944    }
36945    fn lookup(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36946        TokenNeq::from_syntax_node(db, self.0.lookup(db))
36947    }
36948}
36949impl<'db> From<TokenNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36950    fn from(ptr: TokenNeqPtr<'db>) -> Self {
36951        ptr.untyped()
36952    }
36953}
36954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36955pub struct TokenNeqGreen<'db>(pub GreenId<'db>);
36956impl<'db> TokenNeqGreen<'db> {
36957    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36958        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36959    }
36960}
36961impl<'db> TypedSyntaxNode<'db> for TokenNeq<'db> {
36962    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
36963    type StablePtr = TokenNeqPtr<'db>;
36964    type Green = TokenNeqGreen<'db>;
36965    fn missing(db: &'db dyn Database) -> Self::Green {
36966        TokenNeqGreen(
36967            GreenNode {
36968                kind: SyntaxKind::TokenMissing,
36969                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36970            }
36971            .intern(db),
36972        )
36973    }
36974    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36975        match node.long(db).green.long(db).details {
36976            GreenNodeDetails::Token(_) => Self { node },
36977            GreenNodeDetails::Node { .. } => {
36978                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
36979            }
36980        }
36981    }
36982    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36983        match node.long(db).green.long(db).details {
36984            GreenNodeDetails::Token(_) => Some(Self { node }),
36985            GreenNodeDetails::Node { .. } => None,
36986        }
36987    }
36988    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36989        self.node
36990    }
36991    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36992        TokenNeqPtr(self.node.stable_ptr(db))
36993    }
36994}
36995#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36996pub struct TerminalNeq<'db> {
36997    node: SyntaxNode<'db>,
36998}
36999impl<'db> Terminal<'db> for TerminalNeq<'db> {
37000    const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
37001    type TokenType = TokenNeq<'db>;
37002    fn new_green(
37003        db: &'db dyn Database,
37004        leading_trivia: TriviaGreen<'db>,
37005        token: <<TerminalNeq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37006        trailing_trivia: TriviaGreen<'db>,
37007    ) -> Self::Green {
37008        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37009        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37010        TerminalNeqGreen(
37011            GreenNode {
37012                kind: SyntaxKind::TerminalNeq,
37013                details: GreenNodeDetails::Node { children: children.into(), width },
37014            }
37015            .intern(db),
37016        )
37017    }
37018    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37019        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37020        else {
37021            unreachable!("Expected a node, not a token");
37022        };
37023        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37024    }
37025}
37026impl<'db> TerminalNeq<'db> {
37027    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37028        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37029    }
37030    pub fn token(&self, db: &'db dyn Database) -> TokenNeq<'db> {
37031        TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
37032    }
37033    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37034        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37035    }
37036}
37037#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37038pub struct TerminalNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
37039impl<'db> TerminalNeqPtr<'db> {}
37040impl<'db> TypedStablePtr<'db> for TerminalNeqPtr<'db> {
37041    type SyntaxNode = TerminalNeq<'db>;
37042    fn untyped(self) -> SyntaxStablePtrId<'db> {
37043        self.0
37044    }
37045    fn lookup(&self, db: &'db dyn Database) -> TerminalNeq<'db> {
37046        TerminalNeq::from_syntax_node(db, self.0.lookup(db))
37047    }
37048}
37049impl<'db> From<TerminalNeqPtr<'db>> for SyntaxStablePtrId<'db> {
37050    fn from(ptr: TerminalNeqPtr<'db>) -> Self {
37051        ptr.untyped()
37052    }
37053}
37054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37055pub struct TerminalNeqGreen<'db>(pub GreenId<'db>);
37056impl<'db> TypedSyntaxNode<'db> for TerminalNeq<'db> {
37057    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
37058    type StablePtr = TerminalNeqPtr<'db>;
37059    type Green = TerminalNeqGreen<'db>;
37060    fn missing(db: &'db dyn Database) -> Self::Green {
37061        TerminalNeqGreen(
37062            GreenNode {
37063                kind: SyntaxKind::TerminalNeq,
37064                details: GreenNodeDetails::Node {
37065                    children: [
37066                        Trivia::missing(db).0,
37067                        TokenNeq::missing(db).0,
37068                        Trivia::missing(db).0,
37069                    ]
37070                    .into(),
37071                    width: TextWidth::default(),
37072                },
37073            }
37074            .intern(db),
37075        )
37076    }
37077    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37078        let kind = node.kind(db);
37079        assert_eq!(
37080            kind,
37081            SyntaxKind::TerminalNeq,
37082            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37083            kind,
37084            SyntaxKind::TerminalNeq
37085        );
37086        Self { node }
37087    }
37088    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37089        let kind = node.kind(db);
37090        if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
37091    }
37092    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37093        self.node
37094    }
37095    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37096        TerminalNeqPtr(self.node.stable_ptr(db))
37097    }
37098}
37099#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37100pub struct TokenNot<'db> {
37101    node: SyntaxNode<'db>,
37102}
37103impl<'db> Token<'db> for TokenNot<'db> {
37104    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37105        TokenNotGreen(
37106            GreenNode { kind: SyntaxKind::TokenNot, details: GreenNodeDetails::Token(text) }
37107                .intern(db),
37108        )
37109    }
37110    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37111        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37112    }
37113}
37114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37115pub struct TokenNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37116impl<'db> TypedStablePtr<'db> for TokenNotPtr<'db> {
37117    type SyntaxNode = TokenNot<'db>;
37118    fn untyped(self) -> SyntaxStablePtrId<'db> {
37119        self.0
37120    }
37121    fn lookup(&self, db: &'db dyn Database) -> TokenNot<'db> {
37122        TokenNot::from_syntax_node(db, self.0.lookup(db))
37123    }
37124}
37125impl<'db> From<TokenNotPtr<'db>> for SyntaxStablePtrId<'db> {
37126    fn from(ptr: TokenNotPtr<'db>) -> Self {
37127        ptr.untyped()
37128    }
37129}
37130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37131pub struct TokenNotGreen<'db>(pub GreenId<'db>);
37132impl<'db> TokenNotGreen<'db> {
37133    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37134        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37135    }
37136}
37137impl<'db> TypedSyntaxNode<'db> for TokenNot<'db> {
37138    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
37139    type StablePtr = TokenNotPtr<'db>;
37140    type Green = TokenNotGreen<'db>;
37141    fn missing(db: &'db dyn Database) -> Self::Green {
37142        TokenNotGreen(
37143            GreenNode {
37144                kind: SyntaxKind::TokenMissing,
37145                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37146            }
37147            .intern(db),
37148        )
37149    }
37150    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37151        match node.long(db).green.long(db).details {
37152            GreenNodeDetails::Token(_) => Self { node },
37153            GreenNodeDetails::Node { .. } => {
37154                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
37155            }
37156        }
37157    }
37158    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37159        match node.long(db).green.long(db).details {
37160            GreenNodeDetails::Token(_) => Some(Self { node }),
37161            GreenNodeDetails::Node { .. } => None,
37162        }
37163    }
37164    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37165        self.node
37166    }
37167    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37168        TokenNotPtr(self.node.stable_ptr(db))
37169    }
37170}
37171#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37172pub struct TerminalNot<'db> {
37173    node: SyntaxNode<'db>,
37174}
37175impl<'db> Terminal<'db> for TerminalNot<'db> {
37176    const KIND: SyntaxKind = SyntaxKind::TerminalNot;
37177    type TokenType = TokenNot<'db>;
37178    fn new_green(
37179        db: &'db dyn Database,
37180        leading_trivia: TriviaGreen<'db>,
37181        token: <<TerminalNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37182        trailing_trivia: TriviaGreen<'db>,
37183    ) -> Self::Green {
37184        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37185        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37186        TerminalNotGreen(
37187            GreenNode {
37188                kind: SyntaxKind::TerminalNot,
37189                details: GreenNodeDetails::Node { children: children.into(), width },
37190            }
37191            .intern(db),
37192        )
37193    }
37194    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37195        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37196        else {
37197            unreachable!("Expected a node, not a token");
37198        };
37199        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37200    }
37201}
37202impl<'db> TerminalNot<'db> {
37203    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37204        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37205    }
37206    pub fn token(&self, db: &'db dyn Database) -> TokenNot<'db> {
37207        TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
37208    }
37209    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37210        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37211    }
37212}
37213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37214pub struct TerminalNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37215impl<'db> TerminalNotPtr<'db> {}
37216impl<'db> TypedStablePtr<'db> for TerminalNotPtr<'db> {
37217    type SyntaxNode = TerminalNot<'db>;
37218    fn untyped(self) -> SyntaxStablePtrId<'db> {
37219        self.0
37220    }
37221    fn lookup(&self, db: &'db dyn Database) -> TerminalNot<'db> {
37222        TerminalNot::from_syntax_node(db, self.0.lookup(db))
37223    }
37224}
37225impl<'db> From<TerminalNotPtr<'db>> for SyntaxStablePtrId<'db> {
37226    fn from(ptr: TerminalNotPtr<'db>) -> Self {
37227        ptr.untyped()
37228    }
37229}
37230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37231pub struct TerminalNotGreen<'db>(pub GreenId<'db>);
37232impl<'db> TypedSyntaxNode<'db> for TerminalNot<'db> {
37233    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
37234    type StablePtr = TerminalNotPtr<'db>;
37235    type Green = TerminalNotGreen<'db>;
37236    fn missing(db: &'db dyn Database) -> Self::Green {
37237        TerminalNotGreen(
37238            GreenNode {
37239                kind: SyntaxKind::TerminalNot,
37240                details: GreenNodeDetails::Node {
37241                    children: [
37242                        Trivia::missing(db).0,
37243                        TokenNot::missing(db).0,
37244                        Trivia::missing(db).0,
37245                    ]
37246                    .into(),
37247                    width: TextWidth::default(),
37248                },
37249            }
37250            .intern(db),
37251        )
37252    }
37253    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37254        let kind = node.kind(db);
37255        assert_eq!(
37256            kind,
37257            SyntaxKind::TerminalNot,
37258            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37259            kind,
37260            SyntaxKind::TerminalNot
37261        );
37262        Self { node }
37263    }
37264    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37265        let kind = node.kind(db);
37266        if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
37267    }
37268    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37269        self.node
37270    }
37271    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37272        TerminalNotPtr(self.node.stable_ptr(db))
37273    }
37274}
37275#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37276pub struct TokenBitNot<'db> {
37277    node: SyntaxNode<'db>,
37278}
37279impl<'db> Token<'db> for TokenBitNot<'db> {
37280    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37281        TokenBitNotGreen(
37282            GreenNode { kind: SyntaxKind::TokenBitNot, details: GreenNodeDetails::Token(text) }
37283                .intern(db),
37284        )
37285    }
37286    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37287        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37288    }
37289}
37290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37291pub struct TokenBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37292impl<'db> TypedStablePtr<'db> for TokenBitNotPtr<'db> {
37293    type SyntaxNode = TokenBitNot<'db>;
37294    fn untyped(self) -> SyntaxStablePtrId<'db> {
37295        self.0
37296    }
37297    fn lookup(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37298        TokenBitNot::from_syntax_node(db, self.0.lookup(db))
37299    }
37300}
37301impl<'db> From<TokenBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37302    fn from(ptr: TokenBitNotPtr<'db>) -> Self {
37303        ptr.untyped()
37304    }
37305}
37306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37307pub struct TokenBitNotGreen<'db>(pub GreenId<'db>);
37308impl<'db> TokenBitNotGreen<'db> {
37309    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37310        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37311    }
37312}
37313impl<'db> TypedSyntaxNode<'db> for TokenBitNot<'db> {
37314    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
37315    type StablePtr = TokenBitNotPtr<'db>;
37316    type Green = TokenBitNotGreen<'db>;
37317    fn missing(db: &'db dyn Database) -> Self::Green {
37318        TokenBitNotGreen(
37319            GreenNode {
37320                kind: SyntaxKind::TokenMissing,
37321                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37322            }
37323            .intern(db),
37324        )
37325    }
37326    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37327        match node.long(db).green.long(db).details {
37328            GreenNodeDetails::Token(_) => Self { node },
37329            GreenNodeDetails::Node { .. } => {
37330                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
37331            }
37332        }
37333    }
37334    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37335        match node.long(db).green.long(db).details {
37336            GreenNodeDetails::Token(_) => Some(Self { node }),
37337            GreenNodeDetails::Node { .. } => None,
37338        }
37339    }
37340    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37341        self.node
37342    }
37343    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37344        TokenBitNotPtr(self.node.stable_ptr(db))
37345    }
37346}
37347#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37348pub struct TerminalBitNot<'db> {
37349    node: SyntaxNode<'db>,
37350}
37351impl<'db> Terminal<'db> for TerminalBitNot<'db> {
37352    const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
37353    type TokenType = TokenBitNot<'db>;
37354    fn new_green(
37355        db: &'db dyn Database,
37356        leading_trivia: TriviaGreen<'db>,
37357        token: <<TerminalBitNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37358        trailing_trivia: TriviaGreen<'db>,
37359    ) -> Self::Green {
37360        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37361        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37362        TerminalBitNotGreen(
37363            GreenNode {
37364                kind: SyntaxKind::TerminalBitNot,
37365                details: GreenNodeDetails::Node { children: children.into(), width },
37366            }
37367            .intern(db),
37368        )
37369    }
37370    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37371        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37372        else {
37373            unreachable!("Expected a node, not a token");
37374        };
37375        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37376    }
37377}
37378impl<'db> TerminalBitNot<'db> {
37379    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37380        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37381    }
37382    pub fn token(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37383        TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
37384    }
37385    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37386        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37387    }
37388}
37389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37390pub struct TerminalBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37391impl<'db> TerminalBitNotPtr<'db> {}
37392impl<'db> TypedStablePtr<'db> for TerminalBitNotPtr<'db> {
37393    type SyntaxNode = TerminalBitNot<'db>;
37394    fn untyped(self) -> SyntaxStablePtrId<'db> {
37395        self.0
37396    }
37397    fn lookup(&self, db: &'db dyn Database) -> TerminalBitNot<'db> {
37398        TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
37399    }
37400}
37401impl<'db> From<TerminalBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37402    fn from(ptr: TerminalBitNotPtr<'db>) -> Self {
37403        ptr.untyped()
37404    }
37405}
37406#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37407pub struct TerminalBitNotGreen<'db>(pub GreenId<'db>);
37408impl<'db> TypedSyntaxNode<'db> for TerminalBitNot<'db> {
37409    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
37410    type StablePtr = TerminalBitNotPtr<'db>;
37411    type Green = TerminalBitNotGreen<'db>;
37412    fn missing(db: &'db dyn Database) -> Self::Green {
37413        TerminalBitNotGreen(
37414            GreenNode {
37415                kind: SyntaxKind::TerminalBitNot,
37416                details: GreenNodeDetails::Node {
37417                    children: [
37418                        Trivia::missing(db).0,
37419                        TokenBitNot::missing(db).0,
37420                        Trivia::missing(db).0,
37421                    ]
37422                    .into(),
37423                    width: TextWidth::default(),
37424                },
37425            }
37426            .intern(db),
37427        )
37428    }
37429    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37430        let kind = node.kind(db);
37431        assert_eq!(
37432            kind,
37433            SyntaxKind::TerminalBitNot,
37434            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37435            kind,
37436            SyntaxKind::TerminalBitNot
37437        );
37438        Self { node }
37439    }
37440    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37441        let kind = node.kind(db);
37442        if kind == SyntaxKind::TerminalBitNot {
37443            Some(Self::from_syntax_node(db, node))
37444        } else {
37445            None
37446        }
37447    }
37448    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37449        self.node
37450    }
37451    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37452        TerminalBitNotPtr(self.node.stable_ptr(db))
37453    }
37454}
37455#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37456pub struct TokenOr<'db> {
37457    node: SyntaxNode<'db>,
37458}
37459impl<'db> Token<'db> for TokenOr<'db> {
37460    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37461        TokenOrGreen(
37462            GreenNode { kind: SyntaxKind::TokenOr, details: GreenNodeDetails::Token(text) }
37463                .intern(db),
37464        )
37465    }
37466    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37467        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37468    }
37469}
37470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37471pub struct TokenOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37472impl<'db> TypedStablePtr<'db> for TokenOrPtr<'db> {
37473    type SyntaxNode = TokenOr<'db>;
37474    fn untyped(self) -> SyntaxStablePtrId<'db> {
37475        self.0
37476    }
37477    fn lookup(&self, db: &'db dyn Database) -> TokenOr<'db> {
37478        TokenOr::from_syntax_node(db, self.0.lookup(db))
37479    }
37480}
37481impl<'db> From<TokenOrPtr<'db>> for SyntaxStablePtrId<'db> {
37482    fn from(ptr: TokenOrPtr<'db>) -> Self {
37483        ptr.untyped()
37484    }
37485}
37486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37487pub struct TokenOrGreen<'db>(pub GreenId<'db>);
37488impl<'db> TokenOrGreen<'db> {
37489    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37490        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37491    }
37492}
37493impl<'db> TypedSyntaxNode<'db> for TokenOr<'db> {
37494    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
37495    type StablePtr = TokenOrPtr<'db>;
37496    type Green = TokenOrGreen<'db>;
37497    fn missing(db: &'db dyn Database) -> Self::Green {
37498        TokenOrGreen(
37499            GreenNode {
37500                kind: SyntaxKind::TokenMissing,
37501                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37502            }
37503            .intern(db),
37504        )
37505    }
37506    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37507        match node.long(db).green.long(db).details {
37508            GreenNodeDetails::Token(_) => Self { node },
37509            GreenNodeDetails::Node { .. } => {
37510                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
37511            }
37512        }
37513    }
37514    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37515        match node.long(db).green.long(db).details {
37516            GreenNodeDetails::Token(_) => Some(Self { node }),
37517            GreenNodeDetails::Node { .. } => None,
37518        }
37519    }
37520    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37521        self.node
37522    }
37523    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37524        TokenOrPtr(self.node.stable_ptr(db))
37525    }
37526}
37527#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37528pub struct TerminalOr<'db> {
37529    node: SyntaxNode<'db>,
37530}
37531impl<'db> Terminal<'db> for TerminalOr<'db> {
37532    const KIND: SyntaxKind = SyntaxKind::TerminalOr;
37533    type TokenType = TokenOr<'db>;
37534    fn new_green(
37535        db: &'db dyn Database,
37536        leading_trivia: TriviaGreen<'db>,
37537        token: <<TerminalOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37538        trailing_trivia: TriviaGreen<'db>,
37539    ) -> Self::Green {
37540        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37541        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37542        TerminalOrGreen(
37543            GreenNode {
37544                kind: SyntaxKind::TerminalOr,
37545                details: GreenNodeDetails::Node { children: children.into(), width },
37546            }
37547            .intern(db),
37548        )
37549    }
37550    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37551        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37552        else {
37553            unreachable!("Expected a node, not a token");
37554        };
37555        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37556    }
37557}
37558impl<'db> TerminalOr<'db> {
37559    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37560        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37561    }
37562    pub fn token(&self, db: &'db dyn Database) -> TokenOr<'db> {
37563        TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
37564    }
37565    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37566        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37567    }
37568}
37569#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37570pub struct TerminalOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37571impl<'db> TerminalOrPtr<'db> {}
37572impl<'db> TypedStablePtr<'db> for TerminalOrPtr<'db> {
37573    type SyntaxNode = TerminalOr<'db>;
37574    fn untyped(self) -> SyntaxStablePtrId<'db> {
37575        self.0
37576    }
37577    fn lookup(&self, db: &'db dyn Database) -> TerminalOr<'db> {
37578        TerminalOr::from_syntax_node(db, self.0.lookup(db))
37579    }
37580}
37581impl<'db> From<TerminalOrPtr<'db>> for SyntaxStablePtrId<'db> {
37582    fn from(ptr: TerminalOrPtr<'db>) -> Self {
37583        ptr.untyped()
37584    }
37585}
37586#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37587pub struct TerminalOrGreen<'db>(pub GreenId<'db>);
37588impl<'db> TypedSyntaxNode<'db> for TerminalOr<'db> {
37589    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
37590    type StablePtr = TerminalOrPtr<'db>;
37591    type Green = TerminalOrGreen<'db>;
37592    fn missing(db: &'db dyn Database) -> Self::Green {
37593        TerminalOrGreen(
37594            GreenNode {
37595                kind: SyntaxKind::TerminalOr,
37596                details: GreenNodeDetails::Node {
37597                    children: [
37598                        Trivia::missing(db).0,
37599                        TokenOr::missing(db).0,
37600                        Trivia::missing(db).0,
37601                    ]
37602                    .into(),
37603                    width: TextWidth::default(),
37604                },
37605            }
37606            .intern(db),
37607        )
37608    }
37609    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37610        let kind = node.kind(db);
37611        assert_eq!(
37612            kind,
37613            SyntaxKind::TerminalOr,
37614            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37615            kind,
37616            SyntaxKind::TerminalOr
37617        );
37618        Self { node }
37619    }
37620    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37621        let kind = node.kind(db);
37622        if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
37623    }
37624    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37625        self.node
37626    }
37627    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37628        TerminalOrPtr(self.node.stable_ptr(db))
37629    }
37630}
37631#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37632pub struct TokenOrOr<'db> {
37633    node: SyntaxNode<'db>,
37634}
37635impl<'db> Token<'db> for TokenOrOr<'db> {
37636    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37637        TokenOrOrGreen(
37638            GreenNode { kind: SyntaxKind::TokenOrOr, details: GreenNodeDetails::Token(text) }
37639                .intern(db),
37640        )
37641    }
37642    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37643        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37644    }
37645}
37646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37647pub struct TokenOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37648impl<'db> TypedStablePtr<'db> for TokenOrOrPtr<'db> {
37649    type SyntaxNode = TokenOrOr<'db>;
37650    fn untyped(self) -> SyntaxStablePtrId<'db> {
37651        self.0
37652    }
37653    fn lookup(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37654        TokenOrOr::from_syntax_node(db, self.0.lookup(db))
37655    }
37656}
37657impl<'db> From<TokenOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37658    fn from(ptr: TokenOrOrPtr<'db>) -> Self {
37659        ptr.untyped()
37660    }
37661}
37662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37663pub struct TokenOrOrGreen<'db>(pub GreenId<'db>);
37664impl<'db> TokenOrOrGreen<'db> {
37665    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37666        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37667    }
37668}
37669impl<'db> TypedSyntaxNode<'db> for TokenOrOr<'db> {
37670    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
37671    type StablePtr = TokenOrOrPtr<'db>;
37672    type Green = TokenOrOrGreen<'db>;
37673    fn missing(db: &'db dyn Database) -> Self::Green {
37674        TokenOrOrGreen(
37675            GreenNode {
37676                kind: SyntaxKind::TokenMissing,
37677                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37678            }
37679            .intern(db),
37680        )
37681    }
37682    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37683        match node.long(db).green.long(db).details {
37684            GreenNodeDetails::Token(_) => Self { node },
37685            GreenNodeDetails::Node { .. } => {
37686                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
37687            }
37688        }
37689    }
37690    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37691        match node.long(db).green.long(db).details {
37692            GreenNodeDetails::Token(_) => Some(Self { node }),
37693            GreenNodeDetails::Node { .. } => None,
37694        }
37695    }
37696    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37697        self.node
37698    }
37699    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37700        TokenOrOrPtr(self.node.stable_ptr(db))
37701    }
37702}
37703#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37704pub struct TerminalOrOr<'db> {
37705    node: SyntaxNode<'db>,
37706}
37707impl<'db> Terminal<'db> for TerminalOrOr<'db> {
37708    const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
37709    type TokenType = TokenOrOr<'db>;
37710    fn new_green(
37711        db: &'db dyn Database,
37712        leading_trivia: TriviaGreen<'db>,
37713        token: <<TerminalOrOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37714        trailing_trivia: TriviaGreen<'db>,
37715    ) -> Self::Green {
37716        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37717        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37718        TerminalOrOrGreen(
37719            GreenNode {
37720                kind: SyntaxKind::TerminalOrOr,
37721                details: GreenNodeDetails::Node { children: children.into(), width },
37722            }
37723            .intern(db),
37724        )
37725    }
37726    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37727        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37728        else {
37729            unreachable!("Expected a node, not a token");
37730        };
37731        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37732    }
37733}
37734impl<'db> TerminalOrOr<'db> {
37735    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37736        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37737    }
37738    pub fn token(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37739        TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
37740    }
37741    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37742        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37743    }
37744}
37745#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37746pub struct TerminalOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37747impl<'db> TerminalOrOrPtr<'db> {}
37748impl<'db> TypedStablePtr<'db> for TerminalOrOrPtr<'db> {
37749    type SyntaxNode = TerminalOrOr<'db>;
37750    fn untyped(self) -> SyntaxStablePtrId<'db> {
37751        self.0
37752    }
37753    fn lookup(&self, db: &'db dyn Database) -> TerminalOrOr<'db> {
37754        TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
37755    }
37756}
37757impl<'db> From<TerminalOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37758    fn from(ptr: TerminalOrOrPtr<'db>) -> Self {
37759        ptr.untyped()
37760    }
37761}
37762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37763pub struct TerminalOrOrGreen<'db>(pub GreenId<'db>);
37764impl<'db> TypedSyntaxNode<'db> for TerminalOrOr<'db> {
37765    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
37766    type StablePtr = TerminalOrOrPtr<'db>;
37767    type Green = TerminalOrOrGreen<'db>;
37768    fn missing(db: &'db dyn Database) -> Self::Green {
37769        TerminalOrOrGreen(
37770            GreenNode {
37771                kind: SyntaxKind::TerminalOrOr,
37772                details: GreenNodeDetails::Node {
37773                    children: [
37774                        Trivia::missing(db).0,
37775                        TokenOrOr::missing(db).0,
37776                        Trivia::missing(db).0,
37777                    ]
37778                    .into(),
37779                    width: TextWidth::default(),
37780                },
37781            }
37782            .intern(db),
37783        )
37784    }
37785    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37786        let kind = node.kind(db);
37787        assert_eq!(
37788            kind,
37789            SyntaxKind::TerminalOrOr,
37790            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37791            kind,
37792            SyntaxKind::TerminalOrOr
37793        );
37794        Self { node }
37795    }
37796    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37797        let kind = node.kind(db);
37798        if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
37799    }
37800    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37801        self.node
37802    }
37803    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37804        TerminalOrOrPtr(self.node.stable_ptr(db))
37805    }
37806}
37807#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37808pub struct TokenPlus<'db> {
37809    node: SyntaxNode<'db>,
37810}
37811impl<'db> Token<'db> for TokenPlus<'db> {
37812    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37813        TokenPlusGreen(
37814            GreenNode { kind: SyntaxKind::TokenPlus, details: GreenNodeDetails::Token(text) }
37815                .intern(db),
37816        )
37817    }
37818    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37819        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37820    }
37821}
37822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37823pub struct TokenPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37824impl<'db> TypedStablePtr<'db> for TokenPlusPtr<'db> {
37825    type SyntaxNode = TokenPlus<'db>;
37826    fn untyped(self) -> SyntaxStablePtrId<'db> {
37827        self.0
37828    }
37829    fn lookup(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37830        TokenPlus::from_syntax_node(db, self.0.lookup(db))
37831    }
37832}
37833impl<'db> From<TokenPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37834    fn from(ptr: TokenPlusPtr<'db>) -> Self {
37835        ptr.untyped()
37836    }
37837}
37838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37839pub struct TokenPlusGreen<'db>(pub GreenId<'db>);
37840impl<'db> TokenPlusGreen<'db> {
37841    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37842        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37843    }
37844}
37845impl<'db> TypedSyntaxNode<'db> for TokenPlus<'db> {
37846    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
37847    type StablePtr = TokenPlusPtr<'db>;
37848    type Green = TokenPlusGreen<'db>;
37849    fn missing(db: &'db dyn Database) -> Self::Green {
37850        TokenPlusGreen(
37851            GreenNode {
37852                kind: SyntaxKind::TokenMissing,
37853                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37854            }
37855            .intern(db),
37856        )
37857    }
37858    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37859        match node.long(db).green.long(db).details {
37860            GreenNodeDetails::Token(_) => Self { node },
37861            GreenNodeDetails::Node { .. } => {
37862                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
37863            }
37864        }
37865    }
37866    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37867        match node.long(db).green.long(db).details {
37868            GreenNodeDetails::Token(_) => Some(Self { node }),
37869            GreenNodeDetails::Node { .. } => None,
37870        }
37871    }
37872    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37873        self.node
37874    }
37875    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37876        TokenPlusPtr(self.node.stable_ptr(db))
37877    }
37878}
37879#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37880pub struct TerminalPlus<'db> {
37881    node: SyntaxNode<'db>,
37882}
37883impl<'db> Terminal<'db> for TerminalPlus<'db> {
37884    const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
37885    type TokenType = TokenPlus<'db>;
37886    fn new_green(
37887        db: &'db dyn Database,
37888        leading_trivia: TriviaGreen<'db>,
37889        token: <<TerminalPlus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37890        trailing_trivia: TriviaGreen<'db>,
37891    ) -> Self::Green {
37892        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37893        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37894        TerminalPlusGreen(
37895            GreenNode {
37896                kind: SyntaxKind::TerminalPlus,
37897                details: GreenNodeDetails::Node { children: children.into(), width },
37898            }
37899            .intern(db),
37900        )
37901    }
37902    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37903        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
37904        else {
37905            unreachable!("Expected a node, not a token");
37906        };
37907        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37908    }
37909}
37910impl<'db> TerminalPlus<'db> {
37911    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37912        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37913    }
37914    pub fn token(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37915        TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
37916    }
37917    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37918        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37919    }
37920}
37921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37922pub struct TerminalPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37923impl<'db> TerminalPlusPtr<'db> {}
37924impl<'db> TypedStablePtr<'db> for TerminalPlusPtr<'db> {
37925    type SyntaxNode = TerminalPlus<'db>;
37926    fn untyped(self) -> SyntaxStablePtrId<'db> {
37927        self.0
37928    }
37929    fn lookup(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
37930        TerminalPlus::from_syntax_node(db, self.0.lookup(db))
37931    }
37932}
37933impl<'db> From<TerminalPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37934    fn from(ptr: TerminalPlusPtr<'db>) -> Self {
37935        ptr.untyped()
37936    }
37937}
37938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37939pub struct TerminalPlusGreen<'db>(pub GreenId<'db>);
37940impl<'db> TypedSyntaxNode<'db> for TerminalPlus<'db> {
37941    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
37942    type StablePtr = TerminalPlusPtr<'db>;
37943    type Green = TerminalPlusGreen<'db>;
37944    fn missing(db: &'db dyn Database) -> Self::Green {
37945        TerminalPlusGreen(
37946            GreenNode {
37947                kind: SyntaxKind::TerminalPlus,
37948                details: GreenNodeDetails::Node {
37949                    children: [
37950                        Trivia::missing(db).0,
37951                        TokenPlus::missing(db).0,
37952                        Trivia::missing(db).0,
37953                    ]
37954                    .into(),
37955                    width: TextWidth::default(),
37956                },
37957            }
37958            .intern(db),
37959        )
37960    }
37961    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37962        let kind = node.kind(db);
37963        assert_eq!(
37964            kind,
37965            SyntaxKind::TerminalPlus,
37966            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37967            kind,
37968            SyntaxKind::TerminalPlus
37969        );
37970        Self { node }
37971    }
37972    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37973        let kind = node.kind(db);
37974        if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
37975    }
37976    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37977        self.node
37978    }
37979    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37980        TerminalPlusPtr(self.node.stable_ptr(db))
37981    }
37982}
37983#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37984pub struct TokenPlusEq<'db> {
37985    node: SyntaxNode<'db>,
37986}
37987impl<'db> Token<'db> for TokenPlusEq<'db> {
37988    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37989        TokenPlusEqGreen(
37990            GreenNode { kind: SyntaxKind::TokenPlusEq, details: GreenNodeDetails::Token(text) }
37991                .intern(db),
37992        )
37993    }
37994    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37995        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
37996    }
37997}
37998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37999pub struct TokenPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
38000impl<'db> TypedStablePtr<'db> for TokenPlusEqPtr<'db> {
38001    type SyntaxNode = TokenPlusEq<'db>;
38002    fn untyped(self) -> SyntaxStablePtrId<'db> {
38003        self.0
38004    }
38005    fn lookup(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
38006        TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
38007    }
38008}
38009impl<'db> From<TokenPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
38010    fn from(ptr: TokenPlusEqPtr<'db>) -> Self {
38011        ptr.untyped()
38012    }
38013}
38014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38015pub struct TokenPlusEqGreen<'db>(pub GreenId<'db>);
38016impl<'db> TokenPlusEqGreen<'db> {
38017    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38018        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38019    }
38020}
38021impl<'db> TypedSyntaxNode<'db> for TokenPlusEq<'db> {
38022    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
38023    type StablePtr = TokenPlusEqPtr<'db>;
38024    type Green = TokenPlusEqGreen<'db>;
38025    fn missing(db: &'db dyn Database) -> Self::Green {
38026        TokenPlusEqGreen(
38027            GreenNode {
38028                kind: SyntaxKind::TokenMissing,
38029                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38030            }
38031            .intern(db),
38032        )
38033    }
38034    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38035        match node.long(db).green.long(db).details {
38036            GreenNodeDetails::Token(_) => Self { node },
38037            GreenNodeDetails::Node { .. } => {
38038                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
38039            }
38040        }
38041    }
38042    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38043        match node.long(db).green.long(db).details {
38044            GreenNodeDetails::Token(_) => Some(Self { node }),
38045            GreenNodeDetails::Node { .. } => None,
38046        }
38047    }
38048    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38049        self.node
38050    }
38051    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38052        TokenPlusEqPtr(self.node.stable_ptr(db))
38053    }
38054}
38055#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38056pub struct TerminalPlusEq<'db> {
38057    node: SyntaxNode<'db>,
38058}
38059impl<'db> Terminal<'db> for TerminalPlusEq<'db> {
38060    const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
38061    type TokenType = TokenPlusEq<'db>;
38062    fn new_green(
38063        db: &'db dyn Database,
38064        leading_trivia: TriviaGreen<'db>,
38065        token: <<TerminalPlusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38066        trailing_trivia: TriviaGreen<'db>,
38067    ) -> Self::Green {
38068        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38069        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38070        TerminalPlusEqGreen(
38071            GreenNode {
38072                kind: SyntaxKind::TerminalPlusEq,
38073                details: GreenNodeDetails::Node { children: children.into(), width },
38074            }
38075            .intern(db),
38076        )
38077    }
38078    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38079        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38080        else {
38081            unreachable!("Expected a node, not a token");
38082        };
38083        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38084    }
38085}
38086impl<'db> TerminalPlusEq<'db> {
38087    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38088        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38089    }
38090    pub fn token(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
38091        TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
38092    }
38093    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38094        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38095    }
38096}
38097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38098pub struct TerminalPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
38099impl<'db> TerminalPlusEqPtr<'db> {}
38100impl<'db> TypedStablePtr<'db> for TerminalPlusEqPtr<'db> {
38101    type SyntaxNode = TerminalPlusEq<'db>;
38102    fn untyped(self) -> SyntaxStablePtrId<'db> {
38103        self.0
38104    }
38105    fn lookup(&self, db: &'db dyn Database) -> TerminalPlusEq<'db> {
38106        TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
38107    }
38108}
38109impl<'db> From<TerminalPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
38110    fn from(ptr: TerminalPlusEqPtr<'db>) -> Self {
38111        ptr.untyped()
38112    }
38113}
38114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38115pub struct TerminalPlusEqGreen<'db>(pub GreenId<'db>);
38116impl<'db> TypedSyntaxNode<'db> for TerminalPlusEq<'db> {
38117    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
38118    type StablePtr = TerminalPlusEqPtr<'db>;
38119    type Green = TerminalPlusEqGreen<'db>;
38120    fn missing(db: &'db dyn Database) -> Self::Green {
38121        TerminalPlusEqGreen(
38122            GreenNode {
38123                kind: SyntaxKind::TerminalPlusEq,
38124                details: GreenNodeDetails::Node {
38125                    children: [
38126                        Trivia::missing(db).0,
38127                        TokenPlusEq::missing(db).0,
38128                        Trivia::missing(db).0,
38129                    ]
38130                    .into(),
38131                    width: TextWidth::default(),
38132                },
38133            }
38134            .intern(db),
38135        )
38136    }
38137    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38138        let kind = node.kind(db);
38139        assert_eq!(
38140            kind,
38141            SyntaxKind::TerminalPlusEq,
38142            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38143            kind,
38144            SyntaxKind::TerminalPlusEq
38145        );
38146        Self { node }
38147    }
38148    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38149        let kind = node.kind(db);
38150        if kind == SyntaxKind::TerminalPlusEq {
38151            Some(Self::from_syntax_node(db, node))
38152        } else {
38153            None
38154        }
38155    }
38156    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38157        self.node
38158    }
38159    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38160        TerminalPlusEqPtr(self.node.stable_ptr(db))
38161    }
38162}
38163#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38164pub struct TokenQuestionMark<'db> {
38165    node: SyntaxNode<'db>,
38166}
38167impl<'db> Token<'db> for TokenQuestionMark<'db> {
38168    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38169        TokenQuestionMarkGreen(
38170            GreenNode {
38171                kind: SyntaxKind::TokenQuestionMark,
38172                details: GreenNodeDetails::Token(text),
38173            }
38174            .intern(db),
38175        )
38176    }
38177    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38178        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38179    }
38180}
38181#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38182pub struct TokenQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
38183impl<'db> TypedStablePtr<'db> for TokenQuestionMarkPtr<'db> {
38184    type SyntaxNode = TokenQuestionMark<'db>;
38185    fn untyped(self) -> SyntaxStablePtrId<'db> {
38186        self.0
38187    }
38188    fn lookup(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
38189        TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
38190    }
38191}
38192impl<'db> From<TokenQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
38193    fn from(ptr: TokenQuestionMarkPtr<'db>) -> Self {
38194        ptr.untyped()
38195    }
38196}
38197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38198pub struct TokenQuestionMarkGreen<'db>(pub GreenId<'db>);
38199impl<'db> TokenQuestionMarkGreen<'db> {
38200    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38201        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38202    }
38203}
38204impl<'db> TypedSyntaxNode<'db> for TokenQuestionMark<'db> {
38205    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
38206    type StablePtr = TokenQuestionMarkPtr<'db>;
38207    type Green = TokenQuestionMarkGreen<'db>;
38208    fn missing(db: &'db dyn Database) -> Self::Green {
38209        TokenQuestionMarkGreen(
38210            GreenNode {
38211                kind: SyntaxKind::TokenMissing,
38212                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38213            }
38214            .intern(db),
38215        )
38216    }
38217    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38218        match node.long(db).green.long(db).details {
38219            GreenNodeDetails::Token(_) => Self { node },
38220            GreenNodeDetails::Node { .. } => {
38221                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
38222            }
38223        }
38224    }
38225    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38226        match node.long(db).green.long(db).details {
38227            GreenNodeDetails::Token(_) => Some(Self { node }),
38228            GreenNodeDetails::Node { .. } => None,
38229        }
38230    }
38231    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38232        self.node
38233    }
38234    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38235        TokenQuestionMarkPtr(self.node.stable_ptr(db))
38236    }
38237}
38238#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38239pub struct TerminalQuestionMark<'db> {
38240    node: SyntaxNode<'db>,
38241}
38242impl<'db> Terminal<'db> for TerminalQuestionMark<'db> {
38243    const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
38244    type TokenType = TokenQuestionMark<'db>;
38245    fn new_green(
38246        db: &'db dyn Database,
38247        leading_trivia: TriviaGreen<'db>,
38248        token: <<TerminalQuestionMark<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38249        trailing_trivia: TriviaGreen<'db>,
38250    ) -> Self::Green {
38251        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38252        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38253        TerminalQuestionMarkGreen(
38254            GreenNode {
38255                kind: SyntaxKind::TerminalQuestionMark,
38256                details: GreenNodeDetails::Node { children: children.into(), width },
38257            }
38258            .intern(db),
38259        )
38260    }
38261    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38262        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38263        else {
38264            unreachable!("Expected a node, not a token");
38265        };
38266        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38267    }
38268}
38269impl<'db> TerminalQuestionMark<'db> {
38270    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38271        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38272    }
38273    pub fn token(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
38274        TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
38275    }
38276    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38277        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38278    }
38279}
38280#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38281pub struct TerminalQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
38282impl<'db> TerminalQuestionMarkPtr<'db> {}
38283impl<'db> TypedStablePtr<'db> for TerminalQuestionMarkPtr<'db> {
38284    type SyntaxNode = TerminalQuestionMark<'db>;
38285    fn untyped(self) -> SyntaxStablePtrId<'db> {
38286        self.0
38287    }
38288    fn lookup(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
38289        TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
38290    }
38291}
38292impl<'db> From<TerminalQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
38293    fn from(ptr: TerminalQuestionMarkPtr<'db>) -> Self {
38294        ptr.untyped()
38295    }
38296}
38297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38298pub struct TerminalQuestionMarkGreen<'db>(pub GreenId<'db>);
38299impl<'db> TypedSyntaxNode<'db> for TerminalQuestionMark<'db> {
38300    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
38301    type StablePtr = TerminalQuestionMarkPtr<'db>;
38302    type Green = TerminalQuestionMarkGreen<'db>;
38303    fn missing(db: &'db dyn Database) -> Self::Green {
38304        TerminalQuestionMarkGreen(
38305            GreenNode {
38306                kind: SyntaxKind::TerminalQuestionMark,
38307                details: GreenNodeDetails::Node {
38308                    children: [
38309                        Trivia::missing(db).0,
38310                        TokenQuestionMark::missing(db).0,
38311                        Trivia::missing(db).0,
38312                    ]
38313                    .into(),
38314                    width: TextWidth::default(),
38315                },
38316            }
38317            .intern(db),
38318        )
38319    }
38320    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38321        let kind = node.kind(db);
38322        assert_eq!(
38323            kind,
38324            SyntaxKind::TerminalQuestionMark,
38325            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38326            kind,
38327            SyntaxKind::TerminalQuestionMark
38328        );
38329        Self { node }
38330    }
38331    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38332        let kind = node.kind(db);
38333        if kind == SyntaxKind::TerminalQuestionMark {
38334            Some(Self::from_syntax_node(db, node))
38335        } else {
38336            None
38337        }
38338    }
38339    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38340        self.node
38341    }
38342    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38343        TerminalQuestionMarkPtr(self.node.stable_ptr(db))
38344    }
38345}
38346#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38347pub struct TokenRBrace<'db> {
38348    node: SyntaxNode<'db>,
38349}
38350impl<'db> Token<'db> for TokenRBrace<'db> {
38351    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38352        TokenRBraceGreen(
38353            GreenNode { kind: SyntaxKind::TokenRBrace, details: GreenNodeDetails::Token(text) }
38354                .intern(db),
38355        )
38356    }
38357    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38358        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38359    }
38360}
38361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38362pub struct TokenRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38363impl<'db> TypedStablePtr<'db> for TokenRBracePtr<'db> {
38364    type SyntaxNode = TokenRBrace<'db>;
38365    fn untyped(self) -> SyntaxStablePtrId<'db> {
38366        self.0
38367    }
38368    fn lookup(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38369        TokenRBrace::from_syntax_node(db, self.0.lookup(db))
38370    }
38371}
38372impl<'db> From<TokenRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38373    fn from(ptr: TokenRBracePtr<'db>) -> Self {
38374        ptr.untyped()
38375    }
38376}
38377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38378pub struct TokenRBraceGreen<'db>(pub GreenId<'db>);
38379impl<'db> TokenRBraceGreen<'db> {
38380    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38381        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38382    }
38383}
38384impl<'db> TypedSyntaxNode<'db> for TokenRBrace<'db> {
38385    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
38386    type StablePtr = TokenRBracePtr<'db>;
38387    type Green = TokenRBraceGreen<'db>;
38388    fn missing(db: &'db dyn Database) -> Self::Green {
38389        TokenRBraceGreen(
38390            GreenNode {
38391                kind: SyntaxKind::TokenMissing,
38392                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38393            }
38394            .intern(db),
38395        )
38396    }
38397    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38398        match node.long(db).green.long(db).details {
38399            GreenNodeDetails::Token(_) => Self { node },
38400            GreenNodeDetails::Node { .. } => {
38401                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
38402            }
38403        }
38404    }
38405    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38406        match node.long(db).green.long(db).details {
38407            GreenNodeDetails::Token(_) => Some(Self { node }),
38408            GreenNodeDetails::Node { .. } => None,
38409        }
38410    }
38411    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38412        self.node
38413    }
38414    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38415        TokenRBracePtr(self.node.stable_ptr(db))
38416    }
38417}
38418#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38419pub struct TerminalRBrace<'db> {
38420    node: SyntaxNode<'db>,
38421}
38422impl<'db> Terminal<'db> for TerminalRBrace<'db> {
38423    const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
38424    type TokenType = TokenRBrace<'db>;
38425    fn new_green(
38426        db: &'db dyn Database,
38427        leading_trivia: TriviaGreen<'db>,
38428        token: <<TerminalRBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38429        trailing_trivia: TriviaGreen<'db>,
38430    ) -> Self::Green {
38431        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38432        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38433        TerminalRBraceGreen(
38434            GreenNode {
38435                kind: SyntaxKind::TerminalRBrace,
38436                details: GreenNodeDetails::Node { children: children.into(), width },
38437            }
38438            .intern(db),
38439        )
38440    }
38441    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38442        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38443        else {
38444            unreachable!("Expected a node, not a token");
38445        };
38446        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38447    }
38448}
38449impl<'db> TerminalRBrace<'db> {
38450    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38451        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38452    }
38453    pub fn token(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38454        TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
38455    }
38456    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38457        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38458    }
38459}
38460#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38461pub struct TerminalRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38462impl<'db> TerminalRBracePtr<'db> {}
38463impl<'db> TypedStablePtr<'db> for TerminalRBracePtr<'db> {
38464    type SyntaxNode = TerminalRBrace<'db>;
38465    fn untyped(self) -> SyntaxStablePtrId<'db> {
38466        self.0
38467    }
38468    fn lookup(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
38469        TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
38470    }
38471}
38472impl<'db> From<TerminalRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38473    fn from(ptr: TerminalRBracePtr<'db>) -> Self {
38474        ptr.untyped()
38475    }
38476}
38477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38478pub struct TerminalRBraceGreen<'db>(pub GreenId<'db>);
38479impl<'db> TypedSyntaxNode<'db> for TerminalRBrace<'db> {
38480    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
38481    type StablePtr = TerminalRBracePtr<'db>;
38482    type Green = TerminalRBraceGreen<'db>;
38483    fn missing(db: &'db dyn Database) -> Self::Green {
38484        TerminalRBraceGreen(
38485            GreenNode {
38486                kind: SyntaxKind::TerminalRBrace,
38487                details: GreenNodeDetails::Node {
38488                    children: [
38489                        Trivia::missing(db).0,
38490                        TokenRBrace::missing(db).0,
38491                        Trivia::missing(db).0,
38492                    ]
38493                    .into(),
38494                    width: TextWidth::default(),
38495                },
38496            }
38497            .intern(db),
38498        )
38499    }
38500    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38501        let kind = node.kind(db);
38502        assert_eq!(
38503            kind,
38504            SyntaxKind::TerminalRBrace,
38505            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38506            kind,
38507            SyntaxKind::TerminalRBrace
38508        );
38509        Self { node }
38510    }
38511    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38512        let kind = node.kind(db);
38513        if kind == SyntaxKind::TerminalRBrace {
38514            Some(Self::from_syntax_node(db, node))
38515        } else {
38516            None
38517        }
38518    }
38519    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38520        self.node
38521    }
38522    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38523        TerminalRBracePtr(self.node.stable_ptr(db))
38524    }
38525}
38526#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38527pub struct TokenRBrack<'db> {
38528    node: SyntaxNode<'db>,
38529}
38530impl<'db> Token<'db> for TokenRBrack<'db> {
38531    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38532        TokenRBrackGreen(
38533            GreenNode { kind: SyntaxKind::TokenRBrack, details: GreenNodeDetails::Token(text) }
38534                .intern(db),
38535        )
38536    }
38537    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38538        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38539    }
38540}
38541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38542pub struct TokenRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38543impl<'db> TypedStablePtr<'db> for TokenRBrackPtr<'db> {
38544    type SyntaxNode = TokenRBrack<'db>;
38545    fn untyped(self) -> SyntaxStablePtrId<'db> {
38546        self.0
38547    }
38548    fn lookup(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38549        TokenRBrack::from_syntax_node(db, self.0.lookup(db))
38550    }
38551}
38552impl<'db> From<TokenRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38553    fn from(ptr: TokenRBrackPtr<'db>) -> Self {
38554        ptr.untyped()
38555    }
38556}
38557#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38558pub struct TokenRBrackGreen<'db>(pub GreenId<'db>);
38559impl<'db> TokenRBrackGreen<'db> {
38560    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38561        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38562    }
38563}
38564impl<'db> TypedSyntaxNode<'db> for TokenRBrack<'db> {
38565    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
38566    type StablePtr = TokenRBrackPtr<'db>;
38567    type Green = TokenRBrackGreen<'db>;
38568    fn missing(db: &'db dyn Database) -> Self::Green {
38569        TokenRBrackGreen(
38570            GreenNode {
38571                kind: SyntaxKind::TokenMissing,
38572                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38573            }
38574            .intern(db),
38575        )
38576    }
38577    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38578        match node.long(db).green.long(db).details {
38579            GreenNodeDetails::Token(_) => Self { node },
38580            GreenNodeDetails::Node { .. } => {
38581                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
38582            }
38583        }
38584    }
38585    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38586        match node.long(db).green.long(db).details {
38587            GreenNodeDetails::Token(_) => Some(Self { node }),
38588            GreenNodeDetails::Node { .. } => None,
38589        }
38590    }
38591    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38592        self.node
38593    }
38594    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38595        TokenRBrackPtr(self.node.stable_ptr(db))
38596    }
38597}
38598#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38599pub struct TerminalRBrack<'db> {
38600    node: SyntaxNode<'db>,
38601}
38602impl<'db> Terminal<'db> for TerminalRBrack<'db> {
38603    const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
38604    type TokenType = TokenRBrack<'db>;
38605    fn new_green(
38606        db: &'db dyn Database,
38607        leading_trivia: TriviaGreen<'db>,
38608        token: <<TerminalRBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38609        trailing_trivia: TriviaGreen<'db>,
38610    ) -> Self::Green {
38611        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38612        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38613        TerminalRBrackGreen(
38614            GreenNode {
38615                kind: SyntaxKind::TerminalRBrack,
38616                details: GreenNodeDetails::Node { children: children.into(), width },
38617            }
38618            .intern(db),
38619        )
38620    }
38621    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38622        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38623        else {
38624            unreachable!("Expected a node, not a token");
38625        };
38626        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38627    }
38628}
38629impl<'db> TerminalRBrack<'db> {
38630    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38631        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38632    }
38633    pub fn token(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38634        TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
38635    }
38636    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38637        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38638    }
38639}
38640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38641pub struct TerminalRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38642impl<'db> TerminalRBrackPtr<'db> {}
38643impl<'db> TypedStablePtr<'db> for TerminalRBrackPtr<'db> {
38644    type SyntaxNode = TerminalRBrack<'db>;
38645    fn untyped(self) -> SyntaxStablePtrId<'db> {
38646        self.0
38647    }
38648    fn lookup(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
38649        TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
38650    }
38651}
38652impl<'db> From<TerminalRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38653    fn from(ptr: TerminalRBrackPtr<'db>) -> Self {
38654        ptr.untyped()
38655    }
38656}
38657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38658pub struct TerminalRBrackGreen<'db>(pub GreenId<'db>);
38659impl<'db> TypedSyntaxNode<'db> for TerminalRBrack<'db> {
38660    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
38661    type StablePtr = TerminalRBrackPtr<'db>;
38662    type Green = TerminalRBrackGreen<'db>;
38663    fn missing(db: &'db dyn Database) -> Self::Green {
38664        TerminalRBrackGreen(
38665            GreenNode {
38666                kind: SyntaxKind::TerminalRBrack,
38667                details: GreenNodeDetails::Node {
38668                    children: [
38669                        Trivia::missing(db).0,
38670                        TokenRBrack::missing(db).0,
38671                        Trivia::missing(db).0,
38672                    ]
38673                    .into(),
38674                    width: TextWidth::default(),
38675                },
38676            }
38677            .intern(db),
38678        )
38679    }
38680    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38681        let kind = node.kind(db);
38682        assert_eq!(
38683            kind,
38684            SyntaxKind::TerminalRBrack,
38685            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38686            kind,
38687            SyntaxKind::TerminalRBrack
38688        );
38689        Self { node }
38690    }
38691    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38692        let kind = node.kind(db);
38693        if kind == SyntaxKind::TerminalRBrack {
38694            Some(Self::from_syntax_node(db, node))
38695        } else {
38696            None
38697        }
38698    }
38699    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38700        self.node
38701    }
38702    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38703        TerminalRBrackPtr(self.node.stable_ptr(db))
38704    }
38705}
38706#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38707pub struct TokenRParen<'db> {
38708    node: SyntaxNode<'db>,
38709}
38710impl<'db> Token<'db> for TokenRParen<'db> {
38711    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38712        TokenRParenGreen(
38713            GreenNode { kind: SyntaxKind::TokenRParen, details: GreenNodeDetails::Token(text) }
38714                .intern(db),
38715        )
38716    }
38717    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38718        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38719    }
38720}
38721#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38722pub struct TokenRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38723impl<'db> TypedStablePtr<'db> for TokenRParenPtr<'db> {
38724    type SyntaxNode = TokenRParen<'db>;
38725    fn untyped(self) -> SyntaxStablePtrId<'db> {
38726        self.0
38727    }
38728    fn lookup(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38729        TokenRParen::from_syntax_node(db, self.0.lookup(db))
38730    }
38731}
38732impl<'db> From<TokenRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38733    fn from(ptr: TokenRParenPtr<'db>) -> Self {
38734        ptr.untyped()
38735    }
38736}
38737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38738pub struct TokenRParenGreen<'db>(pub GreenId<'db>);
38739impl<'db> TokenRParenGreen<'db> {
38740    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38741        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38742    }
38743}
38744impl<'db> TypedSyntaxNode<'db> for TokenRParen<'db> {
38745    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
38746    type StablePtr = TokenRParenPtr<'db>;
38747    type Green = TokenRParenGreen<'db>;
38748    fn missing(db: &'db dyn Database) -> Self::Green {
38749        TokenRParenGreen(
38750            GreenNode {
38751                kind: SyntaxKind::TokenMissing,
38752                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38753            }
38754            .intern(db),
38755        )
38756    }
38757    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38758        match node.long(db).green.long(db).details {
38759            GreenNodeDetails::Token(_) => Self { node },
38760            GreenNodeDetails::Node { .. } => {
38761                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
38762            }
38763        }
38764    }
38765    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38766        match node.long(db).green.long(db).details {
38767            GreenNodeDetails::Token(_) => Some(Self { node }),
38768            GreenNodeDetails::Node { .. } => None,
38769        }
38770    }
38771    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38772        self.node
38773    }
38774    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38775        TokenRParenPtr(self.node.stable_ptr(db))
38776    }
38777}
38778#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38779pub struct TerminalRParen<'db> {
38780    node: SyntaxNode<'db>,
38781}
38782impl<'db> Terminal<'db> for TerminalRParen<'db> {
38783    const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
38784    type TokenType = TokenRParen<'db>;
38785    fn new_green(
38786        db: &'db dyn Database,
38787        leading_trivia: TriviaGreen<'db>,
38788        token: <<TerminalRParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38789        trailing_trivia: TriviaGreen<'db>,
38790    ) -> Self::Green {
38791        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38792        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38793        TerminalRParenGreen(
38794            GreenNode {
38795                kind: SyntaxKind::TerminalRParen,
38796                details: GreenNodeDetails::Node { children: children.into(), width },
38797            }
38798            .intern(db),
38799        )
38800    }
38801    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38802        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38803        else {
38804            unreachable!("Expected a node, not a token");
38805        };
38806        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38807    }
38808}
38809impl<'db> TerminalRParen<'db> {
38810    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38811        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38812    }
38813    pub fn token(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38814        TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
38815    }
38816    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38817        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38818    }
38819}
38820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38821pub struct TerminalRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38822impl<'db> TerminalRParenPtr<'db> {}
38823impl<'db> TypedStablePtr<'db> for TerminalRParenPtr<'db> {
38824    type SyntaxNode = TerminalRParen<'db>;
38825    fn untyped(self) -> SyntaxStablePtrId<'db> {
38826        self.0
38827    }
38828    fn lookup(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
38829        TerminalRParen::from_syntax_node(db, self.0.lookup(db))
38830    }
38831}
38832impl<'db> From<TerminalRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38833    fn from(ptr: TerminalRParenPtr<'db>) -> Self {
38834        ptr.untyped()
38835    }
38836}
38837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38838pub struct TerminalRParenGreen<'db>(pub GreenId<'db>);
38839impl<'db> TypedSyntaxNode<'db> for TerminalRParen<'db> {
38840    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
38841    type StablePtr = TerminalRParenPtr<'db>;
38842    type Green = TerminalRParenGreen<'db>;
38843    fn missing(db: &'db dyn Database) -> Self::Green {
38844        TerminalRParenGreen(
38845            GreenNode {
38846                kind: SyntaxKind::TerminalRParen,
38847                details: GreenNodeDetails::Node {
38848                    children: [
38849                        Trivia::missing(db).0,
38850                        TokenRParen::missing(db).0,
38851                        Trivia::missing(db).0,
38852                    ]
38853                    .into(),
38854                    width: TextWidth::default(),
38855                },
38856            }
38857            .intern(db),
38858        )
38859    }
38860    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38861        let kind = node.kind(db);
38862        assert_eq!(
38863            kind,
38864            SyntaxKind::TerminalRParen,
38865            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38866            kind,
38867            SyntaxKind::TerminalRParen
38868        );
38869        Self { node }
38870    }
38871    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38872        let kind = node.kind(db);
38873        if kind == SyntaxKind::TerminalRParen {
38874            Some(Self::from_syntax_node(db, node))
38875        } else {
38876            None
38877        }
38878    }
38879    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38880        self.node
38881    }
38882    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38883        TerminalRParenPtr(self.node.stable_ptr(db))
38884    }
38885}
38886#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38887pub struct TokenSemicolon<'db> {
38888    node: SyntaxNode<'db>,
38889}
38890impl<'db> Token<'db> for TokenSemicolon<'db> {
38891    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38892        TokenSemicolonGreen(
38893            GreenNode { kind: SyntaxKind::TokenSemicolon, details: GreenNodeDetails::Token(text) }
38894                .intern(db),
38895        )
38896    }
38897    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38898        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
38899    }
38900}
38901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38902pub struct TokenSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38903impl<'db> TypedStablePtr<'db> for TokenSemicolonPtr<'db> {
38904    type SyntaxNode = TokenSemicolon<'db>;
38905    fn untyped(self) -> SyntaxStablePtrId<'db> {
38906        self.0
38907    }
38908    fn lookup(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38909        TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
38910    }
38911}
38912impl<'db> From<TokenSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38913    fn from(ptr: TokenSemicolonPtr<'db>) -> Self {
38914        ptr.untyped()
38915    }
38916}
38917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38918pub struct TokenSemicolonGreen<'db>(pub GreenId<'db>);
38919impl<'db> TokenSemicolonGreen<'db> {
38920    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38921        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38922    }
38923}
38924impl<'db> TypedSyntaxNode<'db> for TokenSemicolon<'db> {
38925    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
38926    type StablePtr = TokenSemicolonPtr<'db>;
38927    type Green = TokenSemicolonGreen<'db>;
38928    fn missing(db: &'db dyn Database) -> Self::Green {
38929        TokenSemicolonGreen(
38930            GreenNode {
38931                kind: SyntaxKind::TokenMissing,
38932                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38933            }
38934            .intern(db),
38935        )
38936    }
38937    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38938        match node.long(db).green.long(db).details {
38939            GreenNodeDetails::Token(_) => Self { node },
38940            GreenNodeDetails::Node { .. } => {
38941                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
38942            }
38943        }
38944    }
38945    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38946        match node.long(db).green.long(db).details {
38947            GreenNodeDetails::Token(_) => Some(Self { node }),
38948            GreenNodeDetails::Node { .. } => None,
38949        }
38950    }
38951    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38952        self.node
38953    }
38954    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38955        TokenSemicolonPtr(self.node.stable_ptr(db))
38956    }
38957}
38958#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38959pub struct TerminalSemicolon<'db> {
38960    node: SyntaxNode<'db>,
38961}
38962impl<'db> Terminal<'db> for TerminalSemicolon<'db> {
38963    const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
38964    type TokenType = TokenSemicolon<'db>;
38965    fn new_green(
38966        db: &'db dyn Database,
38967        leading_trivia: TriviaGreen<'db>,
38968        token: <<TerminalSemicolon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38969        trailing_trivia: TriviaGreen<'db>,
38970    ) -> Self::Green {
38971        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38972        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38973        TerminalSemicolonGreen(
38974            GreenNode {
38975                kind: SyntaxKind::TerminalSemicolon,
38976                details: GreenNodeDetails::Node { children: children.into(), width },
38977            }
38978            .intern(db),
38979        )
38980    }
38981    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38982        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
38983        else {
38984            unreachable!("Expected a node, not a token");
38985        };
38986        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38987    }
38988}
38989impl<'db> TerminalSemicolon<'db> {
38990    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38991        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38992    }
38993    pub fn token(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38994        TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
38995    }
38996    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38997        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38998    }
38999}
39000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39001pub struct TerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
39002impl<'db> TerminalSemicolonPtr<'db> {}
39003impl<'db> TypedStablePtr<'db> for TerminalSemicolonPtr<'db> {
39004    type SyntaxNode = TerminalSemicolon<'db>;
39005    fn untyped(self) -> SyntaxStablePtrId<'db> {
39006        self.0
39007    }
39008    fn lookup(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
39009        TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
39010    }
39011}
39012impl<'db> From<TerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
39013    fn from(ptr: TerminalSemicolonPtr<'db>) -> Self {
39014        ptr.untyped()
39015    }
39016}
39017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39018pub struct TerminalSemicolonGreen<'db>(pub GreenId<'db>);
39019impl<'db> TypedSyntaxNode<'db> for TerminalSemicolon<'db> {
39020    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
39021    type StablePtr = TerminalSemicolonPtr<'db>;
39022    type Green = TerminalSemicolonGreen<'db>;
39023    fn missing(db: &'db dyn Database) -> Self::Green {
39024        TerminalSemicolonGreen(
39025            GreenNode {
39026                kind: SyntaxKind::TerminalSemicolon,
39027                details: GreenNodeDetails::Node {
39028                    children: [
39029                        Trivia::missing(db).0,
39030                        TokenSemicolon::missing(db).0,
39031                        Trivia::missing(db).0,
39032                    ]
39033                    .into(),
39034                    width: TextWidth::default(),
39035                },
39036            }
39037            .intern(db),
39038        )
39039    }
39040    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39041        let kind = node.kind(db);
39042        assert_eq!(
39043            kind,
39044            SyntaxKind::TerminalSemicolon,
39045            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39046            kind,
39047            SyntaxKind::TerminalSemicolon
39048        );
39049        Self { node }
39050    }
39051    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39052        let kind = node.kind(db);
39053        if kind == SyntaxKind::TerminalSemicolon {
39054            Some(Self::from_syntax_node(db, node))
39055        } else {
39056            None
39057        }
39058    }
39059    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39060        self.node
39061    }
39062    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39063        TerminalSemicolonPtr(self.node.stable_ptr(db))
39064    }
39065}
39066#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39067pub struct TokenUnderscore<'db> {
39068    node: SyntaxNode<'db>,
39069}
39070impl<'db> Token<'db> for TokenUnderscore<'db> {
39071    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39072        TokenUnderscoreGreen(
39073            GreenNode { kind: SyntaxKind::TokenUnderscore, details: GreenNodeDetails::Token(text) }
39074                .intern(db),
39075        )
39076    }
39077    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39078        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39079    }
39080}
39081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39082pub struct TokenUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
39083impl<'db> TypedStablePtr<'db> for TokenUnderscorePtr<'db> {
39084    type SyntaxNode = TokenUnderscore<'db>;
39085    fn untyped(self) -> SyntaxStablePtrId<'db> {
39086        self.0
39087    }
39088    fn lookup(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
39089        TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
39090    }
39091}
39092impl<'db> From<TokenUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
39093    fn from(ptr: TokenUnderscorePtr<'db>) -> Self {
39094        ptr.untyped()
39095    }
39096}
39097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39098pub struct TokenUnderscoreGreen<'db>(pub GreenId<'db>);
39099impl<'db> TokenUnderscoreGreen<'db> {
39100    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39101        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39102    }
39103}
39104impl<'db> TypedSyntaxNode<'db> for TokenUnderscore<'db> {
39105    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
39106    type StablePtr = TokenUnderscorePtr<'db>;
39107    type Green = TokenUnderscoreGreen<'db>;
39108    fn missing(db: &'db dyn Database) -> Self::Green {
39109        TokenUnderscoreGreen(
39110            GreenNode {
39111                kind: SyntaxKind::TokenMissing,
39112                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39113            }
39114            .intern(db),
39115        )
39116    }
39117    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39118        match node.long(db).green.long(db).details {
39119            GreenNodeDetails::Token(_) => Self { node },
39120            GreenNodeDetails::Node { .. } => {
39121                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
39122            }
39123        }
39124    }
39125    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39126        match node.long(db).green.long(db).details {
39127            GreenNodeDetails::Token(_) => Some(Self { node }),
39128            GreenNodeDetails::Node { .. } => None,
39129        }
39130    }
39131    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39132        self.node
39133    }
39134    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39135        TokenUnderscorePtr(self.node.stable_ptr(db))
39136    }
39137}
39138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39139pub struct TerminalUnderscore<'db> {
39140    node: SyntaxNode<'db>,
39141}
39142impl<'db> Terminal<'db> for TerminalUnderscore<'db> {
39143    const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
39144    type TokenType = TokenUnderscore<'db>;
39145    fn new_green(
39146        db: &'db dyn Database,
39147        leading_trivia: TriviaGreen<'db>,
39148        token: <<TerminalUnderscore<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39149        trailing_trivia: TriviaGreen<'db>,
39150    ) -> Self::Green {
39151        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39152        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39153        TerminalUnderscoreGreen(
39154            GreenNode {
39155                kind: SyntaxKind::TerminalUnderscore,
39156                details: GreenNodeDetails::Node { children: children.into(), width },
39157            }
39158            .intern(db),
39159        )
39160    }
39161    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39162        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
39163        else {
39164            unreachable!("Expected a node, not a token");
39165        };
39166        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39167    }
39168}
39169impl<'db> TerminalUnderscore<'db> {
39170    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39171        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39172    }
39173    pub fn token(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
39174        TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
39175    }
39176    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39177        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39178    }
39179}
39180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39181pub struct TerminalUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
39182impl<'db> TerminalUnderscorePtr<'db> {}
39183impl<'db> TypedStablePtr<'db> for TerminalUnderscorePtr<'db> {
39184    type SyntaxNode = TerminalUnderscore<'db>;
39185    fn untyped(self) -> SyntaxStablePtrId<'db> {
39186        self.0
39187    }
39188    fn lookup(&self, db: &'db dyn Database) -> TerminalUnderscore<'db> {
39189        TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
39190    }
39191}
39192impl<'db> From<TerminalUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
39193    fn from(ptr: TerminalUnderscorePtr<'db>) -> Self {
39194        ptr.untyped()
39195    }
39196}
39197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39198pub struct TerminalUnderscoreGreen<'db>(pub GreenId<'db>);
39199impl<'db> TypedSyntaxNode<'db> for TerminalUnderscore<'db> {
39200    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
39201    type StablePtr = TerminalUnderscorePtr<'db>;
39202    type Green = TerminalUnderscoreGreen<'db>;
39203    fn missing(db: &'db dyn Database) -> Self::Green {
39204        TerminalUnderscoreGreen(
39205            GreenNode {
39206                kind: SyntaxKind::TerminalUnderscore,
39207                details: GreenNodeDetails::Node {
39208                    children: [
39209                        Trivia::missing(db).0,
39210                        TokenUnderscore::missing(db).0,
39211                        Trivia::missing(db).0,
39212                    ]
39213                    .into(),
39214                    width: TextWidth::default(),
39215                },
39216            }
39217            .intern(db),
39218        )
39219    }
39220    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39221        let kind = node.kind(db);
39222        assert_eq!(
39223            kind,
39224            SyntaxKind::TerminalUnderscore,
39225            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39226            kind,
39227            SyntaxKind::TerminalUnderscore
39228        );
39229        Self { node }
39230    }
39231    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39232        let kind = node.kind(db);
39233        if kind == SyntaxKind::TerminalUnderscore {
39234            Some(Self::from_syntax_node(db, node))
39235        } else {
39236            None
39237        }
39238    }
39239    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39240        self.node
39241    }
39242    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39243        TerminalUnderscorePtr(self.node.stable_ptr(db))
39244    }
39245}
39246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39247pub struct TokenXor<'db> {
39248    node: SyntaxNode<'db>,
39249}
39250impl<'db> Token<'db> for TokenXor<'db> {
39251    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39252        TokenXorGreen(
39253            GreenNode { kind: SyntaxKind::TokenXor, details: GreenNodeDetails::Token(text) }
39254                .intern(db),
39255        )
39256    }
39257    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39258        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39259    }
39260}
39261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39262pub struct TokenXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39263impl<'db> TypedStablePtr<'db> for TokenXorPtr<'db> {
39264    type SyntaxNode = TokenXor<'db>;
39265    fn untyped(self) -> SyntaxStablePtrId<'db> {
39266        self.0
39267    }
39268    fn lookup(&self, db: &'db dyn Database) -> TokenXor<'db> {
39269        TokenXor::from_syntax_node(db, self.0.lookup(db))
39270    }
39271}
39272impl<'db> From<TokenXorPtr<'db>> for SyntaxStablePtrId<'db> {
39273    fn from(ptr: TokenXorPtr<'db>) -> Self {
39274        ptr.untyped()
39275    }
39276}
39277#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39278pub struct TokenXorGreen<'db>(pub GreenId<'db>);
39279impl<'db> TokenXorGreen<'db> {
39280    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39281        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39282    }
39283}
39284impl<'db> TypedSyntaxNode<'db> for TokenXor<'db> {
39285    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
39286    type StablePtr = TokenXorPtr<'db>;
39287    type Green = TokenXorGreen<'db>;
39288    fn missing(db: &'db dyn Database) -> Self::Green {
39289        TokenXorGreen(
39290            GreenNode {
39291                kind: SyntaxKind::TokenMissing,
39292                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39293            }
39294            .intern(db),
39295        )
39296    }
39297    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39298        match node.long(db).green.long(db).details {
39299            GreenNodeDetails::Token(_) => Self { node },
39300            GreenNodeDetails::Node { .. } => {
39301                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
39302            }
39303        }
39304    }
39305    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39306        match node.long(db).green.long(db).details {
39307            GreenNodeDetails::Token(_) => Some(Self { node }),
39308            GreenNodeDetails::Node { .. } => None,
39309        }
39310    }
39311    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39312        self.node
39313    }
39314    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39315        TokenXorPtr(self.node.stable_ptr(db))
39316    }
39317}
39318#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39319pub struct TerminalXor<'db> {
39320    node: SyntaxNode<'db>,
39321}
39322impl<'db> Terminal<'db> for TerminalXor<'db> {
39323    const KIND: SyntaxKind = SyntaxKind::TerminalXor;
39324    type TokenType = TokenXor<'db>;
39325    fn new_green(
39326        db: &'db dyn Database,
39327        leading_trivia: TriviaGreen<'db>,
39328        token: <<TerminalXor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39329        trailing_trivia: TriviaGreen<'db>,
39330    ) -> Self::Green {
39331        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39332        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39333        TerminalXorGreen(
39334            GreenNode {
39335                kind: SyntaxKind::TerminalXor,
39336                details: GreenNodeDetails::Node { children: children.into(), width },
39337            }
39338            .intern(db),
39339        )
39340    }
39341    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39342        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
39343        else {
39344            unreachable!("Expected a node, not a token");
39345        };
39346        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39347    }
39348}
39349impl<'db> TerminalXor<'db> {
39350    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39351        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39352    }
39353    pub fn token(&self, db: &'db dyn Database) -> TokenXor<'db> {
39354        TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
39355    }
39356    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39357        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39358    }
39359}
39360#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39361pub struct TerminalXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39362impl<'db> TerminalXorPtr<'db> {}
39363impl<'db> TypedStablePtr<'db> for TerminalXorPtr<'db> {
39364    type SyntaxNode = TerminalXor<'db>;
39365    fn untyped(self) -> SyntaxStablePtrId<'db> {
39366        self.0
39367    }
39368    fn lookup(&self, db: &'db dyn Database) -> TerminalXor<'db> {
39369        TerminalXor::from_syntax_node(db, self.0.lookup(db))
39370    }
39371}
39372impl<'db> From<TerminalXorPtr<'db>> for SyntaxStablePtrId<'db> {
39373    fn from(ptr: TerminalXorPtr<'db>) -> Self {
39374        ptr.untyped()
39375    }
39376}
39377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39378pub struct TerminalXorGreen<'db>(pub GreenId<'db>);
39379impl<'db> TypedSyntaxNode<'db> for TerminalXor<'db> {
39380    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
39381    type StablePtr = TerminalXorPtr<'db>;
39382    type Green = TerminalXorGreen<'db>;
39383    fn missing(db: &'db dyn Database) -> Self::Green {
39384        TerminalXorGreen(
39385            GreenNode {
39386                kind: SyntaxKind::TerminalXor,
39387                details: GreenNodeDetails::Node {
39388                    children: [
39389                        Trivia::missing(db).0,
39390                        TokenXor::missing(db).0,
39391                        Trivia::missing(db).0,
39392                    ]
39393                    .into(),
39394                    width: TextWidth::default(),
39395                },
39396            }
39397            .intern(db),
39398        )
39399    }
39400    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39401        let kind = node.kind(db);
39402        assert_eq!(
39403            kind,
39404            SyntaxKind::TerminalXor,
39405            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39406            kind,
39407            SyntaxKind::TerminalXor
39408        );
39409        Self { node }
39410    }
39411    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39412        let kind = node.kind(db);
39413        if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
39414    }
39415    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39416        self.node
39417    }
39418    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39419        TerminalXorPtr(self.node.stable_ptr(db))
39420    }
39421}
39422#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39423pub struct SyntaxFile<'db> {
39424    node: SyntaxNode<'db>,
39425}
39426impl<'db> SyntaxFile<'db> {
39427    pub const INDEX_ITEMS: usize = 0;
39428    pub const INDEX_EOF: usize = 1;
39429    pub fn new_green(
39430        db: &'db dyn Database,
39431        items: ModuleItemListGreen<'db>,
39432        eof: TerminalEndOfFileGreen<'db>,
39433    ) -> SyntaxFileGreen<'db> {
39434        let children = [items.0, eof.0];
39435        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39436        SyntaxFileGreen(
39437            GreenNode {
39438                kind: SyntaxKind::SyntaxFile,
39439                details: GreenNodeDetails::Node { children: children.into(), width },
39440            }
39441            .intern(db),
39442        )
39443    }
39444}
39445impl<'db> SyntaxFile<'db> {
39446    pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
39447        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
39448    }
39449    pub fn eof(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
39450        TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
39451    }
39452}
39453#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39454pub struct SyntaxFilePtr<'db>(pub SyntaxStablePtrId<'db>);
39455impl<'db> SyntaxFilePtr<'db> {}
39456impl<'db> TypedStablePtr<'db> for SyntaxFilePtr<'db> {
39457    type SyntaxNode = SyntaxFile<'db>;
39458    fn untyped(self) -> SyntaxStablePtrId<'db> {
39459        self.0
39460    }
39461    fn lookup(&self, db: &'db dyn Database) -> SyntaxFile<'db> {
39462        SyntaxFile::from_syntax_node(db, self.0.lookup(db))
39463    }
39464}
39465impl<'db> From<SyntaxFilePtr<'db>> for SyntaxStablePtrId<'db> {
39466    fn from(ptr: SyntaxFilePtr<'db>) -> Self {
39467        ptr.untyped()
39468    }
39469}
39470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39471pub struct SyntaxFileGreen<'db>(pub GreenId<'db>);
39472impl<'db> TypedSyntaxNode<'db> for SyntaxFile<'db> {
39473    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
39474    type StablePtr = SyntaxFilePtr<'db>;
39475    type Green = SyntaxFileGreen<'db>;
39476    fn missing(db: &'db dyn Database) -> Self::Green {
39477        SyntaxFileGreen(
39478            GreenNode {
39479                kind: SyntaxKind::SyntaxFile,
39480                details: GreenNodeDetails::Node {
39481                    children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
39482                        .into(),
39483                    width: TextWidth::default(),
39484                },
39485            }
39486            .intern(db),
39487        )
39488    }
39489    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39490        let kind = node.kind(db);
39491        assert_eq!(
39492            kind,
39493            SyntaxKind::SyntaxFile,
39494            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39495            kind,
39496            SyntaxKind::SyntaxFile
39497        );
39498        Self { node }
39499    }
39500    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39501        let kind = node.kind(db);
39502        if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
39503    }
39504    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39505        self.node
39506    }
39507    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39508        SyntaxFilePtr(self.node.stable_ptr(db))
39509    }
39510}
39511#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39512pub struct TokenEmpty<'db> {
39513    node: SyntaxNode<'db>,
39514}
39515impl<'db> Token<'db> for TokenEmpty<'db> {
39516    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39517        TokenEmptyGreen(
39518            GreenNode { kind: SyntaxKind::TokenEmpty, details: GreenNodeDetails::Token(text) }
39519                .intern(db),
39520        )
39521    }
39522    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39523        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39524    }
39525}
39526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39527pub struct TokenEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39528impl<'db> TypedStablePtr<'db> for TokenEmptyPtr<'db> {
39529    type SyntaxNode = TokenEmpty<'db>;
39530    fn untyped(self) -> SyntaxStablePtrId<'db> {
39531        self.0
39532    }
39533    fn lookup(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39534        TokenEmpty::from_syntax_node(db, self.0.lookup(db))
39535    }
39536}
39537impl<'db> From<TokenEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39538    fn from(ptr: TokenEmptyPtr<'db>) -> Self {
39539        ptr.untyped()
39540    }
39541}
39542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39543pub struct TokenEmptyGreen<'db>(pub GreenId<'db>);
39544impl<'db> TokenEmptyGreen<'db> {
39545    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39546        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39547    }
39548}
39549impl<'db> TypedSyntaxNode<'db> for TokenEmpty<'db> {
39550    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
39551    type StablePtr = TokenEmptyPtr<'db>;
39552    type Green = TokenEmptyGreen<'db>;
39553    fn missing(db: &'db dyn Database) -> Self::Green {
39554        TokenEmptyGreen(
39555            GreenNode {
39556                kind: SyntaxKind::TokenMissing,
39557                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39558            }
39559            .intern(db),
39560        )
39561    }
39562    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39563        match node.long(db).green.long(db).details {
39564            GreenNodeDetails::Token(_) => Self { node },
39565            GreenNodeDetails::Node { .. } => {
39566                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
39567            }
39568        }
39569    }
39570    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39571        match node.long(db).green.long(db).details {
39572            GreenNodeDetails::Token(_) => Some(Self { node }),
39573            GreenNodeDetails::Node { .. } => None,
39574        }
39575    }
39576    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39577        self.node
39578    }
39579    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39580        TokenEmptyPtr(self.node.stable_ptr(db))
39581    }
39582}
39583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39584pub struct TerminalEmpty<'db> {
39585    node: SyntaxNode<'db>,
39586}
39587impl<'db> Terminal<'db> for TerminalEmpty<'db> {
39588    const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
39589    type TokenType = TokenEmpty<'db>;
39590    fn new_green(
39591        db: &'db dyn Database,
39592        leading_trivia: TriviaGreen<'db>,
39593        token: <<TerminalEmpty<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39594        trailing_trivia: TriviaGreen<'db>,
39595    ) -> Self::Green {
39596        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39597        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39598        TerminalEmptyGreen(
39599            GreenNode {
39600                kind: SyntaxKind::TerminalEmpty,
39601                details: GreenNodeDetails::Node { children: children.into(), width },
39602            }
39603            .intern(db),
39604        )
39605    }
39606    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39607        let GreenNodeDetails::Node { children, .. } = &self.node.long(db).green.long(db).details
39608        else {
39609            unreachable!("Expected a node, not a token");
39610        };
39611        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39612    }
39613}
39614impl<'db> TerminalEmpty<'db> {
39615    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39616        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39617    }
39618    pub fn token(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39619        TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
39620    }
39621    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39622        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39623    }
39624}
39625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39626pub struct TerminalEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39627impl<'db> TerminalEmptyPtr<'db> {}
39628impl<'db> TypedStablePtr<'db> for TerminalEmptyPtr<'db> {
39629    type SyntaxNode = TerminalEmpty<'db>;
39630    fn untyped(self) -> SyntaxStablePtrId<'db> {
39631        self.0
39632    }
39633    fn lookup(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
39634        TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
39635    }
39636}
39637impl<'db> From<TerminalEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39638    fn from(ptr: TerminalEmptyPtr<'db>) -> Self {
39639        ptr.untyped()
39640    }
39641}
39642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39643pub struct TerminalEmptyGreen<'db>(pub GreenId<'db>);
39644impl<'db> TypedSyntaxNode<'db> for TerminalEmpty<'db> {
39645    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
39646    type StablePtr = TerminalEmptyPtr<'db>;
39647    type Green = TerminalEmptyGreen<'db>;
39648    fn missing(db: &'db dyn Database) -> Self::Green {
39649        TerminalEmptyGreen(
39650            GreenNode {
39651                kind: SyntaxKind::TerminalEmpty,
39652                details: GreenNodeDetails::Node {
39653                    children: [
39654                        Trivia::missing(db).0,
39655                        TokenEmpty::missing(db).0,
39656                        Trivia::missing(db).0,
39657                    ]
39658                    .into(),
39659                    width: TextWidth::default(),
39660                },
39661            }
39662            .intern(db),
39663        )
39664    }
39665    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39666        let kind = node.kind(db);
39667        assert_eq!(
39668            kind,
39669            SyntaxKind::TerminalEmpty,
39670            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39671            kind,
39672            SyntaxKind::TerminalEmpty
39673        );
39674        Self { node }
39675    }
39676    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39677        let kind = node.kind(db);
39678        if kind == SyntaxKind::TerminalEmpty {
39679            Some(Self::from_syntax_node(db, node))
39680        } else {
39681            None
39682        }
39683    }
39684    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39685        self.node
39686    }
39687    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39688        TerminalEmptyPtr(self.node.stable_ptr(db))
39689    }
39690}
39691#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39692pub struct TokenSingleLineComment<'db> {
39693    node: SyntaxNode<'db>,
39694}
39695impl<'db> Token<'db> for TokenSingleLineComment<'db> {
39696    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39697        TokenSingleLineCommentGreen(
39698            GreenNode {
39699                kind: SyntaxKind::TokenSingleLineComment,
39700                details: GreenNodeDetails::Token(text),
39701            }
39702            .intern(db),
39703        )
39704    }
39705    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39706        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39707    }
39708}
39709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39710pub struct TokenSingleLineCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39711impl<'db> TypedStablePtr<'db> for TokenSingleLineCommentPtr<'db> {
39712    type SyntaxNode = TokenSingleLineComment<'db>;
39713    fn untyped(self) -> SyntaxStablePtrId<'db> {
39714        self.0
39715    }
39716    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineComment<'db> {
39717        TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
39718    }
39719}
39720impl<'db> From<TokenSingleLineCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39721    fn from(ptr: TokenSingleLineCommentPtr<'db>) -> Self {
39722        ptr.untyped()
39723    }
39724}
39725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39726pub struct TokenSingleLineCommentGreen<'db>(pub GreenId<'db>);
39727impl<'db> TokenSingleLineCommentGreen<'db> {
39728    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39729        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39730    }
39731}
39732impl<'db> TypedSyntaxNode<'db> for TokenSingleLineComment<'db> {
39733    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
39734    type StablePtr = TokenSingleLineCommentPtr<'db>;
39735    type Green = TokenSingleLineCommentGreen<'db>;
39736    fn missing(db: &'db dyn Database) -> Self::Green {
39737        TokenSingleLineCommentGreen(
39738            GreenNode {
39739                kind: SyntaxKind::TokenMissing,
39740                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39741            }
39742            .intern(db),
39743        )
39744    }
39745    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39746        match node.long(db).green.long(db).details {
39747            GreenNodeDetails::Token(_) => Self { node },
39748            GreenNodeDetails::Node { .. } => panic!(
39749                "Expected a token {:?}, not an internal node",
39750                SyntaxKind::TokenSingleLineComment
39751            ),
39752        }
39753    }
39754    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39755        match node.long(db).green.long(db).details {
39756            GreenNodeDetails::Token(_) => Some(Self { node }),
39757            GreenNodeDetails::Node { .. } => None,
39758        }
39759    }
39760    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39761        self.node
39762    }
39763    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39764        TokenSingleLineCommentPtr(self.node.stable_ptr(db))
39765    }
39766}
39767#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39768pub struct TokenSingleLineInnerComment<'db> {
39769    node: SyntaxNode<'db>,
39770}
39771impl<'db> Token<'db> for TokenSingleLineInnerComment<'db> {
39772    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39773        TokenSingleLineInnerCommentGreen(
39774            GreenNode {
39775                kind: SyntaxKind::TokenSingleLineInnerComment,
39776                details: GreenNodeDetails::Token(text),
39777            }
39778            .intern(db),
39779        )
39780    }
39781    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39782        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39783    }
39784}
39785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39786pub struct TokenSingleLineInnerCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39787impl<'db> TypedStablePtr<'db> for TokenSingleLineInnerCommentPtr<'db> {
39788    type SyntaxNode = TokenSingleLineInnerComment<'db>;
39789    fn untyped(self) -> SyntaxStablePtrId<'db> {
39790        self.0
39791    }
39792    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineInnerComment<'db> {
39793        TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
39794    }
39795}
39796impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39797    fn from(ptr: TokenSingleLineInnerCommentPtr<'db>) -> Self {
39798        ptr.untyped()
39799    }
39800}
39801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39802pub struct TokenSingleLineInnerCommentGreen<'db>(pub GreenId<'db>);
39803impl<'db> TokenSingleLineInnerCommentGreen<'db> {
39804    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39805        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39806    }
39807}
39808impl<'db> TypedSyntaxNode<'db> for TokenSingleLineInnerComment<'db> {
39809    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
39810    type StablePtr = TokenSingleLineInnerCommentPtr<'db>;
39811    type Green = TokenSingleLineInnerCommentGreen<'db>;
39812    fn missing(db: &'db dyn Database) -> Self::Green {
39813        TokenSingleLineInnerCommentGreen(
39814            GreenNode {
39815                kind: SyntaxKind::TokenMissing,
39816                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39817            }
39818            .intern(db),
39819        )
39820    }
39821    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39822        match node.long(db).green.long(db).details {
39823            GreenNodeDetails::Token(_) => Self { node },
39824            GreenNodeDetails::Node { .. } => panic!(
39825                "Expected a token {:?}, not an internal node",
39826                SyntaxKind::TokenSingleLineInnerComment
39827            ),
39828        }
39829    }
39830    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39831        match node.long(db).green.long(db).details {
39832            GreenNodeDetails::Token(_) => Some(Self { node }),
39833            GreenNodeDetails::Node { .. } => None,
39834        }
39835    }
39836    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39837        self.node
39838    }
39839    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39840        TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
39841    }
39842}
39843#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39844pub struct TokenSingleLineDocComment<'db> {
39845    node: SyntaxNode<'db>,
39846}
39847impl<'db> Token<'db> for TokenSingleLineDocComment<'db> {
39848    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39849        TokenSingleLineDocCommentGreen(
39850            GreenNode {
39851                kind: SyntaxKind::TokenSingleLineDocComment,
39852                details: GreenNodeDetails::Token(text),
39853            }
39854            .intern(db),
39855        )
39856    }
39857    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39858        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39859    }
39860}
39861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39862pub struct TokenSingleLineDocCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39863impl<'db> TypedStablePtr<'db> for TokenSingleLineDocCommentPtr<'db> {
39864    type SyntaxNode = TokenSingleLineDocComment<'db>;
39865    fn untyped(self) -> SyntaxStablePtrId<'db> {
39866        self.0
39867    }
39868    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineDocComment<'db> {
39869        TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
39870    }
39871}
39872impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39873    fn from(ptr: TokenSingleLineDocCommentPtr<'db>) -> Self {
39874        ptr.untyped()
39875    }
39876}
39877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39878pub struct TokenSingleLineDocCommentGreen<'db>(pub GreenId<'db>);
39879impl<'db> TokenSingleLineDocCommentGreen<'db> {
39880    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39881        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39882    }
39883}
39884impl<'db> TypedSyntaxNode<'db> for TokenSingleLineDocComment<'db> {
39885    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
39886    type StablePtr = TokenSingleLineDocCommentPtr<'db>;
39887    type Green = TokenSingleLineDocCommentGreen<'db>;
39888    fn missing(db: &'db dyn Database) -> Self::Green {
39889        TokenSingleLineDocCommentGreen(
39890            GreenNode {
39891                kind: SyntaxKind::TokenMissing,
39892                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39893            }
39894            .intern(db),
39895        )
39896    }
39897    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39898        match node.long(db).green.long(db).details {
39899            GreenNodeDetails::Token(_) => Self { node },
39900            GreenNodeDetails::Node { .. } => panic!(
39901                "Expected a token {:?}, not an internal node",
39902                SyntaxKind::TokenSingleLineDocComment
39903            ),
39904        }
39905    }
39906    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39907        match node.long(db).green.long(db).details {
39908            GreenNodeDetails::Token(_) => Some(Self { node }),
39909            GreenNodeDetails::Node { .. } => None,
39910        }
39911    }
39912    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39913        self.node
39914    }
39915    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39916        TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
39917    }
39918}
39919#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39920pub struct TokenWhitespace<'db> {
39921    node: SyntaxNode<'db>,
39922}
39923impl<'db> Token<'db> for TokenWhitespace<'db> {
39924    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39925        TokenWhitespaceGreen(
39926            GreenNode { kind: SyntaxKind::TokenWhitespace, details: GreenNodeDetails::Token(text) }
39927                .intern(db),
39928        )
39929    }
39930    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39931        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
39932    }
39933}
39934#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39935pub struct TokenWhitespacePtr<'db>(pub SyntaxStablePtrId<'db>);
39936impl<'db> TypedStablePtr<'db> for TokenWhitespacePtr<'db> {
39937    type SyntaxNode = TokenWhitespace<'db>;
39938    fn untyped(self) -> SyntaxStablePtrId<'db> {
39939        self.0
39940    }
39941    fn lookup(&self, db: &'db dyn Database) -> TokenWhitespace<'db> {
39942        TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
39943    }
39944}
39945impl<'db> From<TokenWhitespacePtr<'db>> for SyntaxStablePtrId<'db> {
39946    fn from(ptr: TokenWhitespacePtr<'db>) -> Self {
39947        ptr.untyped()
39948    }
39949}
39950#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39951pub struct TokenWhitespaceGreen<'db>(pub GreenId<'db>);
39952impl<'db> TokenWhitespaceGreen<'db> {
39953    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39954        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39955    }
39956}
39957impl<'db> TypedSyntaxNode<'db> for TokenWhitespace<'db> {
39958    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
39959    type StablePtr = TokenWhitespacePtr<'db>;
39960    type Green = TokenWhitespaceGreen<'db>;
39961    fn missing(db: &'db dyn Database) -> Self::Green {
39962        TokenWhitespaceGreen(
39963            GreenNode {
39964                kind: SyntaxKind::TokenMissing,
39965                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39966            }
39967            .intern(db),
39968        )
39969    }
39970    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39971        match node.long(db).green.long(db).details {
39972            GreenNodeDetails::Token(_) => Self { node },
39973            GreenNodeDetails::Node { .. } => {
39974                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
39975            }
39976        }
39977    }
39978    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39979        match node.long(db).green.long(db).details {
39980            GreenNodeDetails::Token(_) => Some(Self { node }),
39981            GreenNodeDetails::Node { .. } => None,
39982        }
39983    }
39984    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39985        self.node
39986    }
39987    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39988        TokenWhitespacePtr(self.node.stable_ptr(db))
39989    }
39990}
39991#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39992pub struct TokenNewline<'db> {
39993    node: SyntaxNode<'db>,
39994}
39995impl<'db> Token<'db> for TokenNewline<'db> {
39996    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39997        TokenNewlineGreen(
39998            GreenNode { kind: SyntaxKind::TokenNewline, details: GreenNodeDetails::Token(text) }
39999                .intern(db),
40000        )
40001    }
40002    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40003        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
40004    }
40005}
40006#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40007pub struct TokenNewlinePtr<'db>(pub SyntaxStablePtrId<'db>);
40008impl<'db> TypedStablePtr<'db> for TokenNewlinePtr<'db> {
40009    type SyntaxNode = TokenNewline<'db>;
40010    fn untyped(self) -> SyntaxStablePtrId<'db> {
40011        self.0
40012    }
40013    fn lookup(&self, db: &'db dyn Database) -> TokenNewline<'db> {
40014        TokenNewline::from_syntax_node(db, self.0.lookup(db))
40015    }
40016}
40017impl<'db> From<TokenNewlinePtr<'db>> for SyntaxStablePtrId<'db> {
40018    fn from(ptr: TokenNewlinePtr<'db>) -> Self {
40019        ptr.untyped()
40020    }
40021}
40022#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40023pub struct TokenNewlineGreen<'db>(pub GreenId<'db>);
40024impl<'db> TokenNewlineGreen<'db> {
40025    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40026        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
40027    }
40028}
40029impl<'db> TypedSyntaxNode<'db> for TokenNewline<'db> {
40030    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
40031    type StablePtr = TokenNewlinePtr<'db>;
40032    type Green = TokenNewlineGreen<'db>;
40033    fn missing(db: &'db dyn Database) -> Self::Green {
40034        TokenNewlineGreen(
40035            GreenNode {
40036                kind: SyntaxKind::TokenMissing,
40037                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
40038            }
40039            .intern(db),
40040        )
40041    }
40042    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40043        match node.long(db).green.long(db).details {
40044            GreenNodeDetails::Token(_) => Self { node },
40045            GreenNodeDetails::Node { .. } => {
40046                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
40047            }
40048        }
40049    }
40050    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40051        match node.long(db).green.long(db).details {
40052            GreenNodeDetails::Token(_) => Some(Self { node }),
40053            GreenNodeDetails::Node { .. } => None,
40054        }
40055    }
40056    fn as_syntax_node(&self) -> SyntaxNode<'db> {
40057        self.node
40058    }
40059    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
40060        TokenNewlinePtr(self.node.stable_ptr(db))
40061    }
40062}
40063#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
40064pub struct TokenMissing<'db> {
40065    node: SyntaxNode<'db>,
40066}
40067impl<'db> Token<'db> for TokenMissing<'db> {
40068    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
40069        TokenMissingGreen(
40070            GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token(text) }
40071                .intern(db),
40072        )
40073    }
40074    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40075        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
40076    }
40077}
40078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40079pub struct TokenMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
40080impl<'db> TypedStablePtr<'db> for TokenMissingPtr<'db> {
40081    type SyntaxNode = TokenMissing<'db>;
40082    fn untyped(self) -> SyntaxStablePtrId<'db> {
40083        self.0
40084    }
40085    fn lookup(&self, db: &'db dyn Database) -> TokenMissing<'db> {
40086        TokenMissing::from_syntax_node(db, self.0.lookup(db))
40087    }
40088}
40089impl<'db> From<TokenMissingPtr<'db>> for SyntaxStablePtrId<'db> {
40090    fn from(ptr: TokenMissingPtr<'db>) -> Self {
40091        ptr.untyped()
40092    }
40093}
40094#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40095pub struct TokenMissingGreen<'db>(pub GreenId<'db>);
40096impl<'db> TokenMissingGreen<'db> {
40097    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40098        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
40099    }
40100}
40101impl<'db> TypedSyntaxNode<'db> for TokenMissing<'db> {
40102    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
40103    type StablePtr = TokenMissingPtr<'db>;
40104    type Green = TokenMissingGreen<'db>;
40105    fn missing(db: &'db dyn Database) -> Self::Green {
40106        TokenMissingGreen(
40107            GreenNode {
40108                kind: SyntaxKind::TokenMissing,
40109                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
40110            }
40111            .intern(db),
40112        )
40113    }
40114    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40115        match node.long(db).green.long(db).details {
40116            GreenNodeDetails::Token(_) => Self { node },
40117            GreenNodeDetails::Node { .. } => {
40118                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
40119            }
40120        }
40121    }
40122    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40123        match node.long(db).green.long(db).details {
40124            GreenNodeDetails::Token(_) => Some(Self { node }),
40125            GreenNodeDetails::Node { .. } => None,
40126        }
40127    }
40128    fn as_syntax_node(&self) -> SyntaxNode<'db> {
40129        self.node
40130    }
40131    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
40132        TokenMissingPtr(self.node.stable_ptr(db))
40133    }
40134}
40135#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
40136pub struct TokenSkipped<'db> {
40137    node: SyntaxNode<'db>,
40138}
40139impl<'db> Token<'db> for TokenSkipped<'db> {
40140    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
40141        TokenSkippedGreen(
40142            GreenNode { kind: SyntaxKind::TokenSkipped, details: GreenNodeDetails::Token(text) }
40143                .intern(db),
40144        )
40145    }
40146    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40147        *extract_matches!(&self.node.long(db).green.long(db).details, GreenNodeDetails::Token)
40148    }
40149}
40150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40151pub struct TokenSkippedPtr<'db>(pub SyntaxStablePtrId<'db>);
40152impl<'db> TypedStablePtr<'db> for TokenSkippedPtr<'db> {
40153    type SyntaxNode = TokenSkipped<'db>;
40154    fn untyped(self) -> SyntaxStablePtrId<'db> {
40155        self.0
40156    }
40157    fn lookup(&self, db: &'db dyn Database) -> TokenSkipped<'db> {
40158        TokenSkipped::from_syntax_node(db, self.0.lookup(db))
40159    }
40160}
40161impl<'db> From<TokenSkippedPtr<'db>> for SyntaxStablePtrId<'db> {
40162    fn from(ptr: TokenSkippedPtr<'db>) -> Self {
40163        ptr.untyped()
40164    }
40165}
40166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40167pub struct TokenSkippedGreen<'db>(pub GreenId<'db>);
40168impl<'db> TokenSkippedGreen<'db> {
40169    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
40170        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
40171    }
40172}
40173impl<'db> TypedSyntaxNode<'db> for TokenSkipped<'db> {
40174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
40175    type StablePtr = TokenSkippedPtr<'db>;
40176    type Green = TokenSkippedGreen<'db>;
40177    fn missing(db: &'db dyn Database) -> Self::Green {
40178        TokenSkippedGreen(
40179            GreenNode {
40180                kind: SyntaxKind::TokenMissing,
40181                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
40182            }
40183            .intern(db),
40184        )
40185    }
40186    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40187        match node.long(db).green.long(db).details {
40188            GreenNodeDetails::Token(_) => Self { node },
40189            GreenNodeDetails::Node { .. } => {
40190                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
40191            }
40192        }
40193    }
40194    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40195        match node.long(db).green.long(db).details {
40196            GreenNodeDetails::Token(_) => Some(Self { node }),
40197            GreenNodeDetails::Node { .. } => None,
40198        }
40199    }
40200    fn as_syntax_node(&self) -> SyntaxNode<'db> {
40201        self.node
40202    }
40203    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
40204        TokenSkippedPtr(self.node.stable_ptr(db))
40205    }
40206}
40207#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
40208pub enum TokenNode<'db> {
40209    TerminalIdentifier(TerminalIdentifier<'db>),
40210    TerminalLiteralNumber(TerminalLiteralNumber<'db>),
40211    TerminalShortString(TerminalShortString<'db>),
40212    TerminalString(TerminalString<'db>),
40213    TerminalAs(TerminalAs<'db>),
40214    TerminalConst(TerminalConst<'db>),
40215    TerminalElse(TerminalElse<'db>),
40216    TerminalEnum(TerminalEnum<'db>),
40217    TerminalExtern(TerminalExtern<'db>),
40218    TerminalFalse(TerminalFalse<'db>),
40219    TerminalFunction(TerminalFunction<'db>),
40220    TerminalIf(TerminalIf<'db>),
40221    TerminalWhile(TerminalWhile<'db>),
40222    TerminalFor(TerminalFor<'db>),
40223    TerminalLoop(TerminalLoop<'db>),
40224    TerminalImpl(TerminalImpl<'db>),
40225    TerminalImplicits(TerminalImplicits<'db>),
40226    TerminalLet(TerminalLet<'db>),
40227    TerminalMacro(TerminalMacro<'db>),
40228    TerminalMatch(TerminalMatch<'db>),
40229    TerminalModule(TerminalModule<'db>),
40230    TerminalMut(TerminalMut<'db>),
40231    TerminalNoPanic(TerminalNoPanic<'db>),
40232    TerminalOf(TerminalOf<'db>),
40233    TerminalRef(TerminalRef<'db>),
40234    TerminalContinue(TerminalContinue<'db>),
40235    TerminalReturn(TerminalReturn<'db>),
40236    TerminalBreak(TerminalBreak<'db>),
40237    TerminalStruct(TerminalStruct<'db>),
40238    TerminalTrait(TerminalTrait<'db>),
40239    TerminalTrue(TerminalTrue<'db>),
40240    TerminalType(TerminalType<'db>),
40241    TerminalUse(TerminalUse<'db>),
40242    TerminalPub(TerminalPub<'db>),
40243    TerminalAnd(TerminalAnd<'db>),
40244    TerminalAndAnd(TerminalAndAnd<'db>),
40245    TerminalArrow(TerminalArrow<'db>),
40246    TerminalAt(TerminalAt<'db>),
40247    TerminalBadCharacters(TerminalBadCharacters<'db>),
40248    TerminalColon(TerminalColon<'db>),
40249    TerminalColonColon(TerminalColonColon<'db>),
40250    TerminalComma(TerminalComma<'db>),
40251    TerminalDiv(TerminalDiv<'db>),
40252    TerminalDivEq(TerminalDivEq<'db>),
40253    TerminalDollar(TerminalDollar<'db>),
40254    TerminalDot(TerminalDot<'db>),
40255    TerminalDotDot(TerminalDotDot<'db>),
40256    TerminalDotDotEq(TerminalDotDotEq<'db>),
40257    TerminalEndOfFile(TerminalEndOfFile<'db>),
40258    TerminalEq(TerminalEq<'db>),
40259    TerminalEqEq(TerminalEqEq<'db>),
40260    TerminalGE(TerminalGE<'db>),
40261    TerminalGT(TerminalGT<'db>),
40262    TerminalHash(TerminalHash<'db>),
40263    TerminalLBrace(TerminalLBrace<'db>),
40264    TerminalLBrack(TerminalLBrack<'db>),
40265    TerminalLE(TerminalLE<'db>),
40266    TerminalLParen(TerminalLParen<'db>),
40267    TerminalLT(TerminalLT<'db>),
40268    TerminalMatchArrow(TerminalMatchArrow<'db>),
40269    TerminalMinus(TerminalMinus<'db>),
40270    TerminalMinusEq(TerminalMinusEq<'db>),
40271    TerminalMod(TerminalMod<'db>),
40272    TerminalModEq(TerminalModEq<'db>),
40273    TerminalMul(TerminalMul<'db>),
40274    TerminalMulEq(TerminalMulEq<'db>),
40275    TerminalNeq(TerminalNeq<'db>),
40276    TerminalNot(TerminalNot<'db>),
40277    TerminalBitNot(TerminalBitNot<'db>),
40278    TerminalOr(TerminalOr<'db>),
40279    TerminalOrOr(TerminalOrOr<'db>),
40280    TerminalPlus(TerminalPlus<'db>),
40281    TerminalPlusEq(TerminalPlusEq<'db>),
40282    TerminalQuestionMark(TerminalQuestionMark<'db>),
40283    TerminalRBrace(TerminalRBrace<'db>),
40284    TerminalRBrack(TerminalRBrack<'db>),
40285    TerminalRParen(TerminalRParen<'db>),
40286    TerminalSemicolon(TerminalSemicolon<'db>),
40287    TerminalUnderscore(TerminalUnderscore<'db>),
40288    TerminalXor(TerminalXor<'db>),
40289    TerminalEmpty(TerminalEmpty<'db>),
40290}
40291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40292pub struct TokenNodePtr<'db>(pub SyntaxStablePtrId<'db>);
40293impl<'db> TypedStablePtr<'db> for TokenNodePtr<'db> {
40294    type SyntaxNode = TokenNode<'db>;
40295    fn untyped(self) -> SyntaxStablePtrId<'db> {
40296        self.0
40297    }
40298    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
40299        TokenNode::from_syntax_node(db, self.0.lookup(db))
40300    }
40301}
40302impl<'db> From<TokenNodePtr<'db>> for SyntaxStablePtrId<'db> {
40303    fn from(ptr: TokenNodePtr<'db>) -> Self {
40304        ptr.untyped()
40305    }
40306}
40307impl<'db> From<TerminalIdentifierPtr<'db>> for TokenNodePtr<'db> {
40308    fn from(value: TerminalIdentifierPtr<'db>) -> Self {
40309        Self(value.0)
40310    }
40311}
40312impl<'db> From<TerminalLiteralNumberPtr<'db>> for TokenNodePtr<'db> {
40313    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
40314        Self(value.0)
40315    }
40316}
40317impl<'db> From<TerminalShortStringPtr<'db>> for TokenNodePtr<'db> {
40318    fn from(value: TerminalShortStringPtr<'db>) -> Self {
40319        Self(value.0)
40320    }
40321}
40322impl<'db> From<TerminalStringPtr<'db>> for TokenNodePtr<'db> {
40323    fn from(value: TerminalStringPtr<'db>) -> Self {
40324        Self(value.0)
40325    }
40326}
40327impl<'db> From<TerminalAsPtr<'db>> for TokenNodePtr<'db> {
40328    fn from(value: TerminalAsPtr<'db>) -> Self {
40329        Self(value.0)
40330    }
40331}
40332impl<'db> From<TerminalConstPtr<'db>> for TokenNodePtr<'db> {
40333    fn from(value: TerminalConstPtr<'db>) -> Self {
40334        Self(value.0)
40335    }
40336}
40337impl<'db> From<TerminalElsePtr<'db>> for TokenNodePtr<'db> {
40338    fn from(value: TerminalElsePtr<'db>) -> Self {
40339        Self(value.0)
40340    }
40341}
40342impl<'db> From<TerminalEnumPtr<'db>> for TokenNodePtr<'db> {
40343    fn from(value: TerminalEnumPtr<'db>) -> Self {
40344        Self(value.0)
40345    }
40346}
40347impl<'db> From<TerminalExternPtr<'db>> for TokenNodePtr<'db> {
40348    fn from(value: TerminalExternPtr<'db>) -> Self {
40349        Self(value.0)
40350    }
40351}
40352impl<'db> From<TerminalFalsePtr<'db>> for TokenNodePtr<'db> {
40353    fn from(value: TerminalFalsePtr<'db>) -> Self {
40354        Self(value.0)
40355    }
40356}
40357impl<'db> From<TerminalFunctionPtr<'db>> for TokenNodePtr<'db> {
40358    fn from(value: TerminalFunctionPtr<'db>) -> Self {
40359        Self(value.0)
40360    }
40361}
40362impl<'db> From<TerminalIfPtr<'db>> for TokenNodePtr<'db> {
40363    fn from(value: TerminalIfPtr<'db>) -> Self {
40364        Self(value.0)
40365    }
40366}
40367impl<'db> From<TerminalWhilePtr<'db>> for TokenNodePtr<'db> {
40368    fn from(value: TerminalWhilePtr<'db>) -> Self {
40369        Self(value.0)
40370    }
40371}
40372impl<'db> From<TerminalForPtr<'db>> for TokenNodePtr<'db> {
40373    fn from(value: TerminalForPtr<'db>) -> Self {
40374        Self(value.0)
40375    }
40376}
40377impl<'db> From<TerminalLoopPtr<'db>> for TokenNodePtr<'db> {
40378    fn from(value: TerminalLoopPtr<'db>) -> Self {
40379        Self(value.0)
40380    }
40381}
40382impl<'db> From<TerminalImplPtr<'db>> for TokenNodePtr<'db> {
40383    fn from(value: TerminalImplPtr<'db>) -> Self {
40384        Self(value.0)
40385    }
40386}
40387impl<'db> From<TerminalImplicitsPtr<'db>> for TokenNodePtr<'db> {
40388    fn from(value: TerminalImplicitsPtr<'db>) -> Self {
40389        Self(value.0)
40390    }
40391}
40392impl<'db> From<TerminalLetPtr<'db>> for TokenNodePtr<'db> {
40393    fn from(value: TerminalLetPtr<'db>) -> Self {
40394        Self(value.0)
40395    }
40396}
40397impl<'db> From<TerminalMacroPtr<'db>> for TokenNodePtr<'db> {
40398    fn from(value: TerminalMacroPtr<'db>) -> Self {
40399        Self(value.0)
40400    }
40401}
40402impl<'db> From<TerminalMatchPtr<'db>> for TokenNodePtr<'db> {
40403    fn from(value: TerminalMatchPtr<'db>) -> Self {
40404        Self(value.0)
40405    }
40406}
40407impl<'db> From<TerminalModulePtr<'db>> for TokenNodePtr<'db> {
40408    fn from(value: TerminalModulePtr<'db>) -> Self {
40409        Self(value.0)
40410    }
40411}
40412impl<'db> From<TerminalMutPtr<'db>> for TokenNodePtr<'db> {
40413    fn from(value: TerminalMutPtr<'db>) -> Self {
40414        Self(value.0)
40415    }
40416}
40417impl<'db> From<TerminalNoPanicPtr<'db>> for TokenNodePtr<'db> {
40418    fn from(value: TerminalNoPanicPtr<'db>) -> Self {
40419        Self(value.0)
40420    }
40421}
40422impl<'db> From<TerminalOfPtr<'db>> for TokenNodePtr<'db> {
40423    fn from(value: TerminalOfPtr<'db>) -> Self {
40424        Self(value.0)
40425    }
40426}
40427impl<'db> From<TerminalRefPtr<'db>> for TokenNodePtr<'db> {
40428    fn from(value: TerminalRefPtr<'db>) -> Self {
40429        Self(value.0)
40430    }
40431}
40432impl<'db> From<TerminalContinuePtr<'db>> for TokenNodePtr<'db> {
40433    fn from(value: TerminalContinuePtr<'db>) -> Self {
40434        Self(value.0)
40435    }
40436}
40437impl<'db> From<TerminalReturnPtr<'db>> for TokenNodePtr<'db> {
40438    fn from(value: TerminalReturnPtr<'db>) -> Self {
40439        Self(value.0)
40440    }
40441}
40442impl<'db> From<TerminalBreakPtr<'db>> for TokenNodePtr<'db> {
40443    fn from(value: TerminalBreakPtr<'db>) -> Self {
40444        Self(value.0)
40445    }
40446}
40447impl<'db> From<TerminalStructPtr<'db>> for TokenNodePtr<'db> {
40448    fn from(value: TerminalStructPtr<'db>) -> Self {
40449        Self(value.0)
40450    }
40451}
40452impl<'db> From<TerminalTraitPtr<'db>> for TokenNodePtr<'db> {
40453    fn from(value: TerminalTraitPtr<'db>) -> Self {
40454        Self(value.0)
40455    }
40456}
40457impl<'db> From<TerminalTruePtr<'db>> for TokenNodePtr<'db> {
40458    fn from(value: TerminalTruePtr<'db>) -> Self {
40459        Self(value.0)
40460    }
40461}
40462impl<'db> From<TerminalTypePtr<'db>> for TokenNodePtr<'db> {
40463    fn from(value: TerminalTypePtr<'db>) -> Self {
40464        Self(value.0)
40465    }
40466}
40467impl<'db> From<TerminalUsePtr<'db>> for TokenNodePtr<'db> {
40468    fn from(value: TerminalUsePtr<'db>) -> Self {
40469        Self(value.0)
40470    }
40471}
40472impl<'db> From<TerminalPubPtr<'db>> for TokenNodePtr<'db> {
40473    fn from(value: TerminalPubPtr<'db>) -> Self {
40474        Self(value.0)
40475    }
40476}
40477impl<'db> From<TerminalAndPtr<'db>> for TokenNodePtr<'db> {
40478    fn from(value: TerminalAndPtr<'db>) -> Self {
40479        Self(value.0)
40480    }
40481}
40482impl<'db> From<TerminalAndAndPtr<'db>> for TokenNodePtr<'db> {
40483    fn from(value: TerminalAndAndPtr<'db>) -> Self {
40484        Self(value.0)
40485    }
40486}
40487impl<'db> From<TerminalArrowPtr<'db>> for TokenNodePtr<'db> {
40488    fn from(value: TerminalArrowPtr<'db>) -> Self {
40489        Self(value.0)
40490    }
40491}
40492impl<'db> From<TerminalAtPtr<'db>> for TokenNodePtr<'db> {
40493    fn from(value: TerminalAtPtr<'db>) -> Self {
40494        Self(value.0)
40495    }
40496}
40497impl<'db> From<TerminalBadCharactersPtr<'db>> for TokenNodePtr<'db> {
40498    fn from(value: TerminalBadCharactersPtr<'db>) -> Self {
40499        Self(value.0)
40500    }
40501}
40502impl<'db> From<TerminalColonPtr<'db>> for TokenNodePtr<'db> {
40503    fn from(value: TerminalColonPtr<'db>) -> Self {
40504        Self(value.0)
40505    }
40506}
40507impl<'db> From<TerminalColonColonPtr<'db>> for TokenNodePtr<'db> {
40508    fn from(value: TerminalColonColonPtr<'db>) -> Self {
40509        Self(value.0)
40510    }
40511}
40512impl<'db> From<TerminalCommaPtr<'db>> for TokenNodePtr<'db> {
40513    fn from(value: TerminalCommaPtr<'db>) -> Self {
40514        Self(value.0)
40515    }
40516}
40517impl<'db> From<TerminalDivPtr<'db>> for TokenNodePtr<'db> {
40518    fn from(value: TerminalDivPtr<'db>) -> Self {
40519        Self(value.0)
40520    }
40521}
40522impl<'db> From<TerminalDivEqPtr<'db>> for TokenNodePtr<'db> {
40523    fn from(value: TerminalDivEqPtr<'db>) -> Self {
40524        Self(value.0)
40525    }
40526}
40527impl<'db> From<TerminalDollarPtr<'db>> for TokenNodePtr<'db> {
40528    fn from(value: TerminalDollarPtr<'db>) -> Self {
40529        Self(value.0)
40530    }
40531}
40532impl<'db> From<TerminalDotPtr<'db>> for TokenNodePtr<'db> {
40533    fn from(value: TerminalDotPtr<'db>) -> Self {
40534        Self(value.0)
40535    }
40536}
40537impl<'db> From<TerminalDotDotPtr<'db>> for TokenNodePtr<'db> {
40538    fn from(value: TerminalDotDotPtr<'db>) -> Self {
40539        Self(value.0)
40540    }
40541}
40542impl<'db> From<TerminalDotDotEqPtr<'db>> for TokenNodePtr<'db> {
40543    fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
40544        Self(value.0)
40545    }
40546}
40547impl<'db> From<TerminalEndOfFilePtr<'db>> for TokenNodePtr<'db> {
40548    fn from(value: TerminalEndOfFilePtr<'db>) -> Self {
40549        Self(value.0)
40550    }
40551}
40552impl<'db> From<TerminalEqPtr<'db>> for TokenNodePtr<'db> {
40553    fn from(value: TerminalEqPtr<'db>) -> Self {
40554        Self(value.0)
40555    }
40556}
40557impl<'db> From<TerminalEqEqPtr<'db>> for TokenNodePtr<'db> {
40558    fn from(value: TerminalEqEqPtr<'db>) -> Self {
40559        Self(value.0)
40560    }
40561}
40562impl<'db> From<TerminalGEPtr<'db>> for TokenNodePtr<'db> {
40563    fn from(value: TerminalGEPtr<'db>) -> Self {
40564        Self(value.0)
40565    }
40566}
40567impl<'db> From<TerminalGTPtr<'db>> for TokenNodePtr<'db> {
40568    fn from(value: TerminalGTPtr<'db>) -> Self {
40569        Self(value.0)
40570    }
40571}
40572impl<'db> From<TerminalHashPtr<'db>> for TokenNodePtr<'db> {
40573    fn from(value: TerminalHashPtr<'db>) -> Self {
40574        Self(value.0)
40575    }
40576}
40577impl<'db> From<TerminalLBracePtr<'db>> for TokenNodePtr<'db> {
40578    fn from(value: TerminalLBracePtr<'db>) -> Self {
40579        Self(value.0)
40580    }
40581}
40582impl<'db> From<TerminalLBrackPtr<'db>> for TokenNodePtr<'db> {
40583    fn from(value: TerminalLBrackPtr<'db>) -> Self {
40584        Self(value.0)
40585    }
40586}
40587impl<'db> From<TerminalLEPtr<'db>> for TokenNodePtr<'db> {
40588    fn from(value: TerminalLEPtr<'db>) -> Self {
40589        Self(value.0)
40590    }
40591}
40592impl<'db> From<TerminalLParenPtr<'db>> for TokenNodePtr<'db> {
40593    fn from(value: TerminalLParenPtr<'db>) -> Self {
40594        Self(value.0)
40595    }
40596}
40597impl<'db> From<TerminalLTPtr<'db>> for TokenNodePtr<'db> {
40598    fn from(value: TerminalLTPtr<'db>) -> Self {
40599        Self(value.0)
40600    }
40601}
40602impl<'db> From<TerminalMatchArrowPtr<'db>> for TokenNodePtr<'db> {
40603    fn from(value: TerminalMatchArrowPtr<'db>) -> Self {
40604        Self(value.0)
40605    }
40606}
40607impl<'db> From<TerminalMinusPtr<'db>> for TokenNodePtr<'db> {
40608    fn from(value: TerminalMinusPtr<'db>) -> Self {
40609        Self(value.0)
40610    }
40611}
40612impl<'db> From<TerminalMinusEqPtr<'db>> for TokenNodePtr<'db> {
40613    fn from(value: TerminalMinusEqPtr<'db>) -> Self {
40614        Self(value.0)
40615    }
40616}
40617impl<'db> From<TerminalModPtr<'db>> for TokenNodePtr<'db> {
40618    fn from(value: TerminalModPtr<'db>) -> Self {
40619        Self(value.0)
40620    }
40621}
40622impl<'db> From<TerminalModEqPtr<'db>> for TokenNodePtr<'db> {
40623    fn from(value: TerminalModEqPtr<'db>) -> Self {
40624        Self(value.0)
40625    }
40626}
40627impl<'db> From<TerminalMulPtr<'db>> for TokenNodePtr<'db> {
40628    fn from(value: TerminalMulPtr<'db>) -> Self {
40629        Self(value.0)
40630    }
40631}
40632impl<'db> From<TerminalMulEqPtr<'db>> for TokenNodePtr<'db> {
40633    fn from(value: TerminalMulEqPtr<'db>) -> Self {
40634        Self(value.0)
40635    }
40636}
40637impl<'db> From<TerminalNeqPtr<'db>> for TokenNodePtr<'db> {
40638    fn from(value: TerminalNeqPtr<'db>) -> Self {
40639        Self(value.0)
40640    }
40641}
40642impl<'db> From<TerminalNotPtr<'db>> for TokenNodePtr<'db> {
40643    fn from(value: TerminalNotPtr<'db>) -> Self {
40644        Self(value.0)
40645    }
40646}
40647impl<'db> From<TerminalBitNotPtr<'db>> for TokenNodePtr<'db> {
40648    fn from(value: TerminalBitNotPtr<'db>) -> Self {
40649        Self(value.0)
40650    }
40651}
40652impl<'db> From<TerminalOrPtr<'db>> for TokenNodePtr<'db> {
40653    fn from(value: TerminalOrPtr<'db>) -> Self {
40654        Self(value.0)
40655    }
40656}
40657impl<'db> From<TerminalOrOrPtr<'db>> for TokenNodePtr<'db> {
40658    fn from(value: TerminalOrOrPtr<'db>) -> Self {
40659        Self(value.0)
40660    }
40661}
40662impl<'db> From<TerminalPlusPtr<'db>> for TokenNodePtr<'db> {
40663    fn from(value: TerminalPlusPtr<'db>) -> Self {
40664        Self(value.0)
40665    }
40666}
40667impl<'db> From<TerminalPlusEqPtr<'db>> for TokenNodePtr<'db> {
40668    fn from(value: TerminalPlusEqPtr<'db>) -> Self {
40669        Self(value.0)
40670    }
40671}
40672impl<'db> From<TerminalQuestionMarkPtr<'db>> for TokenNodePtr<'db> {
40673    fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
40674        Self(value.0)
40675    }
40676}
40677impl<'db> From<TerminalRBracePtr<'db>> for TokenNodePtr<'db> {
40678    fn from(value: TerminalRBracePtr<'db>) -> Self {
40679        Self(value.0)
40680    }
40681}
40682impl<'db> From<TerminalRBrackPtr<'db>> for TokenNodePtr<'db> {
40683    fn from(value: TerminalRBrackPtr<'db>) -> Self {
40684        Self(value.0)
40685    }
40686}
40687impl<'db> From<TerminalRParenPtr<'db>> for TokenNodePtr<'db> {
40688    fn from(value: TerminalRParenPtr<'db>) -> Self {
40689        Self(value.0)
40690    }
40691}
40692impl<'db> From<TerminalSemicolonPtr<'db>> for TokenNodePtr<'db> {
40693    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
40694        Self(value.0)
40695    }
40696}
40697impl<'db> From<TerminalUnderscorePtr<'db>> for TokenNodePtr<'db> {
40698    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
40699        Self(value.0)
40700    }
40701}
40702impl<'db> From<TerminalXorPtr<'db>> for TokenNodePtr<'db> {
40703    fn from(value: TerminalXorPtr<'db>) -> Self {
40704        Self(value.0)
40705    }
40706}
40707impl<'db> From<TerminalEmptyPtr<'db>> for TokenNodePtr<'db> {
40708    fn from(value: TerminalEmptyPtr<'db>) -> Self {
40709        Self(value.0)
40710    }
40711}
40712impl<'db> From<TerminalIdentifierGreen<'db>> for TokenNodeGreen<'db> {
40713    fn from(value: TerminalIdentifierGreen<'db>) -> Self {
40714        Self(value.0)
40715    }
40716}
40717impl<'db> From<TerminalLiteralNumberGreen<'db>> for TokenNodeGreen<'db> {
40718    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
40719        Self(value.0)
40720    }
40721}
40722impl<'db> From<TerminalShortStringGreen<'db>> for TokenNodeGreen<'db> {
40723    fn from(value: TerminalShortStringGreen<'db>) -> Self {
40724        Self(value.0)
40725    }
40726}
40727impl<'db> From<TerminalStringGreen<'db>> for TokenNodeGreen<'db> {
40728    fn from(value: TerminalStringGreen<'db>) -> Self {
40729        Self(value.0)
40730    }
40731}
40732impl<'db> From<TerminalAsGreen<'db>> for TokenNodeGreen<'db> {
40733    fn from(value: TerminalAsGreen<'db>) -> Self {
40734        Self(value.0)
40735    }
40736}
40737impl<'db> From<TerminalConstGreen<'db>> for TokenNodeGreen<'db> {
40738    fn from(value: TerminalConstGreen<'db>) -> Self {
40739        Self(value.0)
40740    }
40741}
40742impl<'db> From<TerminalElseGreen<'db>> for TokenNodeGreen<'db> {
40743    fn from(value: TerminalElseGreen<'db>) -> Self {
40744        Self(value.0)
40745    }
40746}
40747impl<'db> From<TerminalEnumGreen<'db>> for TokenNodeGreen<'db> {
40748    fn from(value: TerminalEnumGreen<'db>) -> Self {
40749        Self(value.0)
40750    }
40751}
40752impl<'db> From<TerminalExternGreen<'db>> for TokenNodeGreen<'db> {
40753    fn from(value: TerminalExternGreen<'db>) -> Self {
40754        Self(value.0)
40755    }
40756}
40757impl<'db> From<TerminalFalseGreen<'db>> for TokenNodeGreen<'db> {
40758    fn from(value: TerminalFalseGreen<'db>) -> Self {
40759        Self(value.0)
40760    }
40761}
40762impl<'db> From<TerminalFunctionGreen<'db>> for TokenNodeGreen<'db> {
40763    fn from(value: TerminalFunctionGreen<'db>) -> Self {
40764        Self(value.0)
40765    }
40766}
40767impl<'db> From<TerminalIfGreen<'db>> for TokenNodeGreen<'db> {
40768    fn from(value: TerminalIfGreen<'db>) -> Self {
40769        Self(value.0)
40770    }
40771}
40772impl<'db> From<TerminalWhileGreen<'db>> for TokenNodeGreen<'db> {
40773    fn from(value: TerminalWhileGreen<'db>) -> Self {
40774        Self(value.0)
40775    }
40776}
40777impl<'db> From<TerminalForGreen<'db>> for TokenNodeGreen<'db> {
40778    fn from(value: TerminalForGreen<'db>) -> Self {
40779        Self(value.0)
40780    }
40781}
40782impl<'db> From<TerminalLoopGreen<'db>> for TokenNodeGreen<'db> {
40783    fn from(value: TerminalLoopGreen<'db>) -> Self {
40784        Self(value.0)
40785    }
40786}
40787impl<'db> From<TerminalImplGreen<'db>> for TokenNodeGreen<'db> {
40788    fn from(value: TerminalImplGreen<'db>) -> Self {
40789        Self(value.0)
40790    }
40791}
40792impl<'db> From<TerminalImplicitsGreen<'db>> for TokenNodeGreen<'db> {
40793    fn from(value: TerminalImplicitsGreen<'db>) -> Self {
40794        Self(value.0)
40795    }
40796}
40797impl<'db> From<TerminalLetGreen<'db>> for TokenNodeGreen<'db> {
40798    fn from(value: TerminalLetGreen<'db>) -> Self {
40799        Self(value.0)
40800    }
40801}
40802impl<'db> From<TerminalMacroGreen<'db>> for TokenNodeGreen<'db> {
40803    fn from(value: TerminalMacroGreen<'db>) -> Self {
40804        Self(value.0)
40805    }
40806}
40807impl<'db> From<TerminalMatchGreen<'db>> for TokenNodeGreen<'db> {
40808    fn from(value: TerminalMatchGreen<'db>) -> Self {
40809        Self(value.0)
40810    }
40811}
40812impl<'db> From<TerminalModuleGreen<'db>> for TokenNodeGreen<'db> {
40813    fn from(value: TerminalModuleGreen<'db>) -> Self {
40814        Self(value.0)
40815    }
40816}
40817impl<'db> From<TerminalMutGreen<'db>> for TokenNodeGreen<'db> {
40818    fn from(value: TerminalMutGreen<'db>) -> Self {
40819        Self(value.0)
40820    }
40821}
40822impl<'db> From<TerminalNoPanicGreen<'db>> for TokenNodeGreen<'db> {
40823    fn from(value: TerminalNoPanicGreen<'db>) -> Self {
40824        Self(value.0)
40825    }
40826}
40827impl<'db> From<TerminalOfGreen<'db>> for TokenNodeGreen<'db> {
40828    fn from(value: TerminalOfGreen<'db>) -> Self {
40829        Self(value.0)
40830    }
40831}
40832impl<'db> From<TerminalRefGreen<'db>> for TokenNodeGreen<'db> {
40833    fn from(value: TerminalRefGreen<'db>) -> Self {
40834        Self(value.0)
40835    }
40836}
40837impl<'db> From<TerminalContinueGreen<'db>> for TokenNodeGreen<'db> {
40838    fn from(value: TerminalContinueGreen<'db>) -> Self {
40839        Self(value.0)
40840    }
40841}
40842impl<'db> From<TerminalReturnGreen<'db>> for TokenNodeGreen<'db> {
40843    fn from(value: TerminalReturnGreen<'db>) -> Self {
40844        Self(value.0)
40845    }
40846}
40847impl<'db> From<TerminalBreakGreen<'db>> for TokenNodeGreen<'db> {
40848    fn from(value: TerminalBreakGreen<'db>) -> Self {
40849        Self(value.0)
40850    }
40851}
40852impl<'db> From<TerminalStructGreen<'db>> for TokenNodeGreen<'db> {
40853    fn from(value: TerminalStructGreen<'db>) -> Self {
40854        Self(value.0)
40855    }
40856}
40857impl<'db> From<TerminalTraitGreen<'db>> for TokenNodeGreen<'db> {
40858    fn from(value: TerminalTraitGreen<'db>) -> Self {
40859        Self(value.0)
40860    }
40861}
40862impl<'db> From<TerminalTrueGreen<'db>> for TokenNodeGreen<'db> {
40863    fn from(value: TerminalTrueGreen<'db>) -> Self {
40864        Self(value.0)
40865    }
40866}
40867impl<'db> From<TerminalTypeGreen<'db>> for TokenNodeGreen<'db> {
40868    fn from(value: TerminalTypeGreen<'db>) -> Self {
40869        Self(value.0)
40870    }
40871}
40872impl<'db> From<TerminalUseGreen<'db>> for TokenNodeGreen<'db> {
40873    fn from(value: TerminalUseGreen<'db>) -> Self {
40874        Self(value.0)
40875    }
40876}
40877impl<'db> From<TerminalPubGreen<'db>> for TokenNodeGreen<'db> {
40878    fn from(value: TerminalPubGreen<'db>) -> Self {
40879        Self(value.0)
40880    }
40881}
40882impl<'db> From<TerminalAndGreen<'db>> for TokenNodeGreen<'db> {
40883    fn from(value: TerminalAndGreen<'db>) -> Self {
40884        Self(value.0)
40885    }
40886}
40887impl<'db> From<TerminalAndAndGreen<'db>> for TokenNodeGreen<'db> {
40888    fn from(value: TerminalAndAndGreen<'db>) -> Self {
40889        Self(value.0)
40890    }
40891}
40892impl<'db> From<TerminalArrowGreen<'db>> for TokenNodeGreen<'db> {
40893    fn from(value: TerminalArrowGreen<'db>) -> Self {
40894        Self(value.0)
40895    }
40896}
40897impl<'db> From<TerminalAtGreen<'db>> for TokenNodeGreen<'db> {
40898    fn from(value: TerminalAtGreen<'db>) -> Self {
40899        Self(value.0)
40900    }
40901}
40902impl<'db> From<TerminalBadCharactersGreen<'db>> for TokenNodeGreen<'db> {
40903    fn from(value: TerminalBadCharactersGreen<'db>) -> Self {
40904        Self(value.0)
40905    }
40906}
40907impl<'db> From<TerminalColonGreen<'db>> for TokenNodeGreen<'db> {
40908    fn from(value: TerminalColonGreen<'db>) -> Self {
40909        Self(value.0)
40910    }
40911}
40912impl<'db> From<TerminalColonColonGreen<'db>> for TokenNodeGreen<'db> {
40913    fn from(value: TerminalColonColonGreen<'db>) -> Self {
40914        Self(value.0)
40915    }
40916}
40917impl<'db> From<TerminalCommaGreen<'db>> for TokenNodeGreen<'db> {
40918    fn from(value: TerminalCommaGreen<'db>) -> Self {
40919        Self(value.0)
40920    }
40921}
40922impl<'db> From<TerminalDivGreen<'db>> for TokenNodeGreen<'db> {
40923    fn from(value: TerminalDivGreen<'db>) -> Self {
40924        Self(value.0)
40925    }
40926}
40927impl<'db> From<TerminalDivEqGreen<'db>> for TokenNodeGreen<'db> {
40928    fn from(value: TerminalDivEqGreen<'db>) -> Self {
40929        Self(value.0)
40930    }
40931}
40932impl<'db> From<TerminalDollarGreen<'db>> for TokenNodeGreen<'db> {
40933    fn from(value: TerminalDollarGreen<'db>) -> Self {
40934        Self(value.0)
40935    }
40936}
40937impl<'db> From<TerminalDotGreen<'db>> for TokenNodeGreen<'db> {
40938    fn from(value: TerminalDotGreen<'db>) -> Self {
40939        Self(value.0)
40940    }
40941}
40942impl<'db> From<TerminalDotDotGreen<'db>> for TokenNodeGreen<'db> {
40943    fn from(value: TerminalDotDotGreen<'db>) -> Self {
40944        Self(value.0)
40945    }
40946}
40947impl<'db> From<TerminalDotDotEqGreen<'db>> for TokenNodeGreen<'db> {
40948    fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
40949        Self(value.0)
40950    }
40951}
40952impl<'db> From<TerminalEndOfFileGreen<'db>> for TokenNodeGreen<'db> {
40953    fn from(value: TerminalEndOfFileGreen<'db>) -> Self {
40954        Self(value.0)
40955    }
40956}
40957impl<'db> From<TerminalEqGreen<'db>> for TokenNodeGreen<'db> {
40958    fn from(value: TerminalEqGreen<'db>) -> Self {
40959        Self(value.0)
40960    }
40961}
40962impl<'db> From<TerminalEqEqGreen<'db>> for TokenNodeGreen<'db> {
40963    fn from(value: TerminalEqEqGreen<'db>) -> Self {
40964        Self(value.0)
40965    }
40966}
40967impl<'db> From<TerminalGEGreen<'db>> for TokenNodeGreen<'db> {
40968    fn from(value: TerminalGEGreen<'db>) -> Self {
40969        Self(value.0)
40970    }
40971}
40972impl<'db> From<TerminalGTGreen<'db>> for TokenNodeGreen<'db> {
40973    fn from(value: TerminalGTGreen<'db>) -> Self {
40974        Self(value.0)
40975    }
40976}
40977impl<'db> From<TerminalHashGreen<'db>> for TokenNodeGreen<'db> {
40978    fn from(value: TerminalHashGreen<'db>) -> Self {
40979        Self(value.0)
40980    }
40981}
40982impl<'db> From<TerminalLBraceGreen<'db>> for TokenNodeGreen<'db> {
40983    fn from(value: TerminalLBraceGreen<'db>) -> Self {
40984        Self(value.0)
40985    }
40986}
40987impl<'db> From<TerminalLBrackGreen<'db>> for TokenNodeGreen<'db> {
40988    fn from(value: TerminalLBrackGreen<'db>) -> Self {
40989        Self(value.0)
40990    }
40991}
40992impl<'db> From<TerminalLEGreen<'db>> for TokenNodeGreen<'db> {
40993    fn from(value: TerminalLEGreen<'db>) -> Self {
40994        Self(value.0)
40995    }
40996}
40997impl<'db> From<TerminalLParenGreen<'db>> for TokenNodeGreen<'db> {
40998    fn from(value: TerminalLParenGreen<'db>) -> Self {
40999        Self(value.0)
41000    }
41001}
41002impl<'db> From<TerminalLTGreen<'db>> for TokenNodeGreen<'db> {
41003    fn from(value: TerminalLTGreen<'db>) -> Self {
41004        Self(value.0)
41005    }
41006}
41007impl<'db> From<TerminalMatchArrowGreen<'db>> for TokenNodeGreen<'db> {
41008    fn from(value: TerminalMatchArrowGreen<'db>) -> Self {
41009        Self(value.0)
41010    }
41011}
41012impl<'db> From<TerminalMinusGreen<'db>> for TokenNodeGreen<'db> {
41013    fn from(value: TerminalMinusGreen<'db>) -> Self {
41014        Self(value.0)
41015    }
41016}
41017impl<'db> From<TerminalMinusEqGreen<'db>> for TokenNodeGreen<'db> {
41018    fn from(value: TerminalMinusEqGreen<'db>) -> Self {
41019        Self(value.0)
41020    }
41021}
41022impl<'db> From<TerminalModGreen<'db>> for TokenNodeGreen<'db> {
41023    fn from(value: TerminalModGreen<'db>) -> Self {
41024        Self(value.0)
41025    }
41026}
41027impl<'db> From<TerminalModEqGreen<'db>> for TokenNodeGreen<'db> {
41028    fn from(value: TerminalModEqGreen<'db>) -> Self {
41029        Self(value.0)
41030    }
41031}
41032impl<'db> From<TerminalMulGreen<'db>> for TokenNodeGreen<'db> {
41033    fn from(value: TerminalMulGreen<'db>) -> Self {
41034        Self(value.0)
41035    }
41036}
41037impl<'db> From<TerminalMulEqGreen<'db>> for TokenNodeGreen<'db> {
41038    fn from(value: TerminalMulEqGreen<'db>) -> Self {
41039        Self(value.0)
41040    }
41041}
41042impl<'db> From<TerminalNeqGreen<'db>> for TokenNodeGreen<'db> {
41043    fn from(value: TerminalNeqGreen<'db>) -> Self {
41044        Self(value.0)
41045    }
41046}
41047impl<'db> From<TerminalNotGreen<'db>> for TokenNodeGreen<'db> {
41048    fn from(value: TerminalNotGreen<'db>) -> Self {
41049        Self(value.0)
41050    }
41051}
41052impl<'db> From<TerminalBitNotGreen<'db>> for TokenNodeGreen<'db> {
41053    fn from(value: TerminalBitNotGreen<'db>) -> Self {
41054        Self(value.0)
41055    }
41056}
41057impl<'db> From<TerminalOrGreen<'db>> for TokenNodeGreen<'db> {
41058    fn from(value: TerminalOrGreen<'db>) -> Self {
41059        Self(value.0)
41060    }
41061}
41062impl<'db> From<TerminalOrOrGreen<'db>> for TokenNodeGreen<'db> {
41063    fn from(value: TerminalOrOrGreen<'db>) -> Self {
41064        Self(value.0)
41065    }
41066}
41067impl<'db> From<TerminalPlusGreen<'db>> for TokenNodeGreen<'db> {
41068    fn from(value: TerminalPlusGreen<'db>) -> Self {
41069        Self(value.0)
41070    }
41071}
41072impl<'db> From<TerminalPlusEqGreen<'db>> for TokenNodeGreen<'db> {
41073    fn from(value: TerminalPlusEqGreen<'db>) -> Self {
41074        Self(value.0)
41075    }
41076}
41077impl<'db> From<TerminalQuestionMarkGreen<'db>> for TokenNodeGreen<'db> {
41078    fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
41079        Self(value.0)
41080    }
41081}
41082impl<'db> From<TerminalRBraceGreen<'db>> for TokenNodeGreen<'db> {
41083    fn from(value: TerminalRBraceGreen<'db>) -> Self {
41084        Self(value.0)
41085    }
41086}
41087impl<'db> From<TerminalRBrackGreen<'db>> for TokenNodeGreen<'db> {
41088    fn from(value: TerminalRBrackGreen<'db>) -> Self {
41089        Self(value.0)
41090    }
41091}
41092impl<'db> From<TerminalRParenGreen<'db>> for TokenNodeGreen<'db> {
41093    fn from(value: TerminalRParenGreen<'db>) -> Self {
41094        Self(value.0)
41095    }
41096}
41097impl<'db> From<TerminalSemicolonGreen<'db>> for TokenNodeGreen<'db> {
41098    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
41099        Self(value.0)
41100    }
41101}
41102impl<'db> From<TerminalUnderscoreGreen<'db>> for TokenNodeGreen<'db> {
41103    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
41104        Self(value.0)
41105    }
41106}
41107impl<'db> From<TerminalXorGreen<'db>> for TokenNodeGreen<'db> {
41108    fn from(value: TerminalXorGreen<'db>) -> Self {
41109        Self(value.0)
41110    }
41111}
41112impl<'db> From<TerminalEmptyGreen<'db>> for TokenNodeGreen<'db> {
41113    fn from(value: TerminalEmptyGreen<'db>) -> Self {
41114        Self(value.0)
41115    }
41116}
41117#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
41118pub struct TokenNodeGreen<'db>(pub GreenId<'db>);
41119impl<'db> TypedSyntaxNode<'db> for TokenNode<'db> {
41120    const OPTIONAL_KIND: Option<SyntaxKind> = None;
41121    type StablePtr = TokenNodePtr<'db>;
41122    type Green = TokenNodeGreen<'db>;
41123    fn missing(db: &'db dyn Database) -> Self::Green {
41124        panic!("No missing variant.");
41125    }
41126    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
41127        let kind = node.kind(db);
41128        match kind {
41129            SyntaxKind::TerminalIdentifier => {
41130                TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
41131            }
41132            SyntaxKind::TerminalLiteralNumber => {
41133                TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
41134            }
41135            SyntaxKind::TerminalShortString => {
41136                TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
41137            }
41138            SyntaxKind::TerminalString => {
41139                TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
41140            }
41141            SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
41142            SyntaxKind::TerminalConst => {
41143                TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
41144            }
41145            SyntaxKind::TerminalElse => {
41146                TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
41147            }
41148            SyntaxKind::TerminalEnum => {
41149                TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
41150            }
41151            SyntaxKind::TerminalExtern => {
41152                TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
41153            }
41154            SyntaxKind::TerminalFalse => {
41155                TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
41156            }
41157            SyntaxKind::TerminalFunction => {
41158                TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
41159            }
41160            SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
41161            SyntaxKind::TerminalWhile => {
41162                TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
41163            }
41164            SyntaxKind::TerminalFor => {
41165                TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
41166            }
41167            SyntaxKind::TerminalLoop => {
41168                TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
41169            }
41170            SyntaxKind::TerminalImpl => {
41171                TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
41172            }
41173            SyntaxKind::TerminalImplicits => {
41174                TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
41175            }
41176            SyntaxKind::TerminalLet => {
41177                TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
41178            }
41179            SyntaxKind::TerminalMacro => {
41180                TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
41181            }
41182            SyntaxKind::TerminalMatch => {
41183                TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
41184            }
41185            SyntaxKind::TerminalModule => {
41186                TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
41187            }
41188            SyntaxKind::TerminalMut => {
41189                TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
41190            }
41191            SyntaxKind::TerminalNoPanic => {
41192                TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
41193            }
41194            SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
41195            SyntaxKind::TerminalRef => {
41196                TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
41197            }
41198            SyntaxKind::TerminalContinue => {
41199                TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
41200            }
41201            SyntaxKind::TerminalReturn => {
41202                TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
41203            }
41204            SyntaxKind::TerminalBreak => {
41205                TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
41206            }
41207            SyntaxKind::TerminalStruct => {
41208                TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
41209            }
41210            SyntaxKind::TerminalTrait => {
41211                TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
41212            }
41213            SyntaxKind::TerminalTrue => {
41214                TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
41215            }
41216            SyntaxKind::TerminalType => {
41217                TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
41218            }
41219            SyntaxKind::TerminalUse => {
41220                TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
41221            }
41222            SyntaxKind::TerminalPub => {
41223                TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
41224            }
41225            SyntaxKind::TerminalAnd => {
41226                TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
41227            }
41228            SyntaxKind::TerminalAndAnd => {
41229                TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
41230            }
41231            SyntaxKind::TerminalArrow => {
41232                TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
41233            }
41234            SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
41235            SyntaxKind::TerminalBadCharacters => {
41236                TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
41237            }
41238            SyntaxKind::TerminalColon => {
41239                TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
41240            }
41241            SyntaxKind::TerminalColonColon => {
41242                TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
41243            }
41244            SyntaxKind::TerminalComma => {
41245                TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
41246            }
41247            SyntaxKind::TerminalDiv => {
41248                TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
41249            }
41250            SyntaxKind::TerminalDivEq => {
41251                TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
41252            }
41253            SyntaxKind::TerminalDollar => {
41254                TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
41255            }
41256            SyntaxKind::TerminalDot => {
41257                TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
41258            }
41259            SyntaxKind::TerminalDotDot => {
41260                TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
41261            }
41262            SyntaxKind::TerminalDotDotEq => {
41263                TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
41264            }
41265            SyntaxKind::TerminalEndOfFile => {
41266                TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
41267            }
41268            SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
41269            SyntaxKind::TerminalEqEq => {
41270                TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
41271            }
41272            SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
41273            SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
41274            SyntaxKind::TerminalHash => {
41275                TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
41276            }
41277            SyntaxKind::TerminalLBrace => {
41278                TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
41279            }
41280            SyntaxKind::TerminalLBrack => {
41281                TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
41282            }
41283            SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
41284            SyntaxKind::TerminalLParen => {
41285                TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
41286            }
41287            SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
41288            SyntaxKind::TerminalMatchArrow => {
41289                TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
41290            }
41291            SyntaxKind::TerminalMinus => {
41292                TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
41293            }
41294            SyntaxKind::TerminalMinusEq => {
41295                TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
41296            }
41297            SyntaxKind::TerminalMod => {
41298                TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
41299            }
41300            SyntaxKind::TerminalModEq => {
41301                TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
41302            }
41303            SyntaxKind::TerminalMul => {
41304                TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
41305            }
41306            SyntaxKind::TerminalMulEq => {
41307                TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
41308            }
41309            SyntaxKind::TerminalNeq => {
41310                TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
41311            }
41312            SyntaxKind::TerminalNot => {
41313                TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
41314            }
41315            SyntaxKind::TerminalBitNot => {
41316                TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
41317            }
41318            SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
41319            SyntaxKind::TerminalOrOr => {
41320                TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
41321            }
41322            SyntaxKind::TerminalPlus => {
41323                TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
41324            }
41325            SyntaxKind::TerminalPlusEq => {
41326                TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
41327            }
41328            SyntaxKind::TerminalQuestionMark => {
41329                TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
41330            }
41331            SyntaxKind::TerminalRBrace => {
41332                TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
41333            }
41334            SyntaxKind::TerminalRBrack => {
41335                TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
41336            }
41337            SyntaxKind::TerminalRParen => {
41338                TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
41339            }
41340            SyntaxKind::TerminalSemicolon => {
41341                TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
41342            }
41343            SyntaxKind::TerminalUnderscore => {
41344                TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
41345            }
41346            SyntaxKind::TerminalXor => {
41347                TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
41348            }
41349            SyntaxKind::TerminalEmpty => {
41350                TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
41351            }
41352            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
41353        }
41354    }
41355    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
41356        let kind = node.kind(db);
41357        match kind {
41358            SyntaxKind::TerminalIdentifier => {
41359                Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
41360            }
41361            SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
41362                TerminalLiteralNumber::from_syntax_node(db, node),
41363            )),
41364            SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
41365                TerminalShortString::from_syntax_node(db, node),
41366            )),
41367            SyntaxKind::TerminalString => {
41368                Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
41369            }
41370            SyntaxKind::TerminalAs => {
41371                Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
41372            }
41373            SyntaxKind::TerminalConst => {
41374                Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
41375            }
41376            SyntaxKind::TerminalElse => {
41377                Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
41378            }
41379            SyntaxKind::TerminalEnum => {
41380                Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
41381            }
41382            SyntaxKind::TerminalExtern => {
41383                Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
41384            }
41385            SyntaxKind::TerminalFalse => {
41386                Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
41387            }
41388            SyntaxKind::TerminalFunction => {
41389                Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
41390            }
41391            SyntaxKind::TerminalIf => {
41392                Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
41393            }
41394            SyntaxKind::TerminalWhile => {
41395                Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
41396            }
41397            SyntaxKind::TerminalFor => {
41398                Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
41399            }
41400            SyntaxKind::TerminalLoop => {
41401                Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
41402            }
41403            SyntaxKind::TerminalImpl => {
41404                Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
41405            }
41406            SyntaxKind::TerminalImplicits => {
41407                Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
41408            }
41409            SyntaxKind::TerminalLet => {
41410                Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
41411            }
41412            SyntaxKind::TerminalMacro => {
41413                Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
41414            }
41415            SyntaxKind::TerminalMatch => {
41416                Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
41417            }
41418            SyntaxKind::TerminalModule => {
41419                Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
41420            }
41421            SyntaxKind::TerminalMut => {
41422                Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
41423            }
41424            SyntaxKind::TerminalNoPanic => {
41425                Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
41426            }
41427            SyntaxKind::TerminalOf => {
41428                Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
41429            }
41430            SyntaxKind::TerminalRef => {
41431                Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
41432            }
41433            SyntaxKind::TerminalContinue => {
41434                Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
41435            }
41436            SyntaxKind::TerminalReturn => {
41437                Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
41438            }
41439            SyntaxKind::TerminalBreak => {
41440                Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
41441            }
41442            SyntaxKind::TerminalStruct => {
41443                Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
41444            }
41445            SyntaxKind::TerminalTrait => {
41446                Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
41447            }
41448            SyntaxKind::TerminalTrue => {
41449                Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
41450            }
41451            SyntaxKind::TerminalType => {
41452                Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
41453            }
41454            SyntaxKind::TerminalUse => {
41455                Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
41456            }
41457            SyntaxKind::TerminalPub => {
41458                Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
41459            }
41460            SyntaxKind::TerminalAnd => {
41461                Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
41462            }
41463            SyntaxKind::TerminalAndAnd => {
41464                Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
41465            }
41466            SyntaxKind::TerminalArrow => {
41467                Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
41468            }
41469            SyntaxKind::TerminalAt => {
41470                Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
41471            }
41472            SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
41473                TerminalBadCharacters::from_syntax_node(db, node),
41474            )),
41475            SyntaxKind::TerminalColon => {
41476                Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
41477            }
41478            SyntaxKind::TerminalColonColon => {
41479                Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
41480            }
41481            SyntaxKind::TerminalComma => {
41482                Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
41483            }
41484            SyntaxKind::TerminalDiv => {
41485                Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
41486            }
41487            SyntaxKind::TerminalDivEq => {
41488                Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
41489            }
41490            SyntaxKind::TerminalDollar => {
41491                Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
41492            }
41493            SyntaxKind::TerminalDot => {
41494                Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
41495            }
41496            SyntaxKind::TerminalDotDot => {
41497                Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
41498            }
41499            SyntaxKind::TerminalDotDotEq => {
41500                Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
41501            }
41502            SyntaxKind::TerminalEndOfFile => {
41503                Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
41504            }
41505            SyntaxKind::TerminalEq => {
41506                Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
41507            }
41508            SyntaxKind::TerminalEqEq => {
41509                Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
41510            }
41511            SyntaxKind::TerminalGE => {
41512                Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
41513            }
41514            SyntaxKind::TerminalGT => {
41515                Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
41516            }
41517            SyntaxKind::TerminalHash => {
41518                Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
41519            }
41520            SyntaxKind::TerminalLBrace => {
41521                Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
41522            }
41523            SyntaxKind::TerminalLBrack => {
41524                Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
41525            }
41526            SyntaxKind::TerminalLE => {
41527                Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
41528            }
41529            SyntaxKind::TerminalLParen => {
41530                Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
41531            }
41532            SyntaxKind::TerminalLT => {
41533                Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
41534            }
41535            SyntaxKind::TerminalMatchArrow => {
41536                Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
41537            }
41538            SyntaxKind::TerminalMinus => {
41539                Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
41540            }
41541            SyntaxKind::TerminalMinusEq => {
41542                Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
41543            }
41544            SyntaxKind::TerminalMod => {
41545                Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
41546            }
41547            SyntaxKind::TerminalModEq => {
41548                Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
41549            }
41550            SyntaxKind::TerminalMul => {
41551                Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
41552            }
41553            SyntaxKind::TerminalMulEq => {
41554                Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
41555            }
41556            SyntaxKind::TerminalNeq => {
41557                Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
41558            }
41559            SyntaxKind::TerminalNot => {
41560                Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
41561            }
41562            SyntaxKind::TerminalBitNot => {
41563                Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
41564            }
41565            SyntaxKind::TerminalOr => {
41566                Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
41567            }
41568            SyntaxKind::TerminalOrOr => {
41569                Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
41570            }
41571            SyntaxKind::TerminalPlus => {
41572                Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
41573            }
41574            SyntaxKind::TerminalPlusEq => {
41575                Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
41576            }
41577            SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
41578                TerminalQuestionMark::from_syntax_node(db, node),
41579            )),
41580            SyntaxKind::TerminalRBrace => {
41581                Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
41582            }
41583            SyntaxKind::TerminalRBrack => {
41584                Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
41585            }
41586            SyntaxKind::TerminalRParen => {
41587                Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
41588            }
41589            SyntaxKind::TerminalSemicolon => {
41590                Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
41591            }
41592            SyntaxKind::TerminalUnderscore => {
41593                Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
41594            }
41595            SyntaxKind::TerminalXor => {
41596                Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
41597            }
41598            SyntaxKind::TerminalEmpty => {
41599                Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
41600            }
41601            _ => None,
41602        }
41603    }
41604    fn as_syntax_node(&self) -> SyntaxNode<'db> {
41605        match self {
41606            TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
41607            TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
41608            TokenNode::TerminalShortString(x) => x.as_syntax_node(),
41609            TokenNode::TerminalString(x) => x.as_syntax_node(),
41610            TokenNode::TerminalAs(x) => x.as_syntax_node(),
41611            TokenNode::TerminalConst(x) => x.as_syntax_node(),
41612            TokenNode::TerminalElse(x) => x.as_syntax_node(),
41613            TokenNode::TerminalEnum(x) => x.as_syntax_node(),
41614            TokenNode::TerminalExtern(x) => x.as_syntax_node(),
41615            TokenNode::TerminalFalse(x) => x.as_syntax_node(),
41616            TokenNode::TerminalFunction(x) => x.as_syntax_node(),
41617            TokenNode::TerminalIf(x) => x.as_syntax_node(),
41618            TokenNode::TerminalWhile(x) => x.as_syntax_node(),
41619            TokenNode::TerminalFor(x) => x.as_syntax_node(),
41620            TokenNode::TerminalLoop(x) => x.as_syntax_node(),
41621            TokenNode::TerminalImpl(x) => x.as_syntax_node(),
41622            TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
41623            TokenNode::TerminalLet(x) => x.as_syntax_node(),
41624            TokenNode::TerminalMacro(x) => x.as_syntax_node(),
41625            TokenNode::TerminalMatch(x) => x.as_syntax_node(),
41626            TokenNode::TerminalModule(x) => x.as_syntax_node(),
41627            TokenNode::TerminalMut(x) => x.as_syntax_node(),
41628            TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
41629            TokenNode::TerminalOf(x) => x.as_syntax_node(),
41630            TokenNode::TerminalRef(x) => x.as_syntax_node(),
41631            TokenNode::TerminalContinue(x) => x.as_syntax_node(),
41632            TokenNode::TerminalReturn(x) => x.as_syntax_node(),
41633            TokenNode::TerminalBreak(x) => x.as_syntax_node(),
41634            TokenNode::TerminalStruct(x) => x.as_syntax_node(),
41635            TokenNode::TerminalTrait(x) => x.as_syntax_node(),
41636            TokenNode::TerminalTrue(x) => x.as_syntax_node(),
41637            TokenNode::TerminalType(x) => x.as_syntax_node(),
41638            TokenNode::TerminalUse(x) => x.as_syntax_node(),
41639            TokenNode::TerminalPub(x) => x.as_syntax_node(),
41640            TokenNode::TerminalAnd(x) => x.as_syntax_node(),
41641            TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
41642            TokenNode::TerminalArrow(x) => x.as_syntax_node(),
41643            TokenNode::TerminalAt(x) => x.as_syntax_node(),
41644            TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
41645            TokenNode::TerminalColon(x) => x.as_syntax_node(),
41646            TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
41647            TokenNode::TerminalComma(x) => x.as_syntax_node(),
41648            TokenNode::TerminalDiv(x) => x.as_syntax_node(),
41649            TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
41650            TokenNode::TerminalDollar(x) => x.as_syntax_node(),
41651            TokenNode::TerminalDot(x) => x.as_syntax_node(),
41652            TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
41653            TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
41654            TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
41655            TokenNode::TerminalEq(x) => x.as_syntax_node(),
41656            TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
41657            TokenNode::TerminalGE(x) => x.as_syntax_node(),
41658            TokenNode::TerminalGT(x) => x.as_syntax_node(),
41659            TokenNode::TerminalHash(x) => x.as_syntax_node(),
41660            TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
41661            TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
41662            TokenNode::TerminalLE(x) => x.as_syntax_node(),
41663            TokenNode::TerminalLParen(x) => x.as_syntax_node(),
41664            TokenNode::TerminalLT(x) => x.as_syntax_node(),
41665            TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
41666            TokenNode::TerminalMinus(x) => x.as_syntax_node(),
41667            TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
41668            TokenNode::TerminalMod(x) => x.as_syntax_node(),
41669            TokenNode::TerminalModEq(x) => x.as_syntax_node(),
41670            TokenNode::TerminalMul(x) => x.as_syntax_node(),
41671            TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
41672            TokenNode::TerminalNeq(x) => x.as_syntax_node(),
41673            TokenNode::TerminalNot(x) => x.as_syntax_node(),
41674            TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
41675            TokenNode::TerminalOr(x) => x.as_syntax_node(),
41676            TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
41677            TokenNode::TerminalPlus(x) => x.as_syntax_node(),
41678            TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
41679            TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
41680            TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
41681            TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
41682            TokenNode::TerminalRParen(x) => x.as_syntax_node(),
41683            TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
41684            TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
41685            TokenNode::TerminalXor(x) => x.as_syntax_node(),
41686            TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
41687        }
41688    }
41689    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
41690        TokenNodePtr(self.as_syntax_node().long(db).stable_ptr)
41691    }
41692}
41693impl<'db> TokenNode<'db> {
41694    /// Checks if a kind of a variant of [TokenNode].
41695    pub fn is_variant(kind: SyntaxKind) -> bool {
41696        matches!(
41697            kind,
41698            SyntaxKind::TerminalIdentifier
41699                | SyntaxKind::TerminalLiteralNumber
41700                | SyntaxKind::TerminalShortString
41701                | SyntaxKind::TerminalString
41702                | SyntaxKind::TerminalAs
41703                | SyntaxKind::TerminalConst
41704                | SyntaxKind::TerminalElse
41705                | SyntaxKind::TerminalEnum
41706                | SyntaxKind::TerminalExtern
41707                | SyntaxKind::TerminalFalse
41708                | SyntaxKind::TerminalFunction
41709                | SyntaxKind::TerminalIf
41710                | SyntaxKind::TerminalWhile
41711                | SyntaxKind::TerminalFor
41712                | SyntaxKind::TerminalLoop
41713                | SyntaxKind::TerminalImpl
41714                | SyntaxKind::TerminalImplicits
41715                | SyntaxKind::TerminalLet
41716                | SyntaxKind::TerminalMacro
41717                | SyntaxKind::TerminalMatch
41718                | SyntaxKind::TerminalModule
41719                | SyntaxKind::TerminalMut
41720                | SyntaxKind::TerminalNoPanic
41721                | SyntaxKind::TerminalOf
41722                | SyntaxKind::TerminalRef
41723                | SyntaxKind::TerminalContinue
41724                | SyntaxKind::TerminalReturn
41725                | SyntaxKind::TerminalBreak
41726                | SyntaxKind::TerminalStruct
41727                | SyntaxKind::TerminalTrait
41728                | SyntaxKind::TerminalTrue
41729                | SyntaxKind::TerminalType
41730                | SyntaxKind::TerminalUse
41731                | SyntaxKind::TerminalPub
41732                | SyntaxKind::TerminalAnd
41733                | SyntaxKind::TerminalAndAnd
41734                | SyntaxKind::TerminalArrow
41735                | SyntaxKind::TerminalAt
41736                | SyntaxKind::TerminalBadCharacters
41737                | SyntaxKind::TerminalColon
41738                | SyntaxKind::TerminalColonColon
41739                | SyntaxKind::TerminalComma
41740                | SyntaxKind::TerminalDiv
41741                | SyntaxKind::TerminalDivEq
41742                | SyntaxKind::TerminalDollar
41743                | SyntaxKind::TerminalDot
41744                | SyntaxKind::TerminalDotDot
41745                | SyntaxKind::TerminalDotDotEq
41746                | SyntaxKind::TerminalEndOfFile
41747                | SyntaxKind::TerminalEq
41748                | SyntaxKind::TerminalEqEq
41749                | SyntaxKind::TerminalGE
41750                | SyntaxKind::TerminalGT
41751                | SyntaxKind::TerminalHash
41752                | SyntaxKind::TerminalLBrace
41753                | SyntaxKind::TerminalLBrack
41754                | SyntaxKind::TerminalLE
41755                | SyntaxKind::TerminalLParen
41756                | SyntaxKind::TerminalLT
41757                | SyntaxKind::TerminalMatchArrow
41758                | SyntaxKind::TerminalMinus
41759                | SyntaxKind::TerminalMinusEq
41760                | SyntaxKind::TerminalMod
41761                | SyntaxKind::TerminalModEq
41762                | SyntaxKind::TerminalMul
41763                | SyntaxKind::TerminalMulEq
41764                | SyntaxKind::TerminalNeq
41765                | SyntaxKind::TerminalNot
41766                | SyntaxKind::TerminalBitNot
41767                | SyntaxKind::TerminalOr
41768                | SyntaxKind::TerminalOrOr
41769                | SyntaxKind::TerminalPlus
41770                | SyntaxKind::TerminalPlusEq
41771                | SyntaxKind::TerminalQuestionMark
41772                | SyntaxKind::TerminalRBrace
41773                | SyntaxKind::TerminalRBrack
41774                | SyntaxKind::TerminalRParen
41775                | SyntaxKind::TerminalSemicolon
41776                | SyntaxKind::TerminalUnderscore
41777                | SyntaxKind::TerminalXor
41778                | SyntaxKind::TerminalEmpty
41779        )
41780    }
41781}