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_proc_macros::HeapSize;
11use cairo_lang_utils::{Intern, extract_matches};
12use salsa::Database;
13
14use super::element_list::ElementList;
15use super::green::GreenNodeDetails;
16use super::kind::SyntaxKind;
17use super::{
18    GreenId, GreenNode, SyntaxNode, SyntaxStablePtrId, Terminal, Token, TypedStablePtr,
19    TypedSyntaxNode,
20};
21#[path = "ast_ext.rs"]
22mod ast_ext;
23#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24pub struct Trivia<'db>(ElementList<'db, Trivium<'db>, 1>);
25impl<'db> Deref for Trivia<'db> {
26    type Target = ElementList<'db, Trivium<'db>, 1>;
27    fn deref(&self) -> &Self::Target {
28        &self.0
29    }
30}
31impl<'db> Trivia<'db> {
32    pub fn new_green(db: &'db dyn Database, children: &[TriviumGreen<'db>]) -> TriviaGreen<'db> {
33        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
34        TriviaGreen(
35            GreenNode {
36                kind: SyntaxKind::Trivia,
37                details: GreenNodeDetails::Node {
38                    children: children.iter().map(|x| x.0).collect(),
39                    width,
40                },
41            }
42            .intern(db),
43        )
44    }
45}
46#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
47pub struct TriviaPtr<'db>(pub SyntaxStablePtrId<'db>);
48impl<'db> TypedStablePtr<'db> for TriviaPtr<'db> {
49    type SyntaxNode = Trivia<'db>;
50    fn untyped(self) -> SyntaxStablePtrId<'db> {
51        self.0
52    }
53    fn lookup(&self, db: &'db dyn Database) -> Trivia<'db> {
54        Trivia::from_syntax_node(db, self.0.lookup(db))
55    }
56}
57impl<'db> From<TriviaPtr<'db>> for SyntaxStablePtrId<'db> {
58    fn from(ptr: TriviaPtr<'db>) -> Self {
59        ptr.untyped()
60    }
61}
62#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
63pub struct TriviaGreen<'db>(pub GreenId<'db>);
64impl<'db> TypedSyntaxNode<'db> for Trivia<'db> {
65    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Trivia);
66    type StablePtr = TriviaPtr<'db>;
67    type Green = TriviaGreen<'db>;
68    fn missing(db: &'db dyn Database) -> Self::Green {
69        TriviaGreen(
70            GreenNode {
71                kind: SyntaxKind::Trivia,
72                details: GreenNodeDetails::Node {
73                    children: [].into(),
74                    width: TextWidth::default(),
75                },
76            }
77            .intern(db),
78        )
79    }
80    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
81        Self(ElementList::new(node))
82    }
83    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
84        if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
85    }
86    fn as_syntax_node(&self) -> SyntaxNode<'db> {
87        self.node
88    }
89    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
90        TriviaPtr(self.node.stable_ptr(db))
91    }
92}
93#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
94pub enum Trivium<'db> {
95    SingleLineComment(TokenSingleLineComment<'db>),
96    SingleLineDocComment(TokenSingleLineDocComment<'db>),
97    SingleLineInnerComment(TokenSingleLineInnerComment<'db>),
98    Whitespace(TokenWhitespace<'db>),
99    Newline(TokenNewline<'db>),
100    Skipped(TokenSkipped<'db>),
101    SkippedNode(TriviumSkippedNode<'db>),
102}
103#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
104pub struct TriviumPtr<'db>(pub SyntaxStablePtrId<'db>);
105impl<'db> TypedStablePtr<'db> for TriviumPtr<'db> {
106    type SyntaxNode = Trivium<'db>;
107    fn untyped(self) -> SyntaxStablePtrId<'db> {
108        self.0
109    }
110    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
111        Trivium::from_syntax_node(db, self.0.lookup(db))
112    }
113}
114impl<'db> From<TriviumPtr<'db>> for SyntaxStablePtrId<'db> {
115    fn from(ptr: TriviumPtr<'db>) -> Self {
116        ptr.untyped()
117    }
118}
119impl<'db> From<TokenSingleLineCommentPtr<'db>> for TriviumPtr<'db> {
120    fn from(value: TokenSingleLineCommentPtr<'db>) -> Self {
121        Self(value.0)
122    }
123}
124impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for TriviumPtr<'db> {
125    fn from(value: TokenSingleLineDocCommentPtr<'db>) -> Self {
126        Self(value.0)
127    }
128}
129impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for TriviumPtr<'db> {
130    fn from(value: TokenSingleLineInnerCommentPtr<'db>) -> Self {
131        Self(value.0)
132    }
133}
134impl<'db> From<TokenWhitespacePtr<'db>> for TriviumPtr<'db> {
135    fn from(value: TokenWhitespacePtr<'db>) -> Self {
136        Self(value.0)
137    }
138}
139impl<'db> From<TokenNewlinePtr<'db>> for TriviumPtr<'db> {
140    fn from(value: TokenNewlinePtr<'db>) -> Self {
141        Self(value.0)
142    }
143}
144impl<'db> From<TokenSkippedPtr<'db>> for TriviumPtr<'db> {
145    fn from(value: TokenSkippedPtr<'db>) -> Self {
146        Self(value.0)
147    }
148}
149impl<'db> From<TriviumSkippedNodePtr<'db>> for TriviumPtr<'db> {
150    fn from(value: TriviumSkippedNodePtr<'db>) -> Self {
151        Self(value.0)
152    }
153}
154impl<'db> From<TokenSingleLineCommentGreen<'db>> for TriviumGreen<'db> {
155    fn from(value: TokenSingleLineCommentGreen<'db>) -> Self {
156        Self(value.0)
157    }
158}
159impl<'db> From<TokenSingleLineDocCommentGreen<'db>> for TriviumGreen<'db> {
160    fn from(value: TokenSingleLineDocCommentGreen<'db>) -> Self {
161        Self(value.0)
162    }
163}
164impl<'db> From<TokenSingleLineInnerCommentGreen<'db>> for TriviumGreen<'db> {
165    fn from(value: TokenSingleLineInnerCommentGreen<'db>) -> Self {
166        Self(value.0)
167    }
168}
169impl<'db> From<TokenWhitespaceGreen<'db>> for TriviumGreen<'db> {
170    fn from(value: TokenWhitespaceGreen<'db>) -> Self {
171        Self(value.0)
172    }
173}
174impl<'db> From<TokenNewlineGreen<'db>> for TriviumGreen<'db> {
175    fn from(value: TokenNewlineGreen<'db>) -> Self {
176        Self(value.0)
177    }
178}
179impl<'db> From<TokenSkippedGreen<'db>> for TriviumGreen<'db> {
180    fn from(value: TokenSkippedGreen<'db>) -> Self {
181        Self(value.0)
182    }
183}
184impl<'db> From<TriviumSkippedNodeGreen<'db>> for TriviumGreen<'db> {
185    fn from(value: TriviumSkippedNodeGreen<'db>) -> Self {
186        Self(value.0)
187    }
188}
189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
190pub struct TriviumGreen<'db>(pub GreenId<'db>);
191impl<'db> TypedSyntaxNode<'db> for Trivium<'db> {
192    const OPTIONAL_KIND: Option<SyntaxKind> = None;
193    type StablePtr = TriviumPtr<'db>;
194    type Green = TriviumGreen<'db>;
195    fn missing(db: &'db dyn Database) -> Self::Green {
196        panic!("No missing variant.");
197    }
198    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
199        let kind = node.kind(db);
200        match kind {
201            SyntaxKind::TokenSingleLineComment => {
202                Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
203            }
204            SyntaxKind::TokenSingleLineDocComment => {
205                Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
206            }
207            SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
208                TokenSingleLineInnerComment::from_syntax_node(db, node),
209            ),
210            SyntaxKind::TokenWhitespace => {
211                Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
212            }
213            SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
214            SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
215            SyntaxKind::TriviumSkippedNode => {
216                Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
217            }
218            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
219        }
220    }
221    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
222        let kind = node.kind(db);
223        match kind {
224            SyntaxKind::TokenSingleLineComment => {
225                Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
226            }
227            SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
228                TokenSingleLineDocComment::from_syntax_node(db, node),
229            )),
230            SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
231                TokenSingleLineInnerComment::from_syntax_node(db, node),
232            )),
233            SyntaxKind::TokenWhitespace => {
234                Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
235            }
236            SyntaxKind::TokenNewline => {
237                Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
238            }
239            SyntaxKind::TokenSkipped => {
240                Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
241            }
242            SyntaxKind::TriviumSkippedNode => {
243                Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
244            }
245            _ => None,
246        }
247    }
248    fn as_syntax_node(&self) -> SyntaxNode<'db> {
249        match self {
250            Trivium::SingleLineComment(x) => x.as_syntax_node(),
251            Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
252            Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
253            Trivium::Whitespace(x) => x.as_syntax_node(),
254            Trivium::Newline(x) => x.as_syntax_node(),
255            Trivium::Skipped(x) => x.as_syntax_node(),
256            Trivium::SkippedNode(x) => x.as_syntax_node(),
257        }
258    }
259    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
260        TriviumPtr(self.as_syntax_node().stable_ptr(db))
261    }
262}
263impl<'db> Trivium<'db> {
264    /// Checks if a kind of a variant of [Trivium].
265    pub fn is_variant(kind: SyntaxKind) -> bool {
266        matches!(
267            kind,
268            SyntaxKind::TokenSingleLineComment
269                | SyntaxKind::TokenSingleLineDocComment
270                | SyntaxKind::TokenSingleLineInnerComment
271                | SyntaxKind::TokenWhitespace
272                | SyntaxKind::TokenNewline
273                | SyntaxKind::TokenSkipped
274                | SyntaxKind::TriviumSkippedNode
275        )
276    }
277}
278#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
279pub enum Expr<'db> {
280    Path(ExprPath<'db>),
281    Literal(TerminalLiteralNumber<'db>),
282    ShortString(TerminalShortString<'db>),
283    String(TerminalString<'db>),
284    False(TerminalFalse<'db>),
285    True(TerminalTrue<'db>),
286    Parenthesized(ExprParenthesized<'db>),
287    Unary(ExprUnary<'db>),
288    Binary(ExprBinary<'db>),
289    Tuple(ExprListParenthesized<'db>),
290    FunctionCall(ExprFunctionCall<'db>),
291    StructCtorCall(ExprStructCtorCall<'db>),
292    Block(ExprBlock<'db>),
293    Match(ExprMatch<'db>),
294    If(ExprIf<'db>),
295    Loop(ExprLoop<'db>),
296    While(ExprWhile<'db>),
297    For(ExprFor<'db>),
298    Closure(ExprClosure<'db>),
299    ErrorPropagate(ExprErrorPropagate<'db>),
300    FieldInitShorthand(ExprFieldInitShorthand<'db>),
301    Indexed(ExprIndexed<'db>),
302    InlineMacro(ExprInlineMacro<'db>),
303    FixedSizeArray(ExprFixedSizeArray<'db>),
304    Underscore(TerminalUnderscore<'db>),
305    Missing(ExprMissing<'db>),
306}
307#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
308pub struct ExprPtr<'db>(pub SyntaxStablePtrId<'db>);
309impl<'db> TypedStablePtr<'db> for ExprPtr<'db> {
310    type SyntaxNode = Expr<'db>;
311    fn untyped(self) -> SyntaxStablePtrId<'db> {
312        self.0
313    }
314    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
315        Expr::from_syntax_node(db, self.0.lookup(db))
316    }
317}
318impl<'db> From<ExprPtr<'db>> for SyntaxStablePtrId<'db> {
319    fn from(ptr: ExprPtr<'db>) -> Self {
320        ptr.untyped()
321    }
322}
323impl<'db> From<ExprPathPtr<'db>> for ExprPtr<'db> {
324    fn from(value: ExprPathPtr<'db>) -> Self {
325        Self(value.0)
326    }
327}
328impl<'db> From<TerminalLiteralNumberPtr<'db>> for ExprPtr<'db> {
329    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
330        Self(value.0)
331    }
332}
333impl<'db> From<TerminalShortStringPtr<'db>> for ExprPtr<'db> {
334    fn from(value: TerminalShortStringPtr<'db>) -> Self {
335        Self(value.0)
336    }
337}
338impl<'db> From<TerminalStringPtr<'db>> for ExprPtr<'db> {
339    fn from(value: TerminalStringPtr<'db>) -> Self {
340        Self(value.0)
341    }
342}
343impl<'db> From<TerminalFalsePtr<'db>> for ExprPtr<'db> {
344    fn from(value: TerminalFalsePtr<'db>) -> Self {
345        Self(value.0)
346    }
347}
348impl<'db> From<TerminalTruePtr<'db>> for ExprPtr<'db> {
349    fn from(value: TerminalTruePtr<'db>) -> Self {
350        Self(value.0)
351    }
352}
353impl<'db> From<ExprParenthesizedPtr<'db>> for ExprPtr<'db> {
354    fn from(value: ExprParenthesizedPtr<'db>) -> Self {
355        Self(value.0)
356    }
357}
358impl<'db> From<ExprUnaryPtr<'db>> for ExprPtr<'db> {
359    fn from(value: ExprUnaryPtr<'db>) -> Self {
360        Self(value.0)
361    }
362}
363impl<'db> From<ExprBinaryPtr<'db>> for ExprPtr<'db> {
364    fn from(value: ExprBinaryPtr<'db>) -> Self {
365        Self(value.0)
366    }
367}
368impl<'db> From<ExprListParenthesizedPtr<'db>> for ExprPtr<'db> {
369    fn from(value: ExprListParenthesizedPtr<'db>) -> Self {
370        Self(value.0)
371    }
372}
373impl<'db> From<ExprFunctionCallPtr<'db>> for ExprPtr<'db> {
374    fn from(value: ExprFunctionCallPtr<'db>) -> Self {
375        Self(value.0)
376    }
377}
378impl<'db> From<ExprStructCtorCallPtr<'db>> for ExprPtr<'db> {
379    fn from(value: ExprStructCtorCallPtr<'db>) -> Self {
380        Self(value.0)
381    }
382}
383impl<'db> From<ExprBlockPtr<'db>> for ExprPtr<'db> {
384    fn from(value: ExprBlockPtr<'db>) -> Self {
385        Self(value.0)
386    }
387}
388impl<'db> From<ExprMatchPtr<'db>> for ExprPtr<'db> {
389    fn from(value: ExprMatchPtr<'db>) -> Self {
390        Self(value.0)
391    }
392}
393impl<'db> From<ExprIfPtr<'db>> for ExprPtr<'db> {
394    fn from(value: ExprIfPtr<'db>) -> Self {
395        Self(value.0)
396    }
397}
398impl<'db> From<ExprLoopPtr<'db>> for ExprPtr<'db> {
399    fn from(value: ExprLoopPtr<'db>) -> Self {
400        Self(value.0)
401    }
402}
403impl<'db> From<ExprWhilePtr<'db>> for ExprPtr<'db> {
404    fn from(value: ExprWhilePtr<'db>) -> Self {
405        Self(value.0)
406    }
407}
408impl<'db> From<ExprForPtr<'db>> for ExprPtr<'db> {
409    fn from(value: ExprForPtr<'db>) -> Self {
410        Self(value.0)
411    }
412}
413impl<'db> From<ExprClosurePtr<'db>> for ExprPtr<'db> {
414    fn from(value: ExprClosurePtr<'db>) -> Self {
415        Self(value.0)
416    }
417}
418impl<'db> From<ExprErrorPropagatePtr<'db>> for ExprPtr<'db> {
419    fn from(value: ExprErrorPropagatePtr<'db>) -> Self {
420        Self(value.0)
421    }
422}
423impl<'db> From<ExprFieldInitShorthandPtr<'db>> for ExprPtr<'db> {
424    fn from(value: ExprFieldInitShorthandPtr<'db>) -> Self {
425        Self(value.0)
426    }
427}
428impl<'db> From<ExprIndexedPtr<'db>> for ExprPtr<'db> {
429    fn from(value: ExprIndexedPtr<'db>) -> Self {
430        Self(value.0)
431    }
432}
433impl<'db> From<ExprInlineMacroPtr<'db>> for ExprPtr<'db> {
434    fn from(value: ExprInlineMacroPtr<'db>) -> Self {
435        Self(value.0)
436    }
437}
438impl<'db> From<ExprFixedSizeArrayPtr<'db>> for ExprPtr<'db> {
439    fn from(value: ExprFixedSizeArrayPtr<'db>) -> Self {
440        Self(value.0)
441    }
442}
443impl<'db> From<TerminalUnderscorePtr<'db>> for ExprPtr<'db> {
444    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
445        Self(value.0)
446    }
447}
448impl<'db> From<ExprMissingPtr<'db>> for ExprPtr<'db> {
449    fn from(value: ExprMissingPtr<'db>) -> Self {
450        Self(value.0)
451    }
452}
453impl<'db> From<ExprPathGreen<'db>> for ExprGreen<'db> {
454    fn from(value: ExprPathGreen<'db>) -> Self {
455        Self(value.0)
456    }
457}
458impl<'db> From<TerminalLiteralNumberGreen<'db>> for ExprGreen<'db> {
459    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
460        Self(value.0)
461    }
462}
463impl<'db> From<TerminalShortStringGreen<'db>> for ExprGreen<'db> {
464    fn from(value: TerminalShortStringGreen<'db>) -> Self {
465        Self(value.0)
466    }
467}
468impl<'db> From<TerminalStringGreen<'db>> for ExprGreen<'db> {
469    fn from(value: TerminalStringGreen<'db>) -> Self {
470        Self(value.0)
471    }
472}
473impl<'db> From<TerminalFalseGreen<'db>> for ExprGreen<'db> {
474    fn from(value: TerminalFalseGreen<'db>) -> Self {
475        Self(value.0)
476    }
477}
478impl<'db> From<TerminalTrueGreen<'db>> for ExprGreen<'db> {
479    fn from(value: TerminalTrueGreen<'db>) -> Self {
480        Self(value.0)
481    }
482}
483impl<'db> From<ExprParenthesizedGreen<'db>> for ExprGreen<'db> {
484    fn from(value: ExprParenthesizedGreen<'db>) -> Self {
485        Self(value.0)
486    }
487}
488impl<'db> From<ExprUnaryGreen<'db>> for ExprGreen<'db> {
489    fn from(value: ExprUnaryGreen<'db>) -> Self {
490        Self(value.0)
491    }
492}
493impl<'db> From<ExprBinaryGreen<'db>> for ExprGreen<'db> {
494    fn from(value: ExprBinaryGreen<'db>) -> Self {
495        Self(value.0)
496    }
497}
498impl<'db> From<ExprListParenthesizedGreen<'db>> for ExprGreen<'db> {
499    fn from(value: ExprListParenthesizedGreen<'db>) -> Self {
500        Self(value.0)
501    }
502}
503impl<'db> From<ExprFunctionCallGreen<'db>> for ExprGreen<'db> {
504    fn from(value: ExprFunctionCallGreen<'db>) -> Self {
505        Self(value.0)
506    }
507}
508impl<'db> From<ExprStructCtorCallGreen<'db>> for ExprGreen<'db> {
509    fn from(value: ExprStructCtorCallGreen<'db>) -> Self {
510        Self(value.0)
511    }
512}
513impl<'db> From<ExprBlockGreen<'db>> for ExprGreen<'db> {
514    fn from(value: ExprBlockGreen<'db>) -> Self {
515        Self(value.0)
516    }
517}
518impl<'db> From<ExprMatchGreen<'db>> for ExprGreen<'db> {
519    fn from(value: ExprMatchGreen<'db>) -> Self {
520        Self(value.0)
521    }
522}
523impl<'db> From<ExprIfGreen<'db>> for ExprGreen<'db> {
524    fn from(value: ExprIfGreen<'db>) -> Self {
525        Self(value.0)
526    }
527}
528impl<'db> From<ExprLoopGreen<'db>> for ExprGreen<'db> {
529    fn from(value: ExprLoopGreen<'db>) -> Self {
530        Self(value.0)
531    }
532}
533impl<'db> From<ExprWhileGreen<'db>> for ExprGreen<'db> {
534    fn from(value: ExprWhileGreen<'db>) -> Self {
535        Self(value.0)
536    }
537}
538impl<'db> From<ExprForGreen<'db>> for ExprGreen<'db> {
539    fn from(value: ExprForGreen<'db>) -> Self {
540        Self(value.0)
541    }
542}
543impl<'db> From<ExprClosureGreen<'db>> for ExprGreen<'db> {
544    fn from(value: ExprClosureGreen<'db>) -> Self {
545        Self(value.0)
546    }
547}
548impl<'db> From<ExprErrorPropagateGreen<'db>> for ExprGreen<'db> {
549    fn from(value: ExprErrorPropagateGreen<'db>) -> Self {
550        Self(value.0)
551    }
552}
553impl<'db> From<ExprFieldInitShorthandGreen<'db>> for ExprGreen<'db> {
554    fn from(value: ExprFieldInitShorthandGreen<'db>) -> Self {
555        Self(value.0)
556    }
557}
558impl<'db> From<ExprIndexedGreen<'db>> for ExprGreen<'db> {
559    fn from(value: ExprIndexedGreen<'db>) -> Self {
560        Self(value.0)
561    }
562}
563impl<'db> From<ExprInlineMacroGreen<'db>> for ExprGreen<'db> {
564    fn from(value: ExprInlineMacroGreen<'db>) -> Self {
565        Self(value.0)
566    }
567}
568impl<'db> From<ExprFixedSizeArrayGreen<'db>> for ExprGreen<'db> {
569    fn from(value: ExprFixedSizeArrayGreen<'db>) -> Self {
570        Self(value.0)
571    }
572}
573impl<'db> From<TerminalUnderscoreGreen<'db>> for ExprGreen<'db> {
574    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
575        Self(value.0)
576    }
577}
578impl<'db> From<ExprMissingGreen<'db>> for ExprGreen<'db> {
579    fn from(value: ExprMissingGreen<'db>) -> Self {
580        Self(value.0)
581    }
582}
583#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
584pub struct ExprGreen<'db>(pub GreenId<'db>);
585impl<'db> TypedSyntaxNode<'db> for Expr<'db> {
586    const OPTIONAL_KIND: Option<SyntaxKind> = None;
587    type StablePtr = ExprPtr<'db>;
588    type Green = ExprGreen<'db>;
589    fn missing(db: &'db dyn Database) -> Self::Green {
590        ExprGreen(ExprMissing::missing(db).0)
591    }
592    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
593        let kind = node.kind(db);
594        match kind {
595            SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
596            SyntaxKind::TerminalLiteralNumber => {
597                Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
598            }
599            SyntaxKind::TerminalShortString => {
600                Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
601            }
602            SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
603            SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
604            SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
605            SyntaxKind::ExprParenthesized => {
606                Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
607            }
608            SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
609            SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
610            SyntaxKind::ExprListParenthesized => {
611                Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
612            }
613            SyntaxKind::ExprFunctionCall => {
614                Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
615            }
616            SyntaxKind::ExprStructCtorCall => {
617                Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
618            }
619            SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
620            SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
621            SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
622            SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
623            SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
624            SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
625            SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
626            SyntaxKind::ExprErrorPropagate => {
627                Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
628            }
629            SyntaxKind::ExprFieldInitShorthand => {
630                Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
631            }
632            SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
633            SyntaxKind::ExprInlineMacro => {
634                Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
635            }
636            SyntaxKind::ExprFixedSizeArray => {
637                Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
638            }
639            SyntaxKind::TerminalUnderscore => {
640                Expr::Underscore(TerminalUnderscore::from_syntax_node(db, node))
641            }
642            SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
643            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
644        }
645    }
646    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
647        let kind = node.kind(db);
648        match kind {
649            SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
650            SyntaxKind::TerminalLiteralNumber => {
651                Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
652            }
653            SyntaxKind::TerminalShortString => {
654                Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
655            }
656            SyntaxKind::TerminalString => {
657                Some(Expr::String(TerminalString::from_syntax_node(db, node)))
658            }
659            SyntaxKind::TerminalFalse => {
660                Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
661            }
662            SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
663            SyntaxKind::ExprParenthesized => {
664                Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
665            }
666            SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
667            SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
668            SyntaxKind::ExprListParenthesized => {
669                Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
670            }
671            SyntaxKind::ExprFunctionCall => {
672                Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
673            }
674            SyntaxKind::ExprStructCtorCall => {
675                Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
676            }
677            SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
678            SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
679            SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
680            SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
681            SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
682            SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
683            SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
684            SyntaxKind::ExprErrorPropagate => {
685                Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
686            }
687            SyntaxKind::ExprFieldInitShorthand => {
688                Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
689            }
690            SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
691            SyntaxKind::ExprInlineMacro => {
692                Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
693            }
694            SyntaxKind::ExprFixedSizeArray => {
695                Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
696            }
697            SyntaxKind::TerminalUnderscore => {
698                Some(Expr::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
699            }
700            SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
701            _ => None,
702        }
703    }
704    fn as_syntax_node(&self) -> SyntaxNode<'db> {
705        match self {
706            Expr::Path(x) => x.as_syntax_node(),
707            Expr::Literal(x) => x.as_syntax_node(),
708            Expr::ShortString(x) => x.as_syntax_node(),
709            Expr::String(x) => x.as_syntax_node(),
710            Expr::False(x) => x.as_syntax_node(),
711            Expr::True(x) => x.as_syntax_node(),
712            Expr::Parenthesized(x) => x.as_syntax_node(),
713            Expr::Unary(x) => x.as_syntax_node(),
714            Expr::Binary(x) => x.as_syntax_node(),
715            Expr::Tuple(x) => x.as_syntax_node(),
716            Expr::FunctionCall(x) => x.as_syntax_node(),
717            Expr::StructCtorCall(x) => x.as_syntax_node(),
718            Expr::Block(x) => x.as_syntax_node(),
719            Expr::Match(x) => x.as_syntax_node(),
720            Expr::If(x) => x.as_syntax_node(),
721            Expr::Loop(x) => x.as_syntax_node(),
722            Expr::While(x) => x.as_syntax_node(),
723            Expr::For(x) => x.as_syntax_node(),
724            Expr::Closure(x) => x.as_syntax_node(),
725            Expr::ErrorPropagate(x) => x.as_syntax_node(),
726            Expr::FieldInitShorthand(x) => x.as_syntax_node(),
727            Expr::Indexed(x) => x.as_syntax_node(),
728            Expr::InlineMacro(x) => x.as_syntax_node(),
729            Expr::FixedSizeArray(x) => x.as_syntax_node(),
730            Expr::Underscore(x) => x.as_syntax_node(),
731            Expr::Missing(x) => x.as_syntax_node(),
732        }
733    }
734    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
735        ExprPtr(self.as_syntax_node().stable_ptr(db))
736    }
737}
738impl<'db> Expr<'db> {
739    /// Checks if a kind of a variant of [Expr].
740    pub fn is_variant(kind: SyntaxKind) -> bool {
741        matches!(
742            kind,
743            SyntaxKind::ExprPath
744                | SyntaxKind::TerminalLiteralNumber
745                | SyntaxKind::TerminalShortString
746                | SyntaxKind::TerminalString
747                | SyntaxKind::TerminalFalse
748                | SyntaxKind::TerminalTrue
749                | SyntaxKind::ExprParenthesized
750                | SyntaxKind::ExprUnary
751                | SyntaxKind::ExprBinary
752                | SyntaxKind::ExprListParenthesized
753                | SyntaxKind::ExprFunctionCall
754                | SyntaxKind::ExprStructCtorCall
755                | SyntaxKind::ExprBlock
756                | SyntaxKind::ExprMatch
757                | SyntaxKind::ExprIf
758                | SyntaxKind::ExprLoop
759                | SyntaxKind::ExprWhile
760                | SyntaxKind::ExprFor
761                | SyntaxKind::ExprClosure
762                | SyntaxKind::ExprErrorPropagate
763                | SyntaxKind::ExprFieldInitShorthand
764                | SyntaxKind::ExprIndexed
765                | SyntaxKind::ExprInlineMacro
766                | SyntaxKind::ExprFixedSizeArray
767                | SyntaxKind::TerminalUnderscore
768                | SyntaxKind::ExprMissing
769        )
770    }
771}
772#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
773pub struct ExprList<'db>(ElementList<'db, Expr<'db>, 2>);
774impl<'db> Deref for ExprList<'db> {
775    type Target = ElementList<'db, Expr<'db>, 2>;
776    fn deref(&self) -> &Self::Target {
777        &self.0
778    }
779}
780impl<'db> ExprList<'db> {
781    pub fn new_green(
782        db: &'db dyn Database,
783        children: &[ExprListElementOrSeparatorGreen<'db>],
784    ) -> ExprListGreen<'db> {
785        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
786        ExprListGreen(
787            GreenNode {
788                kind: SyntaxKind::ExprList,
789                details: GreenNodeDetails::Node {
790                    children: children.iter().map(|x| x.id()).collect(),
791                    width,
792                },
793            }
794            .intern(db),
795        )
796    }
797}
798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
799pub struct ExprListPtr<'db>(pub SyntaxStablePtrId<'db>);
800impl<'db> TypedStablePtr<'db> for ExprListPtr<'db> {
801    type SyntaxNode = ExprList<'db>;
802    fn untyped(self) -> SyntaxStablePtrId<'db> {
803        self.0
804    }
805    fn lookup(&self, db: &'db dyn Database) -> ExprList<'db> {
806        ExprList::from_syntax_node(db, self.0.lookup(db))
807    }
808}
809impl<'db> From<ExprListPtr<'db>> for SyntaxStablePtrId<'db> {
810    fn from(ptr: ExprListPtr<'db>) -> Self {
811        ptr.untyped()
812    }
813}
814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
815pub enum ExprListElementOrSeparatorGreen<'db> {
816    Separator(TerminalCommaGreen<'db>),
817    Element(ExprGreen<'db>),
818}
819impl<'db> From<TerminalCommaGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
820    fn from(value: TerminalCommaGreen<'db>) -> Self {
821        ExprListElementOrSeparatorGreen::Separator(value)
822    }
823}
824impl<'db> From<ExprGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
825    fn from(value: ExprGreen<'db>) -> Self {
826        ExprListElementOrSeparatorGreen::Element(value)
827    }
828}
829impl<'db> ExprListElementOrSeparatorGreen<'db> {
830    fn id(&self) -> GreenId<'db> {
831        match self {
832            ExprListElementOrSeparatorGreen::Separator(green) => green.0,
833            ExprListElementOrSeparatorGreen::Element(green) => green.0,
834        }
835    }
836}
837#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
838pub struct ExprListGreen<'db>(pub GreenId<'db>);
839impl<'db> TypedSyntaxNode<'db> for ExprList<'db> {
840    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
841    type StablePtr = ExprListPtr<'db>;
842    type Green = ExprListGreen<'db>;
843    fn missing(db: &'db dyn Database) -> Self::Green {
844        ExprListGreen(
845            GreenNode {
846                kind: SyntaxKind::ExprList,
847                details: GreenNodeDetails::Node {
848                    children: [].into(),
849                    width: TextWidth::default(),
850                },
851            }
852            .intern(db),
853        )
854    }
855    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
856        Self(ElementList::new(node))
857    }
858    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
859        if node.kind(db) == SyntaxKind::ExprList {
860            Some(Self(ElementList::new(node)))
861        } else {
862            None
863        }
864    }
865    fn as_syntax_node(&self) -> SyntaxNode<'db> {
866        self.node
867    }
868    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
869        ExprListPtr(self.node.stable_ptr(db))
870    }
871}
872#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
873pub struct Arg<'db> {
874    node: SyntaxNode<'db>,
875}
876impl<'db> Arg<'db> {
877    pub const INDEX_MODIFIERS: usize = 0;
878    pub const INDEX_ARG_CLAUSE: usize = 1;
879    pub fn new_green(
880        db: &'db dyn Database,
881        modifiers: ModifierListGreen<'db>,
882        arg_clause: ArgClauseGreen<'db>,
883    ) -> ArgGreen<'db> {
884        let children = [modifiers.0, arg_clause.0];
885        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
886        ArgGreen(
887            GreenNode {
888                kind: SyntaxKind::Arg,
889                details: GreenNodeDetails::Node { children: children.into(), width },
890            }
891            .intern(db),
892        )
893    }
894}
895impl<'db> Arg<'db> {
896    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
897        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
898    }
899    pub fn arg_clause(&self, db: &'db dyn Database) -> ArgClause<'db> {
900        ArgClause::from_syntax_node(db, self.node.get_children(db)[1])
901    }
902}
903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
904pub struct ArgPtr<'db>(pub SyntaxStablePtrId<'db>);
905impl<'db> ArgPtr<'db> {}
906impl<'db> TypedStablePtr<'db> for ArgPtr<'db> {
907    type SyntaxNode = Arg<'db>;
908    fn untyped(self) -> SyntaxStablePtrId<'db> {
909        self.0
910    }
911    fn lookup(&self, db: &'db dyn Database) -> Arg<'db> {
912        Arg::from_syntax_node(db, self.0.lookup(db))
913    }
914}
915impl<'db> From<ArgPtr<'db>> for SyntaxStablePtrId<'db> {
916    fn from(ptr: ArgPtr<'db>) -> Self {
917        ptr.untyped()
918    }
919}
920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
921pub struct ArgGreen<'db>(pub GreenId<'db>);
922impl<'db> TypedSyntaxNode<'db> for Arg<'db> {
923    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
924    type StablePtr = ArgPtr<'db>;
925    type Green = ArgGreen<'db>;
926    fn missing(db: &'db dyn Database) -> Self::Green {
927        ArgGreen(
928            GreenNode {
929                kind: SyntaxKind::Arg,
930                details: GreenNodeDetails::Node {
931                    children: [ModifierList::missing(db).0, ArgClause::missing(db).0].into(),
932                    width: TextWidth::default(),
933                },
934            }
935            .intern(db),
936        )
937    }
938    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
939        let kind = node.kind(db);
940        assert_eq!(
941            kind,
942            SyntaxKind::Arg,
943            "Unexpected SyntaxKind {:?}. Expected {:?}.",
944            kind,
945            SyntaxKind::Arg
946        );
947        Self { node }
948    }
949    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
950        let kind = node.kind(db);
951        if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
952    }
953    fn as_syntax_node(&self) -> SyntaxNode<'db> {
954        self.node
955    }
956    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
957        ArgPtr(self.node.stable_ptr(db))
958    }
959}
960#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
961pub enum ArgClause<'db> {
962    Unnamed(ArgClauseUnnamed<'db>),
963    Named(ArgClauseNamed<'db>),
964    FieldInitShorthand(ArgClauseFieldInitShorthand<'db>),
965}
966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
967pub struct ArgClausePtr<'db>(pub SyntaxStablePtrId<'db>);
968impl<'db> TypedStablePtr<'db> for ArgClausePtr<'db> {
969    type SyntaxNode = ArgClause<'db>;
970    fn untyped(self) -> SyntaxStablePtrId<'db> {
971        self.0
972    }
973    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
974        ArgClause::from_syntax_node(db, self.0.lookup(db))
975    }
976}
977impl<'db> From<ArgClausePtr<'db>> for SyntaxStablePtrId<'db> {
978    fn from(ptr: ArgClausePtr<'db>) -> Self {
979        ptr.untyped()
980    }
981}
982impl<'db> From<ArgClauseUnnamedPtr<'db>> for ArgClausePtr<'db> {
983    fn from(value: ArgClauseUnnamedPtr<'db>) -> Self {
984        Self(value.0)
985    }
986}
987impl<'db> From<ArgClauseNamedPtr<'db>> for ArgClausePtr<'db> {
988    fn from(value: ArgClauseNamedPtr<'db>) -> Self {
989        Self(value.0)
990    }
991}
992impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for ArgClausePtr<'db> {
993    fn from(value: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
994        Self(value.0)
995    }
996}
997impl<'db> From<ArgClauseUnnamedGreen<'db>> for ArgClauseGreen<'db> {
998    fn from(value: ArgClauseUnnamedGreen<'db>) -> Self {
999        Self(value.0)
1000    }
1001}
1002impl<'db> From<ArgClauseNamedGreen<'db>> for ArgClauseGreen<'db> {
1003    fn from(value: ArgClauseNamedGreen<'db>) -> Self {
1004        Self(value.0)
1005    }
1006}
1007impl<'db> From<ArgClauseFieldInitShorthandGreen<'db>> for ArgClauseGreen<'db> {
1008    fn from(value: ArgClauseFieldInitShorthandGreen<'db>) -> Self {
1009        Self(value.0)
1010    }
1011}
1012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1013pub struct ArgClauseGreen<'db>(pub GreenId<'db>);
1014impl<'db> TypedSyntaxNode<'db> for ArgClause<'db> {
1015    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1016    type StablePtr = ArgClausePtr<'db>;
1017    type Green = ArgClauseGreen<'db>;
1018    fn missing(db: &'db dyn Database) -> Self::Green {
1019        panic!("No missing variant.");
1020    }
1021    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1022        let kind = node.kind(db);
1023        match kind {
1024            SyntaxKind::ArgClauseUnnamed => {
1025                ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1026            }
1027            SyntaxKind::ArgClauseNamed => {
1028                ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1029            }
1030            SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1031                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1032            ),
1033            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1034        }
1035    }
1036    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1037        let kind = node.kind(db);
1038        match kind {
1039            SyntaxKind::ArgClauseUnnamed => {
1040                Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1041            }
1042            SyntaxKind::ArgClauseNamed => {
1043                Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1044            }
1045            SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1046                ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1047            )),
1048            _ => None,
1049        }
1050    }
1051    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1052        match self {
1053            ArgClause::Unnamed(x) => x.as_syntax_node(),
1054            ArgClause::Named(x) => x.as_syntax_node(),
1055            ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1056        }
1057    }
1058    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1059        ArgClausePtr(self.as_syntax_node().stable_ptr(db))
1060    }
1061}
1062impl<'db> ArgClause<'db> {
1063    /// Checks if a kind of a variant of [ArgClause].
1064    pub fn is_variant(kind: SyntaxKind) -> bool {
1065        matches!(
1066            kind,
1067            SyntaxKind::ArgClauseUnnamed
1068                | SyntaxKind::ArgClauseNamed
1069                | SyntaxKind::ArgClauseFieldInitShorthand
1070        )
1071    }
1072}
1073#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1074pub struct ArgClauseNamed<'db> {
1075    node: SyntaxNode<'db>,
1076}
1077impl<'db> ArgClauseNamed<'db> {
1078    pub const INDEX_NAME: usize = 0;
1079    pub const INDEX_COLON: usize = 1;
1080    pub const INDEX_VALUE: usize = 2;
1081    pub fn new_green(
1082        db: &'db dyn Database,
1083        name: TerminalIdentifierGreen<'db>,
1084        colon: TerminalColonGreen<'db>,
1085        value: ExprGreen<'db>,
1086    ) -> ArgClauseNamedGreen<'db> {
1087        let children = [name.0, colon.0, value.0];
1088        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1089        ArgClauseNamedGreen(
1090            GreenNode {
1091                kind: SyntaxKind::ArgClauseNamed,
1092                details: GreenNodeDetails::Node { children: children.into(), width },
1093            }
1094            .intern(db),
1095        )
1096    }
1097}
1098impl<'db> ArgClauseNamed<'db> {
1099    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1100        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1101    }
1102    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1103        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
1104    }
1105    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1106        Expr::from_syntax_node(db, self.node.get_children(db)[2])
1107    }
1108}
1109#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1110pub struct ArgClauseNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1111impl<'db> ArgClauseNamedPtr<'db> {}
1112impl<'db> TypedStablePtr<'db> for ArgClauseNamedPtr<'db> {
1113    type SyntaxNode = ArgClauseNamed<'db>;
1114    fn untyped(self) -> SyntaxStablePtrId<'db> {
1115        self.0
1116    }
1117    fn lookup(&self, db: &'db dyn Database) -> ArgClauseNamed<'db> {
1118        ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1119    }
1120}
1121impl<'db> From<ArgClauseNamedPtr<'db>> for SyntaxStablePtrId<'db> {
1122    fn from(ptr: ArgClauseNamedPtr<'db>) -> Self {
1123        ptr.untyped()
1124    }
1125}
1126#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1127pub struct ArgClauseNamedGreen<'db>(pub GreenId<'db>);
1128impl<'db> TypedSyntaxNode<'db> for ArgClauseNamed<'db> {
1129    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1130    type StablePtr = ArgClauseNamedPtr<'db>;
1131    type Green = ArgClauseNamedGreen<'db>;
1132    fn missing(db: &'db dyn Database) -> Self::Green {
1133        ArgClauseNamedGreen(
1134            GreenNode {
1135                kind: SyntaxKind::ArgClauseNamed,
1136                details: GreenNodeDetails::Node {
1137                    children: [
1138                        TerminalIdentifier::missing(db).0,
1139                        TerminalColon::missing(db).0,
1140                        Expr::missing(db).0,
1141                    ]
1142                    .into(),
1143                    width: TextWidth::default(),
1144                },
1145            }
1146            .intern(db),
1147        )
1148    }
1149    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1150        let kind = node.kind(db);
1151        assert_eq!(
1152            kind,
1153            SyntaxKind::ArgClauseNamed,
1154            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1155            kind,
1156            SyntaxKind::ArgClauseNamed
1157        );
1158        Self { node }
1159    }
1160    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1161        let kind = node.kind(db);
1162        if kind == SyntaxKind::ArgClauseNamed {
1163            Some(Self::from_syntax_node(db, node))
1164        } else {
1165            None
1166        }
1167    }
1168    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1169        self.node
1170    }
1171    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1172        ArgClauseNamedPtr(self.node.stable_ptr(db))
1173    }
1174}
1175#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1176pub struct ArgClauseUnnamed<'db> {
1177    node: SyntaxNode<'db>,
1178}
1179impl<'db> ArgClauseUnnamed<'db> {
1180    pub const INDEX_VALUE: usize = 0;
1181    pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> ArgClauseUnnamedGreen<'db> {
1182        let children = [value.0];
1183        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1184        ArgClauseUnnamedGreen(
1185            GreenNode {
1186                kind: SyntaxKind::ArgClauseUnnamed,
1187                details: GreenNodeDetails::Node { children: children.into(), width },
1188            }
1189            .intern(db),
1190        )
1191    }
1192}
1193impl<'db> ArgClauseUnnamed<'db> {
1194    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1195        Expr::from_syntax_node(db, self.node.get_children(db)[0])
1196    }
1197}
1198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1199pub struct ArgClauseUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1200impl<'db> ArgClauseUnnamedPtr<'db> {}
1201impl<'db> TypedStablePtr<'db> for ArgClauseUnnamedPtr<'db> {
1202    type SyntaxNode = ArgClauseUnnamed<'db>;
1203    fn untyped(self) -> SyntaxStablePtrId<'db> {
1204        self.0
1205    }
1206    fn lookup(&self, db: &'db dyn Database) -> ArgClauseUnnamed<'db> {
1207        ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1208    }
1209}
1210impl<'db> From<ArgClauseUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
1211    fn from(ptr: ArgClauseUnnamedPtr<'db>) -> Self {
1212        ptr.untyped()
1213    }
1214}
1215#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1216pub struct ArgClauseUnnamedGreen<'db>(pub GreenId<'db>);
1217impl<'db> TypedSyntaxNode<'db> for ArgClauseUnnamed<'db> {
1218    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1219    type StablePtr = ArgClauseUnnamedPtr<'db>;
1220    type Green = ArgClauseUnnamedGreen<'db>;
1221    fn missing(db: &'db dyn Database) -> Self::Green {
1222        ArgClauseUnnamedGreen(
1223            GreenNode {
1224                kind: SyntaxKind::ArgClauseUnnamed,
1225                details: GreenNodeDetails::Node {
1226                    children: [Expr::missing(db).0].into(),
1227                    width: TextWidth::default(),
1228                },
1229            }
1230            .intern(db),
1231        )
1232    }
1233    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1234        let kind = node.kind(db);
1235        assert_eq!(
1236            kind,
1237            SyntaxKind::ArgClauseUnnamed,
1238            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1239            kind,
1240            SyntaxKind::ArgClauseUnnamed
1241        );
1242        Self { node }
1243    }
1244    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1245        let kind = node.kind(db);
1246        if kind == SyntaxKind::ArgClauseUnnamed {
1247            Some(Self::from_syntax_node(db, node))
1248        } else {
1249            None
1250        }
1251    }
1252    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1253        self.node
1254    }
1255    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1256        ArgClauseUnnamedPtr(self.node.stable_ptr(db))
1257    }
1258}
1259#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1260pub struct ArgClauseFieldInitShorthand<'db> {
1261    node: SyntaxNode<'db>,
1262}
1263impl<'db> ArgClauseFieldInitShorthand<'db> {
1264    pub const INDEX_COLON: usize = 0;
1265    pub const INDEX_NAME: usize = 1;
1266    pub fn new_green(
1267        db: &'db dyn Database,
1268        colon: TerminalColonGreen<'db>,
1269        name: ExprFieldInitShorthandGreen<'db>,
1270    ) -> ArgClauseFieldInitShorthandGreen<'db> {
1271        let children = [colon.0, name.0];
1272        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1273        ArgClauseFieldInitShorthandGreen(
1274            GreenNode {
1275                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1276                details: GreenNodeDetails::Node { children: children.into(), width },
1277            }
1278            .intern(db),
1279        )
1280    }
1281}
1282impl<'db> ArgClauseFieldInitShorthand<'db> {
1283    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1284        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
1285    }
1286    pub fn name(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1287        ExprFieldInitShorthand::from_syntax_node(db, self.node.get_children(db)[1])
1288    }
1289}
1290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1291pub struct ArgClauseFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1292impl<'db> ArgClauseFieldInitShorthandPtr<'db> {}
1293impl<'db> TypedStablePtr<'db> for ArgClauseFieldInitShorthandPtr<'db> {
1294    type SyntaxNode = ArgClauseFieldInitShorthand<'db>;
1295    fn untyped(self) -> SyntaxStablePtrId<'db> {
1296        self.0
1297    }
1298    fn lookup(&self, db: &'db dyn Database) -> ArgClauseFieldInitShorthand<'db> {
1299        ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1300    }
1301}
1302impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1303    fn from(ptr: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
1304        ptr.untyped()
1305    }
1306}
1307#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1308pub struct ArgClauseFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1309impl<'db> TypedSyntaxNode<'db> for ArgClauseFieldInitShorthand<'db> {
1310    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1311    type StablePtr = ArgClauseFieldInitShorthandPtr<'db>;
1312    type Green = ArgClauseFieldInitShorthandGreen<'db>;
1313    fn missing(db: &'db dyn Database) -> Self::Green {
1314        ArgClauseFieldInitShorthandGreen(
1315            GreenNode {
1316                kind: SyntaxKind::ArgClauseFieldInitShorthand,
1317                details: GreenNodeDetails::Node {
1318                    children: [TerminalColon::missing(db).0, ExprFieldInitShorthand::missing(db).0]
1319                        .into(),
1320                    width: TextWidth::default(),
1321                },
1322            }
1323            .intern(db),
1324        )
1325    }
1326    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1327        let kind = node.kind(db);
1328        assert_eq!(
1329            kind,
1330            SyntaxKind::ArgClauseFieldInitShorthand,
1331            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1332            kind,
1333            SyntaxKind::ArgClauseFieldInitShorthand
1334        );
1335        Self { node }
1336    }
1337    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1338        let kind = node.kind(db);
1339        if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1340            Some(Self::from_syntax_node(db, node))
1341        } else {
1342            None
1343        }
1344    }
1345    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1346        self.node
1347    }
1348    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1349        ArgClauseFieldInitShorthandPtr(self.node.stable_ptr(db))
1350    }
1351}
1352#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1353pub struct ExprFieldInitShorthand<'db> {
1354    node: SyntaxNode<'db>,
1355}
1356impl<'db> ExprFieldInitShorthand<'db> {
1357    pub const INDEX_NAME: usize = 0;
1358    pub fn new_green(
1359        db: &'db dyn Database,
1360        name: TerminalIdentifierGreen<'db>,
1361    ) -> ExprFieldInitShorthandGreen<'db> {
1362        let children = [name.0];
1363        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1364        ExprFieldInitShorthandGreen(
1365            GreenNode {
1366                kind: SyntaxKind::ExprFieldInitShorthand,
1367                details: GreenNodeDetails::Node { children: children.into(), width },
1368            }
1369            .intern(db),
1370        )
1371    }
1372}
1373impl<'db> ExprFieldInitShorthand<'db> {
1374    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1375        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1376    }
1377}
1378#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1379pub struct ExprFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1380impl<'db> ExprFieldInitShorthandPtr<'db> {}
1381impl<'db> TypedStablePtr<'db> for ExprFieldInitShorthandPtr<'db> {
1382    type SyntaxNode = ExprFieldInitShorthand<'db>;
1383    fn untyped(self) -> SyntaxStablePtrId<'db> {
1384        self.0
1385    }
1386    fn lookup(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1387        ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1388    }
1389}
1390impl<'db> From<ExprFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1391    fn from(ptr: ExprFieldInitShorthandPtr<'db>) -> Self {
1392        ptr.untyped()
1393    }
1394}
1395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1396pub struct ExprFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1397impl<'db> TypedSyntaxNode<'db> for ExprFieldInitShorthand<'db> {
1398    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1399    type StablePtr = ExprFieldInitShorthandPtr<'db>;
1400    type Green = ExprFieldInitShorthandGreen<'db>;
1401    fn missing(db: &'db dyn Database) -> Self::Green {
1402        ExprFieldInitShorthandGreen(
1403            GreenNode {
1404                kind: SyntaxKind::ExprFieldInitShorthand,
1405                details: GreenNodeDetails::Node {
1406                    children: [TerminalIdentifier::missing(db).0].into(),
1407                    width: TextWidth::default(),
1408                },
1409            }
1410            .intern(db),
1411        )
1412    }
1413    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1414        let kind = node.kind(db);
1415        assert_eq!(
1416            kind,
1417            SyntaxKind::ExprFieldInitShorthand,
1418            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1419            kind,
1420            SyntaxKind::ExprFieldInitShorthand
1421        );
1422        Self { node }
1423    }
1424    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1425        let kind = node.kind(db);
1426        if kind == SyntaxKind::ExprFieldInitShorthand {
1427            Some(Self::from_syntax_node(db, node))
1428        } else {
1429            None
1430        }
1431    }
1432    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1433        self.node
1434    }
1435    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1436        ExprFieldInitShorthandPtr(self.node.stable_ptr(db))
1437    }
1438}
1439#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1440pub struct ArgList<'db>(ElementList<'db, Arg<'db>, 2>);
1441impl<'db> Deref for ArgList<'db> {
1442    type Target = ElementList<'db, Arg<'db>, 2>;
1443    fn deref(&self) -> &Self::Target {
1444        &self.0
1445    }
1446}
1447impl<'db> ArgList<'db> {
1448    pub fn new_green(
1449        db: &'db dyn Database,
1450        children: &[ArgListElementOrSeparatorGreen<'db>],
1451    ) -> ArgListGreen<'db> {
1452        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
1453        ArgListGreen(
1454            GreenNode {
1455                kind: SyntaxKind::ArgList,
1456                details: GreenNodeDetails::Node {
1457                    children: children.iter().map(|x| x.id()).collect(),
1458                    width,
1459                },
1460            }
1461            .intern(db),
1462        )
1463    }
1464}
1465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1466pub struct ArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
1467impl<'db> TypedStablePtr<'db> for ArgListPtr<'db> {
1468    type SyntaxNode = ArgList<'db>;
1469    fn untyped(self) -> SyntaxStablePtrId<'db> {
1470        self.0
1471    }
1472    fn lookup(&self, db: &'db dyn Database) -> ArgList<'db> {
1473        ArgList::from_syntax_node(db, self.0.lookup(db))
1474    }
1475}
1476impl<'db> From<ArgListPtr<'db>> for SyntaxStablePtrId<'db> {
1477    fn from(ptr: ArgListPtr<'db>) -> Self {
1478        ptr.untyped()
1479    }
1480}
1481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1482pub enum ArgListElementOrSeparatorGreen<'db> {
1483    Separator(TerminalCommaGreen<'db>),
1484    Element(ArgGreen<'db>),
1485}
1486impl<'db> From<TerminalCommaGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1487    fn from(value: TerminalCommaGreen<'db>) -> Self {
1488        ArgListElementOrSeparatorGreen::Separator(value)
1489    }
1490}
1491impl<'db> From<ArgGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1492    fn from(value: ArgGreen<'db>) -> Self {
1493        ArgListElementOrSeparatorGreen::Element(value)
1494    }
1495}
1496impl<'db> ArgListElementOrSeparatorGreen<'db> {
1497    fn id(&self) -> GreenId<'db> {
1498        match self {
1499            ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1500            ArgListElementOrSeparatorGreen::Element(green) => green.0,
1501        }
1502    }
1503}
1504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1505pub struct ArgListGreen<'db>(pub GreenId<'db>);
1506impl<'db> TypedSyntaxNode<'db> for ArgList<'db> {
1507    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1508    type StablePtr = ArgListPtr<'db>;
1509    type Green = ArgListGreen<'db>;
1510    fn missing(db: &'db dyn Database) -> Self::Green {
1511        ArgListGreen(
1512            GreenNode {
1513                kind: SyntaxKind::ArgList,
1514                details: GreenNodeDetails::Node {
1515                    children: [].into(),
1516                    width: TextWidth::default(),
1517                },
1518            }
1519            .intern(db),
1520        )
1521    }
1522    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1523        Self(ElementList::new(node))
1524    }
1525    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1526        if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1527    }
1528    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1529        self.node
1530    }
1531    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1532        ArgListPtr(self.node.stable_ptr(db))
1533    }
1534}
1535#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1536pub struct ExprMissing<'db> {
1537    node: SyntaxNode<'db>,
1538}
1539impl<'db> ExprMissing<'db> {
1540    pub fn new_green(db: &'db dyn Database) -> ExprMissingGreen<'db> {
1541        let children = [];
1542        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1543        ExprMissingGreen(
1544            GreenNode {
1545                kind: SyntaxKind::ExprMissing,
1546                details: GreenNodeDetails::Node { children: children.into(), width },
1547            }
1548            .intern(db),
1549        )
1550    }
1551}
1552impl<'db> ExprMissing<'db> {}
1553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1554pub struct ExprMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
1555impl<'db> ExprMissingPtr<'db> {}
1556impl<'db> TypedStablePtr<'db> for ExprMissingPtr<'db> {
1557    type SyntaxNode = ExprMissing<'db>;
1558    fn untyped(self) -> SyntaxStablePtrId<'db> {
1559        self.0
1560    }
1561    fn lookup(&self, db: &'db dyn Database) -> ExprMissing<'db> {
1562        ExprMissing::from_syntax_node(db, self.0.lookup(db))
1563    }
1564}
1565impl<'db> From<ExprMissingPtr<'db>> for SyntaxStablePtrId<'db> {
1566    fn from(ptr: ExprMissingPtr<'db>) -> Self {
1567        ptr.untyped()
1568    }
1569}
1570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1571pub struct ExprMissingGreen<'db>(pub GreenId<'db>);
1572impl<'db> TypedSyntaxNode<'db> for ExprMissing<'db> {
1573    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1574    type StablePtr = ExprMissingPtr<'db>;
1575    type Green = ExprMissingGreen<'db>;
1576    fn missing(db: &'db dyn Database) -> Self::Green {
1577        ExprMissingGreen(
1578            GreenNode {
1579                kind: SyntaxKind::ExprMissing,
1580                details: GreenNodeDetails::Node {
1581                    children: [].into(),
1582                    width: TextWidth::default(),
1583                },
1584            }
1585            .intern(db),
1586        )
1587    }
1588    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1589        let kind = node.kind(db);
1590        assert_eq!(
1591            kind,
1592            SyntaxKind::ExprMissing,
1593            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1594            kind,
1595            SyntaxKind::ExprMissing
1596        );
1597        Self { node }
1598    }
1599    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1600        let kind = node.kind(db);
1601        if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1602    }
1603    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1604        self.node
1605    }
1606    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1607        ExprMissingPtr(self.node.stable_ptr(db))
1608    }
1609}
1610#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1611pub enum PathSegment<'db> {
1612    Simple(PathSegmentSimple<'db>),
1613    WithGenericArgs(PathSegmentWithGenericArgs<'db>),
1614    Missing(PathSegmentMissing<'db>),
1615}
1616#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1617pub struct PathSegmentPtr<'db>(pub SyntaxStablePtrId<'db>);
1618impl<'db> TypedStablePtr<'db> for PathSegmentPtr<'db> {
1619    type SyntaxNode = PathSegment<'db>;
1620    fn untyped(self) -> SyntaxStablePtrId<'db> {
1621        self.0
1622    }
1623    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1624        PathSegment::from_syntax_node(db, self.0.lookup(db))
1625    }
1626}
1627impl<'db> From<PathSegmentPtr<'db>> for SyntaxStablePtrId<'db> {
1628    fn from(ptr: PathSegmentPtr<'db>) -> Self {
1629        ptr.untyped()
1630    }
1631}
1632impl<'db> From<PathSegmentSimplePtr<'db>> for PathSegmentPtr<'db> {
1633    fn from(value: PathSegmentSimplePtr<'db>) -> Self {
1634        Self(value.0)
1635    }
1636}
1637impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for PathSegmentPtr<'db> {
1638    fn from(value: PathSegmentWithGenericArgsPtr<'db>) -> Self {
1639        Self(value.0)
1640    }
1641}
1642impl<'db> From<PathSegmentMissingPtr<'db>> for PathSegmentPtr<'db> {
1643    fn from(value: PathSegmentMissingPtr<'db>) -> Self {
1644        Self(value.0)
1645    }
1646}
1647impl<'db> From<PathSegmentSimpleGreen<'db>> for PathSegmentGreen<'db> {
1648    fn from(value: PathSegmentSimpleGreen<'db>) -> Self {
1649        Self(value.0)
1650    }
1651}
1652impl<'db> From<PathSegmentWithGenericArgsGreen<'db>> for PathSegmentGreen<'db> {
1653    fn from(value: PathSegmentWithGenericArgsGreen<'db>) -> Self {
1654        Self(value.0)
1655    }
1656}
1657impl<'db> From<PathSegmentMissingGreen<'db>> for PathSegmentGreen<'db> {
1658    fn from(value: PathSegmentMissingGreen<'db>) -> Self {
1659        Self(value.0)
1660    }
1661}
1662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1663pub struct PathSegmentGreen<'db>(pub GreenId<'db>);
1664impl<'db> TypedSyntaxNode<'db> for PathSegment<'db> {
1665    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1666    type StablePtr = PathSegmentPtr<'db>;
1667    type Green = PathSegmentGreen<'db>;
1668    fn missing(db: &'db dyn Database) -> Self::Green {
1669        PathSegmentGreen(PathSegmentMissing::missing(db).0)
1670    }
1671    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1672        let kind = node.kind(db);
1673        match kind {
1674            SyntaxKind::PathSegmentSimple => {
1675                PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1676            }
1677            SyntaxKind::PathSegmentWithGenericArgs => {
1678                PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1679            }
1680            SyntaxKind::PathSegmentMissing => {
1681                PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1682            }
1683            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1684        }
1685    }
1686    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1687        let kind = node.kind(db);
1688        match kind {
1689            SyntaxKind::PathSegmentSimple => {
1690                Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1691            }
1692            SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1693                PathSegmentWithGenericArgs::from_syntax_node(db, node),
1694            )),
1695            SyntaxKind::PathSegmentMissing => {
1696                Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1697            }
1698            _ => None,
1699        }
1700    }
1701    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1702        match self {
1703            PathSegment::Simple(x) => x.as_syntax_node(),
1704            PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1705            PathSegment::Missing(x) => x.as_syntax_node(),
1706        }
1707    }
1708    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1709        PathSegmentPtr(self.as_syntax_node().stable_ptr(db))
1710    }
1711}
1712impl<'db> PathSegment<'db> {
1713    /// Checks if a kind of a variant of [PathSegment].
1714    pub fn is_variant(kind: SyntaxKind) -> bool {
1715        matches!(
1716            kind,
1717            SyntaxKind::PathSegmentSimple
1718                | SyntaxKind::PathSegmentWithGenericArgs
1719                | SyntaxKind::PathSegmentMissing
1720        )
1721    }
1722}
1723#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1724pub struct PathSegmentSimple<'db> {
1725    node: SyntaxNode<'db>,
1726}
1727impl<'db> PathSegmentSimple<'db> {
1728    pub const INDEX_IDENT: usize = 0;
1729    pub fn new_green(
1730        db: &'db dyn Database,
1731        ident: TerminalIdentifierGreen<'db>,
1732    ) -> PathSegmentSimpleGreen<'db> {
1733        let children = [ident.0];
1734        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1735        PathSegmentSimpleGreen(
1736            GreenNode {
1737                kind: SyntaxKind::PathSegmentSimple,
1738                details: GreenNodeDetails::Node { children: children.into(), width },
1739            }
1740            .intern(db),
1741        )
1742    }
1743}
1744impl<'db> PathSegmentSimple<'db> {
1745    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1746        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1747    }
1748}
1749#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1750pub struct PathSegmentSimplePtr<'db>(pub SyntaxStablePtrId<'db>);
1751impl<'db> PathSegmentSimplePtr<'db> {}
1752impl<'db> TypedStablePtr<'db> for PathSegmentSimplePtr<'db> {
1753    type SyntaxNode = PathSegmentSimple<'db>;
1754    fn untyped(self) -> SyntaxStablePtrId<'db> {
1755        self.0
1756    }
1757    fn lookup(&self, db: &'db dyn Database) -> PathSegmentSimple<'db> {
1758        PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1759    }
1760}
1761impl<'db> From<PathSegmentSimplePtr<'db>> for SyntaxStablePtrId<'db> {
1762    fn from(ptr: PathSegmentSimplePtr<'db>) -> Self {
1763        ptr.untyped()
1764    }
1765}
1766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1767pub struct PathSegmentSimpleGreen<'db>(pub GreenId<'db>);
1768impl<'db> TypedSyntaxNode<'db> for PathSegmentSimple<'db> {
1769    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1770    type StablePtr = PathSegmentSimplePtr<'db>;
1771    type Green = PathSegmentSimpleGreen<'db>;
1772    fn missing(db: &'db dyn Database) -> Self::Green {
1773        PathSegmentSimpleGreen(
1774            GreenNode {
1775                kind: SyntaxKind::PathSegmentSimple,
1776                details: GreenNodeDetails::Node {
1777                    children: [TerminalIdentifier::missing(db).0].into(),
1778                    width: TextWidth::default(),
1779                },
1780            }
1781            .intern(db),
1782        )
1783    }
1784    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1785        let kind = node.kind(db);
1786        assert_eq!(
1787            kind,
1788            SyntaxKind::PathSegmentSimple,
1789            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1790            kind,
1791            SyntaxKind::PathSegmentSimple
1792        );
1793        Self { node }
1794    }
1795    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1796        let kind = node.kind(db);
1797        if kind == SyntaxKind::PathSegmentSimple {
1798            Some(Self::from_syntax_node(db, node))
1799        } else {
1800            None
1801        }
1802    }
1803    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1804        self.node
1805    }
1806    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1807        PathSegmentSimplePtr(self.node.stable_ptr(db))
1808    }
1809}
1810#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1811pub enum OptionTerminalColonColon<'db> {
1812    Empty(OptionTerminalColonColonEmpty<'db>),
1813    TerminalColonColon(TerminalColonColon<'db>),
1814}
1815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1816pub struct OptionTerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
1817impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonPtr<'db> {
1818    type SyntaxNode = OptionTerminalColonColon<'db>;
1819    fn untyped(self) -> SyntaxStablePtrId<'db> {
1820        self.0
1821    }
1822    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1823        OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1824    }
1825}
1826impl<'db> From<OptionTerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
1827    fn from(ptr: OptionTerminalColonColonPtr<'db>) -> Self {
1828        ptr.untyped()
1829    }
1830}
1831impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1832    fn from(value: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1833        Self(value.0)
1834    }
1835}
1836impl<'db> From<TerminalColonColonPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1837    fn from(value: TerminalColonColonPtr<'db>) -> Self {
1838        Self(value.0)
1839    }
1840}
1841impl<'db> From<OptionTerminalColonColonEmptyGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1842    fn from(value: OptionTerminalColonColonEmptyGreen<'db>) -> Self {
1843        Self(value.0)
1844    }
1845}
1846impl<'db> From<TerminalColonColonGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1847    fn from(value: TerminalColonColonGreen<'db>) -> Self {
1848        Self(value.0)
1849    }
1850}
1851#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1852pub struct OptionTerminalColonColonGreen<'db>(pub GreenId<'db>);
1853impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColon<'db> {
1854    const OPTIONAL_KIND: Option<SyntaxKind> = None;
1855    type StablePtr = OptionTerminalColonColonPtr<'db>;
1856    type Green = OptionTerminalColonColonGreen<'db>;
1857    fn missing(db: &'db dyn Database) -> Self::Green {
1858        panic!("No missing variant.");
1859    }
1860    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1861        let kind = node.kind(db);
1862        match kind {
1863            SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1864                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1865            ),
1866            SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1867                TerminalColonColon::from_syntax_node(db, node),
1868            ),
1869            _ => panic!(
1870                "Unexpected syntax kind {:?} when constructing {}.",
1871                kind, "OptionTerminalColonColon"
1872            ),
1873        }
1874    }
1875    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1876        let kind = node.kind(db);
1877        match kind {
1878            SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1879                OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1880            )),
1881            SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1882                TerminalColonColon::from_syntax_node(db, node),
1883            )),
1884            _ => None,
1885        }
1886    }
1887    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1888        match self {
1889            OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1890            OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1891        }
1892    }
1893    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1894        OptionTerminalColonColonPtr(self.as_syntax_node().stable_ptr(db))
1895    }
1896}
1897impl<'db> OptionTerminalColonColon<'db> {
1898    /// Checks if a kind of a variant of [OptionTerminalColonColon].
1899    pub fn is_variant(kind: SyntaxKind) -> bool {
1900        matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1901    }
1902}
1903#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1904pub struct OptionTerminalColonColonEmpty<'db> {
1905    node: SyntaxNode<'db>,
1906}
1907impl<'db> OptionTerminalColonColonEmpty<'db> {
1908    pub fn new_green(db: &'db dyn Database) -> OptionTerminalColonColonEmptyGreen<'db> {
1909        let children = [];
1910        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1911        OptionTerminalColonColonEmptyGreen(
1912            GreenNode {
1913                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1914                details: GreenNodeDetails::Node { children: children.into(), width },
1915            }
1916            .intern(db),
1917        )
1918    }
1919}
1920impl<'db> OptionTerminalColonColonEmpty<'db> {}
1921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
1922pub struct OptionTerminalColonColonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
1923impl<'db> OptionTerminalColonColonEmptyPtr<'db> {}
1924impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonEmptyPtr<'db> {
1925    type SyntaxNode = OptionTerminalColonColonEmpty<'db>;
1926    fn untyped(self) -> SyntaxStablePtrId<'db> {
1927        self.0
1928    }
1929    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalColonColonEmpty<'db> {
1930        OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1931    }
1932}
1933impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
1934    fn from(ptr: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1935        ptr.untyped()
1936    }
1937}
1938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1939pub struct OptionTerminalColonColonEmptyGreen<'db>(pub GreenId<'db>);
1940impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColonEmpty<'db> {
1941    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1942    type StablePtr = OptionTerminalColonColonEmptyPtr<'db>;
1943    type Green = OptionTerminalColonColonEmptyGreen<'db>;
1944    fn missing(db: &'db dyn Database) -> Self::Green {
1945        OptionTerminalColonColonEmptyGreen(
1946            GreenNode {
1947                kind: SyntaxKind::OptionTerminalColonColonEmpty,
1948                details: GreenNodeDetails::Node {
1949                    children: [].into(),
1950                    width: TextWidth::default(),
1951                },
1952            }
1953            .intern(db),
1954        )
1955    }
1956    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1957        let kind = node.kind(db);
1958        assert_eq!(
1959            kind,
1960            SyntaxKind::OptionTerminalColonColonEmpty,
1961            "Unexpected SyntaxKind {:?}. Expected {:?}.",
1962            kind,
1963            SyntaxKind::OptionTerminalColonColonEmpty
1964        );
1965        Self { node }
1966    }
1967    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1968        let kind = node.kind(db);
1969        if kind == SyntaxKind::OptionTerminalColonColonEmpty {
1970            Some(Self::from_syntax_node(db, node))
1971        } else {
1972            None
1973        }
1974    }
1975    fn as_syntax_node(&self) -> SyntaxNode<'db> {
1976        self.node
1977    }
1978    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1979        OptionTerminalColonColonEmptyPtr(self.node.stable_ptr(db))
1980    }
1981}
1982#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1983pub struct PathSegmentWithGenericArgs<'db> {
1984    node: SyntaxNode<'db>,
1985}
1986impl<'db> PathSegmentWithGenericArgs<'db> {
1987    pub const INDEX_IDENT: usize = 0;
1988    pub const INDEX_SEPARATOR: usize = 1;
1989    pub const INDEX_GENERIC_ARGS: usize = 2;
1990    pub fn new_green(
1991        db: &'db dyn Database,
1992        ident: TerminalIdentifierGreen<'db>,
1993        separator: OptionTerminalColonColonGreen<'db>,
1994        generic_args: GenericArgsGreen<'db>,
1995    ) -> PathSegmentWithGenericArgsGreen<'db> {
1996        let children = [ident.0, separator.0, generic_args.0];
1997        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1998        PathSegmentWithGenericArgsGreen(
1999            GreenNode {
2000                kind: SyntaxKind::PathSegmentWithGenericArgs,
2001                details: GreenNodeDetails::Node { children: children.into(), width },
2002            }
2003            .intern(db),
2004        )
2005    }
2006}
2007impl<'db> PathSegmentWithGenericArgs<'db> {
2008    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2009        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2010    }
2011    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalColonColon<'db> {
2012        OptionTerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
2013    }
2014    pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgs<'db> {
2015        GenericArgs::from_syntax_node(db, self.node.get_children(db)[2])
2016    }
2017}
2018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2019pub struct PathSegmentWithGenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
2020impl<'db> PathSegmentWithGenericArgsPtr<'db> {}
2021impl<'db> TypedStablePtr<'db> for PathSegmentWithGenericArgsPtr<'db> {
2022    type SyntaxNode = PathSegmentWithGenericArgs<'db>;
2023    fn untyped(self) -> SyntaxStablePtrId<'db> {
2024        self.0
2025    }
2026    fn lookup(&self, db: &'db dyn Database) -> PathSegmentWithGenericArgs<'db> {
2027        PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2028    }
2029}
2030impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
2031    fn from(ptr: PathSegmentWithGenericArgsPtr<'db>) -> Self {
2032        ptr.untyped()
2033    }
2034}
2035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2036pub struct PathSegmentWithGenericArgsGreen<'db>(pub GreenId<'db>);
2037impl<'db> TypedSyntaxNode<'db> for PathSegmentWithGenericArgs<'db> {
2038    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2039    type StablePtr = PathSegmentWithGenericArgsPtr<'db>;
2040    type Green = PathSegmentWithGenericArgsGreen<'db>;
2041    fn missing(db: &'db dyn Database) -> Self::Green {
2042        PathSegmentWithGenericArgsGreen(
2043            GreenNode {
2044                kind: SyntaxKind::PathSegmentWithGenericArgs,
2045                details: GreenNodeDetails::Node {
2046                    children: [
2047                        TerminalIdentifier::missing(db).0,
2048                        OptionTerminalColonColon::missing(db).0,
2049                        GenericArgs::missing(db).0,
2050                    ]
2051                    .into(),
2052                    width: TextWidth::default(),
2053                },
2054            }
2055            .intern(db),
2056        )
2057    }
2058    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2059        let kind = node.kind(db);
2060        assert_eq!(
2061            kind,
2062            SyntaxKind::PathSegmentWithGenericArgs,
2063            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2064            kind,
2065            SyntaxKind::PathSegmentWithGenericArgs
2066        );
2067        Self { node }
2068    }
2069    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2070        let kind = node.kind(db);
2071        if kind == SyntaxKind::PathSegmentWithGenericArgs {
2072            Some(Self::from_syntax_node(db, node))
2073        } else {
2074            None
2075        }
2076    }
2077    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2078        self.node
2079    }
2080    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2081        PathSegmentWithGenericArgsPtr(self.node.stable_ptr(db))
2082    }
2083}
2084#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2085pub struct ExprPath<'db> {
2086    node: SyntaxNode<'db>,
2087}
2088impl<'db> ExprPath<'db> {
2089    pub const INDEX_DOLLAR: usize = 0;
2090    pub const INDEX_SEGMENTS: usize = 1;
2091    pub fn new_green(
2092        db: &'db dyn Database,
2093        dollar: OptionTerminalDollarGreen<'db>,
2094        segments: ExprPathInnerGreen<'db>,
2095    ) -> ExprPathGreen<'db> {
2096        let children = [dollar.0, segments.0];
2097        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2098        ExprPathGreen(
2099            GreenNode {
2100                kind: SyntaxKind::ExprPath,
2101                details: GreenNodeDetails::Node { children: children.into(), width },
2102            }
2103            .intern(db),
2104        )
2105    }
2106}
2107impl<'db> ExprPath<'db> {
2108    pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
2109        OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
2110    }
2111    pub fn segments(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2112        ExprPathInner::from_syntax_node(db, self.node.get_children(db)[1])
2113    }
2114}
2115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2116pub struct ExprPathPtr<'db>(pub SyntaxStablePtrId<'db>);
2117impl<'db> ExprPathPtr<'db> {}
2118impl<'db> TypedStablePtr<'db> for ExprPathPtr<'db> {
2119    type SyntaxNode = ExprPath<'db>;
2120    fn untyped(self) -> SyntaxStablePtrId<'db> {
2121        self.0
2122    }
2123    fn lookup(&self, db: &'db dyn Database) -> ExprPath<'db> {
2124        ExprPath::from_syntax_node(db, self.0.lookup(db))
2125    }
2126}
2127impl<'db> From<ExprPathPtr<'db>> for SyntaxStablePtrId<'db> {
2128    fn from(ptr: ExprPathPtr<'db>) -> Self {
2129        ptr.untyped()
2130    }
2131}
2132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2133pub struct ExprPathGreen<'db>(pub GreenId<'db>);
2134impl<'db> TypedSyntaxNode<'db> for ExprPath<'db> {
2135    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2136    type StablePtr = ExprPathPtr<'db>;
2137    type Green = ExprPathGreen<'db>;
2138    fn missing(db: &'db dyn Database) -> Self::Green {
2139        ExprPathGreen(
2140            GreenNode {
2141                kind: SyntaxKind::ExprPath,
2142                details: GreenNodeDetails::Node {
2143                    children: [OptionTerminalDollar::missing(db).0, ExprPathInner::missing(db).0]
2144                        .into(),
2145                    width: TextWidth::default(),
2146                },
2147            }
2148            .intern(db),
2149        )
2150    }
2151    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2152        let kind = node.kind(db);
2153        assert_eq!(
2154            kind,
2155            SyntaxKind::ExprPath,
2156            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2157            kind,
2158            SyntaxKind::ExprPath
2159        );
2160        Self { node }
2161    }
2162    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2163        let kind = node.kind(db);
2164        if kind == SyntaxKind::ExprPath { Some(Self::from_syntax_node(db, node)) } else { None }
2165    }
2166    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2167        self.node
2168    }
2169    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2170        ExprPathPtr(self.node.stable_ptr(db))
2171    }
2172}
2173#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2174pub enum OptionTerminalDollar<'db> {
2175    Empty(OptionTerminalDollarEmpty<'db>),
2176    TerminalDollar(TerminalDollar<'db>),
2177}
2178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2179pub struct OptionTerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
2180impl<'db> TypedStablePtr<'db> for OptionTerminalDollarPtr<'db> {
2181    type SyntaxNode = OptionTerminalDollar<'db>;
2182    fn untyped(self) -> SyntaxStablePtrId<'db> {
2183        self.0
2184    }
2185    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2186        OptionTerminalDollar::from_syntax_node(db, self.0.lookup(db))
2187    }
2188}
2189impl<'db> From<OptionTerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
2190    fn from(ptr: OptionTerminalDollarPtr<'db>) -> Self {
2191        ptr.untyped()
2192    }
2193}
2194impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for OptionTerminalDollarPtr<'db> {
2195    fn from(value: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2196        Self(value.0)
2197    }
2198}
2199impl<'db> From<TerminalDollarPtr<'db>> for OptionTerminalDollarPtr<'db> {
2200    fn from(value: TerminalDollarPtr<'db>) -> Self {
2201        Self(value.0)
2202    }
2203}
2204impl<'db> From<OptionTerminalDollarEmptyGreen<'db>> for OptionTerminalDollarGreen<'db> {
2205    fn from(value: OptionTerminalDollarEmptyGreen<'db>) -> Self {
2206        Self(value.0)
2207    }
2208}
2209impl<'db> From<TerminalDollarGreen<'db>> for OptionTerminalDollarGreen<'db> {
2210    fn from(value: TerminalDollarGreen<'db>) -> Self {
2211        Self(value.0)
2212    }
2213}
2214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2215pub struct OptionTerminalDollarGreen<'db>(pub GreenId<'db>);
2216impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollar<'db> {
2217    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2218    type StablePtr = OptionTerminalDollarPtr<'db>;
2219    type Green = OptionTerminalDollarGreen<'db>;
2220    fn missing(db: &'db dyn Database) -> Self::Green {
2221        panic!("No missing variant.");
2222    }
2223    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2224        let kind = node.kind(db);
2225        match kind {
2226            SyntaxKind::OptionTerminalDollarEmpty => {
2227                OptionTerminalDollar::Empty(OptionTerminalDollarEmpty::from_syntax_node(db, node))
2228            }
2229            SyntaxKind::TerminalDollar => {
2230                OptionTerminalDollar::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
2231            }
2232            _ => panic!(
2233                "Unexpected syntax kind {:?} when constructing {}.",
2234                kind, "OptionTerminalDollar"
2235            ),
2236        }
2237    }
2238    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2239        let kind = node.kind(db);
2240        match kind {
2241            SyntaxKind::OptionTerminalDollarEmpty => Some(OptionTerminalDollar::Empty(
2242                OptionTerminalDollarEmpty::from_syntax_node(db, node),
2243            )),
2244            SyntaxKind::TerminalDollar => Some(OptionTerminalDollar::TerminalDollar(
2245                TerminalDollar::from_syntax_node(db, node),
2246            )),
2247            _ => None,
2248        }
2249    }
2250    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2251        match self {
2252            OptionTerminalDollar::Empty(x) => x.as_syntax_node(),
2253            OptionTerminalDollar::TerminalDollar(x) => x.as_syntax_node(),
2254        }
2255    }
2256    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2257        OptionTerminalDollarPtr(self.as_syntax_node().stable_ptr(db))
2258    }
2259}
2260impl<'db> OptionTerminalDollar<'db> {
2261    /// Checks if a kind of a variant of [OptionTerminalDollar].
2262    pub fn is_variant(kind: SyntaxKind) -> bool {
2263        matches!(kind, SyntaxKind::OptionTerminalDollarEmpty | SyntaxKind::TerminalDollar)
2264    }
2265}
2266#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2267pub struct OptionTerminalDollarEmpty<'db> {
2268    node: SyntaxNode<'db>,
2269}
2270impl<'db> OptionTerminalDollarEmpty<'db> {
2271    pub fn new_green(db: &'db dyn Database) -> OptionTerminalDollarEmptyGreen<'db> {
2272        let children = [];
2273        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2274        OptionTerminalDollarEmptyGreen(
2275            GreenNode {
2276                kind: SyntaxKind::OptionTerminalDollarEmpty,
2277                details: GreenNodeDetails::Node { children: children.into(), width },
2278            }
2279            .intern(db),
2280        )
2281    }
2282}
2283impl<'db> OptionTerminalDollarEmpty<'db> {}
2284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2285pub struct OptionTerminalDollarEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
2286impl<'db> OptionTerminalDollarEmptyPtr<'db> {}
2287impl<'db> TypedStablePtr<'db> for OptionTerminalDollarEmptyPtr<'db> {
2288    type SyntaxNode = OptionTerminalDollarEmpty<'db>;
2289    fn untyped(self) -> SyntaxStablePtrId<'db> {
2290        self.0
2291    }
2292    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalDollarEmpty<'db> {
2293        OptionTerminalDollarEmpty::from_syntax_node(db, self.0.lookup(db))
2294    }
2295}
2296impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
2297    fn from(ptr: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2298        ptr.untyped()
2299    }
2300}
2301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2302pub struct OptionTerminalDollarEmptyGreen<'db>(pub GreenId<'db>);
2303impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollarEmpty<'db> {
2304    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalDollarEmpty);
2305    type StablePtr = OptionTerminalDollarEmptyPtr<'db>;
2306    type Green = OptionTerminalDollarEmptyGreen<'db>;
2307    fn missing(db: &'db dyn Database) -> Self::Green {
2308        OptionTerminalDollarEmptyGreen(
2309            GreenNode {
2310                kind: SyntaxKind::OptionTerminalDollarEmpty,
2311                details: GreenNodeDetails::Node {
2312                    children: [].into(),
2313                    width: TextWidth::default(),
2314                },
2315            }
2316            .intern(db),
2317        )
2318    }
2319    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2320        let kind = node.kind(db);
2321        assert_eq!(
2322            kind,
2323            SyntaxKind::OptionTerminalDollarEmpty,
2324            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2325            kind,
2326            SyntaxKind::OptionTerminalDollarEmpty
2327        );
2328        Self { node }
2329    }
2330    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2331        let kind = node.kind(db);
2332        if kind == SyntaxKind::OptionTerminalDollarEmpty {
2333            Some(Self::from_syntax_node(db, node))
2334        } else {
2335            None
2336        }
2337    }
2338    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2339        self.node
2340    }
2341    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2342        OptionTerminalDollarEmptyPtr(self.node.stable_ptr(db))
2343    }
2344}
2345#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2346pub struct PathSegmentMissing<'db> {
2347    node: SyntaxNode<'db>,
2348}
2349impl<'db> PathSegmentMissing<'db> {
2350    pub const INDEX_IDENT: usize = 0;
2351    pub fn new_green(
2352        db: &'db dyn Database,
2353        ident: TerminalIdentifierGreen<'db>,
2354    ) -> PathSegmentMissingGreen<'db> {
2355        let children = [ident.0];
2356        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2357        PathSegmentMissingGreen(
2358            GreenNode {
2359                kind: SyntaxKind::PathSegmentMissing,
2360                details: GreenNodeDetails::Node { children: children.into(), width },
2361            }
2362            .intern(db),
2363        )
2364    }
2365}
2366impl<'db> PathSegmentMissing<'db> {
2367    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2368        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2369    }
2370}
2371#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2372pub struct PathSegmentMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
2373impl<'db> PathSegmentMissingPtr<'db> {}
2374impl<'db> TypedStablePtr<'db> for PathSegmentMissingPtr<'db> {
2375    type SyntaxNode = PathSegmentMissing<'db>;
2376    fn untyped(self) -> SyntaxStablePtrId<'db> {
2377        self.0
2378    }
2379    fn lookup(&self, db: &'db dyn Database) -> PathSegmentMissing<'db> {
2380        PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2381    }
2382}
2383impl<'db> From<PathSegmentMissingPtr<'db>> for SyntaxStablePtrId<'db> {
2384    fn from(ptr: PathSegmentMissingPtr<'db>) -> Self {
2385        ptr.untyped()
2386    }
2387}
2388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2389pub struct PathSegmentMissingGreen<'db>(pub GreenId<'db>);
2390impl<'db> TypedSyntaxNode<'db> for PathSegmentMissing<'db> {
2391    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2392    type StablePtr = PathSegmentMissingPtr<'db>;
2393    type Green = PathSegmentMissingGreen<'db>;
2394    fn missing(db: &'db dyn Database) -> Self::Green {
2395        PathSegmentMissingGreen(
2396            GreenNode {
2397                kind: SyntaxKind::PathSegmentMissing,
2398                details: GreenNodeDetails::Node {
2399                    children: [TerminalIdentifier::missing(db).0].into(),
2400                    width: TextWidth::default(),
2401                },
2402            }
2403            .intern(db),
2404        )
2405    }
2406    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2407        let kind = node.kind(db);
2408        assert_eq!(
2409            kind,
2410            SyntaxKind::PathSegmentMissing,
2411            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2412            kind,
2413            SyntaxKind::PathSegmentMissing
2414        );
2415        Self { node }
2416    }
2417    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2418        let kind = node.kind(db);
2419        if kind == SyntaxKind::PathSegmentMissing {
2420            Some(Self::from_syntax_node(db, node))
2421        } else {
2422            None
2423        }
2424    }
2425    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2426        self.node
2427    }
2428    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2429        PathSegmentMissingPtr(self.node.stable_ptr(db))
2430    }
2431}
2432#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2433pub struct ExprPathInner<'db>(ElementList<'db, PathSegment<'db>, 2>);
2434impl<'db> Deref for ExprPathInner<'db> {
2435    type Target = ElementList<'db, PathSegment<'db>, 2>;
2436    fn deref(&self) -> &Self::Target {
2437        &self.0
2438    }
2439}
2440impl<'db> ExprPathInner<'db> {
2441    pub fn new_green(
2442        db: &'db dyn Database,
2443        children: &[ExprPathInnerElementOrSeparatorGreen<'db>],
2444    ) -> ExprPathInnerGreen<'db> {
2445        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
2446        ExprPathInnerGreen(
2447            GreenNode {
2448                kind: SyntaxKind::ExprPathInner,
2449                details: GreenNodeDetails::Node {
2450                    children: children.iter().map(|x| x.id()).collect(),
2451                    width,
2452                },
2453            }
2454            .intern(db),
2455        )
2456    }
2457}
2458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2459pub struct ExprPathInnerPtr<'db>(pub SyntaxStablePtrId<'db>);
2460impl<'db> TypedStablePtr<'db> for ExprPathInnerPtr<'db> {
2461    type SyntaxNode = ExprPathInner<'db>;
2462    fn untyped(self) -> SyntaxStablePtrId<'db> {
2463        self.0
2464    }
2465    fn lookup(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2466        ExprPathInner::from_syntax_node(db, self.0.lookup(db))
2467    }
2468}
2469impl<'db> From<ExprPathInnerPtr<'db>> for SyntaxStablePtrId<'db> {
2470    fn from(ptr: ExprPathInnerPtr<'db>) -> Self {
2471        ptr.untyped()
2472    }
2473}
2474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2475pub enum ExprPathInnerElementOrSeparatorGreen<'db> {
2476    Separator(TerminalColonColonGreen<'db>),
2477    Element(PathSegmentGreen<'db>),
2478}
2479impl<'db> From<TerminalColonColonGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2480    fn from(value: TerminalColonColonGreen<'db>) -> Self {
2481        ExprPathInnerElementOrSeparatorGreen::Separator(value)
2482    }
2483}
2484impl<'db> From<PathSegmentGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2485    fn from(value: PathSegmentGreen<'db>) -> Self {
2486        ExprPathInnerElementOrSeparatorGreen::Element(value)
2487    }
2488}
2489impl<'db> ExprPathInnerElementOrSeparatorGreen<'db> {
2490    fn id(&self) -> GreenId<'db> {
2491        match self {
2492            ExprPathInnerElementOrSeparatorGreen::Separator(green) => green.0,
2493            ExprPathInnerElementOrSeparatorGreen::Element(green) => green.0,
2494        }
2495    }
2496}
2497#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2498pub struct ExprPathInnerGreen<'db>(pub GreenId<'db>);
2499impl<'db> TypedSyntaxNode<'db> for ExprPathInner<'db> {
2500    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPathInner);
2501    type StablePtr = ExprPathInnerPtr<'db>;
2502    type Green = ExprPathInnerGreen<'db>;
2503    fn missing(db: &'db dyn Database) -> Self::Green {
2504        ExprPathInnerGreen(
2505            GreenNode {
2506                kind: SyntaxKind::ExprPathInner,
2507                details: GreenNodeDetails::Node {
2508                    children: [].into(),
2509                    width: TextWidth::default(),
2510                },
2511            }
2512            .intern(db),
2513        )
2514    }
2515    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2516        Self(ElementList::new(node))
2517    }
2518    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2519        if node.kind(db) == SyntaxKind::ExprPathInner {
2520            Some(Self(ElementList::new(node)))
2521        } else {
2522            None
2523        }
2524    }
2525    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2526        self.node
2527    }
2528    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2529        ExprPathInnerPtr(self.node.stable_ptr(db))
2530    }
2531}
2532#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2533pub struct ExprParenthesized<'db> {
2534    node: SyntaxNode<'db>,
2535}
2536impl<'db> ExprParenthesized<'db> {
2537    pub const INDEX_LPAREN: usize = 0;
2538    pub const INDEX_EXPR: usize = 1;
2539    pub const INDEX_RPAREN: usize = 2;
2540    pub fn new_green(
2541        db: &'db dyn Database,
2542        lparen: TerminalLParenGreen<'db>,
2543        expr: ExprGreen<'db>,
2544        rparen: TerminalRParenGreen<'db>,
2545    ) -> ExprParenthesizedGreen<'db> {
2546        let children = [lparen.0, expr.0, rparen.0];
2547        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2548        ExprParenthesizedGreen(
2549            GreenNode {
2550                kind: SyntaxKind::ExprParenthesized,
2551                details: GreenNodeDetails::Node { children: children.into(), width },
2552            }
2553            .intern(db),
2554        )
2555    }
2556}
2557impl<'db> ExprParenthesized<'db> {
2558    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
2559        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
2560    }
2561    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2562        Expr::from_syntax_node(db, self.node.get_children(db)[1])
2563    }
2564    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
2565        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
2566    }
2567}
2568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2569pub struct ExprParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
2570impl<'db> ExprParenthesizedPtr<'db> {}
2571impl<'db> TypedStablePtr<'db> for ExprParenthesizedPtr<'db> {
2572    type SyntaxNode = ExprParenthesized<'db>;
2573    fn untyped(self) -> SyntaxStablePtrId<'db> {
2574        self.0
2575    }
2576    fn lookup(&self, db: &'db dyn Database) -> ExprParenthesized<'db> {
2577        ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2578    }
2579}
2580impl<'db> From<ExprParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
2581    fn from(ptr: ExprParenthesizedPtr<'db>) -> Self {
2582        ptr.untyped()
2583    }
2584}
2585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2586pub struct ExprParenthesizedGreen<'db>(pub GreenId<'db>);
2587impl<'db> TypedSyntaxNode<'db> for ExprParenthesized<'db> {
2588    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2589    type StablePtr = ExprParenthesizedPtr<'db>;
2590    type Green = ExprParenthesizedGreen<'db>;
2591    fn missing(db: &'db dyn Database) -> Self::Green {
2592        ExprParenthesizedGreen(
2593            GreenNode {
2594                kind: SyntaxKind::ExprParenthesized,
2595                details: GreenNodeDetails::Node {
2596                    children: [
2597                        TerminalLParen::missing(db).0,
2598                        Expr::missing(db).0,
2599                        TerminalRParen::missing(db).0,
2600                    ]
2601                    .into(),
2602                    width: TextWidth::default(),
2603                },
2604            }
2605            .intern(db),
2606        )
2607    }
2608    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2609        let kind = node.kind(db);
2610        assert_eq!(
2611            kind,
2612            SyntaxKind::ExprParenthesized,
2613            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2614            kind,
2615            SyntaxKind::ExprParenthesized
2616        );
2617        Self { node }
2618    }
2619    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2620        let kind = node.kind(db);
2621        if kind == SyntaxKind::ExprParenthesized {
2622            Some(Self::from_syntax_node(db, node))
2623        } else {
2624            None
2625        }
2626    }
2627    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2628        self.node
2629    }
2630    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2631        ExprParenthesizedPtr(self.node.stable_ptr(db))
2632    }
2633}
2634#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2635pub struct ExprUnary<'db> {
2636    node: SyntaxNode<'db>,
2637}
2638impl<'db> ExprUnary<'db> {
2639    pub const INDEX_OP: usize = 0;
2640    pub const INDEX_EXPR: usize = 1;
2641    pub fn new_green(
2642        db: &'db dyn Database,
2643        op: UnaryOperatorGreen<'db>,
2644        expr: ExprGreen<'db>,
2645    ) -> ExprUnaryGreen<'db> {
2646        let children = [op.0, expr.0];
2647        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2648        ExprUnaryGreen(
2649            GreenNode {
2650                kind: SyntaxKind::ExprUnary,
2651                details: GreenNodeDetails::Node { children: children.into(), width },
2652            }
2653            .intern(db),
2654        )
2655    }
2656}
2657impl<'db> ExprUnary<'db> {
2658    pub fn op(&self, db: &'db dyn Database) -> UnaryOperator<'db> {
2659        UnaryOperator::from_syntax_node(db, self.node.get_children(db)[0])
2660    }
2661    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2662        Expr::from_syntax_node(db, self.node.get_children(db)[1])
2663    }
2664}
2665#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2666pub struct ExprUnaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2667impl<'db> ExprUnaryPtr<'db> {}
2668impl<'db> TypedStablePtr<'db> for ExprUnaryPtr<'db> {
2669    type SyntaxNode = ExprUnary<'db>;
2670    fn untyped(self) -> SyntaxStablePtrId<'db> {
2671        self.0
2672    }
2673    fn lookup(&self, db: &'db dyn Database) -> ExprUnary<'db> {
2674        ExprUnary::from_syntax_node(db, self.0.lookup(db))
2675    }
2676}
2677impl<'db> From<ExprUnaryPtr<'db>> for SyntaxStablePtrId<'db> {
2678    fn from(ptr: ExprUnaryPtr<'db>) -> Self {
2679        ptr.untyped()
2680    }
2681}
2682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2683pub struct ExprUnaryGreen<'db>(pub GreenId<'db>);
2684impl<'db> TypedSyntaxNode<'db> for ExprUnary<'db> {
2685    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2686    type StablePtr = ExprUnaryPtr<'db>;
2687    type Green = ExprUnaryGreen<'db>;
2688    fn missing(db: &'db dyn Database) -> Self::Green {
2689        ExprUnaryGreen(
2690            GreenNode {
2691                kind: SyntaxKind::ExprUnary,
2692                details: GreenNodeDetails::Node {
2693                    children: [UnaryOperator::missing(db).0, Expr::missing(db).0].into(),
2694                    width: TextWidth::default(),
2695                },
2696            }
2697            .intern(db),
2698        )
2699    }
2700    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2701        let kind = node.kind(db);
2702        assert_eq!(
2703            kind,
2704            SyntaxKind::ExprUnary,
2705            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2706            kind,
2707            SyntaxKind::ExprUnary
2708        );
2709        Self { node }
2710    }
2711    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2712        let kind = node.kind(db);
2713        if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2714    }
2715    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2716        self.node
2717    }
2718    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2719        ExprUnaryPtr(self.node.stable_ptr(db))
2720    }
2721}
2722#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2723pub enum UnaryOperator<'db> {
2724    Not(TerminalNot<'db>),
2725    BitNot(TerminalBitNot<'db>),
2726    Minus(TerminalMinus<'db>),
2727    At(TerminalAt<'db>),
2728    Desnap(TerminalMul<'db>),
2729    Reference(TerminalAnd<'db>),
2730}
2731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2732pub struct UnaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2733impl<'db> TypedStablePtr<'db> for UnaryOperatorPtr<'db> {
2734    type SyntaxNode = UnaryOperator<'db>;
2735    fn untyped(self) -> SyntaxStablePtrId<'db> {
2736        self.0
2737    }
2738    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2739        UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2740    }
2741}
2742impl<'db> From<UnaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2743    fn from(ptr: UnaryOperatorPtr<'db>) -> Self {
2744        ptr.untyped()
2745    }
2746}
2747impl<'db> From<TerminalNotPtr<'db>> for UnaryOperatorPtr<'db> {
2748    fn from(value: TerminalNotPtr<'db>) -> Self {
2749        Self(value.0)
2750    }
2751}
2752impl<'db> From<TerminalBitNotPtr<'db>> for UnaryOperatorPtr<'db> {
2753    fn from(value: TerminalBitNotPtr<'db>) -> Self {
2754        Self(value.0)
2755    }
2756}
2757impl<'db> From<TerminalMinusPtr<'db>> for UnaryOperatorPtr<'db> {
2758    fn from(value: TerminalMinusPtr<'db>) -> Self {
2759        Self(value.0)
2760    }
2761}
2762impl<'db> From<TerminalAtPtr<'db>> for UnaryOperatorPtr<'db> {
2763    fn from(value: TerminalAtPtr<'db>) -> Self {
2764        Self(value.0)
2765    }
2766}
2767impl<'db> From<TerminalMulPtr<'db>> for UnaryOperatorPtr<'db> {
2768    fn from(value: TerminalMulPtr<'db>) -> Self {
2769        Self(value.0)
2770    }
2771}
2772impl<'db> From<TerminalAndPtr<'db>> for UnaryOperatorPtr<'db> {
2773    fn from(value: TerminalAndPtr<'db>) -> Self {
2774        Self(value.0)
2775    }
2776}
2777impl<'db> From<TerminalNotGreen<'db>> for UnaryOperatorGreen<'db> {
2778    fn from(value: TerminalNotGreen<'db>) -> Self {
2779        Self(value.0)
2780    }
2781}
2782impl<'db> From<TerminalBitNotGreen<'db>> for UnaryOperatorGreen<'db> {
2783    fn from(value: TerminalBitNotGreen<'db>) -> Self {
2784        Self(value.0)
2785    }
2786}
2787impl<'db> From<TerminalMinusGreen<'db>> for UnaryOperatorGreen<'db> {
2788    fn from(value: TerminalMinusGreen<'db>) -> Self {
2789        Self(value.0)
2790    }
2791}
2792impl<'db> From<TerminalAtGreen<'db>> for UnaryOperatorGreen<'db> {
2793    fn from(value: TerminalAtGreen<'db>) -> Self {
2794        Self(value.0)
2795    }
2796}
2797impl<'db> From<TerminalMulGreen<'db>> for UnaryOperatorGreen<'db> {
2798    fn from(value: TerminalMulGreen<'db>) -> Self {
2799        Self(value.0)
2800    }
2801}
2802impl<'db> From<TerminalAndGreen<'db>> for UnaryOperatorGreen<'db> {
2803    fn from(value: TerminalAndGreen<'db>) -> Self {
2804        Self(value.0)
2805    }
2806}
2807#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2808pub struct UnaryOperatorGreen<'db>(pub GreenId<'db>);
2809impl<'db> TypedSyntaxNode<'db> for UnaryOperator<'db> {
2810    const OPTIONAL_KIND: Option<SyntaxKind> = None;
2811    type StablePtr = UnaryOperatorPtr<'db>;
2812    type Green = UnaryOperatorGreen<'db>;
2813    fn missing(db: &'db dyn Database) -> Self::Green {
2814        panic!("No missing variant.");
2815    }
2816    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2817        let kind = node.kind(db);
2818        match kind {
2819            SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2820            SyntaxKind::TerminalBitNot => {
2821                UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2822            }
2823            SyntaxKind::TerminalMinus => {
2824                UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2825            }
2826            SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2827            SyntaxKind::TerminalMul => {
2828                UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2829            }
2830            SyntaxKind::TerminalAnd => {
2831                UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node))
2832            }
2833            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2834        }
2835    }
2836    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2837        let kind = node.kind(db);
2838        match kind {
2839            SyntaxKind::TerminalNot => {
2840                Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2841            }
2842            SyntaxKind::TerminalBitNot => {
2843                Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2844            }
2845            SyntaxKind::TerminalMinus => {
2846                Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2847            }
2848            SyntaxKind::TerminalAt => {
2849                Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2850            }
2851            SyntaxKind::TerminalMul => {
2852                Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2853            }
2854            SyntaxKind::TerminalAnd => {
2855                Some(UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node)))
2856            }
2857            _ => None,
2858        }
2859    }
2860    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2861        match self {
2862            UnaryOperator::Not(x) => x.as_syntax_node(),
2863            UnaryOperator::BitNot(x) => x.as_syntax_node(),
2864            UnaryOperator::Minus(x) => x.as_syntax_node(),
2865            UnaryOperator::At(x) => x.as_syntax_node(),
2866            UnaryOperator::Desnap(x) => x.as_syntax_node(),
2867            UnaryOperator::Reference(x) => x.as_syntax_node(),
2868        }
2869    }
2870    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2871        UnaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
2872    }
2873}
2874impl<'db> UnaryOperator<'db> {
2875    /// Checks if a kind of a variant of [UnaryOperator].
2876    pub fn is_variant(kind: SyntaxKind) -> bool {
2877        matches!(
2878            kind,
2879            SyntaxKind::TerminalNot
2880                | SyntaxKind::TerminalBitNot
2881                | SyntaxKind::TerminalMinus
2882                | SyntaxKind::TerminalAt
2883                | SyntaxKind::TerminalMul
2884                | SyntaxKind::TerminalAnd
2885        )
2886    }
2887}
2888#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2889pub struct ExprBinary<'db> {
2890    node: SyntaxNode<'db>,
2891}
2892impl<'db> ExprBinary<'db> {
2893    pub const INDEX_LHS: usize = 0;
2894    pub const INDEX_OP: usize = 1;
2895    pub const INDEX_RHS: usize = 2;
2896    pub fn new_green(
2897        db: &'db dyn Database,
2898        lhs: ExprGreen<'db>,
2899        op: BinaryOperatorGreen<'db>,
2900        rhs: ExprGreen<'db>,
2901    ) -> ExprBinaryGreen<'db> {
2902        let children = [lhs.0, op.0, rhs.0];
2903        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2904        ExprBinaryGreen(
2905            GreenNode {
2906                kind: SyntaxKind::ExprBinary,
2907                details: GreenNodeDetails::Node { children: children.into(), width },
2908            }
2909            .intern(db),
2910        )
2911    }
2912}
2913impl<'db> ExprBinary<'db> {
2914    pub fn lhs(&self, db: &'db dyn Database) -> Expr<'db> {
2915        Expr::from_syntax_node(db, self.node.get_children(db)[0])
2916    }
2917    pub fn op(&self, db: &'db dyn Database) -> BinaryOperator<'db> {
2918        BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2919    }
2920    pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
2921        Expr::from_syntax_node(db, self.node.get_children(db)[2])
2922    }
2923}
2924#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
2925pub struct ExprBinaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2926impl<'db> ExprBinaryPtr<'db> {}
2927impl<'db> TypedStablePtr<'db> for ExprBinaryPtr<'db> {
2928    type SyntaxNode = ExprBinary<'db>;
2929    fn untyped(self) -> SyntaxStablePtrId<'db> {
2930        self.0
2931    }
2932    fn lookup(&self, db: &'db dyn Database) -> ExprBinary<'db> {
2933        ExprBinary::from_syntax_node(db, self.0.lookup(db))
2934    }
2935}
2936impl<'db> From<ExprBinaryPtr<'db>> for SyntaxStablePtrId<'db> {
2937    fn from(ptr: ExprBinaryPtr<'db>) -> Self {
2938        ptr.untyped()
2939    }
2940}
2941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2942pub struct ExprBinaryGreen<'db>(pub GreenId<'db>);
2943impl<'db> TypedSyntaxNode<'db> for ExprBinary<'db> {
2944    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2945    type StablePtr = ExprBinaryPtr<'db>;
2946    type Green = ExprBinaryGreen<'db>;
2947    fn missing(db: &'db dyn Database) -> Self::Green {
2948        ExprBinaryGreen(
2949            GreenNode {
2950                kind: SyntaxKind::ExprBinary,
2951                details: GreenNodeDetails::Node {
2952                    children: [
2953                        Expr::missing(db).0,
2954                        BinaryOperator::missing(db).0,
2955                        Expr::missing(db).0,
2956                    ]
2957                    .into(),
2958                    width: TextWidth::default(),
2959                },
2960            }
2961            .intern(db),
2962        )
2963    }
2964    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2965        let kind = node.kind(db);
2966        assert_eq!(
2967            kind,
2968            SyntaxKind::ExprBinary,
2969            "Unexpected SyntaxKind {:?}. Expected {:?}.",
2970            kind,
2971            SyntaxKind::ExprBinary
2972        );
2973        Self { node }
2974    }
2975    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2976        let kind = node.kind(db);
2977        if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2978    }
2979    fn as_syntax_node(&self) -> SyntaxNode<'db> {
2980        self.node
2981    }
2982    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2983        ExprBinaryPtr(self.node.stable_ptr(db))
2984    }
2985}
2986#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2987pub enum BinaryOperator<'db> {
2988    Dot(TerminalDot<'db>),
2989    Not(TerminalNot<'db>),
2990    Mul(TerminalMul<'db>),
2991    MulEq(TerminalMulEq<'db>),
2992    Div(TerminalDiv<'db>),
2993    DivEq(TerminalDivEq<'db>),
2994    Mod(TerminalMod<'db>),
2995    ModEq(TerminalModEq<'db>),
2996    Plus(TerminalPlus<'db>),
2997    PlusEq(TerminalPlusEq<'db>),
2998    Minus(TerminalMinus<'db>),
2999    MinusEq(TerminalMinusEq<'db>),
3000    EqEq(TerminalEqEq<'db>),
3001    Neq(TerminalNeq<'db>),
3002    Eq(TerminalEq<'db>),
3003    And(TerminalAnd<'db>),
3004    AndAnd(TerminalAndAnd<'db>),
3005    Or(TerminalOr<'db>),
3006    OrOr(TerminalOrOr<'db>),
3007    Xor(TerminalXor<'db>),
3008    LE(TerminalLE<'db>),
3009    GE(TerminalGE<'db>),
3010    LT(TerminalLT<'db>),
3011    GT(TerminalGT<'db>),
3012    DotDot(TerminalDotDot<'db>),
3013    DotDotEq(TerminalDotDotEq<'db>),
3014}
3015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3016pub struct BinaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
3017impl<'db> TypedStablePtr<'db> for BinaryOperatorPtr<'db> {
3018    type SyntaxNode = BinaryOperator<'db>;
3019    fn untyped(self) -> SyntaxStablePtrId<'db> {
3020        self.0
3021    }
3022    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3023        BinaryOperator::from_syntax_node(db, self.0.lookup(db))
3024    }
3025}
3026impl<'db> From<BinaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
3027    fn from(ptr: BinaryOperatorPtr<'db>) -> Self {
3028        ptr.untyped()
3029    }
3030}
3031impl<'db> From<TerminalDotPtr<'db>> for BinaryOperatorPtr<'db> {
3032    fn from(value: TerminalDotPtr<'db>) -> Self {
3033        Self(value.0)
3034    }
3035}
3036impl<'db> From<TerminalNotPtr<'db>> for BinaryOperatorPtr<'db> {
3037    fn from(value: TerminalNotPtr<'db>) -> Self {
3038        Self(value.0)
3039    }
3040}
3041impl<'db> From<TerminalMulPtr<'db>> for BinaryOperatorPtr<'db> {
3042    fn from(value: TerminalMulPtr<'db>) -> Self {
3043        Self(value.0)
3044    }
3045}
3046impl<'db> From<TerminalMulEqPtr<'db>> for BinaryOperatorPtr<'db> {
3047    fn from(value: TerminalMulEqPtr<'db>) -> Self {
3048        Self(value.0)
3049    }
3050}
3051impl<'db> From<TerminalDivPtr<'db>> for BinaryOperatorPtr<'db> {
3052    fn from(value: TerminalDivPtr<'db>) -> Self {
3053        Self(value.0)
3054    }
3055}
3056impl<'db> From<TerminalDivEqPtr<'db>> for BinaryOperatorPtr<'db> {
3057    fn from(value: TerminalDivEqPtr<'db>) -> Self {
3058        Self(value.0)
3059    }
3060}
3061impl<'db> From<TerminalModPtr<'db>> for BinaryOperatorPtr<'db> {
3062    fn from(value: TerminalModPtr<'db>) -> Self {
3063        Self(value.0)
3064    }
3065}
3066impl<'db> From<TerminalModEqPtr<'db>> for BinaryOperatorPtr<'db> {
3067    fn from(value: TerminalModEqPtr<'db>) -> Self {
3068        Self(value.0)
3069    }
3070}
3071impl<'db> From<TerminalPlusPtr<'db>> for BinaryOperatorPtr<'db> {
3072    fn from(value: TerminalPlusPtr<'db>) -> Self {
3073        Self(value.0)
3074    }
3075}
3076impl<'db> From<TerminalPlusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3077    fn from(value: TerminalPlusEqPtr<'db>) -> Self {
3078        Self(value.0)
3079    }
3080}
3081impl<'db> From<TerminalMinusPtr<'db>> for BinaryOperatorPtr<'db> {
3082    fn from(value: TerminalMinusPtr<'db>) -> Self {
3083        Self(value.0)
3084    }
3085}
3086impl<'db> From<TerminalMinusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3087    fn from(value: TerminalMinusEqPtr<'db>) -> Self {
3088        Self(value.0)
3089    }
3090}
3091impl<'db> From<TerminalEqEqPtr<'db>> for BinaryOperatorPtr<'db> {
3092    fn from(value: TerminalEqEqPtr<'db>) -> Self {
3093        Self(value.0)
3094    }
3095}
3096impl<'db> From<TerminalNeqPtr<'db>> for BinaryOperatorPtr<'db> {
3097    fn from(value: TerminalNeqPtr<'db>) -> Self {
3098        Self(value.0)
3099    }
3100}
3101impl<'db> From<TerminalEqPtr<'db>> for BinaryOperatorPtr<'db> {
3102    fn from(value: TerminalEqPtr<'db>) -> Self {
3103        Self(value.0)
3104    }
3105}
3106impl<'db> From<TerminalAndPtr<'db>> for BinaryOperatorPtr<'db> {
3107    fn from(value: TerminalAndPtr<'db>) -> Self {
3108        Self(value.0)
3109    }
3110}
3111impl<'db> From<TerminalAndAndPtr<'db>> for BinaryOperatorPtr<'db> {
3112    fn from(value: TerminalAndAndPtr<'db>) -> Self {
3113        Self(value.0)
3114    }
3115}
3116impl<'db> From<TerminalOrPtr<'db>> for BinaryOperatorPtr<'db> {
3117    fn from(value: TerminalOrPtr<'db>) -> Self {
3118        Self(value.0)
3119    }
3120}
3121impl<'db> From<TerminalOrOrPtr<'db>> for BinaryOperatorPtr<'db> {
3122    fn from(value: TerminalOrOrPtr<'db>) -> Self {
3123        Self(value.0)
3124    }
3125}
3126impl<'db> From<TerminalXorPtr<'db>> for BinaryOperatorPtr<'db> {
3127    fn from(value: TerminalXorPtr<'db>) -> Self {
3128        Self(value.0)
3129    }
3130}
3131impl<'db> From<TerminalLEPtr<'db>> for BinaryOperatorPtr<'db> {
3132    fn from(value: TerminalLEPtr<'db>) -> Self {
3133        Self(value.0)
3134    }
3135}
3136impl<'db> From<TerminalGEPtr<'db>> for BinaryOperatorPtr<'db> {
3137    fn from(value: TerminalGEPtr<'db>) -> Self {
3138        Self(value.0)
3139    }
3140}
3141impl<'db> From<TerminalLTPtr<'db>> for BinaryOperatorPtr<'db> {
3142    fn from(value: TerminalLTPtr<'db>) -> Self {
3143        Self(value.0)
3144    }
3145}
3146impl<'db> From<TerminalGTPtr<'db>> for BinaryOperatorPtr<'db> {
3147    fn from(value: TerminalGTPtr<'db>) -> Self {
3148        Self(value.0)
3149    }
3150}
3151impl<'db> From<TerminalDotDotPtr<'db>> for BinaryOperatorPtr<'db> {
3152    fn from(value: TerminalDotDotPtr<'db>) -> Self {
3153        Self(value.0)
3154    }
3155}
3156impl<'db> From<TerminalDotDotEqPtr<'db>> for BinaryOperatorPtr<'db> {
3157    fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
3158        Self(value.0)
3159    }
3160}
3161impl<'db> From<TerminalDotGreen<'db>> for BinaryOperatorGreen<'db> {
3162    fn from(value: TerminalDotGreen<'db>) -> Self {
3163        Self(value.0)
3164    }
3165}
3166impl<'db> From<TerminalNotGreen<'db>> for BinaryOperatorGreen<'db> {
3167    fn from(value: TerminalNotGreen<'db>) -> Self {
3168        Self(value.0)
3169    }
3170}
3171impl<'db> From<TerminalMulGreen<'db>> for BinaryOperatorGreen<'db> {
3172    fn from(value: TerminalMulGreen<'db>) -> Self {
3173        Self(value.0)
3174    }
3175}
3176impl<'db> From<TerminalMulEqGreen<'db>> for BinaryOperatorGreen<'db> {
3177    fn from(value: TerminalMulEqGreen<'db>) -> Self {
3178        Self(value.0)
3179    }
3180}
3181impl<'db> From<TerminalDivGreen<'db>> for BinaryOperatorGreen<'db> {
3182    fn from(value: TerminalDivGreen<'db>) -> Self {
3183        Self(value.0)
3184    }
3185}
3186impl<'db> From<TerminalDivEqGreen<'db>> for BinaryOperatorGreen<'db> {
3187    fn from(value: TerminalDivEqGreen<'db>) -> Self {
3188        Self(value.0)
3189    }
3190}
3191impl<'db> From<TerminalModGreen<'db>> for BinaryOperatorGreen<'db> {
3192    fn from(value: TerminalModGreen<'db>) -> Self {
3193        Self(value.0)
3194    }
3195}
3196impl<'db> From<TerminalModEqGreen<'db>> for BinaryOperatorGreen<'db> {
3197    fn from(value: TerminalModEqGreen<'db>) -> Self {
3198        Self(value.0)
3199    }
3200}
3201impl<'db> From<TerminalPlusGreen<'db>> for BinaryOperatorGreen<'db> {
3202    fn from(value: TerminalPlusGreen<'db>) -> Self {
3203        Self(value.0)
3204    }
3205}
3206impl<'db> From<TerminalPlusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3207    fn from(value: TerminalPlusEqGreen<'db>) -> Self {
3208        Self(value.0)
3209    }
3210}
3211impl<'db> From<TerminalMinusGreen<'db>> for BinaryOperatorGreen<'db> {
3212    fn from(value: TerminalMinusGreen<'db>) -> Self {
3213        Self(value.0)
3214    }
3215}
3216impl<'db> From<TerminalMinusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3217    fn from(value: TerminalMinusEqGreen<'db>) -> Self {
3218        Self(value.0)
3219    }
3220}
3221impl<'db> From<TerminalEqEqGreen<'db>> for BinaryOperatorGreen<'db> {
3222    fn from(value: TerminalEqEqGreen<'db>) -> Self {
3223        Self(value.0)
3224    }
3225}
3226impl<'db> From<TerminalNeqGreen<'db>> for BinaryOperatorGreen<'db> {
3227    fn from(value: TerminalNeqGreen<'db>) -> Self {
3228        Self(value.0)
3229    }
3230}
3231impl<'db> From<TerminalEqGreen<'db>> for BinaryOperatorGreen<'db> {
3232    fn from(value: TerminalEqGreen<'db>) -> Self {
3233        Self(value.0)
3234    }
3235}
3236impl<'db> From<TerminalAndGreen<'db>> for BinaryOperatorGreen<'db> {
3237    fn from(value: TerminalAndGreen<'db>) -> Self {
3238        Self(value.0)
3239    }
3240}
3241impl<'db> From<TerminalAndAndGreen<'db>> for BinaryOperatorGreen<'db> {
3242    fn from(value: TerminalAndAndGreen<'db>) -> Self {
3243        Self(value.0)
3244    }
3245}
3246impl<'db> From<TerminalOrGreen<'db>> for BinaryOperatorGreen<'db> {
3247    fn from(value: TerminalOrGreen<'db>) -> Self {
3248        Self(value.0)
3249    }
3250}
3251impl<'db> From<TerminalOrOrGreen<'db>> for BinaryOperatorGreen<'db> {
3252    fn from(value: TerminalOrOrGreen<'db>) -> Self {
3253        Self(value.0)
3254    }
3255}
3256impl<'db> From<TerminalXorGreen<'db>> for BinaryOperatorGreen<'db> {
3257    fn from(value: TerminalXorGreen<'db>) -> Self {
3258        Self(value.0)
3259    }
3260}
3261impl<'db> From<TerminalLEGreen<'db>> for BinaryOperatorGreen<'db> {
3262    fn from(value: TerminalLEGreen<'db>) -> Self {
3263        Self(value.0)
3264    }
3265}
3266impl<'db> From<TerminalGEGreen<'db>> for BinaryOperatorGreen<'db> {
3267    fn from(value: TerminalGEGreen<'db>) -> Self {
3268        Self(value.0)
3269    }
3270}
3271impl<'db> From<TerminalLTGreen<'db>> for BinaryOperatorGreen<'db> {
3272    fn from(value: TerminalLTGreen<'db>) -> Self {
3273        Self(value.0)
3274    }
3275}
3276impl<'db> From<TerminalGTGreen<'db>> for BinaryOperatorGreen<'db> {
3277    fn from(value: TerminalGTGreen<'db>) -> Self {
3278        Self(value.0)
3279    }
3280}
3281impl<'db> From<TerminalDotDotGreen<'db>> for BinaryOperatorGreen<'db> {
3282    fn from(value: TerminalDotDotGreen<'db>) -> Self {
3283        Self(value.0)
3284    }
3285}
3286impl<'db> From<TerminalDotDotEqGreen<'db>> for BinaryOperatorGreen<'db> {
3287    fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
3288        Self(value.0)
3289    }
3290}
3291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3292pub struct BinaryOperatorGreen<'db>(pub GreenId<'db>);
3293impl<'db> TypedSyntaxNode<'db> for BinaryOperator<'db> {
3294    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3295    type StablePtr = BinaryOperatorPtr<'db>;
3296    type Green = BinaryOperatorGreen<'db>;
3297    fn missing(db: &'db dyn Database) -> Self::Green {
3298        panic!("No missing variant.");
3299    }
3300    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3301        let kind = node.kind(db);
3302        match kind {
3303            SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3304            SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3305            SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3306            SyntaxKind::TerminalMulEq => {
3307                BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3308            }
3309            SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3310            SyntaxKind::TerminalDivEq => {
3311                BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3312            }
3313            SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3314            SyntaxKind::TerminalModEq => {
3315                BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3316            }
3317            SyntaxKind::TerminalPlus => {
3318                BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3319            }
3320            SyntaxKind::TerminalPlusEq => {
3321                BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3322            }
3323            SyntaxKind::TerminalMinus => {
3324                BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3325            }
3326            SyntaxKind::TerminalMinusEq => {
3327                BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3328            }
3329            SyntaxKind::TerminalEqEq => {
3330                BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3331            }
3332            SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3333            SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3334            SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3335            SyntaxKind::TerminalAndAnd => {
3336                BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3337            }
3338            SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3339            SyntaxKind::TerminalOrOr => {
3340                BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3341            }
3342            SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3343            SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3344            SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3345            SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3346            SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3347            SyntaxKind::TerminalDotDot => {
3348                BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3349            }
3350            SyntaxKind::TerminalDotDotEq => {
3351                BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3352            }
3353            _ => {
3354                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3355            }
3356        }
3357    }
3358    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3359        let kind = node.kind(db);
3360        match kind {
3361            SyntaxKind::TerminalDot => {
3362                Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3363            }
3364            SyntaxKind::TerminalNot => {
3365                Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3366            }
3367            SyntaxKind::TerminalMul => {
3368                Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3369            }
3370            SyntaxKind::TerminalMulEq => {
3371                Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3372            }
3373            SyntaxKind::TerminalDiv => {
3374                Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3375            }
3376            SyntaxKind::TerminalDivEq => {
3377                Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3378            }
3379            SyntaxKind::TerminalMod => {
3380                Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3381            }
3382            SyntaxKind::TerminalModEq => {
3383                Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3384            }
3385            SyntaxKind::TerminalPlus => {
3386                Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3387            }
3388            SyntaxKind::TerminalPlusEq => {
3389                Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3390            }
3391            SyntaxKind::TerminalMinus => {
3392                Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3393            }
3394            SyntaxKind::TerminalMinusEq => {
3395                Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3396            }
3397            SyntaxKind::TerminalEqEq => {
3398                Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3399            }
3400            SyntaxKind::TerminalNeq => {
3401                Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3402            }
3403            SyntaxKind::TerminalEq => {
3404                Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3405            }
3406            SyntaxKind::TerminalAnd => {
3407                Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3408            }
3409            SyntaxKind::TerminalAndAnd => {
3410                Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3411            }
3412            SyntaxKind::TerminalOr => {
3413                Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3414            }
3415            SyntaxKind::TerminalOrOr => {
3416                Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3417            }
3418            SyntaxKind::TerminalXor => {
3419                Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3420            }
3421            SyntaxKind::TerminalLE => {
3422                Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3423            }
3424            SyntaxKind::TerminalGE => {
3425                Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3426            }
3427            SyntaxKind::TerminalLT => {
3428                Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3429            }
3430            SyntaxKind::TerminalGT => {
3431                Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3432            }
3433            SyntaxKind::TerminalDotDot => {
3434                Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3435            }
3436            SyntaxKind::TerminalDotDotEq => {
3437                Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3438            }
3439            _ => None,
3440        }
3441    }
3442    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3443        match self {
3444            BinaryOperator::Dot(x) => x.as_syntax_node(),
3445            BinaryOperator::Not(x) => x.as_syntax_node(),
3446            BinaryOperator::Mul(x) => x.as_syntax_node(),
3447            BinaryOperator::MulEq(x) => x.as_syntax_node(),
3448            BinaryOperator::Div(x) => x.as_syntax_node(),
3449            BinaryOperator::DivEq(x) => x.as_syntax_node(),
3450            BinaryOperator::Mod(x) => x.as_syntax_node(),
3451            BinaryOperator::ModEq(x) => x.as_syntax_node(),
3452            BinaryOperator::Plus(x) => x.as_syntax_node(),
3453            BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3454            BinaryOperator::Minus(x) => x.as_syntax_node(),
3455            BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3456            BinaryOperator::EqEq(x) => x.as_syntax_node(),
3457            BinaryOperator::Neq(x) => x.as_syntax_node(),
3458            BinaryOperator::Eq(x) => x.as_syntax_node(),
3459            BinaryOperator::And(x) => x.as_syntax_node(),
3460            BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3461            BinaryOperator::Or(x) => x.as_syntax_node(),
3462            BinaryOperator::OrOr(x) => x.as_syntax_node(),
3463            BinaryOperator::Xor(x) => x.as_syntax_node(),
3464            BinaryOperator::LE(x) => x.as_syntax_node(),
3465            BinaryOperator::GE(x) => x.as_syntax_node(),
3466            BinaryOperator::LT(x) => x.as_syntax_node(),
3467            BinaryOperator::GT(x) => x.as_syntax_node(),
3468            BinaryOperator::DotDot(x) => x.as_syntax_node(),
3469            BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3470        }
3471    }
3472    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3473        BinaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
3474    }
3475}
3476impl<'db> BinaryOperator<'db> {
3477    /// Checks if a kind of a variant of [BinaryOperator].
3478    pub fn is_variant(kind: SyntaxKind) -> bool {
3479        matches!(
3480            kind,
3481            SyntaxKind::TerminalDot
3482                | SyntaxKind::TerminalNot
3483                | SyntaxKind::TerminalMul
3484                | SyntaxKind::TerminalMulEq
3485                | SyntaxKind::TerminalDiv
3486                | SyntaxKind::TerminalDivEq
3487                | SyntaxKind::TerminalMod
3488                | SyntaxKind::TerminalModEq
3489                | SyntaxKind::TerminalPlus
3490                | SyntaxKind::TerminalPlusEq
3491                | SyntaxKind::TerminalMinus
3492                | SyntaxKind::TerminalMinusEq
3493                | SyntaxKind::TerminalEqEq
3494                | SyntaxKind::TerminalNeq
3495                | SyntaxKind::TerminalEq
3496                | SyntaxKind::TerminalAnd
3497                | SyntaxKind::TerminalAndAnd
3498                | SyntaxKind::TerminalOr
3499                | SyntaxKind::TerminalOrOr
3500                | SyntaxKind::TerminalXor
3501                | SyntaxKind::TerminalLE
3502                | SyntaxKind::TerminalGE
3503                | SyntaxKind::TerminalLT
3504                | SyntaxKind::TerminalGT
3505                | SyntaxKind::TerminalDotDot
3506                | SyntaxKind::TerminalDotDotEq
3507        )
3508    }
3509}
3510#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3511pub struct ExprListParenthesized<'db> {
3512    node: SyntaxNode<'db>,
3513}
3514impl<'db> ExprListParenthesized<'db> {
3515    pub const INDEX_LPAREN: usize = 0;
3516    pub const INDEX_EXPRESSIONS: usize = 1;
3517    pub const INDEX_RPAREN: usize = 2;
3518    pub fn new_green(
3519        db: &'db dyn Database,
3520        lparen: TerminalLParenGreen<'db>,
3521        expressions: ExprListGreen<'db>,
3522        rparen: TerminalRParenGreen<'db>,
3523    ) -> ExprListParenthesizedGreen<'db> {
3524        let children = [lparen.0, expressions.0, rparen.0];
3525        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3526        ExprListParenthesizedGreen(
3527            GreenNode {
3528                kind: SyntaxKind::ExprListParenthesized,
3529                details: GreenNodeDetails::Node { children: children.into(), width },
3530            }
3531            .intern(db),
3532        )
3533    }
3534}
3535impl<'db> ExprListParenthesized<'db> {
3536    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3537        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3538    }
3539    pub fn expressions(&self, db: &'db dyn Database) -> ExprList<'db> {
3540        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3541    }
3542    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3543        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3544    }
3545}
3546#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3547pub struct ExprListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3548impl<'db> ExprListParenthesizedPtr<'db> {}
3549impl<'db> TypedStablePtr<'db> for ExprListParenthesizedPtr<'db> {
3550    type SyntaxNode = ExprListParenthesized<'db>;
3551    fn untyped(self) -> SyntaxStablePtrId<'db> {
3552        self.0
3553    }
3554    fn lookup(&self, db: &'db dyn Database) -> ExprListParenthesized<'db> {
3555        ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3556    }
3557}
3558impl<'db> From<ExprListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3559    fn from(ptr: ExprListParenthesizedPtr<'db>) -> Self {
3560        ptr.untyped()
3561    }
3562}
3563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3564pub struct ExprListParenthesizedGreen<'db>(pub GreenId<'db>);
3565impl<'db> TypedSyntaxNode<'db> for ExprListParenthesized<'db> {
3566    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3567    type StablePtr = ExprListParenthesizedPtr<'db>;
3568    type Green = ExprListParenthesizedGreen<'db>;
3569    fn missing(db: &'db dyn Database) -> Self::Green {
3570        ExprListParenthesizedGreen(
3571            GreenNode {
3572                kind: SyntaxKind::ExprListParenthesized,
3573                details: GreenNodeDetails::Node {
3574                    children: [
3575                        TerminalLParen::missing(db).0,
3576                        ExprList::missing(db).0,
3577                        TerminalRParen::missing(db).0,
3578                    ]
3579                    .into(),
3580                    width: TextWidth::default(),
3581                },
3582            }
3583            .intern(db),
3584        )
3585    }
3586    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3587        let kind = node.kind(db);
3588        assert_eq!(
3589            kind,
3590            SyntaxKind::ExprListParenthesized,
3591            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3592            kind,
3593            SyntaxKind::ExprListParenthesized
3594        );
3595        Self { node }
3596    }
3597    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3598        let kind = node.kind(db);
3599        if kind == SyntaxKind::ExprListParenthesized {
3600            Some(Self::from_syntax_node(db, node))
3601        } else {
3602            None
3603        }
3604    }
3605    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3606        self.node
3607    }
3608    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3609        ExprListParenthesizedPtr(self.node.stable_ptr(db))
3610    }
3611}
3612#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3613pub struct ExprFunctionCall<'db> {
3614    node: SyntaxNode<'db>,
3615}
3616impl<'db> ExprFunctionCall<'db> {
3617    pub const INDEX_PATH: usize = 0;
3618    pub const INDEX_ARGUMENTS: usize = 1;
3619    pub fn new_green(
3620        db: &'db dyn Database,
3621        path: ExprPathGreen<'db>,
3622        arguments: ArgListParenthesizedGreen<'db>,
3623    ) -> ExprFunctionCallGreen<'db> {
3624        let children = [path.0, arguments.0];
3625        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3626        ExprFunctionCallGreen(
3627            GreenNode {
3628                kind: SyntaxKind::ExprFunctionCall,
3629                details: GreenNodeDetails::Node { children: children.into(), width },
3630            }
3631            .intern(db),
3632        )
3633    }
3634}
3635impl<'db> ExprFunctionCall<'db> {
3636    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3637        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3638    }
3639    pub fn arguments(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3640        ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3641    }
3642}
3643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3644pub struct ExprFunctionCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3645impl<'db> ExprFunctionCallPtr<'db> {}
3646impl<'db> TypedStablePtr<'db> for ExprFunctionCallPtr<'db> {
3647    type SyntaxNode = ExprFunctionCall<'db>;
3648    fn untyped(self) -> SyntaxStablePtrId<'db> {
3649        self.0
3650    }
3651    fn lookup(&self, db: &'db dyn Database) -> ExprFunctionCall<'db> {
3652        ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3653    }
3654}
3655impl<'db> From<ExprFunctionCallPtr<'db>> for SyntaxStablePtrId<'db> {
3656    fn from(ptr: ExprFunctionCallPtr<'db>) -> Self {
3657        ptr.untyped()
3658    }
3659}
3660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3661pub struct ExprFunctionCallGreen<'db>(pub GreenId<'db>);
3662impl<'db> TypedSyntaxNode<'db> for ExprFunctionCall<'db> {
3663    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3664    type StablePtr = ExprFunctionCallPtr<'db>;
3665    type Green = ExprFunctionCallGreen<'db>;
3666    fn missing(db: &'db dyn Database) -> Self::Green {
3667        ExprFunctionCallGreen(
3668            GreenNode {
3669                kind: SyntaxKind::ExprFunctionCall,
3670                details: GreenNodeDetails::Node {
3671                    children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3672                    width: TextWidth::default(),
3673                },
3674            }
3675            .intern(db),
3676        )
3677    }
3678    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3679        let kind = node.kind(db);
3680        assert_eq!(
3681            kind,
3682            SyntaxKind::ExprFunctionCall,
3683            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3684            kind,
3685            SyntaxKind::ExprFunctionCall
3686        );
3687        Self { node }
3688    }
3689    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3690        let kind = node.kind(db);
3691        if kind == SyntaxKind::ExprFunctionCall {
3692            Some(Self::from_syntax_node(db, node))
3693        } else {
3694            None
3695        }
3696    }
3697    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3698        self.node
3699    }
3700    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3701        ExprFunctionCallPtr(self.node.stable_ptr(db))
3702    }
3703}
3704#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3705pub struct ArgListParenthesized<'db> {
3706    node: SyntaxNode<'db>,
3707}
3708impl<'db> ArgListParenthesized<'db> {
3709    pub const INDEX_LPAREN: usize = 0;
3710    pub const INDEX_ARGUMENTS: usize = 1;
3711    pub const INDEX_RPAREN: usize = 2;
3712    pub fn new_green(
3713        db: &'db dyn Database,
3714        lparen: TerminalLParenGreen<'db>,
3715        arguments: ArgListGreen<'db>,
3716        rparen: TerminalRParenGreen<'db>,
3717    ) -> ArgListParenthesizedGreen<'db> {
3718        let children = [lparen.0, arguments.0, rparen.0];
3719        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3720        ArgListParenthesizedGreen(
3721            GreenNode {
3722                kind: SyntaxKind::ArgListParenthesized,
3723                details: GreenNodeDetails::Node { children: children.into(), width },
3724            }
3725            .intern(db),
3726        )
3727    }
3728}
3729impl<'db> ArgListParenthesized<'db> {
3730    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3731        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3732    }
3733    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
3734        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3735    }
3736    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3737        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3738    }
3739}
3740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3741pub struct ArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3742impl<'db> ArgListParenthesizedPtr<'db> {}
3743impl<'db> TypedStablePtr<'db> for ArgListParenthesizedPtr<'db> {
3744    type SyntaxNode = ArgListParenthesized<'db>;
3745    fn untyped(self) -> SyntaxStablePtrId<'db> {
3746        self.0
3747    }
3748    fn lookup(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3749        ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3750    }
3751}
3752impl<'db> From<ArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3753    fn from(ptr: ArgListParenthesizedPtr<'db>) -> Self {
3754        ptr.untyped()
3755    }
3756}
3757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3758pub struct ArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3759impl<'db> TypedSyntaxNode<'db> for ArgListParenthesized<'db> {
3760    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3761    type StablePtr = ArgListParenthesizedPtr<'db>;
3762    type Green = ArgListParenthesizedGreen<'db>;
3763    fn missing(db: &'db dyn Database) -> Self::Green {
3764        ArgListParenthesizedGreen(
3765            GreenNode {
3766                kind: SyntaxKind::ArgListParenthesized,
3767                details: GreenNodeDetails::Node {
3768                    children: [
3769                        TerminalLParen::missing(db).0,
3770                        ArgList::missing(db).0,
3771                        TerminalRParen::missing(db).0,
3772                    ]
3773                    .into(),
3774                    width: TextWidth::default(),
3775                },
3776            }
3777            .intern(db),
3778        )
3779    }
3780    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3781        let kind = node.kind(db);
3782        assert_eq!(
3783            kind,
3784            SyntaxKind::ArgListParenthesized,
3785            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3786            kind,
3787            SyntaxKind::ArgListParenthesized
3788        );
3789        Self { node }
3790    }
3791    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3792        let kind = node.kind(db);
3793        if kind == SyntaxKind::ArgListParenthesized {
3794            Some(Self::from_syntax_node(db, node))
3795        } else {
3796            None
3797        }
3798    }
3799    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3800        self.node
3801    }
3802    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3803        ArgListParenthesizedPtr(self.node.stable_ptr(db))
3804    }
3805}
3806#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3807pub enum OptionArgListParenthesized<'db> {
3808    Empty(OptionArgListParenthesizedEmpty<'db>),
3809    ArgListParenthesized(ArgListParenthesized<'db>),
3810}
3811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3812pub struct OptionArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3813impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedPtr<'db> {
3814    type SyntaxNode = OptionArgListParenthesized<'db>;
3815    fn untyped(self) -> SyntaxStablePtrId<'db> {
3816        self.0
3817    }
3818    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3819        OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3820    }
3821}
3822impl<'db> From<OptionArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3823    fn from(ptr: OptionArgListParenthesizedPtr<'db>) -> Self {
3824        ptr.untyped()
3825    }
3826}
3827impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3828    fn from(value: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3829        Self(value.0)
3830    }
3831}
3832impl<'db> From<ArgListParenthesizedPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3833    fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
3834        Self(value.0)
3835    }
3836}
3837impl<'db> From<OptionArgListParenthesizedEmptyGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3838    fn from(value: OptionArgListParenthesizedEmptyGreen<'db>) -> Self {
3839        Self(value.0)
3840    }
3841}
3842impl<'db> From<ArgListParenthesizedGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3843    fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
3844        Self(value.0)
3845    }
3846}
3847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3848pub struct OptionArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3849impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesized<'db> {
3850    const OPTIONAL_KIND: Option<SyntaxKind> = None;
3851    type StablePtr = OptionArgListParenthesizedPtr<'db>;
3852    type Green = OptionArgListParenthesizedGreen<'db>;
3853    fn missing(db: &'db dyn Database) -> Self::Green {
3854        panic!("No missing variant.");
3855    }
3856    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3857        let kind = node.kind(db);
3858        match kind {
3859            SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3860                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3861            ),
3862            SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3863                ArgListParenthesized::from_syntax_node(db, node),
3864            ),
3865            _ => panic!(
3866                "Unexpected syntax kind {:?} when constructing {}.",
3867                kind, "OptionArgListParenthesized"
3868            ),
3869        }
3870    }
3871    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3872        let kind = node.kind(db);
3873        match kind {
3874            SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3875                OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3876            )),
3877            SyntaxKind::ArgListParenthesized => {
3878                Some(OptionArgListParenthesized::ArgListParenthesized(
3879                    ArgListParenthesized::from_syntax_node(db, node),
3880                ))
3881            }
3882            _ => None,
3883        }
3884    }
3885    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3886        match self {
3887            OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3888            OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3889        }
3890    }
3891    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3892        OptionArgListParenthesizedPtr(self.as_syntax_node().stable_ptr(db))
3893    }
3894}
3895impl<'db> OptionArgListParenthesized<'db> {
3896    /// Checks if a kind of a variant of [OptionArgListParenthesized].
3897    pub fn is_variant(kind: SyntaxKind) -> bool {
3898        matches!(
3899            kind,
3900            SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3901        )
3902    }
3903}
3904#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3905pub struct OptionArgListParenthesizedEmpty<'db> {
3906    node: SyntaxNode<'db>,
3907}
3908impl<'db> OptionArgListParenthesizedEmpty<'db> {
3909    pub fn new_green(db: &'db dyn Database) -> OptionArgListParenthesizedEmptyGreen<'db> {
3910        let children = [];
3911        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3912        OptionArgListParenthesizedEmptyGreen(
3913            GreenNode {
3914                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3915                details: GreenNodeDetails::Node { children: children.into(), width },
3916            }
3917            .intern(db),
3918        )
3919    }
3920}
3921impl<'db> OptionArgListParenthesizedEmpty<'db> {}
3922#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
3923pub struct OptionArgListParenthesizedEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
3924impl<'db> OptionArgListParenthesizedEmptyPtr<'db> {}
3925impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedEmptyPtr<'db> {
3926    type SyntaxNode = OptionArgListParenthesizedEmpty<'db>;
3927    fn untyped(self) -> SyntaxStablePtrId<'db> {
3928        self.0
3929    }
3930    fn lookup(&self, db: &'db dyn Database) -> OptionArgListParenthesizedEmpty<'db> {
3931        OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3932    }
3933}
3934impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
3935    fn from(ptr: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3936        ptr.untyped()
3937    }
3938}
3939#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3940pub struct OptionArgListParenthesizedEmptyGreen<'db>(pub GreenId<'db>);
3941impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesizedEmpty<'db> {
3942    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3943    type StablePtr = OptionArgListParenthesizedEmptyPtr<'db>;
3944    type Green = OptionArgListParenthesizedEmptyGreen<'db>;
3945    fn missing(db: &'db dyn Database) -> Self::Green {
3946        OptionArgListParenthesizedEmptyGreen(
3947            GreenNode {
3948                kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3949                details: GreenNodeDetails::Node {
3950                    children: [].into(),
3951                    width: TextWidth::default(),
3952                },
3953            }
3954            .intern(db),
3955        )
3956    }
3957    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3958        let kind = node.kind(db);
3959        assert_eq!(
3960            kind,
3961            SyntaxKind::OptionArgListParenthesizedEmpty,
3962            "Unexpected SyntaxKind {:?}. Expected {:?}.",
3963            kind,
3964            SyntaxKind::OptionArgListParenthesizedEmpty
3965        );
3966        Self { node }
3967    }
3968    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3969        let kind = node.kind(db);
3970        if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3971            Some(Self::from_syntax_node(db, node))
3972        } else {
3973            None
3974        }
3975    }
3976    fn as_syntax_node(&self) -> SyntaxNode<'db> {
3977        self.node
3978    }
3979    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3980        OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3981    }
3982}
3983#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3984pub struct ExprStructCtorCall<'db> {
3985    node: SyntaxNode<'db>,
3986}
3987impl<'db> ExprStructCtorCall<'db> {
3988    pub const INDEX_PATH: usize = 0;
3989    pub const INDEX_ARGUMENTS: usize = 1;
3990    pub fn new_green(
3991        db: &'db dyn Database,
3992        path: ExprPathGreen<'db>,
3993        arguments: StructArgListBracedGreen<'db>,
3994    ) -> ExprStructCtorCallGreen<'db> {
3995        let children = [path.0, arguments.0];
3996        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3997        ExprStructCtorCallGreen(
3998            GreenNode {
3999                kind: SyntaxKind::ExprStructCtorCall,
4000                details: GreenNodeDetails::Node { children: children.into(), width },
4001            }
4002            .intern(db),
4003        )
4004    }
4005}
4006impl<'db> ExprStructCtorCall<'db> {
4007    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
4008        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
4009    }
4010    pub fn arguments(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4011        StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
4012    }
4013}
4014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4015pub struct ExprStructCtorCallPtr<'db>(pub SyntaxStablePtrId<'db>);
4016impl<'db> ExprStructCtorCallPtr<'db> {}
4017impl<'db> TypedStablePtr<'db> for ExprStructCtorCallPtr<'db> {
4018    type SyntaxNode = ExprStructCtorCall<'db>;
4019    fn untyped(self) -> SyntaxStablePtrId<'db> {
4020        self.0
4021    }
4022    fn lookup(&self, db: &'db dyn Database) -> ExprStructCtorCall<'db> {
4023        ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
4024    }
4025}
4026impl<'db> From<ExprStructCtorCallPtr<'db>> for SyntaxStablePtrId<'db> {
4027    fn from(ptr: ExprStructCtorCallPtr<'db>) -> Self {
4028        ptr.untyped()
4029    }
4030}
4031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4032pub struct ExprStructCtorCallGreen<'db>(pub GreenId<'db>);
4033impl<'db> TypedSyntaxNode<'db> for ExprStructCtorCall<'db> {
4034    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
4035    type StablePtr = ExprStructCtorCallPtr<'db>;
4036    type Green = ExprStructCtorCallGreen<'db>;
4037    fn missing(db: &'db dyn Database) -> Self::Green {
4038        ExprStructCtorCallGreen(
4039            GreenNode {
4040                kind: SyntaxKind::ExprStructCtorCall,
4041                details: GreenNodeDetails::Node {
4042                    children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4043                    width: TextWidth::default(),
4044                },
4045            }
4046            .intern(db),
4047        )
4048    }
4049    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4050        let kind = node.kind(db);
4051        assert_eq!(
4052            kind,
4053            SyntaxKind::ExprStructCtorCall,
4054            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4055            kind,
4056            SyntaxKind::ExprStructCtorCall
4057        );
4058        Self { node }
4059    }
4060    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4061        let kind = node.kind(db);
4062        if kind == SyntaxKind::ExprStructCtorCall {
4063            Some(Self::from_syntax_node(db, node))
4064        } else {
4065            None
4066        }
4067    }
4068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4069        self.node
4070    }
4071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4072        ExprStructCtorCallPtr(self.node.stable_ptr(db))
4073    }
4074}
4075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4076pub struct StructArgListBraced<'db> {
4077    node: SyntaxNode<'db>,
4078}
4079impl<'db> StructArgListBraced<'db> {
4080    pub const INDEX_LBRACE: usize = 0;
4081    pub const INDEX_ARGUMENTS: usize = 1;
4082    pub const INDEX_RBRACE: usize = 2;
4083    pub fn new_green(
4084        db: &'db dyn Database,
4085        lbrace: TerminalLBraceGreen<'db>,
4086        arguments: StructArgListGreen<'db>,
4087        rbrace: TerminalRBraceGreen<'db>,
4088    ) -> StructArgListBracedGreen<'db> {
4089        let children = [lbrace.0, arguments.0, rbrace.0];
4090        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4091        StructArgListBracedGreen(
4092            GreenNode {
4093                kind: SyntaxKind::StructArgListBraced,
4094                details: GreenNodeDetails::Node { children: children.into(), width },
4095            }
4096            .intern(db),
4097        )
4098    }
4099}
4100impl<'db> StructArgListBraced<'db> {
4101    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4102        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4103    }
4104    pub fn arguments(&self, db: &'db dyn Database) -> StructArgList<'db> {
4105        StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4106    }
4107    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4108        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4109    }
4110}
4111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4112pub struct StructArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
4113impl<'db> StructArgListBracedPtr<'db> {}
4114impl<'db> TypedStablePtr<'db> for StructArgListBracedPtr<'db> {
4115    type SyntaxNode = StructArgListBraced<'db>;
4116    fn untyped(self) -> SyntaxStablePtrId<'db> {
4117        self.0
4118    }
4119    fn lookup(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4120        StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4121    }
4122}
4123impl<'db> From<StructArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
4124    fn from(ptr: StructArgListBracedPtr<'db>) -> Self {
4125        ptr.untyped()
4126    }
4127}
4128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4129pub struct StructArgListBracedGreen<'db>(pub GreenId<'db>);
4130impl<'db> TypedSyntaxNode<'db> for StructArgListBraced<'db> {
4131    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4132    type StablePtr = StructArgListBracedPtr<'db>;
4133    type Green = StructArgListBracedGreen<'db>;
4134    fn missing(db: &'db dyn Database) -> Self::Green {
4135        StructArgListBracedGreen(
4136            GreenNode {
4137                kind: SyntaxKind::StructArgListBraced,
4138                details: GreenNodeDetails::Node {
4139                    children: [
4140                        TerminalLBrace::missing(db).0,
4141                        StructArgList::missing(db).0,
4142                        TerminalRBrace::missing(db).0,
4143                    ]
4144                    .into(),
4145                    width: TextWidth::default(),
4146                },
4147            }
4148            .intern(db),
4149        )
4150    }
4151    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4152        let kind = node.kind(db);
4153        assert_eq!(
4154            kind,
4155            SyntaxKind::StructArgListBraced,
4156            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4157            kind,
4158            SyntaxKind::StructArgListBraced
4159        );
4160        Self { node }
4161    }
4162    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4163        let kind = node.kind(db);
4164        if kind == SyntaxKind::StructArgListBraced {
4165            Some(Self::from_syntax_node(db, node))
4166        } else {
4167            None
4168        }
4169    }
4170    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4171        self.node
4172    }
4173    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4174        StructArgListBracedPtr(self.node.stable_ptr(db))
4175    }
4176}
4177#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4178pub struct ExprBlock<'db> {
4179    node: SyntaxNode<'db>,
4180}
4181impl<'db> ExprBlock<'db> {
4182    pub const INDEX_LBRACE: usize = 0;
4183    pub const INDEX_STATEMENTS: usize = 1;
4184    pub const INDEX_RBRACE: usize = 2;
4185    pub fn new_green(
4186        db: &'db dyn Database,
4187        lbrace: TerminalLBraceGreen<'db>,
4188        statements: StatementListGreen<'db>,
4189        rbrace: TerminalRBraceGreen<'db>,
4190    ) -> ExprBlockGreen<'db> {
4191        let children = [lbrace.0, statements.0, rbrace.0];
4192        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4193        ExprBlockGreen(
4194            GreenNode {
4195                kind: SyntaxKind::ExprBlock,
4196                details: GreenNodeDetails::Node { children: children.into(), width },
4197            }
4198            .intern(db),
4199        )
4200    }
4201}
4202impl<'db> ExprBlock<'db> {
4203    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4204        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4205    }
4206    pub fn statements(&self, db: &'db dyn Database) -> StatementList<'db> {
4207        StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4208    }
4209    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4210        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4211    }
4212}
4213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4214pub struct ExprBlockPtr<'db>(pub SyntaxStablePtrId<'db>);
4215impl<'db> ExprBlockPtr<'db> {}
4216impl<'db> TypedStablePtr<'db> for ExprBlockPtr<'db> {
4217    type SyntaxNode = ExprBlock<'db>;
4218    fn untyped(self) -> SyntaxStablePtrId<'db> {
4219        self.0
4220    }
4221    fn lookup(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4222        ExprBlock::from_syntax_node(db, self.0.lookup(db))
4223    }
4224}
4225impl<'db> From<ExprBlockPtr<'db>> for SyntaxStablePtrId<'db> {
4226    fn from(ptr: ExprBlockPtr<'db>) -> Self {
4227        ptr.untyped()
4228    }
4229}
4230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4231pub struct ExprBlockGreen<'db>(pub GreenId<'db>);
4232impl<'db> TypedSyntaxNode<'db> for ExprBlock<'db> {
4233    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4234    type StablePtr = ExprBlockPtr<'db>;
4235    type Green = ExprBlockGreen<'db>;
4236    fn missing(db: &'db dyn Database) -> Self::Green {
4237        ExprBlockGreen(
4238            GreenNode {
4239                kind: SyntaxKind::ExprBlock,
4240                details: GreenNodeDetails::Node {
4241                    children: [
4242                        TerminalLBrace::missing(db).0,
4243                        StatementList::missing(db).0,
4244                        TerminalRBrace::missing(db).0,
4245                    ]
4246                    .into(),
4247                    width: TextWidth::default(),
4248                },
4249            }
4250            .intern(db),
4251        )
4252    }
4253    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4254        let kind = node.kind(db);
4255        assert_eq!(
4256            kind,
4257            SyntaxKind::ExprBlock,
4258            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4259            kind,
4260            SyntaxKind::ExprBlock
4261        );
4262        Self { node }
4263    }
4264    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4265        let kind = node.kind(db);
4266        if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4267    }
4268    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4269        self.node
4270    }
4271    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4272        ExprBlockPtr(self.node.stable_ptr(db))
4273    }
4274}
4275#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4276pub struct ExprMatch<'db> {
4277    node: SyntaxNode<'db>,
4278}
4279impl<'db> ExprMatch<'db> {
4280    pub const INDEX_MATCH_KW: usize = 0;
4281    pub const INDEX_EXPR: usize = 1;
4282    pub const INDEX_LBRACE: usize = 2;
4283    pub const INDEX_ARMS: usize = 3;
4284    pub const INDEX_RBRACE: usize = 4;
4285    pub fn new_green(
4286        db: &'db dyn Database,
4287        match_kw: TerminalMatchGreen<'db>,
4288        expr: ExprGreen<'db>,
4289        lbrace: TerminalLBraceGreen<'db>,
4290        arms: MatchArmsGreen<'db>,
4291        rbrace: TerminalRBraceGreen<'db>,
4292    ) -> ExprMatchGreen<'db> {
4293        let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4294        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4295        ExprMatchGreen(
4296            GreenNode {
4297                kind: SyntaxKind::ExprMatch,
4298                details: GreenNodeDetails::Node { children: children.into(), width },
4299            }
4300            .intern(db),
4301        )
4302    }
4303}
4304impl<'db> ExprMatch<'db> {
4305    pub fn match_kw(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
4306        TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4307    }
4308    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4309        Expr::from_syntax_node(db, self.node.get_children(db)[1])
4310    }
4311    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4312        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4313    }
4314    pub fn arms(&self, db: &'db dyn Database) -> MatchArms<'db> {
4315        MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4316    }
4317    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4318        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4319    }
4320}
4321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4322pub struct ExprMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
4323impl<'db> ExprMatchPtr<'db> {}
4324impl<'db> TypedStablePtr<'db> for ExprMatchPtr<'db> {
4325    type SyntaxNode = ExprMatch<'db>;
4326    fn untyped(self) -> SyntaxStablePtrId<'db> {
4327        self.0
4328    }
4329    fn lookup(&self, db: &'db dyn Database) -> ExprMatch<'db> {
4330        ExprMatch::from_syntax_node(db, self.0.lookup(db))
4331    }
4332}
4333impl<'db> From<ExprMatchPtr<'db>> for SyntaxStablePtrId<'db> {
4334    fn from(ptr: ExprMatchPtr<'db>) -> Self {
4335        ptr.untyped()
4336    }
4337}
4338#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4339pub struct ExprMatchGreen<'db>(pub GreenId<'db>);
4340impl<'db> TypedSyntaxNode<'db> for ExprMatch<'db> {
4341    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4342    type StablePtr = ExprMatchPtr<'db>;
4343    type Green = ExprMatchGreen<'db>;
4344    fn missing(db: &'db dyn Database) -> Self::Green {
4345        ExprMatchGreen(
4346            GreenNode {
4347                kind: SyntaxKind::ExprMatch,
4348                details: GreenNodeDetails::Node {
4349                    children: [
4350                        TerminalMatch::missing(db).0,
4351                        Expr::missing(db).0,
4352                        TerminalLBrace::missing(db).0,
4353                        MatchArms::missing(db).0,
4354                        TerminalRBrace::missing(db).0,
4355                    ]
4356                    .into(),
4357                    width: TextWidth::default(),
4358                },
4359            }
4360            .intern(db),
4361        )
4362    }
4363    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4364        let kind = node.kind(db);
4365        assert_eq!(
4366            kind,
4367            SyntaxKind::ExprMatch,
4368            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4369            kind,
4370            SyntaxKind::ExprMatch
4371        );
4372        Self { node }
4373    }
4374    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4375        let kind = node.kind(db);
4376        if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4377    }
4378    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4379        self.node
4380    }
4381    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4382        ExprMatchPtr(self.node.stable_ptr(db))
4383    }
4384}
4385#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4386pub struct MatchArms<'db>(ElementList<'db, MatchArm<'db>, 2>);
4387impl<'db> Deref for MatchArms<'db> {
4388    type Target = ElementList<'db, MatchArm<'db>, 2>;
4389    fn deref(&self) -> &Self::Target {
4390        &self.0
4391    }
4392}
4393impl<'db> MatchArms<'db> {
4394    pub fn new_green(
4395        db: &'db dyn Database,
4396        children: &[MatchArmsElementOrSeparatorGreen<'db>],
4397    ) -> MatchArmsGreen<'db> {
4398        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4399        MatchArmsGreen(
4400            GreenNode {
4401                kind: SyntaxKind::MatchArms,
4402                details: GreenNodeDetails::Node {
4403                    children: children.iter().map(|x| x.id()).collect(),
4404                    width,
4405                },
4406            }
4407            .intern(db),
4408        )
4409    }
4410}
4411#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4412pub struct MatchArmsPtr<'db>(pub SyntaxStablePtrId<'db>);
4413impl<'db> TypedStablePtr<'db> for MatchArmsPtr<'db> {
4414    type SyntaxNode = MatchArms<'db>;
4415    fn untyped(self) -> SyntaxStablePtrId<'db> {
4416        self.0
4417    }
4418    fn lookup(&self, db: &'db dyn Database) -> MatchArms<'db> {
4419        MatchArms::from_syntax_node(db, self.0.lookup(db))
4420    }
4421}
4422impl<'db> From<MatchArmsPtr<'db>> for SyntaxStablePtrId<'db> {
4423    fn from(ptr: MatchArmsPtr<'db>) -> Self {
4424        ptr.untyped()
4425    }
4426}
4427#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4428pub enum MatchArmsElementOrSeparatorGreen<'db> {
4429    Separator(TerminalCommaGreen<'db>),
4430    Element(MatchArmGreen<'db>),
4431}
4432impl<'db> From<TerminalCommaGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4433    fn from(value: TerminalCommaGreen<'db>) -> Self {
4434        MatchArmsElementOrSeparatorGreen::Separator(value)
4435    }
4436}
4437impl<'db> From<MatchArmGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4438    fn from(value: MatchArmGreen<'db>) -> Self {
4439        MatchArmsElementOrSeparatorGreen::Element(value)
4440    }
4441}
4442impl<'db> MatchArmsElementOrSeparatorGreen<'db> {
4443    fn id(&self) -> GreenId<'db> {
4444        match self {
4445            MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4446            MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4447        }
4448    }
4449}
4450#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4451pub struct MatchArmsGreen<'db>(pub GreenId<'db>);
4452impl<'db> TypedSyntaxNode<'db> for MatchArms<'db> {
4453    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4454    type StablePtr = MatchArmsPtr<'db>;
4455    type Green = MatchArmsGreen<'db>;
4456    fn missing(db: &'db dyn Database) -> Self::Green {
4457        MatchArmsGreen(
4458            GreenNode {
4459                kind: SyntaxKind::MatchArms,
4460                details: GreenNodeDetails::Node {
4461                    children: [].into(),
4462                    width: TextWidth::default(),
4463                },
4464            }
4465            .intern(db),
4466        )
4467    }
4468    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4469        Self(ElementList::new(node))
4470    }
4471    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4472        if node.kind(db) == SyntaxKind::MatchArms {
4473            Some(Self(ElementList::new(node)))
4474        } else {
4475            None
4476        }
4477    }
4478    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4479        self.node
4480    }
4481    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4482        MatchArmsPtr(self.node.stable_ptr(db))
4483    }
4484}
4485#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4486pub struct MatchArm<'db> {
4487    node: SyntaxNode<'db>,
4488}
4489impl<'db> MatchArm<'db> {
4490    pub const INDEX_PATTERNS: usize = 0;
4491    pub const INDEX_ARROW: usize = 1;
4492    pub const INDEX_EXPRESSION: usize = 2;
4493    pub fn new_green(
4494        db: &'db dyn Database,
4495        patterns: PatternListOrGreen<'db>,
4496        arrow: TerminalMatchArrowGreen<'db>,
4497        expression: ExprGreen<'db>,
4498    ) -> MatchArmGreen<'db> {
4499        let children = [patterns.0, arrow.0, expression.0];
4500        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4501        MatchArmGreen(
4502            GreenNode {
4503                kind: SyntaxKind::MatchArm,
4504                details: GreenNodeDetails::Node { children: children.into(), width },
4505            }
4506            .intern(db),
4507        )
4508    }
4509}
4510impl<'db> MatchArm<'db> {
4511    pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4512        PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4513    }
4514    pub fn arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
4515        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4516    }
4517    pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
4518        Expr::from_syntax_node(db, self.node.get_children(db)[2])
4519    }
4520}
4521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4522pub struct MatchArmPtr<'db>(pub SyntaxStablePtrId<'db>);
4523impl<'db> MatchArmPtr<'db> {}
4524impl<'db> TypedStablePtr<'db> for MatchArmPtr<'db> {
4525    type SyntaxNode = MatchArm<'db>;
4526    fn untyped(self) -> SyntaxStablePtrId<'db> {
4527        self.0
4528    }
4529    fn lookup(&self, db: &'db dyn Database) -> MatchArm<'db> {
4530        MatchArm::from_syntax_node(db, self.0.lookup(db))
4531    }
4532}
4533impl<'db> From<MatchArmPtr<'db>> for SyntaxStablePtrId<'db> {
4534    fn from(ptr: MatchArmPtr<'db>) -> Self {
4535        ptr.untyped()
4536    }
4537}
4538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4539pub struct MatchArmGreen<'db>(pub GreenId<'db>);
4540impl<'db> TypedSyntaxNode<'db> for MatchArm<'db> {
4541    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4542    type StablePtr = MatchArmPtr<'db>;
4543    type Green = MatchArmGreen<'db>;
4544    fn missing(db: &'db dyn Database) -> Self::Green {
4545        MatchArmGreen(
4546            GreenNode {
4547                kind: SyntaxKind::MatchArm,
4548                details: GreenNodeDetails::Node {
4549                    children: [
4550                        PatternListOr::missing(db).0,
4551                        TerminalMatchArrow::missing(db).0,
4552                        Expr::missing(db).0,
4553                    ]
4554                    .into(),
4555                    width: TextWidth::default(),
4556                },
4557            }
4558            .intern(db),
4559        )
4560    }
4561    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4562        let kind = node.kind(db);
4563        assert_eq!(
4564            kind,
4565            SyntaxKind::MatchArm,
4566            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4567            kind,
4568            SyntaxKind::MatchArm
4569        );
4570        Self { node }
4571    }
4572    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4573        let kind = node.kind(db);
4574        if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4575    }
4576    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4577        self.node
4578    }
4579    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4580        MatchArmPtr(self.node.stable_ptr(db))
4581    }
4582}
4583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4584pub struct ExprIf<'db> {
4585    node: SyntaxNode<'db>,
4586}
4587impl<'db> ExprIf<'db> {
4588    pub const INDEX_IF_KW: usize = 0;
4589    pub const INDEX_CONDITIONS: usize = 1;
4590    pub const INDEX_IF_BLOCK: usize = 2;
4591    pub const INDEX_ELSE_CLAUSE: usize = 3;
4592    pub fn new_green(
4593        db: &'db dyn Database,
4594        if_kw: TerminalIfGreen<'db>,
4595        conditions: ConditionListAndGreen<'db>,
4596        if_block: ExprBlockGreen<'db>,
4597        else_clause: OptionElseClauseGreen<'db>,
4598    ) -> ExprIfGreen<'db> {
4599        let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4600        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4601        ExprIfGreen(
4602            GreenNode {
4603                kind: SyntaxKind::ExprIf,
4604                details: GreenNodeDetails::Node { children: children.into(), width },
4605            }
4606            .intern(db),
4607        )
4608    }
4609}
4610impl<'db> ExprIf<'db> {
4611    pub fn if_kw(&self, db: &'db dyn Database) -> TerminalIf<'db> {
4612        TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4613    }
4614    pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4615        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4616    }
4617    pub fn if_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4618        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4619    }
4620    pub fn else_clause(&self, db: &'db dyn Database) -> OptionElseClause<'db> {
4621        OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4622    }
4623}
4624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4625pub struct ExprIfPtr<'db>(pub SyntaxStablePtrId<'db>);
4626impl<'db> ExprIfPtr<'db> {}
4627impl<'db> TypedStablePtr<'db> for ExprIfPtr<'db> {
4628    type SyntaxNode = ExprIf<'db>;
4629    fn untyped(self) -> SyntaxStablePtrId<'db> {
4630        self.0
4631    }
4632    fn lookup(&self, db: &'db dyn Database) -> ExprIf<'db> {
4633        ExprIf::from_syntax_node(db, self.0.lookup(db))
4634    }
4635}
4636impl<'db> From<ExprIfPtr<'db>> for SyntaxStablePtrId<'db> {
4637    fn from(ptr: ExprIfPtr<'db>) -> Self {
4638        ptr.untyped()
4639    }
4640}
4641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4642pub struct ExprIfGreen<'db>(pub GreenId<'db>);
4643impl<'db> TypedSyntaxNode<'db> for ExprIf<'db> {
4644    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4645    type StablePtr = ExprIfPtr<'db>;
4646    type Green = ExprIfGreen<'db>;
4647    fn missing(db: &'db dyn Database) -> Self::Green {
4648        ExprIfGreen(
4649            GreenNode {
4650                kind: SyntaxKind::ExprIf,
4651                details: GreenNodeDetails::Node {
4652                    children: [
4653                        TerminalIf::missing(db).0,
4654                        ConditionListAnd::missing(db).0,
4655                        ExprBlock::missing(db).0,
4656                        OptionElseClause::missing(db).0,
4657                    ]
4658                    .into(),
4659                    width: TextWidth::default(),
4660                },
4661            }
4662            .intern(db),
4663        )
4664    }
4665    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4666        let kind = node.kind(db);
4667        assert_eq!(
4668            kind,
4669            SyntaxKind::ExprIf,
4670            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4671            kind,
4672            SyntaxKind::ExprIf
4673        );
4674        Self { node }
4675    }
4676    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4677        let kind = node.kind(db);
4678        if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4679    }
4680    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4681        self.node
4682    }
4683    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4684        ExprIfPtr(self.node.stable_ptr(db))
4685    }
4686}
4687#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4688pub struct ConditionListAnd<'db>(ElementList<'db, Condition<'db>, 2>);
4689impl<'db> Deref for ConditionListAnd<'db> {
4690    type Target = ElementList<'db, Condition<'db>, 2>;
4691    fn deref(&self) -> &Self::Target {
4692        &self.0
4693    }
4694}
4695impl<'db> ConditionListAnd<'db> {
4696    pub fn new_green(
4697        db: &'db dyn Database,
4698        children: &[ConditionListAndElementOrSeparatorGreen<'db>],
4699    ) -> ConditionListAndGreen<'db> {
4700        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4701        ConditionListAndGreen(
4702            GreenNode {
4703                kind: SyntaxKind::ConditionListAnd,
4704                details: GreenNodeDetails::Node {
4705                    children: children.iter().map(|x| x.id()).collect(),
4706                    width,
4707                },
4708            }
4709            .intern(db),
4710        )
4711    }
4712}
4713#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4714pub struct ConditionListAndPtr<'db>(pub SyntaxStablePtrId<'db>);
4715impl<'db> TypedStablePtr<'db> for ConditionListAndPtr<'db> {
4716    type SyntaxNode = ConditionListAnd<'db>;
4717    fn untyped(self) -> SyntaxStablePtrId<'db> {
4718        self.0
4719    }
4720    fn lookup(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4721        ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4722    }
4723}
4724impl<'db> From<ConditionListAndPtr<'db>> for SyntaxStablePtrId<'db> {
4725    fn from(ptr: ConditionListAndPtr<'db>) -> Self {
4726        ptr.untyped()
4727    }
4728}
4729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4730pub enum ConditionListAndElementOrSeparatorGreen<'db> {
4731    Separator(TerminalAndAndGreen<'db>),
4732    Element(ConditionGreen<'db>),
4733}
4734impl<'db> From<TerminalAndAndGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4735    fn from(value: TerminalAndAndGreen<'db>) -> Self {
4736        ConditionListAndElementOrSeparatorGreen::Separator(value)
4737    }
4738}
4739impl<'db> From<ConditionGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4740    fn from(value: ConditionGreen<'db>) -> Self {
4741        ConditionListAndElementOrSeparatorGreen::Element(value)
4742    }
4743}
4744impl<'db> ConditionListAndElementOrSeparatorGreen<'db> {
4745    fn id(&self) -> GreenId<'db> {
4746        match self {
4747            ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4748            ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4749        }
4750    }
4751}
4752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4753pub struct ConditionListAndGreen<'db>(pub GreenId<'db>);
4754impl<'db> TypedSyntaxNode<'db> for ConditionListAnd<'db> {
4755    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4756    type StablePtr = ConditionListAndPtr<'db>;
4757    type Green = ConditionListAndGreen<'db>;
4758    fn missing(db: &'db dyn Database) -> Self::Green {
4759        ConditionListAndGreen(
4760            GreenNode {
4761                kind: SyntaxKind::ConditionListAnd,
4762                details: GreenNodeDetails::Node {
4763                    children: [].into(),
4764                    width: TextWidth::default(),
4765                },
4766            }
4767            .intern(db),
4768        )
4769    }
4770    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4771        Self(ElementList::new(node))
4772    }
4773    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4774        if node.kind(db) == SyntaxKind::ConditionListAnd {
4775            Some(Self(ElementList::new(node)))
4776        } else {
4777            None
4778        }
4779    }
4780    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4781        self.node
4782    }
4783    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4784        ConditionListAndPtr(self.node.stable_ptr(db))
4785    }
4786}
4787#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4788pub enum Condition<'db> {
4789    Let(ConditionLet<'db>),
4790    Expr(ConditionExpr<'db>),
4791}
4792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4793pub struct ConditionPtr<'db>(pub SyntaxStablePtrId<'db>);
4794impl<'db> TypedStablePtr<'db> for ConditionPtr<'db> {
4795    type SyntaxNode = Condition<'db>;
4796    fn untyped(self) -> SyntaxStablePtrId<'db> {
4797        self.0
4798    }
4799    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
4800        Condition::from_syntax_node(db, self.0.lookup(db))
4801    }
4802}
4803impl<'db> From<ConditionPtr<'db>> for SyntaxStablePtrId<'db> {
4804    fn from(ptr: ConditionPtr<'db>) -> Self {
4805        ptr.untyped()
4806    }
4807}
4808impl<'db> From<ConditionLetPtr<'db>> for ConditionPtr<'db> {
4809    fn from(value: ConditionLetPtr<'db>) -> Self {
4810        Self(value.0)
4811    }
4812}
4813impl<'db> From<ConditionExprPtr<'db>> for ConditionPtr<'db> {
4814    fn from(value: ConditionExprPtr<'db>) -> Self {
4815        Self(value.0)
4816    }
4817}
4818impl<'db> From<ConditionLetGreen<'db>> for ConditionGreen<'db> {
4819    fn from(value: ConditionLetGreen<'db>) -> Self {
4820        Self(value.0)
4821    }
4822}
4823impl<'db> From<ConditionExprGreen<'db>> for ConditionGreen<'db> {
4824    fn from(value: ConditionExprGreen<'db>) -> Self {
4825        Self(value.0)
4826    }
4827}
4828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4829pub struct ConditionGreen<'db>(pub GreenId<'db>);
4830impl<'db> TypedSyntaxNode<'db> for Condition<'db> {
4831    const OPTIONAL_KIND: Option<SyntaxKind> = None;
4832    type StablePtr = ConditionPtr<'db>;
4833    type Green = ConditionGreen<'db>;
4834    fn missing(db: &'db dyn Database) -> Self::Green {
4835        panic!("No missing variant.");
4836    }
4837    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4838        let kind = node.kind(db);
4839        match kind {
4840            SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4841            SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4842            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4843        }
4844    }
4845    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4846        let kind = node.kind(db);
4847        match kind {
4848            SyntaxKind::ConditionLet => {
4849                Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4850            }
4851            SyntaxKind::ConditionExpr => {
4852                Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4853            }
4854            _ => None,
4855        }
4856    }
4857    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4858        match self {
4859            Condition::Let(x) => x.as_syntax_node(),
4860            Condition::Expr(x) => x.as_syntax_node(),
4861        }
4862    }
4863    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4864        ConditionPtr(self.as_syntax_node().stable_ptr(db))
4865    }
4866}
4867impl<'db> Condition<'db> {
4868    /// Checks if a kind of a variant of [Condition].
4869    pub fn is_variant(kind: SyntaxKind) -> bool {
4870        matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4871    }
4872}
4873#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4874pub struct ConditionLet<'db> {
4875    node: SyntaxNode<'db>,
4876}
4877impl<'db> ConditionLet<'db> {
4878    pub const INDEX_LET_KW: usize = 0;
4879    pub const INDEX_PATTERNS: usize = 1;
4880    pub const INDEX_EQ: usize = 2;
4881    pub const INDEX_EXPR: usize = 3;
4882    pub fn new_green(
4883        db: &'db dyn Database,
4884        let_kw: TerminalLetGreen<'db>,
4885        patterns: PatternListOrGreen<'db>,
4886        eq: TerminalEqGreen<'db>,
4887        expr: ExprGreen<'db>,
4888    ) -> ConditionLetGreen<'db> {
4889        let children = [let_kw.0, patterns.0, eq.0, expr.0];
4890        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4891        ConditionLetGreen(
4892            GreenNode {
4893                kind: SyntaxKind::ConditionLet,
4894                details: GreenNodeDetails::Node { children: children.into(), width },
4895            }
4896            .intern(db),
4897        )
4898    }
4899}
4900impl<'db> ConditionLet<'db> {
4901    pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
4902        TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4903    }
4904    pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4905        PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4906    }
4907    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
4908        TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4909    }
4910    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4911        Expr::from_syntax_node(db, self.node.get_children(db)[3])
4912    }
4913}
4914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
4915pub struct ConditionLetPtr<'db>(pub SyntaxStablePtrId<'db>);
4916impl<'db> ConditionLetPtr<'db> {}
4917impl<'db> TypedStablePtr<'db> for ConditionLetPtr<'db> {
4918    type SyntaxNode = ConditionLet<'db>;
4919    fn untyped(self) -> SyntaxStablePtrId<'db> {
4920        self.0
4921    }
4922    fn lookup(&self, db: &'db dyn Database) -> ConditionLet<'db> {
4923        ConditionLet::from_syntax_node(db, self.0.lookup(db))
4924    }
4925}
4926impl<'db> From<ConditionLetPtr<'db>> for SyntaxStablePtrId<'db> {
4927    fn from(ptr: ConditionLetPtr<'db>) -> Self {
4928        ptr.untyped()
4929    }
4930}
4931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4932pub struct ConditionLetGreen<'db>(pub GreenId<'db>);
4933impl<'db> TypedSyntaxNode<'db> for ConditionLet<'db> {
4934    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4935    type StablePtr = ConditionLetPtr<'db>;
4936    type Green = ConditionLetGreen<'db>;
4937    fn missing(db: &'db dyn Database) -> Self::Green {
4938        ConditionLetGreen(
4939            GreenNode {
4940                kind: SyntaxKind::ConditionLet,
4941                details: GreenNodeDetails::Node {
4942                    children: [
4943                        TerminalLet::missing(db).0,
4944                        PatternListOr::missing(db).0,
4945                        TerminalEq::missing(db).0,
4946                        Expr::missing(db).0,
4947                    ]
4948                    .into(),
4949                    width: TextWidth::default(),
4950                },
4951            }
4952            .intern(db),
4953        )
4954    }
4955    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4956        let kind = node.kind(db);
4957        assert_eq!(
4958            kind,
4959            SyntaxKind::ConditionLet,
4960            "Unexpected SyntaxKind {:?}. Expected {:?}.",
4961            kind,
4962            SyntaxKind::ConditionLet
4963        );
4964        Self { node }
4965    }
4966    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4967        let kind = node.kind(db);
4968        if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4969    }
4970    fn as_syntax_node(&self) -> SyntaxNode<'db> {
4971        self.node
4972    }
4973    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4974        ConditionLetPtr(self.node.stable_ptr(db))
4975    }
4976}
4977#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4978pub struct ConditionExpr<'db> {
4979    node: SyntaxNode<'db>,
4980}
4981impl<'db> ConditionExpr<'db> {
4982    pub const INDEX_EXPR: usize = 0;
4983    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ConditionExprGreen<'db> {
4984        let children = [expr.0];
4985        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4986        ConditionExprGreen(
4987            GreenNode {
4988                kind: SyntaxKind::ConditionExpr,
4989                details: GreenNodeDetails::Node { children: children.into(), width },
4990            }
4991            .intern(db),
4992        )
4993    }
4994}
4995impl<'db> ConditionExpr<'db> {
4996    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4997        Expr::from_syntax_node(db, self.node.get_children(db)[0])
4998    }
4999}
5000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5001pub struct ConditionExprPtr<'db>(pub SyntaxStablePtrId<'db>);
5002impl<'db> ConditionExprPtr<'db> {}
5003impl<'db> TypedStablePtr<'db> for ConditionExprPtr<'db> {
5004    type SyntaxNode = ConditionExpr<'db>;
5005    fn untyped(self) -> SyntaxStablePtrId<'db> {
5006        self.0
5007    }
5008    fn lookup(&self, db: &'db dyn Database) -> ConditionExpr<'db> {
5009        ConditionExpr::from_syntax_node(db, self.0.lookup(db))
5010    }
5011}
5012impl<'db> From<ConditionExprPtr<'db>> for SyntaxStablePtrId<'db> {
5013    fn from(ptr: ConditionExprPtr<'db>) -> Self {
5014        ptr.untyped()
5015    }
5016}
5017#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5018pub struct ConditionExprGreen<'db>(pub GreenId<'db>);
5019impl<'db> TypedSyntaxNode<'db> for ConditionExpr<'db> {
5020    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
5021    type StablePtr = ConditionExprPtr<'db>;
5022    type Green = ConditionExprGreen<'db>;
5023    fn missing(db: &'db dyn Database) -> Self::Green {
5024        ConditionExprGreen(
5025            GreenNode {
5026                kind: SyntaxKind::ConditionExpr,
5027                details: GreenNodeDetails::Node {
5028                    children: [Expr::missing(db).0].into(),
5029                    width: TextWidth::default(),
5030                },
5031            }
5032            .intern(db),
5033        )
5034    }
5035    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5036        let kind = node.kind(db);
5037        assert_eq!(
5038            kind,
5039            SyntaxKind::ConditionExpr,
5040            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5041            kind,
5042            SyntaxKind::ConditionExpr
5043        );
5044        Self { node }
5045    }
5046    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5047        let kind = node.kind(db);
5048        if kind == SyntaxKind::ConditionExpr {
5049            Some(Self::from_syntax_node(db, node))
5050        } else {
5051            None
5052        }
5053    }
5054    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5055        self.node
5056    }
5057    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5058        ConditionExprPtr(self.node.stable_ptr(db))
5059    }
5060}
5061#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5062pub enum BlockOrIf<'db> {
5063    Block(ExprBlock<'db>),
5064    If(ExprIf<'db>),
5065}
5066#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5067pub struct BlockOrIfPtr<'db>(pub SyntaxStablePtrId<'db>);
5068impl<'db> TypedStablePtr<'db> for BlockOrIfPtr<'db> {
5069    type SyntaxNode = BlockOrIf<'db>;
5070    fn untyped(self) -> SyntaxStablePtrId<'db> {
5071        self.0
5072    }
5073    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5074        BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5075    }
5076}
5077impl<'db> From<BlockOrIfPtr<'db>> for SyntaxStablePtrId<'db> {
5078    fn from(ptr: BlockOrIfPtr<'db>) -> Self {
5079        ptr.untyped()
5080    }
5081}
5082impl<'db> From<ExprBlockPtr<'db>> for BlockOrIfPtr<'db> {
5083    fn from(value: ExprBlockPtr<'db>) -> Self {
5084        Self(value.0)
5085    }
5086}
5087impl<'db> From<ExprIfPtr<'db>> for BlockOrIfPtr<'db> {
5088    fn from(value: ExprIfPtr<'db>) -> Self {
5089        Self(value.0)
5090    }
5091}
5092impl<'db> From<ExprBlockGreen<'db>> for BlockOrIfGreen<'db> {
5093    fn from(value: ExprBlockGreen<'db>) -> Self {
5094        Self(value.0)
5095    }
5096}
5097impl<'db> From<ExprIfGreen<'db>> for BlockOrIfGreen<'db> {
5098    fn from(value: ExprIfGreen<'db>) -> Self {
5099        Self(value.0)
5100    }
5101}
5102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5103pub struct BlockOrIfGreen<'db>(pub GreenId<'db>);
5104impl<'db> TypedSyntaxNode<'db> for BlockOrIf<'db> {
5105    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5106    type StablePtr = BlockOrIfPtr<'db>;
5107    type Green = BlockOrIfGreen<'db>;
5108    fn missing(db: &'db dyn Database) -> Self::Green {
5109        panic!("No missing variant.");
5110    }
5111    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5112        let kind = node.kind(db);
5113        match kind {
5114            SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5115            SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5116            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5117        }
5118    }
5119    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5120        let kind = node.kind(db);
5121        match kind {
5122            SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5123            SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5124            _ => None,
5125        }
5126    }
5127    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5128        match self {
5129            BlockOrIf::Block(x) => x.as_syntax_node(),
5130            BlockOrIf::If(x) => x.as_syntax_node(),
5131        }
5132    }
5133    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5134        BlockOrIfPtr(self.as_syntax_node().stable_ptr(db))
5135    }
5136}
5137impl<'db> BlockOrIf<'db> {
5138    /// Checks if a kind of a variant of [BlockOrIf].
5139    pub fn is_variant(kind: SyntaxKind) -> bool {
5140        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5141    }
5142}
5143#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5144pub struct ExprLoop<'db> {
5145    node: SyntaxNode<'db>,
5146}
5147impl<'db> ExprLoop<'db> {
5148    pub const INDEX_LOOP_KW: usize = 0;
5149    pub const INDEX_BODY: usize = 1;
5150    pub fn new_green(
5151        db: &'db dyn Database,
5152        loop_kw: TerminalLoopGreen<'db>,
5153        body: ExprBlockGreen<'db>,
5154    ) -> ExprLoopGreen<'db> {
5155        let children = [loop_kw.0, body.0];
5156        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5157        ExprLoopGreen(
5158            GreenNode {
5159                kind: SyntaxKind::ExprLoop,
5160                details: GreenNodeDetails::Node { children: children.into(), width },
5161            }
5162            .intern(db),
5163        )
5164    }
5165}
5166impl<'db> ExprLoop<'db> {
5167    pub fn loop_kw(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
5168        TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5169    }
5170    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5171        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5172    }
5173}
5174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5175pub struct ExprLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
5176impl<'db> ExprLoopPtr<'db> {}
5177impl<'db> TypedStablePtr<'db> for ExprLoopPtr<'db> {
5178    type SyntaxNode = ExprLoop<'db>;
5179    fn untyped(self) -> SyntaxStablePtrId<'db> {
5180        self.0
5181    }
5182    fn lookup(&self, db: &'db dyn Database) -> ExprLoop<'db> {
5183        ExprLoop::from_syntax_node(db, self.0.lookup(db))
5184    }
5185}
5186impl<'db> From<ExprLoopPtr<'db>> for SyntaxStablePtrId<'db> {
5187    fn from(ptr: ExprLoopPtr<'db>) -> Self {
5188        ptr.untyped()
5189    }
5190}
5191#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5192pub struct ExprLoopGreen<'db>(pub GreenId<'db>);
5193impl<'db> TypedSyntaxNode<'db> for ExprLoop<'db> {
5194    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5195    type StablePtr = ExprLoopPtr<'db>;
5196    type Green = ExprLoopGreen<'db>;
5197    fn missing(db: &'db dyn Database) -> Self::Green {
5198        ExprLoopGreen(
5199            GreenNode {
5200                kind: SyntaxKind::ExprLoop,
5201                details: GreenNodeDetails::Node {
5202                    children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5203                    width: TextWidth::default(),
5204                },
5205            }
5206            .intern(db),
5207        )
5208    }
5209    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5210        let kind = node.kind(db);
5211        assert_eq!(
5212            kind,
5213            SyntaxKind::ExprLoop,
5214            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5215            kind,
5216            SyntaxKind::ExprLoop
5217        );
5218        Self { node }
5219    }
5220    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5221        let kind = node.kind(db);
5222        if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5223    }
5224    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5225        self.node
5226    }
5227    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5228        ExprLoopPtr(self.node.stable_ptr(db))
5229    }
5230}
5231#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5232pub struct ExprWhile<'db> {
5233    node: SyntaxNode<'db>,
5234}
5235impl<'db> ExprWhile<'db> {
5236    pub const INDEX_WHILE_KW: usize = 0;
5237    pub const INDEX_CONDITIONS: usize = 1;
5238    pub const INDEX_BODY: usize = 2;
5239    pub fn new_green(
5240        db: &'db dyn Database,
5241        while_kw: TerminalWhileGreen<'db>,
5242        conditions: ConditionListAndGreen<'db>,
5243        body: ExprBlockGreen<'db>,
5244    ) -> ExprWhileGreen<'db> {
5245        let children = [while_kw.0, conditions.0, body.0];
5246        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5247        ExprWhileGreen(
5248            GreenNode {
5249                kind: SyntaxKind::ExprWhile,
5250                details: GreenNodeDetails::Node { children: children.into(), width },
5251            }
5252            .intern(db),
5253        )
5254    }
5255}
5256impl<'db> ExprWhile<'db> {
5257    pub fn while_kw(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
5258        TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5259    }
5260    pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
5261        ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5262    }
5263    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5264        ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5265    }
5266}
5267#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5268pub struct ExprWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
5269impl<'db> ExprWhilePtr<'db> {}
5270impl<'db> TypedStablePtr<'db> for ExprWhilePtr<'db> {
5271    type SyntaxNode = ExprWhile<'db>;
5272    fn untyped(self) -> SyntaxStablePtrId<'db> {
5273        self.0
5274    }
5275    fn lookup(&self, db: &'db dyn Database) -> ExprWhile<'db> {
5276        ExprWhile::from_syntax_node(db, self.0.lookup(db))
5277    }
5278}
5279impl<'db> From<ExprWhilePtr<'db>> for SyntaxStablePtrId<'db> {
5280    fn from(ptr: ExprWhilePtr<'db>) -> Self {
5281        ptr.untyped()
5282    }
5283}
5284#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5285pub struct ExprWhileGreen<'db>(pub GreenId<'db>);
5286impl<'db> TypedSyntaxNode<'db> for ExprWhile<'db> {
5287    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5288    type StablePtr = ExprWhilePtr<'db>;
5289    type Green = ExprWhileGreen<'db>;
5290    fn missing(db: &'db dyn Database) -> Self::Green {
5291        ExprWhileGreen(
5292            GreenNode {
5293                kind: SyntaxKind::ExprWhile,
5294                details: GreenNodeDetails::Node {
5295                    children: [
5296                        TerminalWhile::missing(db).0,
5297                        ConditionListAnd::missing(db).0,
5298                        ExprBlock::missing(db).0,
5299                    ]
5300                    .into(),
5301                    width: TextWidth::default(),
5302                },
5303            }
5304            .intern(db),
5305        )
5306    }
5307    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5308        let kind = node.kind(db);
5309        assert_eq!(
5310            kind,
5311            SyntaxKind::ExprWhile,
5312            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5313            kind,
5314            SyntaxKind::ExprWhile
5315        );
5316        Self { node }
5317    }
5318    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5319        let kind = node.kind(db);
5320        if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5321    }
5322    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5323        self.node
5324    }
5325    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5326        ExprWhilePtr(self.node.stable_ptr(db))
5327    }
5328}
5329#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5330pub struct ExprFor<'db> {
5331    node: SyntaxNode<'db>,
5332}
5333impl<'db> ExprFor<'db> {
5334    pub const INDEX_FOR_KW: usize = 0;
5335    pub const INDEX_PATTERN: usize = 1;
5336    pub const INDEX_IDENTIFIER: usize = 2;
5337    pub const INDEX_EXPR: usize = 3;
5338    pub const INDEX_BODY: usize = 4;
5339    pub fn new_green(
5340        db: &'db dyn Database,
5341        for_kw: TerminalForGreen<'db>,
5342        pattern: PatternGreen<'db>,
5343        identifier: TerminalIdentifierGreen<'db>,
5344        expr: ExprGreen<'db>,
5345        body: ExprBlockGreen<'db>,
5346    ) -> ExprForGreen<'db> {
5347        let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5348        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5349        ExprForGreen(
5350            GreenNode {
5351                kind: SyntaxKind::ExprFor,
5352                details: GreenNodeDetails::Node { children: children.into(), width },
5353            }
5354            .intern(db),
5355        )
5356    }
5357}
5358impl<'db> ExprFor<'db> {
5359    pub fn for_kw(&self, db: &'db dyn Database) -> TerminalFor<'db> {
5360        TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5361    }
5362    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
5363        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5364    }
5365    pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
5366        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5367    }
5368    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5369        Expr::from_syntax_node(db, self.node.get_children(db)[3])
5370    }
5371    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5372        ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5373    }
5374}
5375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5376pub struct ExprForPtr<'db>(pub SyntaxStablePtrId<'db>);
5377impl<'db> ExprForPtr<'db> {
5378    pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
5379        PatternGreen(self.0.0.key_fields(db)[0])
5380    }
5381    pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
5382        TerminalIdentifierGreen(self.0.0.key_fields(db)[1])
5383    }
5384}
5385impl<'db> TypedStablePtr<'db> for ExprForPtr<'db> {
5386    type SyntaxNode = ExprFor<'db>;
5387    fn untyped(self) -> SyntaxStablePtrId<'db> {
5388        self.0
5389    }
5390    fn lookup(&self, db: &'db dyn Database) -> ExprFor<'db> {
5391        ExprFor::from_syntax_node(db, self.0.lookup(db))
5392    }
5393}
5394impl<'db> From<ExprForPtr<'db>> for SyntaxStablePtrId<'db> {
5395    fn from(ptr: ExprForPtr<'db>) -> Self {
5396        ptr.untyped()
5397    }
5398}
5399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5400pub struct ExprForGreen<'db>(pub GreenId<'db>);
5401impl<'db> TypedSyntaxNode<'db> for ExprFor<'db> {
5402    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5403    type StablePtr = ExprForPtr<'db>;
5404    type Green = ExprForGreen<'db>;
5405    fn missing(db: &'db dyn Database) -> Self::Green {
5406        ExprForGreen(
5407            GreenNode {
5408                kind: SyntaxKind::ExprFor,
5409                details: GreenNodeDetails::Node {
5410                    children: [
5411                        TerminalFor::missing(db).0,
5412                        Pattern::missing(db).0,
5413                        TerminalIdentifier::missing(db).0,
5414                        Expr::missing(db).0,
5415                        ExprBlock::missing(db).0,
5416                    ]
5417                    .into(),
5418                    width: TextWidth::default(),
5419                },
5420            }
5421            .intern(db),
5422        )
5423    }
5424    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5425        let kind = node.kind(db);
5426        assert_eq!(
5427            kind,
5428            SyntaxKind::ExprFor,
5429            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5430            kind,
5431            SyntaxKind::ExprFor
5432        );
5433        Self { node }
5434    }
5435    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5436        let kind = node.kind(db);
5437        if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5438    }
5439    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5440        self.node
5441    }
5442    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5443        ExprForPtr(self.node.stable_ptr(db))
5444    }
5445}
5446#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5447pub struct ElseClause<'db> {
5448    node: SyntaxNode<'db>,
5449}
5450impl<'db> ElseClause<'db> {
5451    pub const INDEX_ELSE_KW: usize = 0;
5452    pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5453    pub fn new_green(
5454        db: &'db dyn Database,
5455        else_kw: TerminalElseGreen<'db>,
5456        else_block_or_if: BlockOrIfGreen<'db>,
5457    ) -> ElseClauseGreen<'db> {
5458        let children = [else_kw.0, else_block_or_if.0];
5459        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5460        ElseClauseGreen(
5461            GreenNode {
5462                kind: SyntaxKind::ElseClause,
5463                details: GreenNodeDetails::Node { children: children.into(), width },
5464            }
5465            .intern(db),
5466        )
5467    }
5468}
5469impl<'db> ElseClause<'db> {
5470    pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
5471        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5472    }
5473    pub fn else_block_or_if(&self, db: &'db dyn Database) -> BlockOrIf<'db> {
5474        BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5475    }
5476}
5477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5478pub struct ElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5479impl<'db> ElseClausePtr<'db> {}
5480impl<'db> TypedStablePtr<'db> for ElseClausePtr<'db> {
5481    type SyntaxNode = ElseClause<'db>;
5482    fn untyped(self) -> SyntaxStablePtrId<'db> {
5483        self.0
5484    }
5485    fn lookup(&self, db: &'db dyn Database) -> ElseClause<'db> {
5486        ElseClause::from_syntax_node(db, self.0.lookup(db))
5487    }
5488}
5489impl<'db> From<ElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5490    fn from(ptr: ElseClausePtr<'db>) -> Self {
5491        ptr.untyped()
5492    }
5493}
5494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5495pub struct ElseClauseGreen<'db>(pub GreenId<'db>);
5496impl<'db> TypedSyntaxNode<'db> for ElseClause<'db> {
5497    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5498    type StablePtr = ElseClausePtr<'db>;
5499    type Green = ElseClauseGreen<'db>;
5500    fn missing(db: &'db dyn Database) -> Self::Green {
5501        ElseClauseGreen(
5502            GreenNode {
5503                kind: SyntaxKind::ElseClause,
5504                details: GreenNodeDetails::Node {
5505                    children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5506                    width: TextWidth::default(),
5507                },
5508            }
5509            .intern(db),
5510        )
5511    }
5512    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5513        let kind = node.kind(db);
5514        assert_eq!(
5515            kind,
5516            SyntaxKind::ElseClause,
5517            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5518            kind,
5519            SyntaxKind::ElseClause
5520        );
5521        Self { node }
5522    }
5523    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5524        let kind = node.kind(db);
5525        if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5526    }
5527    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5528        self.node
5529    }
5530    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5531        ElseClausePtr(self.node.stable_ptr(db))
5532    }
5533}
5534#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5535pub enum OptionElseClause<'db> {
5536    Empty(OptionElseClauseEmpty<'db>),
5537    ElseClause(ElseClause<'db>),
5538}
5539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5540pub struct OptionElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5541impl<'db> TypedStablePtr<'db> for OptionElseClausePtr<'db> {
5542    type SyntaxNode = OptionElseClause<'db>;
5543    fn untyped(self) -> SyntaxStablePtrId<'db> {
5544        self.0
5545    }
5546    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5547        OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5548    }
5549}
5550impl<'db> From<OptionElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5551    fn from(ptr: OptionElseClausePtr<'db>) -> Self {
5552        ptr.untyped()
5553    }
5554}
5555impl<'db> From<OptionElseClauseEmptyPtr<'db>> for OptionElseClausePtr<'db> {
5556    fn from(value: OptionElseClauseEmptyPtr<'db>) -> Self {
5557        Self(value.0)
5558    }
5559}
5560impl<'db> From<ElseClausePtr<'db>> for OptionElseClausePtr<'db> {
5561    fn from(value: ElseClausePtr<'db>) -> Self {
5562        Self(value.0)
5563    }
5564}
5565impl<'db> From<OptionElseClauseEmptyGreen<'db>> for OptionElseClauseGreen<'db> {
5566    fn from(value: OptionElseClauseEmptyGreen<'db>) -> Self {
5567        Self(value.0)
5568    }
5569}
5570impl<'db> From<ElseClauseGreen<'db>> for OptionElseClauseGreen<'db> {
5571    fn from(value: ElseClauseGreen<'db>) -> Self {
5572        Self(value.0)
5573    }
5574}
5575#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5576pub struct OptionElseClauseGreen<'db>(pub GreenId<'db>);
5577impl<'db> TypedSyntaxNode<'db> for OptionElseClause<'db> {
5578    const OPTIONAL_KIND: Option<SyntaxKind> = None;
5579    type StablePtr = OptionElseClausePtr<'db>;
5580    type Green = OptionElseClauseGreen<'db>;
5581    fn missing(db: &'db dyn Database) -> Self::Green {
5582        panic!("No missing variant.");
5583    }
5584    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5585        let kind = node.kind(db);
5586        match kind {
5587            SyntaxKind::OptionElseClauseEmpty => {
5588                OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5589            }
5590            SyntaxKind::ElseClause => {
5591                OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5592            }
5593            _ => panic!(
5594                "Unexpected syntax kind {:?} when constructing {}.",
5595                kind, "OptionElseClause"
5596            ),
5597        }
5598    }
5599    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5600        let kind = node.kind(db);
5601        match kind {
5602            SyntaxKind::OptionElseClauseEmpty => {
5603                Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5604            }
5605            SyntaxKind::ElseClause => {
5606                Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5607            }
5608            _ => None,
5609        }
5610    }
5611    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5612        match self {
5613            OptionElseClause::Empty(x) => x.as_syntax_node(),
5614            OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5615        }
5616    }
5617    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5618        OptionElseClausePtr(self.as_syntax_node().stable_ptr(db))
5619    }
5620}
5621impl<'db> OptionElseClause<'db> {
5622    /// Checks if a kind of a variant of [OptionElseClause].
5623    pub fn is_variant(kind: SyntaxKind) -> bool {
5624        matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5625    }
5626}
5627#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5628pub struct OptionElseClauseEmpty<'db> {
5629    node: SyntaxNode<'db>,
5630}
5631impl<'db> OptionElseClauseEmpty<'db> {
5632    pub fn new_green(db: &'db dyn Database) -> OptionElseClauseEmptyGreen<'db> {
5633        let children = [];
5634        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5635        OptionElseClauseEmptyGreen(
5636            GreenNode {
5637                kind: SyntaxKind::OptionElseClauseEmpty,
5638                details: GreenNodeDetails::Node { children: children.into(), width },
5639            }
5640            .intern(db),
5641        )
5642    }
5643}
5644impl<'db> OptionElseClauseEmpty<'db> {}
5645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5646pub struct OptionElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
5647impl<'db> OptionElseClauseEmptyPtr<'db> {}
5648impl<'db> TypedStablePtr<'db> for OptionElseClauseEmptyPtr<'db> {
5649    type SyntaxNode = OptionElseClauseEmpty<'db>;
5650    fn untyped(self) -> SyntaxStablePtrId<'db> {
5651        self.0
5652    }
5653    fn lookup(&self, db: &'db dyn Database) -> OptionElseClauseEmpty<'db> {
5654        OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5655    }
5656}
5657impl<'db> From<OptionElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
5658    fn from(ptr: OptionElseClauseEmptyPtr<'db>) -> Self {
5659        ptr.untyped()
5660    }
5661}
5662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5663pub struct OptionElseClauseEmptyGreen<'db>(pub GreenId<'db>);
5664impl<'db> TypedSyntaxNode<'db> for OptionElseClauseEmpty<'db> {
5665    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5666    type StablePtr = OptionElseClauseEmptyPtr<'db>;
5667    type Green = OptionElseClauseEmptyGreen<'db>;
5668    fn missing(db: &'db dyn Database) -> Self::Green {
5669        OptionElseClauseEmptyGreen(
5670            GreenNode {
5671                kind: SyntaxKind::OptionElseClauseEmpty,
5672                details: GreenNodeDetails::Node {
5673                    children: [].into(),
5674                    width: TextWidth::default(),
5675                },
5676            }
5677            .intern(db),
5678        )
5679    }
5680    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5681        let kind = node.kind(db);
5682        assert_eq!(
5683            kind,
5684            SyntaxKind::OptionElseClauseEmpty,
5685            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5686            kind,
5687            SyntaxKind::OptionElseClauseEmpty
5688        );
5689        Self { node }
5690    }
5691    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5692        let kind = node.kind(db);
5693        if kind == SyntaxKind::OptionElseClauseEmpty {
5694            Some(Self::from_syntax_node(db, node))
5695        } else {
5696            None
5697        }
5698    }
5699    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5700        self.node
5701    }
5702    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5703        OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5704    }
5705}
5706#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5707pub struct ExprErrorPropagate<'db> {
5708    node: SyntaxNode<'db>,
5709}
5710impl<'db> ExprErrorPropagate<'db> {
5711    pub const INDEX_EXPR: usize = 0;
5712    pub const INDEX_OP: usize = 1;
5713    pub fn new_green(
5714        db: &'db dyn Database,
5715        expr: ExprGreen<'db>,
5716        op: TerminalQuestionMarkGreen<'db>,
5717    ) -> ExprErrorPropagateGreen<'db> {
5718        let children = [expr.0, op.0];
5719        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5720        ExprErrorPropagateGreen(
5721            GreenNode {
5722                kind: SyntaxKind::ExprErrorPropagate,
5723                details: GreenNodeDetails::Node { children: children.into(), width },
5724            }
5725            .intern(db),
5726        )
5727    }
5728}
5729impl<'db> ExprErrorPropagate<'db> {
5730    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5731        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5732    }
5733    pub fn op(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
5734        TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5735    }
5736}
5737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5738pub struct ExprErrorPropagatePtr<'db>(pub SyntaxStablePtrId<'db>);
5739impl<'db> ExprErrorPropagatePtr<'db> {}
5740impl<'db> TypedStablePtr<'db> for ExprErrorPropagatePtr<'db> {
5741    type SyntaxNode = ExprErrorPropagate<'db>;
5742    fn untyped(self) -> SyntaxStablePtrId<'db> {
5743        self.0
5744    }
5745    fn lookup(&self, db: &'db dyn Database) -> ExprErrorPropagate<'db> {
5746        ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5747    }
5748}
5749impl<'db> From<ExprErrorPropagatePtr<'db>> for SyntaxStablePtrId<'db> {
5750    fn from(ptr: ExprErrorPropagatePtr<'db>) -> Self {
5751        ptr.untyped()
5752    }
5753}
5754#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5755pub struct ExprErrorPropagateGreen<'db>(pub GreenId<'db>);
5756impl<'db> TypedSyntaxNode<'db> for ExprErrorPropagate<'db> {
5757    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5758    type StablePtr = ExprErrorPropagatePtr<'db>;
5759    type Green = ExprErrorPropagateGreen<'db>;
5760    fn missing(db: &'db dyn Database) -> Self::Green {
5761        ExprErrorPropagateGreen(
5762            GreenNode {
5763                kind: SyntaxKind::ExprErrorPropagate,
5764                details: GreenNodeDetails::Node {
5765                    children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5766                    width: TextWidth::default(),
5767                },
5768            }
5769            .intern(db),
5770        )
5771    }
5772    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5773        let kind = node.kind(db);
5774        assert_eq!(
5775            kind,
5776            SyntaxKind::ExprErrorPropagate,
5777            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5778            kind,
5779            SyntaxKind::ExprErrorPropagate
5780        );
5781        Self { node }
5782    }
5783    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5784        let kind = node.kind(db);
5785        if kind == SyntaxKind::ExprErrorPropagate {
5786            Some(Self::from_syntax_node(db, node))
5787        } else {
5788            None
5789        }
5790    }
5791    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5792        self.node
5793    }
5794    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5795        ExprErrorPropagatePtr(self.node.stable_ptr(db))
5796    }
5797}
5798#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5799pub struct ExprIndexed<'db> {
5800    node: SyntaxNode<'db>,
5801}
5802impl<'db> ExprIndexed<'db> {
5803    pub const INDEX_EXPR: usize = 0;
5804    pub const INDEX_LBRACK: usize = 1;
5805    pub const INDEX_INDEX_EXPR: usize = 2;
5806    pub const INDEX_RBRACK: usize = 3;
5807    pub fn new_green(
5808        db: &'db dyn Database,
5809        expr: ExprGreen<'db>,
5810        lbrack: TerminalLBrackGreen<'db>,
5811        index_expr: ExprGreen<'db>,
5812        rbrack: TerminalRBrackGreen<'db>,
5813    ) -> ExprIndexedGreen<'db> {
5814        let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5815        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5816        ExprIndexedGreen(
5817            GreenNode {
5818                kind: SyntaxKind::ExprIndexed,
5819                details: GreenNodeDetails::Node { children: children.into(), width },
5820            }
5821            .intern(db),
5822        )
5823    }
5824}
5825impl<'db> ExprIndexed<'db> {
5826    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5827        Expr::from_syntax_node(db, self.node.get_children(db)[0])
5828    }
5829    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5830        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5831    }
5832    pub fn index_expr(&self, db: &'db dyn Database) -> Expr<'db> {
5833        Expr::from_syntax_node(db, self.node.get_children(db)[2])
5834    }
5835    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5836        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5837    }
5838}
5839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5840pub struct ExprIndexedPtr<'db>(pub SyntaxStablePtrId<'db>);
5841impl<'db> ExprIndexedPtr<'db> {}
5842impl<'db> TypedStablePtr<'db> for ExprIndexedPtr<'db> {
5843    type SyntaxNode = ExprIndexed<'db>;
5844    fn untyped(self) -> SyntaxStablePtrId<'db> {
5845        self.0
5846    }
5847    fn lookup(&self, db: &'db dyn Database) -> ExprIndexed<'db> {
5848        ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5849    }
5850}
5851impl<'db> From<ExprIndexedPtr<'db>> for SyntaxStablePtrId<'db> {
5852    fn from(ptr: ExprIndexedPtr<'db>) -> Self {
5853        ptr.untyped()
5854    }
5855}
5856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5857pub struct ExprIndexedGreen<'db>(pub GreenId<'db>);
5858impl<'db> TypedSyntaxNode<'db> for ExprIndexed<'db> {
5859    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5860    type StablePtr = ExprIndexedPtr<'db>;
5861    type Green = ExprIndexedGreen<'db>;
5862    fn missing(db: &'db dyn Database) -> Self::Green {
5863        ExprIndexedGreen(
5864            GreenNode {
5865                kind: SyntaxKind::ExprIndexed,
5866                details: GreenNodeDetails::Node {
5867                    children: [
5868                        Expr::missing(db).0,
5869                        TerminalLBrack::missing(db).0,
5870                        Expr::missing(db).0,
5871                        TerminalRBrack::missing(db).0,
5872                    ]
5873                    .into(),
5874                    width: TextWidth::default(),
5875                },
5876            }
5877            .intern(db),
5878        )
5879    }
5880    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5881        let kind = node.kind(db);
5882        assert_eq!(
5883            kind,
5884            SyntaxKind::ExprIndexed,
5885            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5886            kind,
5887            SyntaxKind::ExprIndexed
5888        );
5889        Self { node }
5890    }
5891    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5892        let kind = node.kind(db);
5893        if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5894    }
5895    fn as_syntax_node(&self) -> SyntaxNode<'db> {
5896        self.node
5897    }
5898    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5899        ExprIndexedPtr(self.node.stable_ptr(db))
5900    }
5901}
5902#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5903pub struct ExprFixedSizeArray<'db> {
5904    node: SyntaxNode<'db>,
5905}
5906impl<'db> ExprFixedSizeArray<'db> {
5907    pub const INDEX_LBRACK: usize = 0;
5908    pub const INDEX_EXPRS: usize = 1;
5909    pub const INDEX_SIZE: usize = 2;
5910    pub const INDEX_RBRACK: usize = 3;
5911    pub fn new_green(
5912        db: &'db dyn Database,
5913        lbrack: TerminalLBrackGreen<'db>,
5914        exprs: ExprListGreen<'db>,
5915        size: OptionFixedSizeArraySizeGreen<'db>,
5916        rbrack: TerminalRBrackGreen<'db>,
5917    ) -> ExprFixedSizeArrayGreen<'db> {
5918        let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5919        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5920        ExprFixedSizeArrayGreen(
5921            GreenNode {
5922                kind: SyntaxKind::ExprFixedSizeArray,
5923                details: GreenNodeDetails::Node { children: children.into(), width },
5924            }
5925            .intern(db),
5926        )
5927    }
5928}
5929impl<'db> ExprFixedSizeArray<'db> {
5930    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5931        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5932    }
5933    pub fn exprs(&self, db: &'db dyn Database) -> ExprList<'db> {
5934        ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5935    }
5936    pub fn size(&self, db: &'db dyn Database) -> OptionFixedSizeArraySize<'db> {
5937        OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5938    }
5939    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5940        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5941    }
5942}
5943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
5944pub struct ExprFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
5945impl<'db> ExprFixedSizeArrayPtr<'db> {}
5946impl<'db> TypedStablePtr<'db> for ExprFixedSizeArrayPtr<'db> {
5947    type SyntaxNode = ExprFixedSizeArray<'db>;
5948    fn untyped(self) -> SyntaxStablePtrId<'db> {
5949        self.0
5950    }
5951    fn lookup(&self, db: &'db dyn Database) -> ExprFixedSizeArray<'db> {
5952        ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5953    }
5954}
5955impl<'db> From<ExprFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
5956    fn from(ptr: ExprFixedSizeArrayPtr<'db>) -> Self {
5957        ptr.untyped()
5958    }
5959}
5960#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5961pub struct ExprFixedSizeArrayGreen<'db>(pub GreenId<'db>);
5962impl<'db> TypedSyntaxNode<'db> for ExprFixedSizeArray<'db> {
5963    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5964    type StablePtr = ExprFixedSizeArrayPtr<'db>;
5965    type Green = ExprFixedSizeArrayGreen<'db>;
5966    fn missing(db: &'db dyn Database) -> Self::Green {
5967        ExprFixedSizeArrayGreen(
5968            GreenNode {
5969                kind: SyntaxKind::ExprFixedSizeArray,
5970                details: GreenNodeDetails::Node {
5971                    children: [
5972                        TerminalLBrack::missing(db).0,
5973                        ExprList::missing(db).0,
5974                        OptionFixedSizeArraySize::missing(db).0,
5975                        TerminalRBrack::missing(db).0,
5976                    ]
5977                    .into(),
5978                    width: TextWidth::default(),
5979                },
5980            }
5981            .intern(db),
5982        )
5983    }
5984    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5985        let kind = node.kind(db);
5986        assert_eq!(
5987            kind,
5988            SyntaxKind::ExprFixedSizeArray,
5989            "Unexpected SyntaxKind {:?}. Expected {:?}.",
5990            kind,
5991            SyntaxKind::ExprFixedSizeArray
5992        );
5993        Self { node }
5994    }
5995    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5996        let kind = node.kind(db);
5997        if kind == SyntaxKind::ExprFixedSizeArray {
5998            Some(Self::from_syntax_node(db, node))
5999        } else {
6000            None
6001        }
6002    }
6003    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6004        self.node
6005    }
6006    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6007        ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
6008    }
6009}
6010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6011pub struct FixedSizeArraySize<'db> {
6012    node: SyntaxNode<'db>,
6013}
6014impl<'db> FixedSizeArraySize<'db> {
6015    pub const INDEX_SEMICOLON: usize = 0;
6016    pub const INDEX_SIZE: usize = 1;
6017    pub fn new_green(
6018        db: &'db dyn Database,
6019        semicolon: TerminalSemicolonGreen<'db>,
6020        size: ExprGreen<'db>,
6021    ) -> FixedSizeArraySizeGreen<'db> {
6022        let children = [semicolon.0, size.0];
6023        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6024        FixedSizeArraySizeGreen(
6025            GreenNode {
6026                kind: SyntaxKind::FixedSizeArraySize,
6027                details: GreenNodeDetails::Node { children: children.into(), width },
6028            }
6029            .intern(db),
6030        )
6031    }
6032}
6033impl<'db> FixedSizeArraySize<'db> {
6034    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
6035        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6036    }
6037    pub fn size(&self, db: &'db dyn Database) -> Expr<'db> {
6038        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6039    }
6040}
6041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6042pub struct FixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6043impl<'db> FixedSizeArraySizePtr<'db> {}
6044impl<'db> TypedStablePtr<'db> for FixedSizeArraySizePtr<'db> {
6045    type SyntaxNode = FixedSizeArraySize<'db>;
6046    fn untyped(self) -> SyntaxStablePtrId<'db> {
6047        self.0
6048    }
6049    fn lookup(&self, db: &'db dyn Database) -> FixedSizeArraySize<'db> {
6050        FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6051    }
6052}
6053impl<'db> From<FixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6054    fn from(ptr: FixedSizeArraySizePtr<'db>) -> Self {
6055        ptr.untyped()
6056    }
6057}
6058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6059pub struct FixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6060impl<'db> TypedSyntaxNode<'db> for FixedSizeArraySize<'db> {
6061    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6062    type StablePtr = FixedSizeArraySizePtr<'db>;
6063    type Green = FixedSizeArraySizeGreen<'db>;
6064    fn missing(db: &'db dyn Database) -> Self::Green {
6065        FixedSizeArraySizeGreen(
6066            GreenNode {
6067                kind: SyntaxKind::FixedSizeArraySize,
6068                details: GreenNodeDetails::Node {
6069                    children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6070                    width: TextWidth::default(),
6071                },
6072            }
6073            .intern(db),
6074        )
6075    }
6076    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6077        let kind = node.kind(db);
6078        assert_eq!(
6079            kind,
6080            SyntaxKind::FixedSizeArraySize,
6081            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6082            kind,
6083            SyntaxKind::FixedSizeArraySize
6084        );
6085        Self { node }
6086    }
6087    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6088        let kind = node.kind(db);
6089        if kind == SyntaxKind::FixedSizeArraySize {
6090            Some(Self::from_syntax_node(db, node))
6091        } else {
6092            None
6093        }
6094    }
6095    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6096        self.node
6097    }
6098    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6099        FixedSizeArraySizePtr(self.node.stable_ptr(db))
6100    }
6101}
6102#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6103pub enum OptionFixedSizeArraySize<'db> {
6104    Empty(OptionFixedSizeArraySizeEmpty<'db>),
6105    FixedSizeArraySize(FixedSizeArraySize<'db>),
6106}
6107#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6108pub struct OptionFixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6109impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizePtr<'db> {
6110    type SyntaxNode = OptionFixedSizeArraySize<'db>;
6111    fn untyped(self) -> SyntaxStablePtrId<'db> {
6112        self.0
6113    }
6114    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6115        OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6116    }
6117}
6118impl<'db> From<OptionFixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6119    fn from(ptr: OptionFixedSizeArraySizePtr<'db>) -> Self {
6120        ptr.untyped()
6121    }
6122}
6123impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6124    fn from(value: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6125        Self(value.0)
6126    }
6127}
6128impl<'db> From<FixedSizeArraySizePtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6129    fn from(value: FixedSizeArraySizePtr<'db>) -> Self {
6130        Self(value.0)
6131    }
6132}
6133impl<'db> From<OptionFixedSizeArraySizeEmptyGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6134    fn from(value: OptionFixedSizeArraySizeEmptyGreen<'db>) -> Self {
6135        Self(value.0)
6136    }
6137}
6138impl<'db> From<FixedSizeArraySizeGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6139    fn from(value: FixedSizeArraySizeGreen<'db>) -> Self {
6140        Self(value.0)
6141    }
6142}
6143#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6144pub struct OptionFixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6145impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySize<'db> {
6146    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6147    type StablePtr = OptionFixedSizeArraySizePtr<'db>;
6148    type Green = OptionFixedSizeArraySizeGreen<'db>;
6149    fn missing(db: &'db dyn Database) -> Self::Green {
6150        panic!("No missing variant.");
6151    }
6152    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6153        let kind = node.kind(db);
6154        match kind {
6155            SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6156                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6157            ),
6158            SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6159                FixedSizeArraySize::from_syntax_node(db, node),
6160            ),
6161            _ => panic!(
6162                "Unexpected syntax kind {:?} when constructing {}.",
6163                kind, "OptionFixedSizeArraySize"
6164            ),
6165        }
6166    }
6167    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6168        let kind = node.kind(db);
6169        match kind {
6170            SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6171                OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6172            )),
6173            SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6174                FixedSizeArraySize::from_syntax_node(db, node),
6175            )),
6176            _ => None,
6177        }
6178    }
6179    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6180        match self {
6181            OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6182            OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6183        }
6184    }
6185    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6186        OptionFixedSizeArraySizePtr(self.as_syntax_node().stable_ptr(db))
6187    }
6188}
6189impl<'db> OptionFixedSizeArraySize<'db> {
6190    /// Checks if a kind of a variant of [OptionFixedSizeArraySize].
6191    pub fn is_variant(kind: SyntaxKind) -> bool {
6192        matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6193    }
6194}
6195#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6196pub struct OptionFixedSizeArraySizeEmpty<'db> {
6197    node: SyntaxNode<'db>,
6198}
6199impl<'db> OptionFixedSizeArraySizeEmpty<'db> {
6200    pub fn new_green(db: &'db dyn Database) -> OptionFixedSizeArraySizeEmptyGreen<'db> {
6201        let children = [];
6202        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6203        OptionFixedSizeArraySizeEmptyGreen(
6204            GreenNode {
6205                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6206                details: GreenNodeDetails::Node { children: children.into(), width },
6207            }
6208            .intern(db),
6209        )
6210    }
6211}
6212impl<'db> OptionFixedSizeArraySizeEmpty<'db> {}
6213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6214pub struct OptionFixedSizeArraySizeEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6215impl<'db> OptionFixedSizeArraySizeEmptyPtr<'db> {}
6216impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizeEmptyPtr<'db> {
6217    type SyntaxNode = OptionFixedSizeArraySizeEmpty<'db>;
6218    fn untyped(self) -> SyntaxStablePtrId<'db> {
6219        self.0
6220    }
6221    fn lookup(&self, db: &'db dyn Database) -> OptionFixedSizeArraySizeEmpty<'db> {
6222        OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6223    }
6224}
6225impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6226    fn from(ptr: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6227        ptr.untyped()
6228    }
6229}
6230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6231pub struct OptionFixedSizeArraySizeEmptyGreen<'db>(pub GreenId<'db>);
6232impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySizeEmpty<'db> {
6233    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6234    type StablePtr = OptionFixedSizeArraySizeEmptyPtr<'db>;
6235    type Green = OptionFixedSizeArraySizeEmptyGreen<'db>;
6236    fn missing(db: &'db dyn Database) -> Self::Green {
6237        OptionFixedSizeArraySizeEmptyGreen(
6238            GreenNode {
6239                kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6240                details: GreenNodeDetails::Node {
6241                    children: [].into(),
6242                    width: TextWidth::default(),
6243                },
6244            }
6245            .intern(db),
6246        )
6247    }
6248    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6249        let kind = node.kind(db);
6250        assert_eq!(
6251            kind,
6252            SyntaxKind::OptionFixedSizeArraySizeEmpty,
6253            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6254            kind,
6255            SyntaxKind::OptionFixedSizeArraySizeEmpty
6256        );
6257        Self { node }
6258    }
6259    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6260        let kind = node.kind(db);
6261        if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6262            Some(Self::from_syntax_node(db, node))
6263        } else {
6264            None
6265        }
6266    }
6267    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6268        self.node
6269    }
6270    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6271        OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6272    }
6273}
6274#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6275pub struct ExprClosure<'db> {
6276    node: SyntaxNode<'db>,
6277}
6278impl<'db> ExprClosure<'db> {
6279    pub const INDEX_PARAMS: usize = 0;
6280    pub const INDEX_RET_TY: usize = 1;
6281    pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6282    pub const INDEX_EXPR: usize = 3;
6283    pub fn new_green(
6284        db: &'db dyn Database,
6285        params: ClosureParamsGreen<'db>,
6286        ret_ty: OptionReturnTypeClauseGreen<'db>,
6287        optional_no_panic: OptionTerminalNoPanicGreen<'db>,
6288        expr: ExprGreen<'db>,
6289    ) -> ExprClosureGreen<'db> {
6290        let children = [params.0, ret_ty.0, optional_no_panic.0, expr.0];
6291        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6292        ExprClosureGreen(
6293            GreenNode {
6294                kind: SyntaxKind::ExprClosure,
6295                details: GreenNodeDetails::Node { children: children.into(), width },
6296            }
6297            .intern(db),
6298        )
6299    }
6300}
6301impl<'db> ExprClosure<'db> {
6302    pub fn params(&self, db: &'db dyn Database) -> ClosureParams<'db> {
6303        ClosureParams::from_syntax_node(db, self.node.get_children(db)[0])
6304    }
6305    pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
6306        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6307    }
6308    pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
6309        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6310    }
6311    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6312        Expr::from_syntax_node(db, self.node.get_children(db)[3])
6313    }
6314}
6315#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6316pub struct ExprClosurePtr<'db>(pub SyntaxStablePtrId<'db>);
6317impl<'db> ExprClosurePtr<'db> {}
6318impl<'db> TypedStablePtr<'db> for ExprClosurePtr<'db> {
6319    type SyntaxNode = ExprClosure<'db>;
6320    fn untyped(self) -> SyntaxStablePtrId<'db> {
6321        self.0
6322    }
6323    fn lookup(&self, db: &'db dyn Database) -> ExprClosure<'db> {
6324        ExprClosure::from_syntax_node(db, self.0.lookup(db))
6325    }
6326}
6327impl<'db> From<ExprClosurePtr<'db>> for SyntaxStablePtrId<'db> {
6328    fn from(ptr: ExprClosurePtr<'db>) -> Self {
6329        ptr.untyped()
6330    }
6331}
6332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6333pub struct ExprClosureGreen<'db>(pub GreenId<'db>);
6334impl<'db> TypedSyntaxNode<'db> for ExprClosure<'db> {
6335    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6336    type StablePtr = ExprClosurePtr<'db>;
6337    type Green = ExprClosureGreen<'db>;
6338    fn missing(db: &'db dyn Database) -> Self::Green {
6339        ExprClosureGreen(
6340            GreenNode {
6341                kind: SyntaxKind::ExprClosure,
6342                details: GreenNodeDetails::Node {
6343                    children: [
6344                        ClosureParams::missing(db).0,
6345                        OptionReturnTypeClause::missing(db).0,
6346                        OptionTerminalNoPanic::missing(db).0,
6347                        Expr::missing(db).0,
6348                    ]
6349                    .into(),
6350                    width: TextWidth::default(),
6351                },
6352            }
6353            .intern(db),
6354        )
6355    }
6356    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6357        let kind = node.kind(db);
6358        assert_eq!(
6359            kind,
6360            SyntaxKind::ExprClosure,
6361            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6362            kind,
6363            SyntaxKind::ExprClosure
6364        );
6365        Self { node }
6366    }
6367    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6368        let kind = node.kind(db);
6369        if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6370    }
6371    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6372        self.node
6373    }
6374    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6375        ExprClosurePtr(self.node.stable_ptr(db))
6376    }
6377}
6378#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6379pub struct ClosureParams<'db> {
6380    node: SyntaxNode<'db>,
6381}
6382impl<'db> ClosureParams<'db> {
6383    pub const INDEX_LEFTOR: usize = 0;
6384    pub const INDEX_PARAMS: usize = 1;
6385    pub const INDEX_RIGHTOR: usize = 2;
6386    pub fn new_green(
6387        db: &'db dyn Database,
6388        leftor: TerminalOrGreen<'db>,
6389        params: ParamListGreen<'db>,
6390        rightor: TerminalOrGreen<'db>,
6391    ) -> ClosureParamsGreen<'db> {
6392        let children = [leftor.0, params.0, rightor.0];
6393        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6394        ClosureParamsGreen(
6395            GreenNode {
6396                kind: SyntaxKind::ClosureParams,
6397                details: GreenNodeDetails::Node { children: children.into(), width },
6398            }
6399            .intern(db),
6400        )
6401    }
6402}
6403impl<'db> ClosureParams<'db> {
6404    pub fn leftor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6405        TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6406    }
6407    pub fn params(&self, db: &'db dyn Database) -> ParamList<'db> {
6408        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6409    }
6410    pub fn rightor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6411        TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6412    }
6413}
6414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6415pub struct ClosureParamsPtr<'db>(pub SyntaxStablePtrId<'db>);
6416impl<'db> ClosureParamsPtr<'db> {}
6417impl<'db> TypedStablePtr<'db> for ClosureParamsPtr<'db> {
6418    type SyntaxNode = ClosureParams<'db>;
6419    fn untyped(self) -> SyntaxStablePtrId<'db> {
6420        self.0
6421    }
6422    fn lookup(&self, db: &'db dyn Database) -> ClosureParams<'db> {
6423        ClosureParams::from_syntax_node(db, self.0.lookup(db))
6424    }
6425}
6426impl<'db> From<ClosureParamsPtr<'db>> for SyntaxStablePtrId<'db> {
6427    fn from(ptr: ClosureParamsPtr<'db>) -> Self {
6428        ptr.untyped()
6429    }
6430}
6431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6432pub struct ClosureParamsGreen<'db>(pub GreenId<'db>);
6433impl<'db> TypedSyntaxNode<'db> for ClosureParams<'db> {
6434    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParams);
6435    type StablePtr = ClosureParamsPtr<'db>;
6436    type Green = ClosureParamsGreen<'db>;
6437    fn missing(db: &'db dyn Database) -> Self::Green {
6438        ClosureParamsGreen(
6439            GreenNode {
6440                kind: SyntaxKind::ClosureParams,
6441                details: GreenNodeDetails::Node {
6442                    children: [
6443                        TerminalOr::missing(db).0,
6444                        ParamList::missing(db).0,
6445                        TerminalOr::missing(db).0,
6446                    ]
6447                    .into(),
6448                    width: TextWidth::default(),
6449                },
6450            }
6451            .intern(db),
6452        )
6453    }
6454    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6455        let kind = node.kind(db);
6456        assert_eq!(
6457            kind,
6458            SyntaxKind::ClosureParams,
6459            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6460            kind,
6461            SyntaxKind::ClosureParams
6462        );
6463        Self { node }
6464    }
6465    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6466        let kind = node.kind(db);
6467        if kind == SyntaxKind::ClosureParams {
6468            Some(Self::from_syntax_node(db, node))
6469        } else {
6470            None
6471        }
6472    }
6473    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6474        self.node
6475    }
6476    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6477        ClosureParamsPtr(self.node.stable_ptr(db))
6478    }
6479}
6480#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6481pub struct StructArgExpr<'db> {
6482    node: SyntaxNode<'db>,
6483}
6484impl<'db> StructArgExpr<'db> {
6485    pub const INDEX_COLON: usize = 0;
6486    pub const INDEX_EXPR: usize = 1;
6487    pub fn new_green(
6488        db: &'db dyn Database,
6489        colon: TerminalColonGreen<'db>,
6490        expr: ExprGreen<'db>,
6491    ) -> StructArgExprGreen<'db> {
6492        let children = [colon.0, expr.0];
6493        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6494        StructArgExprGreen(
6495            GreenNode {
6496                kind: SyntaxKind::StructArgExpr,
6497                details: GreenNodeDetails::Node { children: children.into(), width },
6498            }
6499            .intern(db),
6500        )
6501    }
6502}
6503impl<'db> StructArgExpr<'db> {
6504    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
6505        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6506    }
6507    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6508        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6509    }
6510}
6511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6512pub struct StructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6513impl<'db> StructArgExprPtr<'db> {}
6514impl<'db> TypedStablePtr<'db> for StructArgExprPtr<'db> {
6515    type SyntaxNode = StructArgExpr<'db>;
6516    fn untyped(self) -> SyntaxStablePtrId<'db> {
6517        self.0
6518    }
6519    fn lookup(&self, db: &'db dyn Database) -> StructArgExpr<'db> {
6520        StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6521    }
6522}
6523impl<'db> From<StructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6524    fn from(ptr: StructArgExprPtr<'db>) -> Self {
6525        ptr.untyped()
6526    }
6527}
6528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6529pub struct StructArgExprGreen<'db>(pub GreenId<'db>);
6530impl<'db> TypedSyntaxNode<'db> for StructArgExpr<'db> {
6531    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6532    type StablePtr = StructArgExprPtr<'db>;
6533    type Green = StructArgExprGreen<'db>;
6534    fn missing(db: &'db dyn Database) -> Self::Green {
6535        StructArgExprGreen(
6536            GreenNode {
6537                kind: SyntaxKind::StructArgExpr,
6538                details: GreenNodeDetails::Node {
6539                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6540                    width: TextWidth::default(),
6541                },
6542            }
6543            .intern(db),
6544        )
6545    }
6546    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6547        let kind = node.kind(db);
6548        assert_eq!(
6549            kind,
6550            SyntaxKind::StructArgExpr,
6551            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6552            kind,
6553            SyntaxKind::StructArgExpr
6554        );
6555        Self { node }
6556    }
6557    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6558        let kind = node.kind(db);
6559        if kind == SyntaxKind::StructArgExpr {
6560            Some(Self::from_syntax_node(db, node))
6561        } else {
6562            None
6563        }
6564    }
6565    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6566        self.node
6567    }
6568    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6569        StructArgExprPtr(self.node.stable_ptr(db))
6570    }
6571}
6572#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6573pub enum OptionStructArgExpr<'db> {
6574    Empty(OptionStructArgExprEmpty<'db>),
6575    StructArgExpr(StructArgExpr<'db>),
6576}
6577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6578pub struct OptionStructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6579impl<'db> TypedStablePtr<'db> for OptionStructArgExprPtr<'db> {
6580    type SyntaxNode = OptionStructArgExpr<'db>;
6581    fn untyped(self) -> SyntaxStablePtrId<'db> {
6582        self.0
6583    }
6584    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6585        OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6586    }
6587}
6588impl<'db> From<OptionStructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6589    fn from(ptr: OptionStructArgExprPtr<'db>) -> Self {
6590        ptr.untyped()
6591    }
6592}
6593impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for OptionStructArgExprPtr<'db> {
6594    fn from(value: OptionStructArgExprEmptyPtr<'db>) -> Self {
6595        Self(value.0)
6596    }
6597}
6598impl<'db> From<StructArgExprPtr<'db>> for OptionStructArgExprPtr<'db> {
6599    fn from(value: StructArgExprPtr<'db>) -> Self {
6600        Self(value.0)
6601    }
6602}
6603impl<'db> From<OptionStructArgExprEmptyGreen<'db>> for OptionStructArgExprGreen<'db> {
6604    fn from(value: OptionStructArgExprEmptyGreen<'db>) -> Self {
6605        Self(value.0)
6606    }
6607}
6608impl<'db> From<StructArgExprGreen<'db>> for OptionStructArgExprGreen<'db> {
6609    fn from(value: StructArgExprGreen<'db>) -> Self {
6610        Self(value.0)
6611    }
6612}
6613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6614pub struct OptionStructArgExprGreen<'db>(pub GreenId<'db>);
6615impl<'db> TypedSyntaxNode<'db> for OptionStructArgExpr<'db> {
6616    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6617    type StablePtr = OptionStructArgExprPtr<'db>;
6618    type Green = OptionStructArgExprGreen<'db>;
6619    fn missing(db: &'db dyn Database) -> Self::Green {
6620        panic!("No missing variant.");
6621    }
6622    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6623        let kind = node.kind(db);
6624        match kind {
6625            SyntaxKind::OptionStructArgExprEmpty => {
6626                OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6627            }
6628            SyntaxKind::StructArgExpr => {
6629                OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6630            }
6631            _ => panic!(
6632                "Unexpected syntax kind {:?} when constructing {}.",
6633                kind, "OptionStructArgExpr"
6634            ),
6635        }
6636    }
6637    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6638        let kind = node.kind(db);
6639        match kind {
6640            SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6641                OptionStructArgExprEmpty::from_syntax_node(db, node),
6642            )),
6643            SyntaxKind::StructArgExpr => {
6644                Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6645            }
6646            _ => None,
6647        }
6648    }
6649    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6650        match self {
6651            OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6652            OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6653        }
6654    }
6655    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6656        OptionStructArgExprPtr(self.as_syntax_node().stable_ptr(db))
6657    }
6658}
6659impl<'db> OptionStructArgExpr<'db> {
6660    /// Checks if a kind of a variant of [OptionStructArgExpr].
6661    pub fn is_variant(kind: SyntaxKind) -> bool {
6662        matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6663    }
6664}
6665#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6666pub struct OptionStructArgExprEmpty<'db> {
6667    node: SyntaxNode<'db>,
6668}
6669impl<'db> OptionStructArgExprEmpty<'db> {
6670    pub fn new_green(db: &'db dyn Database) -> OptionStructArgExprEmptyGreen<'db> {
6671        let children = [];
6672        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6673        OptionStructArgExprEmptyGreen(
6674            GreenNode {
6675                kind: SyntaxKind::OptionStructArgExprEmpty,
6676                details: GreenNodeDetails::Node { children: children.into(), width },
6677            }
6678            .intern(db),
6679        )
6680    }
6681}
6682impl<'db> OptionStructArgExprEmpty<'db> {}
6683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6684pub struct OptionStructArgExprEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6685impl<'db> OptionStructArgExprEmptyPtr<'db> {}
6686impl<'db> TypedStablePtr<'db> for OptionStructArgExprEmptyPtr<'db> {
6687    type SyntaxNode = OptionStructArgExprEmpty<'db>;
6688    fn untyped(self) -> SyntaxStablePtrId<'db> {
6689        self.0
6690    }
6691    fn lookup(&self, db: &'db dyn Database) -> OptionStructArgExprEmpty<'db> {
6692        OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6693    }
6694}
6695impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6696    fn from(ptr: OptionStructArgExprEmptyPtr<'db>) -> Self {
6697        ptr.untyped()
6698    }
6699}
6700#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6701pub struct OptionStructArgExprEmptyGreen<'db>(pub GreenId<'db>);
6702impl<'db> TypedSyntaxNode<'db> for OptionStructArgExprEmpty<'db> {
6703    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6704    type StablePtr = OptionStructArgExprEmptyPtr<'db>;
6705    type Green = OptionStructArgExprEmptyGreen<'db>;
6706    fn missing(db: &'db dyn Database) -> Self::Green {
6707        OptionStructArgExprEmptyGreen(
6708            GreenNode {
6709                kind: SyntaxKind::OptionStructArgExprEmpty,
6710                details: GreenNodeDetails::Node {
6711                    children: [].into(),
6712                    width: TextWidth::default(),
6713                },
6714            }
6715            .intern(db),
6716        )
6717    }
6718    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6719        let kind = node.kind(db);
6720        assert_eq!(
6721            kind,
6722            SyntaxKind::OptionStructArgExprEmpty,
6723            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6724            kind,
6725            SyntaxKind::OptionStructArgExprEmpty
6726        );
6727        Self { node }
6728    }
6729    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6730        let kind = node.kind(db);
6731        if kind == SyntaxKind::OptionStructArgExprEmpty {
6732            Some(Self::from_syntax_node(db, node))
6733        } else {
6734            None
6735        }
6736    }
6737    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6738        self.node
6739    }
6740    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6741        OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6742    }
6743}
6744#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6745pub struct StructArgSingle<'db> {
6746    node: SyntaxNode<'db>,
6747}
6748impl<'db> StructArgSingle<'db> {
6749    pub const INDEX_IDENTIFIER: usize = 0;
6750    pub const INDEX_ARG_EXPR: usize = 1;
6751    pub fn new_green(
6752        db: &'db dyn Database,
6753        identifier: TerminalIdentifierGreen<'db>,
6754        arg_expr: OptionStructArgExprGreen<'db>,
6755    ) -> StructArgSingleGreen<'db> {
6756        let children = [identifier.0, arg_expr.0];
6757        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6758        StructArgSingleGreen(
6759            GreenNode {
6760                kind: SyntaxKind::StructArgSingle,
6761                details: GreenNodeDetails::Node { children: children.into(), width },
6762            }
6763            .intern(db),
6764        )
6765    }
6766}
6767impl<'db> StructArgSingle<'db> {
6768    pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
6769        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6770    }
6771    pub fn arg_expr(&self, db: &'db dyn Database) -> OptionStructArgExpr<'db> {
6772        OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6773    }
6774}
6775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6776pub struct StructArgSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
6777impl<'db> StructArgSinglePtr<'db> {
6778    pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
6779        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
6780    }
6781}
6782impl<'db> TypedStablePtr<'db> for StructArgSinglePtr<'db> {
6783    type SyntaxNode = StructArgSingle<'db>;
6784    fn untyped(self) -> SyntaxStablePtrId<'db> {
6785        self.0
6786    }
6787    fn lookup(&self, db: &'db dyn Database) -> StructArgSingle<'db> {
6788        StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6789    }
6790}
6791impl<'db> From<StructArgSinglePtr<'db>> for SyntaxStablePtrId<'db> {
6792    fn from(ptr: StructArgSinglePtr<'db>) -> Self {
6793        ptr.untyped()
6794    }
6795}
6796#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6797pub struct StructArgSingleGreen<'db>(pub GreenId<'db>);
6798impl<'db> TypedSyntaxNode<'db> for StructArgSingle<'db> {
6799    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6800    type StablePtr = StructArgSinglePtr<'db>;
6801    type Green = StructArgSingleGreen<'db>;
6802    fn missing(db: &'db dyn Database) -> Self::Green {
6803        StructArgSingleGreen(
6804            GreenNode {
6805                kind: SyntaxKind::StructArgSingle,
6806                details: GreenNodeDetails::Node {
6807                    children: [
6808                        TerminalIdentifier::missing(db).0,
6809                        OptionStructArgExpr::missing(db).0,
6810                    ]
6811                    .into(),
6812                    width: TextWidth::default(),
6813                },
6814            }
6815            .intern(db),
6816        )
6817    }
6818    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6819        let kind = node.kind(db);
6820        assert_eq!(
6821            kind,
6822            SyntaxKind::StructArgSingle,
6823            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6824            kind,
6825            SyntaxKind::StructArgSingle
6826        );
6827        Self { node }
6828    }
6829    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6830        let kind = node.kind(db);
6831        if kind == SyntaxKind::StructArgSingle {
6832            Some(Self::from_syntax_node(db, node))
6833        } else {
6834            None
6835        }
6836    }
6837    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6838        self.node
6839    }
6840    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6841        StructArgSinglePtr(self.node.stable_ptr(db))
6842    }
6843}
6844#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6845pub struct StructArgTail<'db> {
6846    node: SyntaxNode<'db>,
6847}
6848impl<'db> StructArgTail<'db> {
6849    pub const INDEX_DOTDOT: usize = 0;
6850    pub const INDEX_EXPRESSION: usize = 1;
6851    pub fn new_green(
6852        db: &'db dyn Database,
6853        dotdot: TerminalDotDotGreen<'db>,
6854        expression: ExprGreen<'db>,
6855    ) -> StructArgTailGreen<'db> {
6856        let children = [dotdot.0, expression.0];
6857        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6858        StructArgTailGreen(
6859            GreenNode {
6860                kind: SyntaxKind::StructArgTail,
6861                details: GreenNodeDetails::Node { children: children.into(), width },
6862            }
6863            .intern(db),
6864        )
6865    }
6866}
6867impl<'db> StructArgTail<'db> {
6868    pub fn dotdot(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
6869        TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
6870    }
6871    pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
6872        Expr::from_syntax_node(db, self.node.get_children(db)[1])
6873    }
6874}
6875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6876pub struct StructArgTailPtr<'db>(pub SyntaxStablePtrId<'db>);
6877impl<'db> StructArgTailPtr<'db> {}
6878impl<'db> TypedStablePtr<'db> for StructArgTailPtr<'db> {
6879    type SyntaxNode = StructArgTail<'db>;
6880    fn untyped(self) -> SyntaxStablePtrId<'db> {
6881        self.0
6882    }
6883    fn lookup(&self, db: &'db dyn Database) -> StructArgTail<'db> {
6884        StructArgTail::from_syntax_node(db, self.0.lookup(db))
6885    }
6886}
6887impl<'db> From<StructArgTailPtr<'db>> for SyntaxStablePtrId<'db> {
6888    fn from(ptr: StructArgTailPtr<'db>) -> Self {
6889        ptr.untyped()
6890    }
6891}
6892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6893pub struct StructArgTailGreen<'db>(pub GreenId<'db>);
6894impl<'db> TypedSyntaxNode<'db> for StructArgTail<'db> {
6895    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6896    type StablePtr = StructArgTailPtr<'db>;
6897    type Green = StructArgTailGreen<'db>;
6898    fn missing(db: &'db dyn Database) -> Self::Green {
6899        StructArgTailGreen(
6900            GreenNode {
6901                kind: SyntaxKind::StructArgTail,
6902                details: GreenNodeDetails::Node {
6903                    children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
6904                    width: TextWidth::default(),
6905                },
6906            }
6907            .intern(db),
6908        )
6909    }
6910    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6911        let kind = node.kind(db);
6912        assert_eq!(
6913            kind,
6914            SyntaxKind::StructArgTail,
6915            "Unexpected SyntaxKind {:?}. Expected {:?}.",
6916            kind,
6917            SyntaxKind::StructArgTail
6918        );
6919        Self { node }
6920    }
6921    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6922        let kind = node.kind(db);
6923        if kind == SyntaxKind::StructArgTail {
6924            Some(Self::from_syntax_node(db, node))
6925        } else {
6926            None
6927        }
6928    }
6929    fn as_syntax_node(&self) -> SyntaxNode<'db> {
6930        self.node
6931    }
6932    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6933        StructArgTailPtr(self.node.stable_ptr(db))
6934    }
6935}
6936#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6937pub enum StructArg<'db> {
6938    StructArgSingle(StructArgSingle<'db>),
6939    StructArgTail(StructArgTail<'db>),
6940}
6941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
6942pub struct StructArgPtr<'db>(pub SyntaxStablePtrId<'db>);
6943impl<'db> TypedStablePtr<'db> for StructArgPtr<'db> {
6944    type SyntaxNode = StructArg<'db>;
6945    fn untyped(self) -> SyntaxStablePtrId<'db> {
6946        self.0
6947    }
6948    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6949        StructArg::from_syntax_node(db, self.0.lookup(db))
6950    }
6951}
6952impl<'db> From<StructArgPtr<'db>> for SyntaxStablePtrId<'db> {
6953    fn from(ptr: StructArgPtr<'db>) -> Self {
6954        ptr.untyped()
6955    }
6956}
6957impl<'db> From<StructArgSinglePtr<'db>> for StructArgPtr<'db> {
6958    fn from(value: StructArgSinglePtr<'db>) -> Self {
6959        Self(value.0)
6960    }
6961}
6962impl<'db> From<StructArgTailPtr<'db>> for StructArgPtr<'db> {
6963    fn from(value: StructArgTailPtr<'db>) -> Self {
6964        Self(value.0)
6965    }
6966}
6967impl<'db> From<StructArgSingleGreen<'db>> for StructArgGreen<'db> {
6968    fn from(value: StructArgSingleGreen<'db>) -> Self {
6969        Self(value.0)
6970    }
6971}
6972impl<'db> From<StructArgTailGreen<'db>> for StructArgGreen<'db> {
6973    fn from(value: StructArgTailGreen<'db>) -> Self {
6974        Self(value.0)
6975    }
6976}
6977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6978pub struct StructArgGreen<'db>(pub GreenId<'db>);
6979impl<'db> TypedSyntaxNode<'db> for StructArg<'db> {
6980    const OPTIONAL_KIND: Option<SyntaxKind> = None;
6981    type StablePtr = StructArgPtr<'db>;
6982    type Green = StructArgGreen<'db>;
6983    fn missing(db: &'db dyn Database) -> Self::Green {
6984        panic!("No missing variant.");
6985    }
6986    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6987        let kind = node.kind(db);
6988        match kind {
6989            SyntaxKind::StructArgSingle => {
6990                StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
6991            }
6992            SyntaxKind::StructArgTail => {
6993                StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
6994            }
6995            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
6996        }
6997    }
6998    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6999        let kind = node.kind(db);
7000        match kind {
7001            SyntaxKind::StructArgSingle => {
7002                Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7003            }
7004            SyntaxKind::StructArgTail => {
7005                Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7006            }
7007            _ => None,
7008        }
7009    }
7010    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7011        match self {
7012            StructArg::StructArgSingle(x) => x.as_syntax_node(),
7013            StructArg::StructArgTail(x) => x.as_syntax_node(),
7014        }
7015    }
7016    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7017        StructArgPtr(self.as_syntax_node().stable_ptr(db))
7018    }
7019}
7020impl<'db> StructArg<'db> {
7021    /// Checks if a kind of a variant of [StructArg].
7022    pub fn is_variant(kind: SyntaxKind) -> bool {
7023        matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7024    }
7025}
7026#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7027pub struct StructArgList<'db>(ElementList<'db, StructArg<'db>, 2>);
7028impl<'db> Deref for StructArgList<'db> {
7029    type Target = ElementList<'db, StructArg<'db>, 2>;
7030    fn deref(&self) -> &Self::Target {
7031        &self.0
7032    }
7033}
7034impl<'db> StructArgList<'db> {
7035    pub fn new_green(
7036        db: &'db dyn Database,
7037        children: &[StructArgListElementOrSeparatorGreen<'db>],
7038    ) -> StructArgListGreen<'db> {
7039        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
7040        StructArgListGreen(
7041            GreenNode {
7042                kind: SyntaxKind::StructArgList,
7043                details: GreenNodeDetails::Node {
7044                    children: children.iter().map(|x| x.id()).collect(),
7045                    width,
7046                },
7047            }
7048            .intern(db),
7049        )
7050    }
7051}
7052#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7053pub struct StructArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7054impl<'db> TypedStablePtr<'db> for StructArgListPtr<'db> {
7055    type SyntaxNode = StructArgList<'db>;
7056    fn untyped(self) -> SyntaxStablePtrId<'db> {
7057        self.0
7058    }
7059    fn lookup(&self, db: &'db dyn Database) -> StructArgList<'db> {
7060        StructArgList::from_syntax_node(db, self.0.lookup(db))
7061    }
7062}
7063impl<'db> From<StructArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7064    fn from(ptr: StructArgListPtr<'db>) -> Self {
7065        ptr.untyped()
7066    }
7067}
7068#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7069pub enum StructArgListElementOrSeparatorGreen<'db> {
7070    Separator(TerminalCommaGreen<'db>),
7071    Element(StructArgGreen<'db>),
7072}
7073impl<'db> From<TerminalCommaGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7074    fn from(value: TerminalCommaGreen<'db>) -> Self {
7075        StructArgListElementOrSeparatorGreen::Separator(value)
7076    }
7077}
7078impl<'db> From<StructArgGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7079    fn from(value: StructArgGreen<'db>) -> Self {
7080        StructArgListElementOrSeparatorGreen::Element(value)
7081    }
7082}
7083impl<'db> StructArgListElementOrSeparatorGreen<'db> {
7084    fn id(&self) -> GreenId<'db> {
7085        match self {
7086            StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7087            StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7088        }
7089    }
7090}
7091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7092pub struct StructArgListGreen<'db>(pub GreenId<'db>);
7093impl<'db> TypedSyntaxNode<'db> for StructArgList<'db> {
7094    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7095    type StablePtr = StructArgListPtr<'db>;
7096    type Green = StructArgListGreen<'db>;
7097    fn missing(db: &'db dyn Database) -> Self::Green {
7098        StructArgListGreen(
7099            GreenNode {
7100                kind: SyntaxKind::StructArgList,
7101                details: GreenNodeDetails::Node {
7102                    children: [].into(),
7103                    width: TextWidth::default(),
7104                },
7105            }
7106            .intern(db),
7107        )
7108    }
7109    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7110        Self(ElementList::new(node))
7111    }
7112    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7113        if node.kind(db) == SyntaxKind::StructArgList {
7114            Some(Self(ElementList::new(node)))
7115        } else {
7116            None
7117        }
7118    }
7119    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7120        self.node
7121    }
7122    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7123        StructArgListPtr(self.node.stable_ptr(db))
7124    }
7125}
7126#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7127pub struct ArgListBraced<'db> {
7128    node: SyntaxNode<'db>,
7129}
7130impl<'db> ArgListBraced<'db> {
7131    pub const INDEX_LBRACE: usize = 0;
7132    pub const INDEX_ARGUMENTS: usize = 1;
7133    pub const INDEX_RBRACE: usize = 2;
7134    pub fn new_green(
7135        db: &'db dyn Database,
7136        lbrace: TerminalLBraceGreen<'db>,
7137        arguments: ArgListGreen<'db>,
7138        rbrace: TerminalRBraceGreen<'db>,
7139    ) -> ArgListBracedGreen<'db> {
7140        let children = [lbrace.0, arguments.0, rbrace.0];
7141        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7142        ArgListBracedGreen(
7143            GreenNode {
7144                kind: SyntaxKind::ArgListBraced,
7145                details: GreenNodeDetails::Node { children: children.into(), width },
7146            }
7147            .intern(db),
7148        )
7149    }
7150}
7151impl<'db> ArgListBraced<'db> {
7152    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7153        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7154    }
7155    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7156        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7157    }
7158    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7159        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7160    }
7161}
7162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7163pub struct ArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
7164impl<'db> ArgListBracedPtr<'db> {}
7165impl<'db> TypedStablePtr<'db> for ArgListBracedPtr<'db> {
7166    type SyntaxNode = ArgListBraced<'db>;
7167    fn untyped(self) -> SyntaxStablePtrId<'db> {
7168        self.0
7169    }
7170    fn lookup(&self, db: &'db dyn Database) -> ArgListBraced<'db> {
7171        ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7172    }
7173}
7174impl<'db> From<ArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
7175    fn from(ptr: ArgListBracedPtr<'db>) -> Self {
7176        ptr.untyped()
7177    }
7178}
7179#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7180pub struct ArgListBracedGreen<'db>(pub GreenId<'db>);
7181impl<'db> TypedSyntaxNode<'db> for ArgListBraced<'db> {
7182    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7183    type StablePtr = ArgListBracedPtr<'db>;
7184    type Green = ArgListBracedGreen<'db>;
7185    fn missing(db: &'db dyn Database) -> Self::Green {
7186        ArgListBracedGreen(
7187            GreenNode {
7188                kind: SyntaxKind::ArgListBraced,
7189                details: GreenNodeDetails::Node {
7190                    children: [
7191                        TerminalLBrace::missing(db).0,
7192                        ArgList::missing(db).0,
7193                        TerminalRBrace::missing(db).0,
7194                    ]
7195                    .into(),
7196                    width: TextWidth::default(),
7197                },
7198            }
7199            .intern(db),
7200        )
7201    }
7202    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7203        let kind = node.kind(db);
7204        assert_eq!(
7205            kind,
7206            SyntaxKind::ArgListBraced,
7207            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7208            kind,
7209            SyntaxKind::ArgListBraced
7210        );
7211        Self { node }
7212    }
7213    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7214        let kind = node.kind(db);
7215        if kind == SyntaxKind::ArgListBraced {
7216            Some(Self::from_syntax_node(db, node))
7217        } else {
7218            None
7219        }
7220    }
7221    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7222        self.node
7223    }
7224    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7225        ArgListBracedPtr(self.node.stable_ptr(db))
7226    }
7227}
7228#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7229pub struct ArgListBracketed<'db> {
7230    node: SyntaxNode<'db>,
7231}
7232impl<'db> ArgListBracketed<'db> {
7233    pub const INDEX_LBRACK: usize = 0;
7234    pub const INDEX_ARGUMENTS: usize = 1;
7235    pub const INDEX_RBRACK: usize = 2;
7236    pub fn new_green(
7237        db: &'db dyn Database,
7238        lbrack: TerminalLBrackGreen<'db>,
7239        arguments: ArgListGreen<'db>,
7240        rbrack: TerminalRBrackGreen<'db>,
7241    ) -> ArgListBracketedGreen<'db> {
7242        let children = [lbrack.0, arguments.0, rbrack.0];
7243        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7244        ArgListBracketedGreen(
7245            GreenNode {
7246                kind: SyntaxKind::ArgListBracketed,
7247                details: GreenNodeDetails::Node { children: children.into(), width },
7248            }
7249            .intern(db),
7250        )
7251    }
7252}
7253impl<'db> ArgListBracketed<'db> {
7254    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
7255        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7256    }
7257    pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7258        ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7259    }
7260    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
7261        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7262    }
7263}
7264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7265pub struct ArgListBracketedPtr<'db>(pub SyntaxStablePtrId<'db>);
7266impl<'db> ArgListBracketedPtr<'db> {}
7267impl<'db> TypedStablePtr<'db> for ArgListBracketedPtr<'db> {
7268    type SyntaxNode = ArgListBracketed<'db>;
7269    fn untyped(self) -> SyntaxStablePtrId<'db> {
7270        self.0
7271    }
7272    fn lookup(&self, db: &'db dyn Database) -> ArgListBracketed<'db> {
7273        ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7274    }
7275}
7276impl<'db> From<ArgListBracketedPtr<'db>> for SyntaxStablePtrId<'db> {
7277    fn from(ptr: ArgListBracketedPtr<'db>) -> Self {
7278        ptr.untyped()
7279    }
7280}
7281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7282pub struct ArgListBracketedGreen<'db>(pub GreenId<'db>);
7283impl<'db> TypedSyntaxNode<'db> for ArgListBracketed<'db> {
7284    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7285    type StablePtr = ArgListBracketedPtr<'db>;
7286    type Green = ArgListBracketedGreen<'db>;
7287    fn missing(db: &'db dyn Database) -> Self::Green {
7288        ArgListBracketedGreen(
7289            GreenNode {
7290                kind: SyntaxKind::ArgListBracketed,
7291                details: GreenNodeDetails::Node {
7292                    children: [
7293                        TerminalLBrack::missing(db).0,
7294                        ArgList::missing(db).0,
7295                        TerminalRBrack::missing(db).0,
7296                    ]
7297                    .into(),
7298                    width: TextWidth::default(),
7299                },
7300            }
7301            .intern(db),
7302        )
7303    }
7304    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7305        let kind = node.kind(db);
7306        assert_eq!(
7307            kind,
7308            SyntaxKind::ArgListBracketed,
7309            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7310            kind,
7311            SyntaxKind::ArgListBracketed
7312        );
7313        Self { node }
7314    }
7315    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7316        let kind = node.kind(db);
7317        if kind == SyntaxKind::ArgListBracketed {
7318            Some(Self::from_syntax_node(db, node))
7319        } else {
7320            None
7321        }
7322    }
7323    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7324        self.node
7325    }
7326    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7327        ArgListBracketedPtr(self.node.stable_ptr(db))
7328    }
7329}
7330#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7331pub enum WrappedArgList<'db> {
7332    BracketedArgList(ArgListBracketed<'db>),
7333    ParenthesizedArgList(ArgListParenthesized<'db>),
7334    BracedArgList(ArgListBraced<'db>),
7335    Missing(WrappedArgListMissing<'db>),
7336}
7337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7338pub struct WrappedArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7339impl<'db> TypedStablePtr<'db> for WrappedArgListPtr<'db> {
7340    type SyntaxNode = WrappedArgList<'db>;
7341    fn untyped(self) -> SyntaxStablePtrId<'db> {
7342        self.0
7343    }
7344    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7345        WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7346    }
7347}
7348impl<'db> From<WrappedArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7349    fn from(ptr: WrappedArgListPtr<'db>) -> Self {
7350        ptr.untyped()
7351    }
7352}
7353impl<'db> From<ArgListBracketedPtr<'db>> for WrappedArgListPtr<'db> {
7354    fn from(value: ArgListBracketedPtr<'db>) -> Self {
7355        Self(value.0)
7356    }
7357}
7358impl<'db> From<ArgListParenthesizedPtr<'db>> for WrappedArgListPtr<'db> {
7359    fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
7360        Self(value.0)
7361    }
7362}
7363impl<'db> From<ArgListBracedPtr<'db>> for WrappedArgListPtr<'db> {
7364    fn from(value: ArgListBracedPtr<'db>) -> Self {
7365        Self(value.0)
7366    }
7367}
7368impl<'db> From<WrappedArgListMissingPtr<'db>> for WrappedArgListPtr<'db> {
7369    fn from(value: WrappedArgListMissingPtr<'db>) -> Self {
7370        Self(value.0)
7371    }
7372}
7373impl<'db> From<ArgListBracketedGreen<'db>> for WrappedArgListGreen<'db> {
7374    fn from(value: ArgListBracketedGreen<'db>) -> Self {
7375        Self(value.0)
7376    }
7377}
7378impl<'db> From<ArgListParenthesizedGreen<'db>> for WrappedArgListGreen<'db> {
7379    fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
7380        Self(value.0)
7381    }
7382}
7383impl<'db> From<ArgListBracedGreen<'db>> for WrappedArgListGreen<'db> {
7384    fn from(value: ArgListBracedGreen<'db>) -> Self {
7385        Self(value.0)
7386    }
7387}
7388impl<'db> From<WrappedArgListMissingGreen<'db>> for WrappedArgListGreen<'db> {
7389    fn from(value: WrappedArgListMissingGreen<'db>) -> Self {
7390        Self(value.0)
7391    }
7392}
7393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7394pub struct WrappedArgListGreen<'db>(pub GreenId<'db>);
7395impl<'db> TypedSyntaxNode<'db> for WrappedArgList<'db> {
7396    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7397    type StablePtr = WrappedArgListPtr<'db>;
7398    type Green = WrappedArgListGreen<'db>;
7399    fn missing(db: &'db dyn Database) -> Self::Green {
7400        WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7401    }
7402    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7403        let kind = node.kind(db);
7404        match kind {
7405            SyntaxKind::ArgListBracketed => {
7406                WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7407            }
7408            SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7409                ArgListParenthesized::from_syntax_node(db, node),
7410            ),
7411            SyntaxKind::ArgListBraced => {
7412                WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7413            }
7414            SyntaxKind::WrappedArgListMissing => {
7415                WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7416            }
7417            _ => {
7418                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7419            }
7420        }
7421    }
7422    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7423        let kind = node.kind(db);
7424        match kind {
7425            SyntaxKind::ArgListBracketed => {
7426                Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7427            }
7428            SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7429                ArgListParenthesized::from_syntax_node(db, node),
7430            )),
7431            SyntaxKind::ArgListBraced => {
7432                Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7433            }
7434            SyntaxKind::WrappedArgListMissing => {
7435                Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7436            }
7437            _ => None,
7438        }
7439    }
7440    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7441        match self {
7442            WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7443            WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7444            WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7445            WrappedArgList::Missing(x) => x.as_syntax_node(),
7446        }
7447    }
7448    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7449        WrappedArgListPtr(self.as_syntax_node().stable_ptr(db))
7450    }
7451}
7452impl<'db> WrappedArgList<'db> {
7453    /// Checks if a kind of a variant of [WrappedArgList].
7454    pub fn is_variant(kind: SyntaxKind) -> bool {
7455        matches!(
7456            kind,
7457            SyntaxKind::ArgListBracketed
7458                | SyntaxKind::ArgListParenthesized
7459                | SyntaxKind::ArgListBraced
7460                | SyntaxKind::WrappedArgListMissing
7461        )
7462    }
7463}
7464#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7465pub struct WrappedArgListMissing<'db> {
7466    node: SyntaxNode<'db>,
7467}
7468impl<'db> WrappedArgListMissing<'db> {
7469    pub fn new_green(db: &'db dyn Database) -> WrappedArgListMissingGreen<'db> {
7470        let children = [];
7471        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7472        WrappedArgListMissingGreen(
7473            GreenNode {
7474                kind: SyntaxKind::WrappedArgListMissing,
7475                details: GreenNodeDetails::Node { children: children.into(), width },
7476            }
7477            .intern(db),
7478        )
7479    }
7480}
7481impl<'db> WrappedArgListMissing<'db> {}
7482#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7483pub struct WrappedArgListMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
7484impl<'db> WrappedArgListMissingPtr<'db> {}
7485impl<'db> TypedStablePtr<'db> for WrappedArgListMissingPtr<'db> {
7486    type SyntaxNode = WrappedArgListMissing<'db>;
7487    fn untyped(self) -> SyntaxStablePtrId<'db> {
7488        self.0
7489    }
7490    fn lookup(&self, db: &'db dyn Database) -> WrappedArgListMissing<'db> {
7491        WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7492    }
7493}
7494impl<'db> From<WrappedArgListMissingPtr<'db>> for SyntaxStablePtrId<'db> {
7495    fn from(ptr: WrappedArgListMissingPtr<'db>) -> Self {
7496        ptr.untyped()
7497    }
7498}
7499#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7500pub struct WrappedArgListMissingGreen<'db>(pub GreenId<'db>);
7501impl<'db> TypedSyntaxNode<'db> for WrappedArgListMissing<'db> {
7502    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7503    type StablePtr = WrappedArgListMissingPtr<'db>;
7504    type Green = WrappedArgListMissingGreen<'db>;
7505    fn missing(db: &'db dyn Database) -> Self::Green {
7506        WrappedArgListMissingGreen(
7507            GreenNode {
7508                kind: SyntaxKind::WrappedArgListMissing,
7509                details: GreenNodeDetails::Node {
7510                    children: [].into(),
7511                    width: TextWidth::default(),
7512                },
7513            }
7514            .intern(db),
7515        )
7516    }
7517    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7518        let kind = node.kind(db);
7519        assert_eq!(
7520            kind,
7521            SyntaxKind::WrappedArgListMissing,
7522            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7523            kind,
7524            SyntaxKind::WrappedArgListMissing
7525        );
7526        Self { node }
7527    }
7528    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7529        let kind = node.kind(db);
7530        if kind == SyntaxKind::WrappedArgListMissing {
7531            Some(Self::from_syntax_node(db, node))
7532        } else {
7533            None
7534        }
7535    }
7536    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7537        self.node
7538    }
7539    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7540        WrappedArgListMissingPtr(self.node.stable_ptr(db))
7541    }
7542}
7543#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7544pub enum Pattern<'db> {
7545    Underscore(TerminalUnderscore<'db>),
7546    Literal(TerminalLiteralNumber<'db>),
7547    False(TerminalFalse<'db>),
7548    True(TerminalTrue<'db>),
7549    ShortString(TerminalShortString<'db>),
7550    String(TerminalString<'db>),
7551    Identifier(PatternIdentifier<'db>),
7552    Struct(PatternStruct<'db>),
7553    Tuple(PatternTuple<'db>),
7554    Enum(PatternEnum<'db>),
7555    FixedSizeArray(PatternFixedSizeArray<'db>),
7556    Path(ExprPath<'db>),
7557}
7558#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7559pub struct PatternPtr<'db>(pub SyntaxStablePtrId<'db>);
7560impl<'db> TypedStablePtr<'db> for PatternPtr<'db> {
7561    type SyntaxNode = Pattern<'db>;
7562    fn untyped(self) -> SyntaxStablePtrId<'db> {
7563        self.0
7564    }
7565    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7566        Pattern::from_syntax_node(db, self.0.lookup(db))
7567    }
7568}
7569impl<'db> From<PatternPtr<'db>> for SyntaxStablePtrId<'db> {
7570    fn from(ptr: PatternPtr<'db>) -> Self {
7571        ptr.untyped()
7572    }
7573}
7574impl<'db> From<TerminalUnderscorePtr<'db>> for PatternPtr<'db> {
7575    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
7576        Self(value.0)
7577    }
7578}
7579impl<'db> From<TerminalLiteralNumberPtr<'db>> for PatternPtr<'db> {
7580    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
7581        Self(value.0)
7582    }
7583}
7584impl<'db> From<TerminalFalsePtr<'db>> for PatternPtr<'db> {
7585    fn from(value: TerminalFalsePtr<'db>) -> Self {
7586        Self(value.0)
7587    }
7588}
7589impl<'db> From<TerminalTruePtr<'db>> for PatternPtr<'db> {
7590    fn from(value: TerminalTruePtr<'db>) -> Self {
7591        Self(value.0)
7592    }
7593}
7594impl<'db> From<TerminalShortStringPtr<'db>> for PatternPtr<'db> {
7595    fn from(value: TerminalShortStringPtr<'db>) -> Self {
7596        Self(value.0)
7597    }
7598}
7599impl<'db> From<TerminalStringPtr<'db>> for PatternPtr<'db> {
7600    fn from(value: TerminalStringPtr<'db>) -> Self {
7601        Self(value.0)
7602    }
7603}
7604impl<'db> From<PatternIdentifierPtr<'db>> for PatternPtr<'db> {
7605    fn from(value: PatternIdentifierPtr<'db>) -> Self {
7606        Self(value.0)
7607    }
7608}
7609impl<'db> From<PatternStructPtr<'db>> for PatternPtr<'db> {
7610    fn from(value: PatternStructPtr<'db>) -> Self {
7611        Self(value.0)
7612    }
7613}
7614impl<'db> From<PatternTuplePtr<'db>> for PatternPtr<'db> {
7615    fn from(value: PatternTuplePtr<'db>) -> Self {
7616        Self(value.0)
7617    }
7618}
7619impl<'db> From<PatternEnumPtr<'db>> for PatternPtr<'db> {
7620    fn from(value: PatternEnumPtr<'db>) -> Self {
7621        Self(value.0)
7622    }
7623}
7624impl<'db> From<PatternFixedSizeArrayPtr<'db>> for PatternPtr<'db> {
7625    fn from(value: PatternFixedSizeArrayPtr<'db>) -> Self {
7626        Self(value.0)
7627    }
7628}
7629impl<'db> From<ExprPathPtr<'db>> for PatternPtr<'db> {
7630    fn from(value: ExprPathPtr<'db>) -> Self {
7631        Self(value.0)
7632    }
7633}
7634impl<'db> From<TerminalUnderscoreGreen<'db>> for PatternGreen<'db> {
7635    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
7636        Self(value.0)
7637    }
7638}
7639impl<'db> From<TerminalLiteralNumberGreen<'db>> for PatternGreen<'db> {
7640    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
7641        Self(value.0)
7642    }
7643}
7644impl<'db> From<TerminalFalseGreen<'db>> for PatternGreen<'db> {
7645    fn from(value: TerminalFalseGreen<'db>) -> Self {
7646        Self(value.0)
7647    }
7648}
7649impl<'db> From<TerminalTrueGreen<'db>> for PatternGreen<'db> {
7650    fn from(value: TerminalTrueGreen<'db>) -> Self {
7651        Self(value.0)
7652    }
7653}
7654impl<'db> From<TerminalShortStringGreen<'db>> for PatternGreen<'db> {
7655    fn from(value: TerminalShortStringGreen<'db>) -> Self {
7656        Self(value.0)
7657    }
7658}
7659impl<'db> From<TerminalStringGreen<'db>> for PatternGreen<'db> {
7660    fn from(value: TerminalStringGreen<'db>) -> Self {
7661        Self(value.0)
7662    }
7663}
7664impl<'db> From<PatternIdentifierGreen<'db>> for PatternGreen<'db> {
7665    fn from(value: PatternIdentifierGreen<'db>) -> Self {
7666        Self(value.0)
7667    }
7668}
7669impl<'db> From<PatternStructGreen<'db>> for PatternGreen<'db> {
7670    fn from(value: PatternStructGreen<'db>) -> Self {
7671        Self(value.0)
7672    }
7673}
7674impl<'db> From<PatternTupleGreen<'db>> for PatternGreen<'db> {
7675    fn from(value: PatternTupleGreen<'db>) -> Self {
7676        Self(value.0)
7677    }
7678}
7679impl<'db> From<PatternEnumGreen<'db>> for PatternGreen<'db> {
7680    fn from(value: PatternEnumGreen<'db>) -> Self {
7681        Self(value.0)
7682    }
7683}
7684impl<'db> From<PatternFixedSizeArrayGreen<'db>> for PatternGreen<'db> {
7685    fn from(value: PatternFixedSizeArrayGreen<'db>) -> Self {
7686        Self(value.0)
7687    }
7688}
7689impl<'db> From<ExprPathGreen<'db>> for PatternGreen<'db> {
7690    fn from(value: ExprPathGreen<'db>) -> Self {
7691        Self(value.0)
7692    }
7693}
7694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7695pub struct PatternGreen<'db>(pub GreenId<'db>);
7696impl<'db> TypedSyntaxNode<'db> for Pattern<'db> {
7697    const OPTIONAL_KIND: Option<SyntaxKind> = None;
7698    type StablePtr = PatternPtr<'db>;
7699    type Green = PatternGreen<'db>;
7700    fn missing(db: &'db dyn Database) -> Self::Green {
7701        panic!("No missing variant.");
7702    }
7703    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7704        let kind = node.kind(db);
7705        match kind {
7706            SyntaxKind::TerminalUnderscore => {
7707                Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7708            }
7709            SyntaxKind::TerminalLiteralNumber => {
7710                Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7711            }
7712            SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7713            SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7714            SyntaxKind::TerminalShortString => {
7715                Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7716            }
7717            SyntaxKind::TerminalString => {
7718                Pattern::String(TerminalString::from_syntax_node(db, node))
7719            }
7720            SyntaxKind::PatternIdentifier => {
7721                Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7722            }
7723            SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7724            SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7725            SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7726            SyntaxKind::PatternFixedSizeArray => {
7727                Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7728            }
7729            SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7730            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7731        }
7732    }
7733    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7734        let kind = node.kind(db);
7735        match kind {
7736            SyntaxKind::TerminalUnderscore => {
7737                Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7738            }
7739            SyntaxKind::TerminalLiteralNumber => {
7740                Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7741            }
7742            SyntaxKind::TerminalFalse => {
7743                Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7744            }
7745            SyntaxKind::TerminalTrue => {
7746                Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7747            }
7748            SyntaxKind::TerminalShortString => {
7749                Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7750            }
7751            SyntaxKind::TerminalString => {
7752                Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7753            }
7754            SyntaxKind::PatternIdentifier => {
7755                Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7756            }
7757            SyntaxKind::PatternStruct => {
7758                Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7759            }
7760            SyntaxKind::PatternTuple => {
7761                Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7762            }
7763            SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7764            SyntaxKind::PatternFixedSizeArray => {
7765                Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7766            }
7767            SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7768            _ => None,
7769        }
7770    }
7771    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7772        match self {
7773            Pattern::Underscore(x) => x.as_syntax_node(),
7774            Pattern::Literal(x) => x.as_syntax_node(),
7775            Pattern::False(x) => x.as_syntax_node(),
7776            Pattern::True(x) => x.as_syntax_node(),
7777            Pattern::ShortString(x) => x.as_syntax_node(),
7778            Pattern::String(x) => x.as_syntax_node(),
7779            Pattern::Identifier(x) => x.as_syntax_node(),
7780            Pattern::Struct(x) => x.as_syntax_node(),
7781            Pattern::Tuple(x) => x.as_syntax_node(),
7782            Pattern::Enum(x) => x.as_syntax_node(),
7783            Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7784            Pattern::Path(x) => x.as_syntax_node(),
7785        }
7786    }
7787    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7788        PatternPtr(self.as_syntax_node().stable_ptr(db))
7789    }
7790}
7791impl<'db> Pattern<'db> {
7792    /// Checks if a kind of a variant of [Pattern].
7793    pub fn is_variant(kind: SyntaxKind) -> bool {
7794        matches!(
7795            kind,
7796            SyntaxKind::TerminalUnderscore
7797                | SyntaxKind::TerminalLiteralNumber
7798                | SyntaxKind::TerminalFalse
7799                | SyntaxKind::TerminalTrue
7800                | SyntaxKind::TerminalShortString
7801                | SyntaxKind::TerminalString
7802                | SyntaxKind::PatternIdentifier
7803                | SyntaxKind::PatternStruct
7804                | SyntaxKind::PatternTuple
7805                | SyntaxKind::PatternEnum
7806                | SyntaxKind::PatternFixedSizeArray
7807                | SyntaxKind::ExprPath
7808        )
7809    }
7810}
7811#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7812pub struct PatternIdentifier<'db> {
7813    node: SyntaxNode<'db>,
7814}
7815impl<'db> PatternIdentifier<'db> {
7816    pub const INDEX_MODIFIERS: usize = 0;
7817    pub const INDEX_NAME: usize = 1;
7818    pub fn new_green(
7819        db: &'db dyn Database,
7820        modifiers: ModifierListGreen<'db>,
7821        name: TerminalIdentifierGreen<'db>,
7822    ) -> PatternIdentifierGreen<'db> {
7823        let children = [modifiers.0, name.0];
7824        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7825        PatternIdentifierGreen(
7826            GreenNode {
7827                kind: SyntaxKind::PatternIdentifier,
7828                details: GreenNodeDetails::Node { children: children.into(), width },
7829            }
7830            .intern(db),
7831        )
7832    }
7833}
7834impl<'db> PatternIdentifier<'db> {
7835    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
7836        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
7837    }
7838    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
7839        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
7840    }
7841}
7842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7843pub struct PatternIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
7844impl<'db> PatternIdentifierPtr<'db> {
7845    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
7846        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
7847    }
7848}
7849impl<'db> TypedStablePtr<'db> for PatternIdentifierPtr<'db> {
7850    type SyntaxNode = PatternIdentifier<'db>;
7851    fn untyped(self) -> SyntaxStablePtrId<'db> {
7852        self.0
7853    }
7854    fn lookup(&self, db: &'db dyn Database) -> PatternIdentifier<'db> {
7855        PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7856    }
7857}
7858impl<'db> From<PatternIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
7859    fn from(ptr: PatternIdentifierPtr<'db>) -> Self {
7860        ptr.untyped()
7861    }
7862}
7863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7864pub struct PatternIdentifierGreen<'db>(pub GreenId<'db>);
7865impl<'db> TypedSyntaxNode<'db> for PatternIdentifier<'db> {
7866    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7867    type StablePtr = PatternIdentifierPtr<'db>;
7868    type Green = PatternIdentifierGreen<'db>;
7869    fn missing(db: &'db dyn Database) -> Self::Green {
7870        PatternIdentifierGreen(
7871            GreenNode {
7872                kind: SyntaxKind::PatternIdentifier,
7873                details: GreenNodeDetails::Node {
7874                    children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
7875                        .into(),
7876                    width: TextWidth::default(),
7877                },
7878            }
7879            .intern(db),
7880        )
7881    }
7882    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7883        let kind = node.kind(db);
7884        assert_eq!(
7885            kind,
7886            SyntaxKind::PatternIdentifier,
7887            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7888            kind,
7889            SyntaxKind::PatternIdentifier
7890        );
7891        Self { node }
7892    }
7893    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7894        let kind = node.kind(db);
7895        if kind == SyntaxKind::PatternIdentifier {
7896            Some(Self::from_syntax_node(db, node))
7897        } else {
7898            None
7899        }
7900    }
7901    fn as_syntax_node(&self) -> SyntaxNode<'db> {
7902        self.node
7903    }
7904    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7905        PatternIdentifierPtr(self.node.stable_ptr(db))
7906    }
7907}
7908#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7909pub struct PatternStruct<'db> {
7910    node: SyntaxNode<'db>,
7911}
7912impl<'db> PatternStruct<'db> {
7913    pub const INDEX_PATH: usize = 0;
7914    pub const INDEX_LBRACE: usize = 1;
7915    pub const INDEX_PARAMS: usize = 2;
7916    pub const INDEX_RBRACE: usize = 3;
7917    pub fn new_green(
7918        db: &'db dyn Database,
7919        path: ExprPathGreen<'db>,
7920        lbrace: TerminalLBraceGreen<'db>,
7921        params: PatternStructParamListGreen<'db>,
7922        rbrace: TerminalRBraceGreen<'db>,
7923    ) -> PatternStructGreen<'db> {
7924        let children = [path.0, lbrace.0, params.0, rbrace.0];
7925        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7926        PatternStructGreen(
7927            GreenNode {
7928                kind: SyntaxKind::PatternStruct,
7929                details: GreenNodeDetails::Node { children: children.into(), width },
7930            }
7931            .intern(db),
7932        )
7933    }
7934}
7935impl<'db> PatternStruct<'db> {
7936    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
7937        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
7938    }
7939    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7940        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
7941    }
7942    pub fn params(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
7943        PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
7944    }
7945    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7946        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
7947    }
7948}
7949#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
7950pub struct PatternStructPtr<'db>(pub SyntaxStablePtrId<'db>);
7951impl<'db> PatternStructPtr<'db> {}
7952impl<'db> TypedStablePtr<'db> for PatternStructPtr<'db> {
7953    type SyntaxNode = PatternStruct<'db>;
7954    fn untyped(self) -> SyntaxStablePtrId<'db> {
7955        self.0
7956    }
7957    fn lookup(&self, db: &'db dyn Database) -> PatternStruct<'db> {
7958        PatternStruct::from_syntax_node(db, self.0.lookup(db))
7959    }
7960}
7961impl<'db> From<PatternStructPtr<'db>> for SyntaxStablePtrId<'db> {
7962    fn from(ptr: PatternStructPtr<'db>) -> Self {
7963        ptr.untyped()
7964    }
7965}
7966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7967pub struct PatternStructGreen<'db>(pub GreenId<'db>);
7968impl<'db> TypedSyntaxNode<'db> for PatternStruct<'db> {
7969    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
7970    type StablePtr = PatternStructPtr<'db>;
7971    type Green = PatternStructGreen<'db>;
7972    fn missing(db: &'db dyn Database) -> Self::Green {
7973        PatternStructGreen(
7974            GreenNode {
7975                kind: SyntaxKind::PatternStruct,
7976                details: GreenNodeDetails::Node {
7977                    children: [
7978                        ExprPath::missing(db).0,
7979                        TerminalLBrace::missing(db).0,
7980                        PatternStructParamList::missing(db).0,
7981                        TerminalRBrace::missing(db).0,
7982                    ]
7983                    .into(),
7984                    width: TextWidth::default(),
7985                },
7986            }
7987            .intern(db),
7988        )
7989    }
7990    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7991        let kind = node.kind(db);
7992        assert_eq!(
7993            kind,
7994            SyntaxKind::PatternStruct,
7995            "Unexpected SyntaxKind {:?}. Expected {:?}.",
7996            kind,
7997            SyntaxKind::PatternStruct
7998        );
7999        Self { node }
8000    }
8001    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8002        let kind = node.kind(db);
8003        if kind == SyntaxKind::PatternStruct {
8004            Some(Self::from_syntax_node(db, node))
8005        } else {
8006            None
8007        }
8008    }
8009    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8010        self.node
8011    }
8012    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8013        PatternStructPtr(self.node.stable_ptr(db))
8014    }
8015}
8016#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8017pub struct PatternStructParamList<'db>(ElementList<'db, PatternStructParam<'db>, 2>);
8018impl<'db> Deref for PatternStructParamList<'db> {
8019    type Target = ElementList<'db, PatternStructParam<'db>, 2>;
8020    fn deref(&self) -> &Self::Target {
8021        &self.0
8022    }
8023}
8024impl<'db> PatternStructParamList<'db> {
8025    pub fn new_green(
8026        db: &'db dyn Database,
8027        children: &[PatternStructParamListElementOrSeparatorGreen<'db>],
8028    ) -> PatternStructParamListGreen<'db> {
8029        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8030        PatternStructParamListGreen(
8031            GreenNode {
8032                kind: SyntaxKind::PatternStructParamList,
8033                details: GreenNodeDetails::Node {
8034                    children: children.iter().map(|x| x.id()).collect(),
8035                    width,
8036                },
8037            }
8038            .intern(db),
8039        )
8040    }
8041}
8042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8043pub struct PatternStructParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
8044impl<'db> TypedStablePtr<'db> for PatternStructParamListPtr<'db> {
8045    type SyntaxNode = PatternStructParamList<'db>;
8046    fn untyped(self) -> SyntaxStablePtrId<'db> {
8047        self.0
8048    }
8049    fn lookup(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8050        PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8051    }
8052}
8053impl<'db> From<PatternStructParamListPtr<'db>> for SyntaxStablePtrId<'db> {
8054    fn from(ptr: PatternStructParamListPtr<'db>) -> Self {
8055        ptr.untyped()
8056    }
8057}
8058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8059pub enum PatternStructParamListElementOrSeparatorGreen<'db> {
8060    Separator(TerminalCommaGreen<'db>),
8061    Element(PatternStructParamGreen<'db>),
8062}
8063impl<'db> From<TerminalCommaGreen<'db>> for PatternStructParamListElementOrSeparatorGreen<'db> {
8064    fn from(value: TerminalCommaGreen<'db>) -> Self {
8065        PatternStructParamListElementOrSeparatorGreen::Separator(value)
8066    }
8067}
8068impl<'db> From<PatternStructParamGreen<'db>>
8069    for PatternStructParamListElementOrSeparatorGreen<'db>
8070{
8071    fn from(value: PatternStructParamGreen<'db>) -> Self {
8072        PatternStructParamListElementOrSeparatorGreen::Element(value)
8073    }
8074}
8075impl<'db> PatternStructParamListElementOrSeparatorGreen<'db> {
8076    fn id(&self) -> GreenId<'db> {
8077        match self {
8078            PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8079            PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8080        }
8081    }
8082}
8083#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8084pub struct PatternStructParamListGreen<'db>(pub GreenId<'db>);
8085impl<'db> TypedSyntaxNode<'db> for PatternStructParamList<'db> {
8086    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8087    type StablePtr = PatternStructParamListPtr<'db>;
8088    type Green = PatternStructParamListGreen<'db>;
8089    fn missing(db: &'db dyn Database) -> Self::Green {
8090        PatternStructParamListGreen(
8091            GreenNode {
8092                kind: SyntaxKind::PatternStructParamList,
8093                details: GreenNodeDetails::Node {
8094                    children: [].into(),
8095                    width: TextWidth::default(),
8096                },
8097            }
8098            .intern(db),
8099        )
8100    }
8101    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8102        Self(ElementList::new(node))
8103    }
8104    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8105        if node.kind(db) == SyntaxKind::PatternStructParamList {
8106            Some(Self(ElementList::new(node)))
8107        } else {
8108            None
8109        }
8110    }
8111    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8112        self.node
8113    }
8114    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8115        PatternStructParamListPtr(self.node.stable_ptr(db))
8116    }
8117}
8118#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8119pub struct PatternTuple<'db> {
8120    node: SyntaxNode<'db>,
8121}
8122impl<'db> PatternTuple<'db> {
8123    pub const INDEX_LPAREN: usize = 0;
8124    pub const INDEX_PATTERNS: usize = 1;
8125    pub const INDEX_RPAREN: usize = 2;
8126    pub fn new_green(
8127        db: &'db dyn Database,
8128        lparen: TerminalLParenGreen<'db>,
8129        patterns: PatternListGreen<'db>,
8130        rparen: TerminalRParenGreen<'db>,
8131    ) -> PatternTupleGreen<'db> {
8132        let children = [lparen.0, patterns.0, rparen.0];
8133        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8134        PatternTupleGreen(
8135            GreenNode {
8136                kind: SyntaxKind::PatternTuple,
8137                details: GreenNodeDetails::Node { children: children.into(), width },
8138            }
8139            .intern(db),
8140        )
8141    }
8142}
8143impl<'db> PatternTuple<'db> {
8144    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8145        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8146    }
8147    pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8148        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8149    }
8150    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8151        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8152    }
8153}
8154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8155pub struct PatternTuplePtr<'db>(pub SyntaxStablePtrId<'db>);
8156impl<'db> PatternTuplePtr<'db> {}
8157impl<'db> TypedStablePtr<'db> for PatternTuplePtr<'db> {
8158    type SyntaxNode = PatternTuple<'db>;
8159    fn untyped(self) -> SyntaxStablePtrId<'db> {
8160        self.0
8161    }
8162    fn lookup(&self, db: &'db dyn Database) -> PatternTuple<'db> {
8163        PatternTuple::from_syntax_node(db, self.0.lookup(db))
8164    }
8165}
8166impl<'db> From<PatternTuplePtr<'db>> for SyntaxStablePtrId<'db> {
8167    fn from(ptr: PatternTuplePtr<'db>) -> Self {
8168        ptr.untyped()
8169    }
8170}
8171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8172pub struct PatternTupleGreen<'db>(pub GreenId<'db>);
8173impl<'db> TypedSyntaxNode<'db> for PatternTuple<'db> {
8174    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8175    type StablePtr = PatternTuplePtr<'db>;
8176    type Green = PatternTupleGreen<'db>;
8177    fn missing(db: &'db dyn Database) -> Self::Green {
8178        PatternTupleGreen(
8179            GreenNode {
8180                kind: SyntaxKind::PatternTuple,
8181                details: GreenNodeDetails::Node {
8182                    children: [
8183                        TerminalLParen::missing(db).0,
8184                        PatternList::missing(db).0,
8185                        TerminalRParen::missing(db).0,
8186                    ]
8187                    .into(),
8188                    width: TextWidth::default(),
8189                },
8190            }
8191            .intern(db),
8192        )
8193    }
8194    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8195        let kind = node.kind(db);
8196        assert_eq!(
8197            kind,
8198            SyntaxKind::PatternTuple,
8199            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8200            kind,
8201            SyntaxKind::PatternTuple
8202        );
8203        Self { node }
8204    }
8205    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8206        let kind = node.kind(db);
8207        if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8208    }
8209    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8210        self.node
8211    }
8212    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8213        PatternTuplePtr(self.node.stable_ptr(db))
8214    }
8215}
8216#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8217pub struct PatternFixedSizeArray<'db> {
8218    node: SyntaxNode<'db>,
8219}
8220impl<'db> PatternFixedSizeArray<'db> {
8221    pub const INDEX_LBRACK: usize = 0;
8222    pub const INDEX_PATTERNS: usize = 1;
8223    pub const INDEX_RBRACK: usize = 2;
8224    pub fn new_green(
8225        db: &'db dyn Database,
8226        lbrack: TerminalLBrackGreen<'db>,
8227        patterns: PatternListGreen<'db>,
8228        rbrack: TerminalRBrackGreen<'db>,
8229    ) -> PatternFixedSizeArrayGreen<'db> {
8230        let children = [lbrack.0, patterns.0, rbrack.0];
8231        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8232        PatternFixedSizeArrayGreen(
8233            GreenNode {
8234                kind: SyntaxKind::PatternFixedSizeArray,
8235                details: GreenNodeDetails::Node { children: children.into(), width },
8236            }
8237            .intern(db),
8238        )
8239    }
8240}
8241impl<'db> PatternFixedSizeArray<'db> {
8242    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
8243        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8244    }
8245    pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8246        PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8247    }
8248    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
8249        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8250    }
8251}
8252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8253pub struct PatternFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
8254impl<'db> PatternFixedSizeArrayPtr<'db> {}
8255impl<'db> TypedStablePtr<'db> for PatternFixedSizeArrayPtr<'db> {
8256    type SyntaxNode = PatternFixedSizeArray<'db>;
8257    fn untyped(self) -> SyntaxStablePtrId<'db> {
8258        self.0
8259    }
8260    fn lookup(&self, db: &'db dyn Database) -> PatternFixedSizeArray<'db> {
8261        PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8262    }
8263}
8264impl<'db> From<PatternFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
8265    fn from(ptr: PatternFixedSizeArrayPtr<'db>) -> Self {
8266        ptr.untyped()
8267    }
8268}
8269#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8270pub struct PatternFixedSizeArrayGreen<'db>(pub GreenId<'db>);
8271impl<'db> TypedSyntaxNode<'db> for PatternFixedSizeArray<'db> {
8272    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8273    type StablePtr = PatternFixedSizeArrayPtr<'db>;
8274    type Green = PatternFixedSizeArrayGreen<'db>;
8275    fn missing(db: &'db dyn Database) -> Self::Green {
8276        PatternFixedSizeArrayGreen(
8277            GreenNode {
8278                kind: SyntaxKind::PatternFixedSizeArray,
8279                details: GreenNodeDetails::Node {
8280                    children: [
8281                        TerminalLBrack::missing(db).0,
8282                        PatternList::missing(db).0,
8283                        TerminalRBrack::missing(db).0,
8284                    ]
8285                    .into(),
8286                    width: TextWidth::default(),
8287                },
8288            }
8289            .intern(db),
8290        )
8291    }
8292    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8293        let kind = node.kind(db);
8294        assert_eq!(
8295            kind,
8296            SyntaxKind::PatternFixedSizeArray,
8297            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8298            kind,
8299            SyntaxKind::PatternFixedSizeArray
8300        );
8301        Self { node }
8302    }
8303    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8304        let kind = node.kind(db);
8305        if kind == SyntaxKind::PatternFixedSizeArray {
8306            Some(Self::from_syntax_node(db, node))
8307        } else {
8308            None
8309        }
8310    }
8311    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8312        self.node
8313    }
8314    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8315        PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8316    }
8317}
8318#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8319pub struct PatternList<'db>(ElementList<'db, Pattern<'db>, 2>);
8320impl<'db> Deref for PatternList<'db> {
8321    type Target = ElementList<'db, Pattern<'db>, 2>;
8322    fn deref(&self) -> &Self::Target {
8323        &self.0
8324    }
8325}
8326impl<'db> PatternList<'db> {
8327    pub fn new_green(
8328        db: &'db dyn Database,
8329        children: &[PatternListElementOrSeparatorGreen<'db>],
8330    ) -> PatternListGreen<'db> {
8331        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8332        PatternListGreen(
8333            GreenNode {
8334                kind: SyntaxKind::PatternList,
8335                details: GreenNodeDetails::Node {
8336                    children: children.iter().map(|x| x.id()).collect(),
8337                    width,
8338                },
8339            }
8340            .intern(db),
8341        )
8342    }
8343}
8344#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8345pub struct PatternListPtr<'db>(pub SyntaxStablePtrId<'db>);
8346impl<'db> TypedStablePtr<'db> for PatternListPtr<'db> {
8347    type SyntaxNode = PatternList<'db>;
8348    fn untyped(self) -> SyntaxStablePtrId<'db> {
8349        self.0
8350    }
8351    fn lookup(&self, db: &'db dyn Database) -> PatternList<'db> {
8352        PatternList::from_syntax_node(db, self.0.lookup(db))
8353    }
8354}
8355impl<'db> From<PatternListPtr<'db>> for SyntaxStablePtrId<'db> {
8356    fn from(ptr: PatternListPtr<'db>) -> Self {
8357        ptr.untyped()
8358    }
8359}
8360#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8361pub enum PatternListElementOrSeparatorGreen<'db> {
8362    Separator(TerminalCommaGreen<'db>),
8363    Element(PatternGreen<'db>),
8364}
8365impl<'db> From<TerminalCommaGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8366    fn from(value: TerminalCommaGreen<'db>) -> Self {
8367        PatternListElementOrSeparatorGreen::Separator(value)
8368    }
8369}
8370impl<'db> From<PatternGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8371    fn from(value: PatternGreen<'db>) -> Self {
8372        PatternListElementOrSeparatorGreen::Element(value)
8373    }
8374}
8375impl<'db> PatternListElementOrSeparatorGreen<'db> {
8376    fn id(&self) -> GreenId<'db> {
8377        match self {
8378            PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8379            PatternListElementOrSeparatorGreen::Element(green) => green.0,
8380        }
8381    }
8382}
8383#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8384pub struct PatternListGreen<'db>(pub GreenId<'db>);
8385impl<'db> TypedSyntaxNode<'db> for PatternList<'db> {
8386    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8387    type StablePtr = PatternListPtr<'db>;
8388    type Green = PatternListGreen<'db>;
8389    fn missing(db: &'db dyn Database) -> Self::Green {
8390        PatternListGreen(
8391            GreenNode {
8392                kind: SyntaxKind::PatternList,
8393                details: GreenNodeDetails::Node {
8394                    children: [].into(),
8395                    width: TextWidth::default(),
8396                },
8397            }
8398            .intern(db),
8399        )
8400    }
8401    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8402        Self(ElementList::new(node))
8403    }
8404    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8405        if node.kind(db) == SyntaxKind::PatternList {
8406            Some(Self(ElementList::new(node)))
8407        } else {
8408            None
8409        }
8410    }
8411    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8412        self.node
8413    }
8414    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8415        PatternListPtr(self.node.stable_ptr(db))
8416    }
8417}
8418#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8419pub struct PatternListOr<'db>(ElementList<'db, Pattern<'db>, 2>);
8420impl<'db> Deref for PatternListOr<'db> {
8421    type Target = ElementList<'db, Pattern<'db>, 2>;
8422    fn deref(&self) -> &Self::Target {
8423        &self.0
8424    }
8425}
8426impl<'db> PatternListOr<'db> {
8427    pub fn new_green(
8428        db: &'db dyn Database,
8429        children: &[PatternListOrElementOrSeparatorGreen<'db>],
8430    ) -> PatternListOrGreen<'db> {
8431        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8432        PatternListOrGreen(
8433            GreenNode {
8434                kind: SyntaxKind::PatternListOr,
8435                details: GreenNodeDetails::Node {
8436                    children: children.iter().map(|x| x.id()).collect(),
8437                    width,
8438                },
8439            }
8440            .intern(db),
8441        )
8442    }
8443}
8444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8445pub struct PatternListOrPtr<'db>(pub SyntaxStablePtrId<'db>);
8446impl<'db> TypedStablePtr<'db> for PatternListOrPtr<'db> {
8447    type SyntaxNode = PatternListOr<'db>;
8448    fn untyped(self) -> SyntaxStablePtrId<'db> {
8449        self.0
8450    }
8451    fn lookup(&self, db: &'db dyn Database) -> PatternListOr<'db> {
8452        PatternListOr::from_syntax_node(db, self.0.lookup(db))
8453    }
8454}
8455impl<'db> From<PatternListOrPtr<'db>> for SyntaxStablePtrId<'db> {
8456    fn from(ptr: PatternListOrPtr<'db>) -> Self {
8457        ptr.untyped()
8458    }
8459}
8460#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8461pub enum PatternListOrElementOrSeparatorGreen<'db> {
8462    Separator(TerminalOrGreen<'db>),
8463    Element(PatternGreen<'db>),
8464}
8465impl<'db> From<TerminalOrGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8466    fn from(value: TerminalOrGreen<'db>) -> Self {
8467        PatternListOrElementOrSeparatorGreen::Separator(value)
8468    }
8469}
8470impl<'db> From<PatternGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8471    fn from(value: PatternGreen<'db>) -> Self {
8472        PatternListOrElementOrSeparatorGreen::Element(value)
8473    }
8474}
8475impl<'db> PatternListOrElementOrSeparatorGreen<'db> {
8476    fn id(&self) -> GreenId<'db> {
8477        match self {
8478            PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8479            PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8480        }
8481    }
8482}
8483#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8484pub struct PatternListOrGreen<'db>(pub GreenId<'db>);
8485impl<'db> TypedSyntaxNode<'db> for PatternListOr<'db> {
8486    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8487    type StablePtr = PatternListOrPtr<'db>;
8488    type Green = PatternListOrGreen<'db>;
8489    fn missing(db: &'db dyn Database) -> Self::Green {
8490        PatternListOrGreen(
8491            GreenNode {
8492                kind: SyntaxKind::PatternListOr,
8493                details: GreenNodeDetails::Node {
8494                    children: [].into(),
8495                    width: TextWidth::default(),
8496                },
8497            }
8498            .intern(db),
8499        )
8500    }
8501    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8502        Self(ElementList::new(node))
8503    }
8504    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8505        if node.kind(db) == SyntaxKind::PatternListOr {
8506            Some(Self(ElementList::new(node)))
8507        } else {
8508            None
8509        }
8510    }
8511    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8512        self.node
8513    }
8514    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8515        PatternListOrPtr(self.node.stable_ptr(db))
8516    }
8517}
8518#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8519pub enum PatternStructParam<'db> {
8520    Single(PatternIdentifier<'db>),
8521    WithExpr(PatternStructParamWithExpr<'db>),
8522    Tail(TerminalDotDot<'db>),
8523}
8524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8525pub struct PatternStructParamPtr<'db>(pub SyntaxStablePtrId<'db>);
8526impl<'db> TypedStablePtr<'db> for PatternStructParamPtr<'db> {
8527    type SyntaxNode = PatternStructParam<'db>;
8528    fn untyped(self) -> SyntaxStablePtrId<'db> {
8529        self.0
8530    }
8531    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8532        PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8533    }
8534}
8535impl<'db> From<PatternStructParamPtr<'db>> for SyntaxStablePtrId<'db> {
8536    fn from(ptr: PatternStructParamPtr<'db>) -> Self {
8537        ptr.untyped()
8538    }
8539}
8540impl<'db> From<PatternIdentifierPtr<'db>> for PatternStructParamPtr<'db> {
8541    fn from(value: PatternIdentifierPtr<'db>) -> Self {
8542        Self(value.0)
8543    }
8544}
8545impl<'db> From<PatternStructParamWithExprPtr<'db>> for PatternStructParamPtr<'db> {
8546    fn from(value: PatternStructParamWithExprPtr<'db>) -> Self {
8547        Self(value.0)
8548    }
8549}
8550impl<'db> From<TerminalDotDotPtr<'db>> for PatternStructParamPtr<'db> {
8551    fn from(value: TerminalDotDotPtr<'db>) -> Self {
8552        Self(value.0)
8553    }
8554}
8555impl<'db> From<PatternIdentifierGreen<'db>> for PatternStructParamGreen<'db> {
8556    fn from(value: PatternIdentifierGreen<'db>) -> Self {
8557        Self(value.0)
8558    }
8559}
8560impl<'db> From<PatternStructParamWithExprGreen<'db>> for PatternStructParamGreen<'db> {
8561    fn from(value: PatternStructParamWithExprGreen<'db>) -> Self {
8562        Self(value.0)
8563    }
8564}
8565impl<'db> From<TerminalDotDotGreen<'db>> for PatternStructParamGreen<'db> {
8566    fn from(value: TerminalDotDotGreen<'db>) -> Self {
8567        Self(value.0)
8568    }
8569}
8570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8571pub struct PatternStructParamGreen<'db>(pub GreenId<'db>);
8572impl<'db> TypedSyntaxNode<'db> for PatternStructParam<'db> {
8573    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8574    type StablePtr = PatternStructParamPtr<'db>;
8575    type Green = PatternStructParamGreen<'db>;
8576    fn missing(db: &'db dyn Database) -> Self::Green {
8577        panic!("No missing variant.");
8578    }
8579    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8580        let kind = node.kind(db);
8581        match kind {
8582            SyntaxKind::PatternIdentifier => {
8583                PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8584            }
8585            SyntaxKind::PatternStructParamWithExpr => {
8586                PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8587            }
8588            SyntaxKind::TerminalDotDot => {
8589                PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8590            }
8591            _ => panic!(
8592                "Unexpected syntax kind {:?} when constructing {}.",
8593                kind, "PatternStructParam"
8594            ),
8595        }
8596    }
8597    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8598        let kind = node.kind(db);
8599        match kind {
8600            SyntaxKind::PatternIdentifier => {
8601                Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8602            }
8603            SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8604                PatternStructParamWithExpr::from_syntax_node(db, node),
8605            )),
8606            SyntaxKind::TerminalDotDot => {
8607                Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8608            }
8609            _ => None,
8610        }
8611    }
8612    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8613        match self {
8614            PatternStructParam::Single(x) => x.as_syntax_node(),
8615            PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8616            PatternStructParam::Tail(x) => x.as_syntax_node(),
8617        }
8618    }
8619    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8620        PatternStructParamPtr(self.as_syntax_node().stable_ptr(db))
8621    }
8622}
8623impl<'db> PatternStructParam<'db> {
8624    /// Checks if a kind of a variant of [PatternStructParam].
8625    pub fn is_variant(kind: SyntaxKind) -> bool {
8626        matches!(
8627            kind,
8628            SyntaxKind::PatternIdentifier
8629                | SyntaxKind::PatternStructParamWithExpr
8630                | SyntaxKind::TerminalDotDot
8631        )
8632    }
8633}
8634#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8635pub struct PatternStructParamWithExpr<'db> {
8636    node: SyntaxNode<'db>,
8637}
8638impl<'db> PatternStructParamWithExpr<'db> {
8639    pub const INDEX_MODIFIERS: usize = 0;
8640    pub const INDEX_NAME: usize = 1;
8641    pub const INDEX_COLON: usize = 2;
8642    pub const INDEX_PATTERN: usize = 3;
8643    pub fn new_green(
8644        db: &'db dyn Database,
8645        modifiers: ModifierListGreen<'db>,
8646        name: TerminalIdentifierGreen<'db>,
8647        colon: TerminalColonGreen<'db>,
8648        pattern: PatternGreen<'db>,
8649    ) -> PatternStructParamWithExprGreen<'db> {
8650        let children = [modifiers.0, name.0, colon.0, pattern.0];
8651        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8652        PatternStructParamWithExprGreen(
8653            GreenNode {
8654                kind: SyntaxKind::PatternStructParamWithExpr,
8655                details: GreenNodeDetails::Node { children: children.into(), width },
8656            }
8657            .intern(db),
8658        )
8659    }
8660}
8661impl<'db> PatternStructParamWithExpr<'db> {
8662    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
8663        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8664    }
8665    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
8666        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8667    }
8668    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
8669        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8670    }
8671    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8672        Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8673    }
8674}
8675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8676pub struct PatternStructParamWithExprPtr<'db>(pub SyntaxStablePtrId<'db>);
8677impl<'db> PatternStructParamWithExprPtr<'db> {}
8678impl<'db> TypedStablePtr<'db> for PatternStructParamWithExprPtr<'db> {
8679    type SyntaxNode = PatternStructParamWithExpr<'db>;
8680    fn untyped(self) -> SyntaxStablePtrId<'db> {
8681        self.0
8682    }
8683    fn lookup(&self, db: &'db dyn Database) -> PatternStructParamWithExpr<'db> {
8684        PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8685    }
8686}
8687impl<'db> From<PatternStructParamWithExprPtr<'db>> for SyntaxStablePtrId<'db> {
8688    fn from(ptr: PatternStructParamWithExprPtr<'db>) -> Self {
8689        ptr.untyped()
8690    }
8691}
8692#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8693pub struct PatternStructParamWithExprGreen<'db>(pub GreenId<'db>);
8694impl<'db> TypedSyntaxNode<'db> for PatternStructParamWithExpr<'db> {
8695    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8696    type StablePtr = PatternStructParamWithExprPtr<'db>;
8697    type Green = PatternStructParamWithExprGreen<'db>;
8698    fn missing(db: &'db dyn Database) -> Self::Green {
8699        PatternStructParamWithExprGreen(
8700            GreenNode {
8701                kind: SyntaxKind::PatternStructParamWithExpr,
8702                details: GreenNodeDetails::Node {
8703                    children: [
8704                        ModifierList::missing(db).0,
8705                        TerminalIdentifier::missing(db).0,
8706                        TerminalColon::missing(db).0,
8707                        Pattern::missing(db).0,
8708                    ]
8709                    .into(),
8710                    width: TextWidth::default(),
8711                },
8712            }
8713            .intern(db),
8714        )
8715    }
8716    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8717        let kind = node.kind(db);
8718        assert_eq!(
8719            kind,
8720            SyntaxKind::PatternStructParamWithExpr,
8721            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8722            kind,
8723            SyntaxKind::PatternStructParamWithExpr
8724        );
8725        Self { node }
8726    }
8727    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8728        let kind = node.kind(db);
8729        if kind == SyntaxKind::PatternStructParamWithExpr {
8730            Some(Self::from_syntax_node(db, node))
8731        } else {
8732            None
8733        }
8734    }
8735    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8736        self.node
8737    }
8738    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8739        PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8740    }
8741}
8742#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8743pub struct PatternEnum<'db> {
8744    node: SyntaxNode<'db>,
8745}
8746impl<'db> PatternEnum<'db> {
8747    pub const INDEX_PATH: usize = 0;
8748    pub const INDEX_PATTERN: usize = 1;
8749    pub fn new_green(
8750        db: &'db dyn Database,
8751        path: ExprPathGreen<'db>,
8752        pattern: OptionPatternEnumInnerPatternGreen<'db>,
8753    ) -> PatternEnumGreen<'db> {
8754        let children = [path.0, pattern.0];
8755        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8756        PatternEnumGreen(
8757            GreenNode {
8758                kind: SyntaxKind::PatternEnum,
8759                details: GreenNodeDetails::Node { children: children.into(), width },
8760            }
8761            .intern(db),
8762        )
8763    }
8764}
8765impl<'db> PatternEnum<'db> {
8766    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8767        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8768    }
8769    pub fn pattern(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPattern<'db> {
8770        OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8771    }
8772}
8773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8774pub struct PatternEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
8775impl<'db> PatternEnumPtr<'db> {}
8776impl<'db> TypedStablePtr<'db> for PatternEnumPtr<'db> {
8777    type SyntaxNode = PatternEnum<'db>;
8778    fn untyped(self) -> SyntaxStablePtrId<'db> {
8779        self.0
8780    }
8781    fn lookup(&self, db: &'db dyn Database) -> PatternEnum<'db> {
8782        PatternEnum::from_syntax_node(db, self.0.lookup(db))
8783    }
8784}
8785impl<'db> From<PatternEnumPtr<'db>> for SyntaxStablePtrId<'db> {
8786    fn from(ptr: PatternEnumPtr<'db>) -> Self {
8787        ptr.untyped()
8788    }
8789}
8790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8791pub struct PatternEnumGreen<'db>(pub GreenId<'db>);
8792impl<'db> TypedSyntaxNode<'db> for PatternEnum<'db> {
8793    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8794    type StablePtr = PatternEnumPtr<'db>;
8795    type Green = PatternEnumGreen<'db>;
8796    fn missing(db: &'db dyn Database) -> Self::Green {
8797        PatternEnumGreen(
8798            GreenNode {
8799                kind: SyntaxKind::PatternEnum,
8800                details: GreenNodeDetails::Node {
8801                    children: [
8802                        ExprPath::missing(db).0,
8803                        OptionPatternEnumInnerPattern::missing(db).0,
8804                    ]
8805                    .into(),
8806                    width: TextWidth::default(),
8807                },
8808            }
8809            .intern(db),
8810        )
8811    }
8812    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8813        let kind = node.kind(db);
8814        assert_eq!(
8815            kind,
8816            SyntaxKind::PatternEnum,
8817            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8818            kind,
8819            SyntaxKind::PatternEnum
8820        );
8821        Self { node }
8822    }
8823    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8824        let kind = node.kind(db);
8825        if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8826    }
8827    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8828        self.node
8829    }
8830    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8831        PatternEnumPtr(self.node.stable_ptr(db))
8832    }
8833}
8834#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8835pub struct PatternEnumInnerPattern<'db> {
8836    node: SyntaxNode<'db>,
8837}
8838impl<'db> PatternEnumInnerPattern<'db> {
8839    pub const INDEX_LPAREN: usize = 0;
8840    pub const INDEX_PATTERN: usize = 1;
8841    pub const INDEX_RPAREN: usize = 2;
8842    pub fn new_green(
8843        db: &'db dyn Database,
8844        lparen: TerminalLParenGreen<'db>,
8845        pattern: PatternGreen<'db>,
8846        rparen: TerminalRParenGreen<'db>,
8847    ) -> PatternEnumInnerPatternGreen<'db> {
8848        let children = [lparen.0, pattern.0, rparen.0];
8849        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8850        PatternEnumInnerPatternGreen(
8851            GreenNode {
8852                kind: SyntaxKind::PatternEnumInnerPattern,
8853                details: GreenNodeDetails::Node { children: children.into(), width },
8854            }
8855            .intern(db),
8856        )
8857    }
8858}
8859impl<'db> PatternEnumInnerPattern<'db> {
8860    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8861        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8862    }
8863    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8864        Pattern::from_syntax_node(db, self.node.get_children(db)[1])
8865    }
8866    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8867        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8868    }
8869}
8870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8871pub struct PatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8872impl<'db> PatternEnumInnerPatternPtr<'db> {}
8873impl<'db> TypedStablePtr<'db> for PatternEnumInnerPatternPtr<'db> {
8874    type SyntaxNode = PatternEnumInnerPattern<'db>;
8875    fn untyped(self) -> SyntaxStablePtrId<'db> {
8876        self.0
8877    }
8878    fn lookup(&self, db: &'db dyn Database) -> PatternEnumInnerPattern<'db> {
8879        PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8880    }
8881}
8882impl<'db> From<PatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8883    fn from(ptr: PatternEnumInnerPatternPtr<'db>) -> Self {
8884        ptr.untyped()
8885    }
8886}
8887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8888pub struct PatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8889impl<'db> TypedSyntaxNode<'db> for PatternEnumInnerPattern<'db> {
8890    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
8891    type StablePtr = PatternEnumInnerPatternPtr<'db>;
8892    type Green = PatternEnumInnerPatternGreen<'db>;
8893    fn missing(db: &'db dyn Database) -> Self::Green {
8894        PatternEnumInnerPatternGreen(
8895            GreenNode {
8896                kind: SyntaxKind::PatternEnumInnerPattern,
8897                details: GreenNodeDetails::Node {
8898                    children: [
8899                        TerminalLParen::missing(db).0,
8900                        Pattern::missing(db).0,
8901                        TerminalRParen::missing(db).0,
8902                    ]
8903                    .into(),
8904                    width: TextWidth::default(),
8905                },
8906            }
8907            .intern(db),
8908        )
8909    }
8910    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8911        let kind = node.kind(db);
8912        assert_eq!(
8913            kind,
8914            SyntaxKind::PatternEnumInnerPattern,
8915            "Unexpected SyntaxKind {:?}. Expected {:?}.",
8916            kind,
8917            SyntaxKind::PatternEnumInnerPattern
8918        );
8919        Self { node }
8920    }
8921    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8922        let kind = node.kind(db);
8923        if kind == SyntaxKind::PatternEnumInnerPattern {
8924            Some(Self::from_syntax_node(db, node))
8925        } else {
8926            None
8927        }
8928    }
8929    fn as_syntax_node(&self) -> SyntaxNode<'db> {
8930        self.node
8931    }
8932    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8933        PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
8934    }
8935}
8936#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8937pub enum OptionPatternEnumInnerPattern<'db> {
8938    Empty(OptionPatternEnumInnerPatternEmpty<'db>),
8939    PatternEnumInnerPattern(PatternEnumInnerPattern<'db>),
8940}
8941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
8942pub struct OptionPatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8943impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternPtr<'db> {
8944    type SyntaxNode = OptionPatternEnumInnerPattern<'db>;
8945    fn untyped(self) -> SyntaxStablePtrId<'db> {
8946        self.0
8947    }
8948    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8949        OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8950    }
8951}
8952impl<'db> From<OptionPatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8953    fn from(ptr: OptionPatternEnumInnerPatternPtr<'db>) -> Self {
8954        ptr.untyped()
8955    }
8956}
8957impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>>
8958    for OptionPatternEnumInnerPatternPtr<'db>
8959{
8960    fn from(value: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
8961        Self(value.0)
8962    }
8963}
8964impl<'db> From<PatternEnumInnerPatternPtr<'db>> for OptionPatternEnumInnerPatternPtr<'db> {
8965    fn from(value: PatternEnumInnerPatternPtr<'db>) -> Self {
8966        Self(value.0)
8967    }
8968}
8969impl<'db> From<OptionPatternEnumInnerPatternEmptyGreen<'db>>
8970    for OptionPatternEnumInnerPatternGreen<'db>
8971{
8972    fn from(value: OptionPatternEnumInnerPatternEmptyGreen<'db>) -> Self {
8973        Self(value.0)
8974    }
8975}
8976impl<'db> From<PatternEnumInnerPatternGreen<'db>> for OptionPatternEnumInnerPatternGreen<'db> {
8977    fn from(value: PatternEnumInnerPatternGreen<'db>) -> Self {
8978        Self(value.0)
8979    }
8980}
8981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8982pub struct OptionPatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8983impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPattern<'db> {
8984    const OPTIONAL_KIND: Option<SyntaxKind> = None;
8985    type StablePtr = OptionPatternEnumInnerPatternPtr<'db>;
8986    type Green = OptionPatternEnumInnerPatternGreen<'db>;
8987    fn missing(db: &'db dyn Database) -> Self::Green {
8988        panic!("No missing variant.");
8989    }
8990    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8991        let kind = node.kind(db);
8992        match kind {
8993            SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
8994                OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
8995            ),
8996            SyntaxKind::PatternEnumInnerPattern => {
8997                OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
8998                    PatternEnumInnerPattern::from_syntax_node(db, node),
8999                )
9000            }
9001            _ => panic!(
9002                "Unexpected syntax kind {:?} when constructing {}.",
9003                kind, "OptionPatternEnumInnerPattern"
9004            ),
9005        }
9006    }
9007    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9008        let kind = node.kind(db);
9009        match kind {
9010            SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9011                Some(OptionPatternEnumInnerPattern::Empty(
9012                    OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9013                ))
9014            }
9015            SyntaxKind::PatternEnumInnerPattern => {
9016                Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9017                    PatternEnumInnerPattern::from_syntax_node(db, node),
9018                ))
9019            }
9020            _ => None,
9021        }
9022    }
9023    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9024        match self {
9025            OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9026            OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9027        }
9028    }
9029    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9030        OptionPatternEnumInnerPatternPtr(self.as_syntax_node().stable_ptr(db))
9031    }
9032}
9033impl<'db> OptionPatternEnumInnerPattern<'db> {
9034    /// Checks if a kind of a variant of [OptionPatternEnumInnerPattern].
9035    pub fn is_variant(kind: SyntaxKind) -> bool {
9036        matches!(
9037            kind,
9038            SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9039        )
9040    }
9041}
9042#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9043pub struct OptionPatternEnumInnerPatternEmpty<'db> {
9044    node: SyntaxNode<'db>,
9045}
9046impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {
9047    pub fn new_green(db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmptyGreen<'db> {
9048        let children = [];
9049        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9050        OptionPatternEnumInnerPatternEmptyGreen(
9051            GreenNode {
9052                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9053                details: GreenNodeDetails::Node { children: children.into(), width },
9054            }
9055            .intern(db),
9056        )
9057    }
9058}
9059impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {}
9060#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9061pub struct OptionPatternEnumInnerPatternEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9062impl<'db> OptionPatternEnumInnerPatternEmptyPtr<'db> {}
9063impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternEmptyPtr<'db> {
9064    type SyntaxNode = OptionPatternEnumInnerPatternEmpty<'db>;
9065    fn untyped(self) -> SyntaxStablePtrId<'db> {
9066        self.0
9067    }
9068    fn lookup(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmpty<'db> {
9069        OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9070    }
9071}
9072impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9073    fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9074        ptr.untyped()
9075    }
9076}
9077#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9078pub struct OptionPatternEnumInnerPatternEmptyGreen<'db>(pub GreenId<'db>);
9079impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPatternEmpty<'db> {
9080    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9081    type StablePtr = OptionPatternEnumInnerPatternEmptyPtr<'db>;
9082    type Green = OptionPatternEnumInnerPatternEmptyGreen<'db>;
9083    fn missing(db: &'db dyn Database) -> Self::Green {
9084        OptionPatternEnumInnerPatternEmptyGreen(
9085            GreenNode {
9086                kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9087                details: GreenNodeDetails::Node {
9088                    children: [].into(),
9089                    width: TextWidth::default(),
9090                },
9091            }
9092            .intern(db),
9093        )
9094    }
9095    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9096        let kind = node.kind(db);
9097        assert_eq!(
9098            kind,
9099            SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9100            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9101            kind,
9102            SyntaxKind::OptionPatternEnumInnerPatternEmpty
9103        );
9104        Self { node }
9105    }
9106    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9107        let kind = node.kind(db);
9108        if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9109            Some(Self::from_syntax_node(db, node))
9110        } else {
9111            None
9112        }
9113    }
9114    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9115        self.node
9116    }
9117    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9118        OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9119    }
9120}
9121#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9122pub struct TypeClause<'db> {
9123    node: SyntaxNode<'db>,
9124}
9125impl<'db> TypeClause<'db> {
9126    pub const INDEX_COLON: usize = 0;
9127    pub const INDEX_TY: usize = 1;
9128    pub fn new_green(
9129        db: &'db dyn Database,
9130        colon: TerminalColonGreen<'db>,
9131        ty: ExprGreen<'db>,
9132    ) -> TypeClauseGreen<'db> {
9133        let children = [colon.0, ty.0];
9134        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9135        TypeClauseGreen(
9136            GreenNode {
9137                kind: SyntaxKind::TypeClause,
9138                details: GreenNodeDetails::Node { children: children.into(), width },
9139            }
9140            .intern(db),
9141        )
9142    }
9143}
9144impl<'db> TypeClause<'db> {
9145    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
9146        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9147    }
9148    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9149        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9150    }
9151}
9152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9153pub struct TypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9154impl<'db> TypeClausePtr<'db> {}
9155impl<'db> TypedStablePtr<'db> for TypeClausePtr<'db> {
9156    type SyntaxNode = TypeClause<'db>;
9157    fn untyped(self) -> SyntaxStablePtrId<'db> {
9158        self.0
9159    }
9160    fn lookup(&self, db: &'db dyn Database) -> TypeClause<'db> {
9161        TypeClause::from_syntax_node(db, self.0.lookup(db))
9162    }
9163}
9164impl<'db> From<TypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9165    fn from(ptr: TypeClausePtr<'db>) -> Self {
9166        ptr.untyped()
9167    }
9168}
9169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9170pub struct TypeClauseGreen<'db>(pub GreenId<'db>);
9171impl<'db> TypedSyntaxNode<'db> for TypeClause<'db> {
9172    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9173    type StablePtr = TypeClausePtr<'db>;
9174    type Green = TypeClauseGreen<'db>;
9175    fn missing(db: &'db dyn Database) -> Self::Green {
9176        TypeClauseGreen(
9177            GreenNode {
9178                kind: SyntaxKind::TypeClause,
9179                details: GreenNodeDetails::Node {
9180                    children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9181                    width: TextWidth::default(),
9182                },
9183            }
9184            .intern(db),
9185        )
9186    }
9187    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9188        let kind = node.kind(db);
9189        assert_eq!(
9190            kind,
9191            SyntaxKind::TypeClause,
9192            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9193            kind,
9194            SyntaxKind::TypeClause
9195        );
9196        Self { node }
9197    }
9198    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9199        let kind = node.kind(db);
9200        if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9201    }
9202    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9203        self.node
9204    }
9205    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9206        TypeClausePtr(self.node.stable_ptr(db))
9207    }
9208}
9209#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9210pub enum OptionTypeClause<'db> {
9211    Empty(OptionTypeClauseEmpty<'db>),
9212    TypeClause(TypeClause<'db>),
9213}
9214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9215pub struct OptionTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9216impl<'db> TypedStablePtr<'db> for OptionTypeClausePtr<'db> {
9217    type SyntaxNode = OptionTypeClause<'db>;
9218    fn untyped(self) -> SyntaxStablePtrId<'db> {
9219        self.0
9220    }
9221    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9222        OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9223    }
9224}
9225impl<'db> From<OptionTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9226    fn from(ptr: OptionTypeClausePtr<'db>) -> Self {
9227        ptr.untyped()
9228    }
9229}
9230impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for OptionTypeClausePtr<'db> {
9231    fn from(value: OptionTypeClauseEmptyPtr<'db>) -> Self {
9232        Self(value.0)
9233    }
9234}
9235impl<'db> From<TypeClausePtr<'db>> for OptionTypeClausePtr<'db> {
9236    fn from(value: TypeClausePtr<'db>) -> Self {
9237        Self(value.0)
9238    }
9239}
9240impl<'db> From<OptionTypeClauseEmptyGreen<'db>> for OptionTypeClauseGreen<'db> {
9241    fn from(value: OptionTypeClauseEmptyGreen<'db>) -> Self {
9242        Self(value.0)
9243    }
9244}
9245impl<'db> From<TypeClauseGreen<'db>> for OptionTypeClauseGreen<'db> {
9246    fn from(value: TypeClauseGreen<'db>) -> Self {
9247        Self(value.0)
9248    }
9249}
9250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9251pub struct OptionTypeClauseGreen<'db>(pub GreenId<'db>);
9252impl<'db> TypedSyntaxNode<'db> for OptionTypeClause<'db> {
9253    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9254    type StablePtr = OptionTypeClausePtr<'db>;
9255    type Green = OptionTypeClauseGreen<'db>;
9256    fn missing(db: &'db dyn Database) -> Self::Green {
9257        panic!("No missing variant.");
9258    }
9259    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9260        let kind = node.kind(db);
9261        match kind {
9262            SyntaxKind::OptionTypeClauseEmpty => {
9263                OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9264            }
9265            SyntaxKind::TypeClause => {
9266                OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9267            }
9268            _ => panic!(
9269                "Unexpected syntax kind {:?} when constructing {}.",
9270                kind, "OptionTypeClause"
9271            ),
9272        }
9273    }
9274    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9275        let kind = node.kind(db);
9276        match kind {
9277            SyntaxKind::OptionTypeClauseEmpty => {
9278                Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9279            }
9280            SyntaxKind::TypeClause => {
9281                Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9282            }
9283            _ => None,
9284        }
9285    }
9286    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9287        match self {
9288            OptionTypeClause::Empty(x) => x.as_syntax_node(),
9289            OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9290        }
9291    }
9292    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9293        OptionTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9294    }
9295}
9296impl<'db> OptionTypeClause<'db> {
9297    /// Checks if a kind of a variant of [OptionTypeClause].
9298    pub fn is_variant(kind: SyntaxKind) -> bool {
9299        matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9300    }
9301}
9302#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9303pub struct OptionTypeClauseEmpty<'db> {
9304    node: SyntaxNode<'db>,
9305}
9306impl<'db> OptionTypeClauseEmpty<'db> {
9307    pub fn new_green(db: &'db dyn Database) -> OptionTypeClauseEmptyGreen<'db> {
9308        let children = [];
9309        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9310        OptionTypeClauseEmptyGreen(
9311            GreenNode {
9312                kind: SyntaxKind::OptionTypeClauseEmpty,
9313                details: GreenNodeDetails::Node { children: children.into(), width },
9314            }
9315            .intern(db),
9316        )
9317    }
9318}
9319impl<'db> OptionTypeClauseEmpty<'db> {}
9320#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9321pub struct OptionTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9322impl<'db> OptionTypeClauseEmptyPtr<'db> {}
9323impl<'db> TypedStablePtr<'db> for OptionTypeClauseEmptyPtr<'db> {
9324    type SyntaxNode = OptionTypeClauseEmpty<'db>;
9325    fn untyped(self) -> SyntaxStablePtrId<'db> {
9326        self.0
9327    }
9328    fn lookup(&self, db: &'db dyn Database) -> OptionTypeClauseEmpty<'db> {
9329        OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9330    }
9331}
9332impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9333    fn from(ptr: OptionTypeClauseEmptyPtr<'db>) -> Self {
9334        ptr.untyped()
9335    }
9336}
9337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9338pub struct OptionTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9339impl<'db> TypedSyntaxNode<'db> for OptionTypeClauseEmpty<'db> {
9340    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9341    type StablePtr = OptionTypeClauseEmptyPtr<'db>;
9342    type Green = OptionTypeClauseEmptyGreen<'db>;
9343    fn missing(db: &'db dyn Database) -> Self::Green {
9344        OptionTypeClauseEmptyGreen(
9345            GreenNode {
9346                kind: SyntaxKind::OptionTypeClauseEmpty,
9347                details: GreenNodeDetails::Node {
9348                    children: [].into(),
9349                    width: TextWidth::default(),
9350                },
9351            }
9352            .intern(db),
9353        )
9354    }
9355    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9356        let kind = node.kind(db);
9357        assert_eq!(
9358            kind,
9359            SyntaxKind::OptionTypeClauseEmpty,
9360            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9361            kind,
9362            SyntaxKind::OptionTypeClauseEmpty
9363        );
9364        Self { node }
9365    }
9366    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9367        let kind = node.kind(db);
9368        if kind == SyntaxKind::OptionTypeClauseEmpty {
9369            Some(Self::from_syntax_node(db, node))
9370        } else {
9371            None
9372        }
9373    }
9374    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9375        self.node
9376    }
9377    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9378        OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9379    }
9380}
9381#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9382pub struct ReturnTypeClause<'db> {
9383    node: SyntaxNode<'db>,
9384}
9385impl<'db> ReturnTypeClause<'db> {
9386    pub const INDEX_ARROW: usize = 0;
9387    pub const INDEX_TY: usize = 1;
9388    pub fn new_green(
9389        db: &'db dyn Database,
9390        arrow: TerminalArrowGreen<'db>,
9391        ty: ExprGreen<'db>,
9392    ) -> ReturnTypeClauseGreen<'db> {
9393        let children = [arrow.0, ty.0];
9394        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9395        ReturnTypeClauseGreen(
9396            GreenNode {
9397                kind: SyntaxKind::ReturnTypeClause,
9398                details: GreenNodeDetails::Node { children: children.into(), width },
9399            }
9400            .intern(db),
9401        )
9402    }
9403}
9404impl<'db> ReturnTypeClause<'db> {
9405    pub fn arrow(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
9406        TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9407    }
9408    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9409        Expr::from_syntax_node(db, self.node.get_children(db)[1])
9410    }
9411}
9412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9413pub struct ReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9414impl<'db> ReturnTypeClausePtr<'db> {}
9415impl<'db> TypedStablePtr<'db> for ReturnTypeClausePtr<'db> {
9416    type SyntaxNode = ReturnTypeClause<'db>;
9417    fn untyped(self) -> SyntaxStablePtrId<'db> {
9418        self.0
9419    }
9420    fn lookup(&self, db: &'db dyn Database) -> ReturnTypeClause<'db> {
9421        ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9422    }
9423}
9424impl<'db> From<ReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9425    fn from(ptr: ReturnTypeClausePtr<'db>) -> Self {
9426        ptr.untyped()
9427    }
9428}
9429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9430pub struct ReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9431impl<'db> TypedSyntaxNode<'db> for ReturnTypeClause<'db> {
9432    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9433    type StablePtr = ReturnTypeClausePtr<'db>;
9434    type Green = ReturnTypeClauseGreen<'db>;
9435    fn missing(db: &'db dyn Database) -> Self::Green {
9436        ReturnTypeClauseGreen(
9437            GreenNode {
9438                kind: SyntaxKind::ReturnTypeClause,
9439                details: GreenNodeDetails::Node {
9440                    children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9441                    width: TextWidth::default(),
9442                },
9443            }
9444            .intern(db),
9445        )
9446    }
9447    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9448        let kind = node.kind(db);
9449        assert_eq!(
9450            kind,
9451            SyntaxKind::ReturnTypeClause,
9452            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9453            kind,
9454            SyntaxKind::ReturnTypeClause
9455        );
9456        Self { node }
9457    }
9458    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9459        let kind = node.kind(db);
9460        if kind == SyntaxKind::ReturnTypeClause {
9461            Some(Self::from_syntax_node(db, node))
9462        } else {
9463            None
9464        }
9465    }
9466    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9467        self.node
9468    }
9469    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9470        ReturnTypeClausePtr(self.node.stable_ptr(db))
9471    }
9472}
9473#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9474pub enum OptionReturnTypeClause<'db> {
9475    Empty(OptionReturnTypeClauseEmpty<'db>),
9476    ReturnTypeClause(ReturnTypeClause<'db>),
9477}
9478#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9479pub struct OptionReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9480impl<'db> TypedStablePtr<'db> for OptionReturnTypeClausePtr<'db> {
9481    type SyntaxNode = OptionReturnTypeClause<'db>;
9482    fn untyped(self) -> SyntaxStablePtrId<'db> {
9483        self.0
9484    }
9485    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9486        OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9487    }
9488}
9489impl<'db> From<OptionReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9490    fn from(ptr: OptionReturnTypeClausePtr<'db>) -> Self {
9491        ptr.untyped()
9492    }
9493}
9494impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for OptionReturnTypeClausePtr<'db> {
9495    fn from(value: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9496        Self(value.0)
9497    }
9498}
9499impl<'db> From<ReturnTypeClausePtr<'db>> for OptionReturnTypeClausePtr<'db> {
9500    fn from(value: ReturnTypeClausePtr<'db>) -> Self {
9501        Self(value.0)
9502    }
9503}
9504impl<'db> From<OptionReturnTypeClauseEmptyGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9505    fn from(value: OptionReturnTypeClauseEmptyGreen<'db>) -> Self {
9506        Self(value.0)
9507    }
9508}
9509impl<'db> From<ReturnTypeClauseGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9510    fn from(value: ReturnTypeClauseGreen<'db>) -> Self {
9511        Self(value.0)
9512    }
9513}
9514#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9515pub struct OptionReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9516impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClause<'db> {
9517    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9518    type StablePtr = OptionReturnTypeClausePtr<'db>;
9519    type Green = OptionReturnTypeClauseGreen<'db>;
9520    fn missing(db: &'db dyn Database) -> Self::Green {
9521        panic!("No missing variant.");
9522    }
9523    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9524        let kind = node.kind(db);
9525        match kind {
9526            SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9527                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9528            ),
9529            SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9530                ReturnTypeClause::from_syntax_node(db, node),
9531            ),
9532            _ => panic!(
9533                "Unexpected syntax kind {:?} when constructing {}.",
9534                kind, "OptionReturnTypeClause"
9535            ),
9536        }
9537    }
9538    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9539        let kind = node.kind(db);
9540        match kind {
9541            SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9542                OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9543            )),
9544            SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9545                ReturnTypeClause::from_syntax_node(db, node),
9546            )),
9547            _ => None,
9548        }
9549    }
9550    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9551        match self {
9552            OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9553            OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9554        }
9555    }
9556    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9557        OptionReturnTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9558    }
9559}
9560impl<'db> OptionReturnTypeClause<'db> {
9561    /// Checks if a kind of a variant of [OptionReturnTypeClause].
9562    pub fn is_variant(kind: SyntaxKind) -> bool {
9563        matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9564    }
9565}
9566#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9567pub struct OptionReturnTypeClauseEmpty<'db> {
9568    node: SyntaxNode<'db>,
9569}
9570impl<'db> OptionReturnTypeClauseEmpty<'db> {
9571    pub fn new_green(db: &'db dyn Database) -> OptionReturnTypeClauseEmptyGreen<'db> {
9572        let children = [];
9573        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9574        OptionReturnTypeClauseEmptyGreen(
9575            GreenNode {
9576                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9577                details: GreenNodeDetails::Node { children: children.into(), width },
9578            }
9579            .intern(db),
9580        )
9581    }
9582}
9583impl<'db> OptionReturnTypeClauseEmpty<'db> {}
9584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9585pub struct OptionReturnTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9586impl<'db> OptionReturnTypeClauseEmptyPtr<'db> {}
9587impl<'db> TypedStablePtr<'db> for OptionReturnTypeClauseEmptyPtr<'db> {
9588    type SyntaxNode = OptionReturnTypeClauseEmpty<'db>;
9589    fn untyped(self) -> SyntaxStablePtrId<'db> {
9590        self.0
9591    }
9592    fn lookup(&self, db: &'db dyn Database) -> OptionReturnTypeClauseEmpty<'db> {
9593        OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9594    }
9595}
9596impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9597    fn from(ptr: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9598        ptr.untyped()
9599    }
9600}
9601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9602pub struct OptionReturnTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9603impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClauseEmpty<'db> {
9604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9605    type StablePtr = OptionReturnTypeClauseEmptyPtr<'db>;
9606    type Green = OptionReturnTypeClauseEmptyGreen<'db>;
9607    fn missing(db: &'db dyn Database) -> Self::Green {
9608        OptionReturnTypeClauseEmptyGreen(
9609            GreenNode {
9610                kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9611                details: GreenNodeDetails::Node {
9612                    children: [].into(),
9613                    width: TextWidth::default(),
9614                },
9615            }
9616            .intern(db),
9617        )
9618    }
9619    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9620        let kind = node.kind(db);
9621        assert_eq!(
9622            kind,
9623            SyntaxKind::OptionReturnTypeClauseEmpty,
9624            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9625            kind,
9626            SyntaxKind::OptionReturnTypeClauseEmpty
9627        );
9628        Self { node }
9629    }
9630    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9631        let kind = node.kind(db);
9632        if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9633            Some(Self::from_syntax_node(db, node))
9634        } else {
9635            None
9636        }
9637    }
9638    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9639        self.node
9640    }
9641    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9642        OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9643    }
9644}
9645#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9646pub enum Statement<'db> {
9647    Let(StatementLet<'db>),
9648    Expr(StatementExpr<'db>),
9649    Continue(StatementContinue<'db>),
9650    Return(StatementReturn<'db>),
9651    Break(StatementBreak<'db>),
9652    Item(StatementItem<'db>),
9653    Missing(StatementMissing<'db>),
9654}
9655#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9656pub struct StatementPtr<'db>(pub SyntaxStablePtrId<'db>);
9657impl<'db> TypedStablePtr<'db> for StatementPtr<'db> {
9658    type SyntaxNode = Statement<'db>;
9659    fn untyped(self) -> SyntaxStablePtrId<'db> {
9660        self.0
9661    }
9662    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9663        Statement::from_syntax_node(db, self.0.lookup(db))
9664    }
9665}
9666impl<'db> From<StatementPtr<'db>> for SyntaxStablePtrId<'db> {
9667    fn from(ptr: StatementPtr<'db>) -> Self {
9668        ptr.untyped()
9669    }
9670}
9671impl<'db> From<StatementLetPtr<'db>> for StatementPtr<'db> {
9672    fn from(value: StatementLetPtr<'db>) -> Self {
9673        Self(value.0)
9674    }
9675}
9676impl<'db> From<StatementExprPtr<'db>> for StatementPtr<'db> {
9677    fn from(value: StatementExprPtr<'db>) -> Self {
9678        Self(value.0)
9679    }
9680}
9681impl<'db> From<StatementContinuePtr<'db>> for StatementPtr<'db> {
9682    fn from(value: StatementContinuePtr<'db>) -> Self {
9683        Self(value.0)
9684    }
9685}
9686impl<'db> From<StatementReturnPtr<'db>> for StatementPtr<'db> {
9687    fn from(value: StatementReturnPtr<'db>) -> Self {
9688        Self(value.0)
9689    }
9690}
9691impl<'db> From<StatementBreakPtr<'db>> for StatementPtr<'db> {
9692    fn from(value: StatementBreakPtr<'db>) -> Self {
9693        Self(value.0)
9694    }
9695}
9696impl<'db> From<StatementItemPtr<'db>> for StatementPtr<'db> {
9697    fn from(value: StatementItemPtr<'db>) -> Self {
9698        Self(value.0)
9699    }
9700}
9701impl<'db> From<StatementMissingPtr<'db>> for StatementPtr<'db> {
9702    fn from(value: StatementMissingPtr<'db>) -> Self {
9703        Self(value.0)
9704    }
9705}
9706impl<'db> From<StatementLetGreen<'db>> for StatementGreen<'db> {
9707    fn from(value: StatementLetGreen<'db>) -> Self {
9708        Self(value.0)
9709    }
9710}
9711impl<'db> From<StatementExprGreen<'db>> for StatementGreen<'db> {
9712    fn from(value: StatementExprGreen<'db>) -> Self {
9713        Self(value.0)
9714    }
9715}
9716impl<'db> From<StatementContinueGreen<'db>> for StatementGreen<'db> {
9717    fn from(value: StatementContinueGreen<'db>) -> Self {
9718        Self(value.0)
9719    }
9720}
9721impl<'db> From<StatementReturnGreen<'db>> for StatementGreen<'db> {
9722    fn from(value: StatementReturnGreen<'db>) -> Self {
9723        Self(value.0)
9724    }
9725}
9726impl<'db> From<StatementBreakGreen<'db>> for StatementGreen<'db> {
9727    fn from(value: StatementBreakGreen<'db>) -> Self {
9728        Self(value.0)
9729    }
9730}
9731impl<'db> From<StatementItemGreen<'db>> for StatementGreen<'db> {
9732    fn from(value: StatementItemGreen<'db>) -> Self {
9733        Self(value.0)
9734    }
9735}
9736impl<'db> From<StatementMissingGreen<'db>> for StatementGreen<'db> {
9737    fn from(value: StatementMissingGreen<'db>) -> Self {
9738        Self(value.0)
9739    }
9740}
9741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9742pub struct StatementGreen<'db>(pub GreenId<'db>);
9743impl<'db> TypedSyntaxNode<'db> for Statement<'db> {
9744    const OPTIONAL_KIND: Option<SyntaxKind> = None;
9745    type StablePtr = StatementPtr<'db>;
9746    type Green = StatementGreen<'db>;
9747    fn missing(db: &'db dyn Database) -> Self::Green {
9748        StatementGreen(StatementMissing::missing(db).0)
9749    }
9750    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9751        let kind = node.kind(db);
9752        match kind {
9753            SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9754            SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9755            SyntaxKind::StatementContinue => {
9756                Statement::Continue(StatementContinue::from_syntax_node(db, node))
9757            }
9758            SyntaxKind::StatementReturn => {
9759                Statement::Return(StatementReturn::from_syntax_node(db, node))
9760            }
9761            SyntaxKind::StatementBreak => {
9762                Statement::Break(StatementBreak::from_syntax_node(db, node))
9763            }
9764            SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9765            SyntaxKind::StatementMissing => {
9766                Statement::Missing(StatementMissing::from_syntax_node(db, node))
9767            }
9768            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9769        }
9770    }
9771    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9772        let kind = node.kind(db);
9773        match kind {
9774            SyntaxKind::StatementLet => {
9775                Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9776            }
9777            SyntaxKind::StatementExpr => {
9778                Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9779            }
9780            SyntaxKind::StatementContinue => {
9781                Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9782            }
9783            SyntaxKind::StatementReturn => {
9784                Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9785            }
9786            SyntaxKind::StatementBreak => {
9787                Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9788            }
9789            SyntaxKind::StatementItem => {
9790                Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9791            }
9792            SyntaxKind::StatementMissing => {
9793                Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9794            }
9795            _ => None,
9796        }
9797    }
9798    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9799        match self {
9800            Statement::Let(x) => x.as_syntax_node(),
9801            Statement::Expr(x) => x.as_syntax_node(),
9802            Statement::Continue(x) => x.as_syntax_node(),
9803            Statement::Return(x) => x.as_syntax_node(),
9804            Statement::Break(x) => x.as_syntax_node(),
9805            Statement::Item(x) => x.as_syntax_node(),
9806            Statement::Missing(x) => x.as_syntax_node(),
9807        }
9808    }
9809    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9810        StatementPtr(self.as_syntax_node().stable_ptr(db))
9811    }
9812}
9813impl<'db> Statement<'db> {
9814    /// Checks if a kind of a variant of [Statement].
9815    pub fn is_variant(kind: SyntaxKind) -> bool {
9816        matches!(
9817            kind,
9818            SyntaxKind::StatementLet
9819                | SyntaxKind::StatementExpr
9820                | SyntaxKind::StatementContinue
9821                | SyntaxKind::StatementReturn
9822                | SyntaxKind::StatementBreak
9823                | SyntaxKind::StatementItem
9824                | SyntaxKind::StatementMissing
9825        )
9826    }
9827}
9828#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9829pub struct StatementList<'db>(ElementList<'db, Statement<'db>, 1>);
9830impl<'db> Deref for StatementList<'db> {
9831    type Target = ElementList<'db, Statement<'db>, 1>;
9832    fn deref(&self) -> &Self::Target {
9833        &self.0
9834    }
9835}
9836impl<'db> StatementList<'db> {
9837    pub fn new_green(
9838        db: &'db dyn Database,
9839        children: &[StatementGreen<'db>],
9840    ) -> StatementListGreen<'db> {
9841        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
9842        StatementListGreen(
9843            GreenNode {
9844                kind: SyntaxKind::StatementList,
9845                details: GreenNodeDetails::Node {
9846                    children: children.iter().map(|x| x.0).collect(),
9847                    width,
9848                },
9849            }
9850            .intern(db),
9851        )
9852    }
9853}
9854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9855pub struct StatementListPtr<'db>(pub SyntaxStablePtrId<'db>);
9856impl<'db> TypedStablePtr<'db> for StatementListPtr<'db> {
9857    type SyntaxNode = StatementList<'db>;
9858    fn untyped(self) -> SyntaxStablePtrId<'db> {
9859        self.0
9860    }
9861    fn lookup(&self, db: &'db dyn Database) -> StatementList<'db> {
9862        StatementList::from_syntax_node(db, self.0.lookup(db))
9863    }
9864}
9865impl<'db> From<StatementListPtr<'db>> for SyntaxStablePtrId<'db> {
9866    fn from(ptr: StatementListPtr<'db>) -> Self {
9867        ptr.untyped()
9868    }
9869}
9870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9871pub struct StatementListGreen<'db>(pub GreenId<'db>);
9872impl<'db> TypedSyntaxNode<'db> for StatementList<'db> {
9873    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
9874    type StablePtr = StatementListPtr<'db>;
9875    type Green = StatementListGreen<'db>;
9876    fn missing(db: &'db dyn Database) -> Self::Green {
9877        StatementListGreen(
9878            GreenNode {
9879                kind: SyntaxKind::StatementList,
9880                details: GreenNodeDetails::Node {
9881                    children: [].into(),
9882                    width: TextWidth::default(),
9883                },
9884            }
9885            .intern(db),
9886        )
9887    }
9888    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9889        Self(ElementList::new(node))
9890    }
9891    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9892        if node.kind(db) == SyntaxKind::StatementList {
9893            Some(Self(ElementList::new(node)))
9894        } else {
9895            None
9896        }
9897    }
9898    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9899        self.node
9900    }
9901    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9902        StatementListPtr(self.node.stable_ptr(db))
9903    }
9904}
9905#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9906pub struct StatementMissing<'db> {
9907    node: SyntaxNode<'db>,
9908}
9909impl<'db> StatementMissing<'db> {
9910    pub fn new_green(db: &'db dyn Database) -> StatementMissingGreen<'db> {
9911        let children = [];
9912        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9913        StatementMissingGreen(
9914            GreenNode {
9915                kind: SyntaxKind::StatementMissing,
9916                details: GreenNodeDetails::Node { children: children.into(), width },
9917            }
9918            .intern(db),
9919        )
9920    }
9921}
9922impl<'db> StatementMissing<'db> {}
9923#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
9924pub struct StatementMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
9925impl<'db> StatementMissingPtr<'db> {}
9926impl<'db> TypedStablePtr<'db> for StatementMissingPtr<'db> {
9927    type SyntaxNode = StatementMissing<'db>;
9928    fn untyped(self) -> SyntaxStablePtrId<'db> {
9929        self.0
9930    }
9931    fn lookup(&self, db: &'db dyn Database) -> StatementMissing<'db> {
9932        StatementMissing::from_syntax_node(db, self.0.lookup(db))
9933    }
9934}
9935impl<'db> From<StatementMissingPtr<'db>> for SyntaxStablePtrId<'db> {
9936    fn from(ptr: StatementMissingPtr<'db>) -> Self {
9937        ptr.untyped()
9938    }
9939}
9940#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9941pub struct StatementMissingGreen<'db>(pub GreenId<'db>);
9942impl<'db> TypedSyntaxNode<'db> for StatementMissing<'db> {
9943    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
9944    type StablePtr = StatementMissingPtr<'db>;
9945    type Green = StatementMissingGreen<'db>;
9946    fn missing(db: &'db dyn Database) -> Self::Green {
9947        StatementMissingGreen(
9948            GreenNode {
9949                kind: SyntaxKind::StatementMissing,
9950                details: GreenNodeDetails::Node {
9951                    children: [].into(),
9952                    width: TextWidth::default(),
9953                },
9954            }
9955            .intern(db),
9956        )
9957    }
9958    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9959        let kind = node.kind(db);
9960        assert_eq!(
9961            kind,
9962            SyntaxKind::StatementMissing,
9963            "Unexpected SyntaxKind {:?}. Expected {:?}.",
9964            kind,
9965            SyntaxKind::StatementMissing
9966        );
9967        Self { node }
9968    }
9969    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9970        let kind = node.kind(db);
9971        if kind == SyntaxKind::StatementMissing {
9972            Some(Self::from_syntax_node(db, node))
9973        } else {
9974            None
9975        }
9976    }
9977    fn as_syntax_node(&self) -> SyntaxNode<'db> {
9978        self.node
9979    }
9980    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9981        StatementMissingPtr(self.node.stable_ptr(db))
9982    }
9983}
9984#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9985pub struct StatementLet<'db> {
9986    node: SyntaxNode<'db>,
9987}
9988impl<'db> StatementLet<'db> {
9989    pub const INDEX_ATTRIBUTES: usize = 0;
9990    pub const INDEX_LET_KW: usize = 1;
9991    pub const INDEX_PATTERN: usize = 2;
9992    pub const INDEX_TYPE_CLAUSE: usize = 3;
9993    pub const INDEX_EQ: usize = 4;
9994    pub const INDEX_RHS: usize = 5;
9995    pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
9996    pub const INDEX_SEMICOLON: usize = 7;
9997    pub fn new_green(
9998        db: &'db dyn Database,
9999        attributes: AttributeListGreen<'db>,
10000        let_kw: TerminalLetGreen<'db>,
10001        pattern: PatternGreen<'db>,
10002        type_clause: OptionTypeClauseGreen<'db>,
10003        eq: TerminalEqGreen<'db>,
10004        rhs: ExprGreen<'db>,
10005        let_else_clause: OptionLetElseClauseGreen<'db>,
10006        semicolon: TerminalSemicolonGreen<'db>,
10007    ) -> StatementLetGreen<'db> {
10008        let children = [
10009            attributes.0,
10010            let_kw.0,
10011            pattern.0,
10012            type_clause.0,
10013            eq.0,
10014            rhs.0,
10015            let_else_clause.0,
10016            semicolon.0,
10017        ];
10018        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10019        StatementLetGreen(
10020            GreenNode {
10021                kind: SyntaxKind::StatementLet,
10022                details: GreenNodeDetails::Node { children: children.into(), width },
10023            }
10024            .intern(db),
10025        )
10026    }
10027}
10028impl<'db> StatementLet<'db> {
10029    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10030        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10031    }
10032    pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
10033        TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10034    }
10035    pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
10036        Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10037    }
10038    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
10039        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10040    }
10041    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
10042        TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10043    }
10044    pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
10045        Expr::from_syntax_node(db, self.node.get_children(db)[5])
10046    }
10047    pub fn let_else_clause(&self, db: &'db dyn Database) -> OptionLetElseClause<'db> {
10048        OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10049    }
10050    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10051        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10052    }
10053}
10054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10055pub struct StatementLetPtr<'db>(pub SyntaxStablePtrId<'db>);
10056impl<'db> StatementLetPtr<'db> {
10057    pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
10058        PatternGreen(self.0.0.key_fields(db)[0])
10059    }
10060}
10061impl<'db> TypedStablePtr<'db> for StatementLetPtr<'db> {
10062    type SyntaxNode = StatementLet<'db>;
10063    fn untyped(self) -> SyntaxStablePtrId<'db> {
10064        self.0
10065    }
10066    fn lookup(&self, db: &'db dyn Database) -> StatementLet<'db> {
10067        StatementLet::from_syntax_node(db, self.0.lookup(db))
10068    }
10069}
10070impl<'db> From<StatementLetPtr<'db>> for SyntaxStablePtrId<'db> {
10071    fn from(ptr: StatementLetPtr<'db>) -> Self {
10072        ptr.untyped()
10073    }
10074}
10075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10076pub struct StatementLetGreen<'db>(pub GreenId<'db>);
10077impl<'db> TypedSyntaxNode<'db> for StatementLet<'db> {
10078    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10079    type StablePtr = StatementLetPtr<'db>;
10080    type Green = StatementLetGreen<'db>;
10081    fn missing(db: &'db dyn Database) -> Self::Green {
10082        StatementLetGreen(
10083            GreenNode {
10084                kind: SyntaxKind::StatementLet,
10085                details: GreenNodeDetails::Node {
10086                    children: [
10087                        AttributeList::missing(db).0,
10088                        TerminalLet::missing(db).0,
10089                        Pattern::missing(db).0,
10090                        OptionTypeClause::missing(db).0,
10091                        TerminalEq::missing(db).0,
10092                        Expr::missing(db).0,
10093                        OptionLetElseClause::missing(db).0,
10094                        TerminalSemicolon::missing(db).0,
10095                    ]
10096                    .into(),
10097                    width: TextWidth::default(),
10098                },
10099            }
10100            .intern(db),
10101        )
10102    }
10103    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10104        let kind = node.kind(db);
10105        assert_eq!(
10106            kind,
10107            SyntaxKind::StatementLet,
10108            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10109            kind,
10110            SyntaxKind::StatementLet
10111        );
10112        Self { node }
10113    }
10114    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10115        let kind = node.kind(db);
10116        if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10117    }
10118    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10119        self.node
10120    }
10121    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10122        StatementLetPtr(self.node.stable_ptr(db))
10123    }
10124}
10125#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10126pub struct LetElseClause<'db> {
10127    node: SyntaxNode<'db>,
10128}
10129impl<'db> LetElseClause<'db> {
10130    pub const INDEX_ELSE_KW: usize = 0;
10131    pub const INDEX_ELSE_BLOCK: usize = 1;
10132    pub fn new_green(
10133        db: &'db dyn Database,
10134        else_kw: TerminalElseGreen<'db>,
10135        else_block: ExprBlockGreen<'db>,
10136    ) -> LetElseClauseGreen<'db> {
10137        let children = [else_kw.0, else_block.0];
10138        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10139        LetElseClauseGreen(
10140            GreenNode {
10141                kind: SyntaxKind::LetElseClause,
10142                details: GreenNodeDetails::Node { children: children.into(), width },
10143            }
10144            .intern(db),
10145        )
10146    }
10147}
10148impl<'db> LetElseClause<'db> {
10149    pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
10150        TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10151    }
10152    pub fn else_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
10153        ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10154    }
10155}
10156#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10157pub struct LetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10158impl<'db> LetElseClausePtr<'db> {}
10159impl<'db> TypedStablePtr<'db> for LetElseClausePtr<'db> {
10160    type SyntaxNode = LetElseClause<'db>;
10161    fn untyped(self) -> SyntaxStablePtrId<'db> {
10162        self.0
10163    }
10164    fn lookup(&self, db: &'db dyn Database) -> LetElseClause<'db> {
10165        LetElseClause::from_syntax_node(db, self.0.lookup(db))
10166    }
10167}
10168impl<'db> From<LetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10169    fn from(ptr: LetElseClausePtr<'db>) -> Self {
10170        ptr.untyped()
10171    }
10172}
10173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10174pub struct LetElseClauseGreen<'db>(pub GreenId<'db>);
10175impl<'db> TypedSyntaxNode<'db> for LetElseClause<'db> {
10176    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10177    type StablePtr = LetElseClausePtr<'db>;
10178    type Green = LetElseClauseGreen<'db>;
10179    fn missing(db: &'db dyn Database) -> Self::Green {
10180        LetElseClauseGreen(
10181            GreenNode {
10182                kind: SyntaxKind::LetElseClause,
10183                details: GreenNodeDetails::Node {
10184                    children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10185                    width: TextWidth::default(),
10186                },
10187            }
10188            .intern(db),
10189        )
10190    }
10191    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10192        let kind = node.kind(db);
10193        assert_eq!(
10194            kind,
10195            SyntaxKind::LetElseClause,
10196            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10197            kind,
10198            SyntaxKind::LetElseClause
10199        );
10200        Self { node }
10201    }
10202    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10203        let kind = node.kind(db);
10204        if kind == SyntaxKind::LetElseClause {
10205            Some(Self::from_syntax_node(db, node))
10206        } else {
10207            None
10208        }
10209    }
10210    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10211        self.node
10212    }
10213    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10214        LetElseClausePtr(self.node.stable_ptr(db))
10215    }
10216}
10217#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10218pub enum OptionLetElseClause<'db> {
10219    Empty(OptionLetElseClauseEmpty<'db>),
10220    LetElseClause(LetElseClause<'db>),
10221}
10222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10223pub struct OptionLetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10224impl<'db> TypedStablePtr<'db> for OptionLetElseClausePtr<'db> {
10225    type SyntaxNode = OptionLetElseClause<'db>;
10226    fn untyped(self) -> SyntaxStablePtrId<'db> {
10227        self.0
10228    }
10229    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10230        OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10231    }
10232}
10233impl<'db> From<OptionLetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10234    fn from(ptr: OptionLetElseClausePtr<'db>) -> Self {
10235        ptr.untyped()
10236    }
10237}
10238impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for OptionLetElseClausePtr<'db> {
10239    fn from(value: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10240        Self(value.0)
10241    }
10242}
10243impl<'db> From<LetElseClausePtr<'db>> for OptionLetElseClausePtr<'db> {
10244    fn from(value: LetElseClausePtr<'db>) -> Self {
10245        Self(value.0)
10246    }
10247}
10248impl<'db> From<OptionLetElseClauseEmptyGreen<'db>> for OptionLetElseClauseGreen<'db> {
10249    fn from(value: OptionLetElseClauseEmptyGreen<'db>) -> Self {
10250        Self(value.0)
10251    }
10252}
10253impl<'db> From<LetElseClauseGreen<'db>> for OptionLetElseClauseGreen<'db> {
10254    fn from(value: LetElseClauseGreen<'db>) -> Self {
10255        Self(value.0)
10256    }
10257}
10258#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10259pub struct OptionLetElseClauseGreen<'db>(pub GreenId<'db>);
10260impl<'db> TypedSyntaxNode<'db> for OptionLetElseClause<'db> {
10261    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10262    type StablePtr = OptionLetElseClausePtr<'db>;
10263    type Green = OptionLetElseClauseGreen<'db>;
10264    fn missing(db: &'db dyn Database) -> Self::Green {
10265        panic!("No missing variant.");
10266    }
10267    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10268        let kind = node.kind(db);
10269        match kind {
10270            SyntaxKind::OptionLetElseClauseEmpty => {
10271                OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10272            }
10273            SyntaxKind::LetElseClause => {
10274                OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10275            }
10276            _ => panic!(
10277                "Unexpected syntax kind {:?} when constructing {}.",
10278                kind, "OptionLetElseClause"
10279            ),
10280        }
10281    }
10282    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10283        let kind = node.kind(db);
10284        match kind {
10285            SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10286                OptionLetElseClauseEmpty::from_syntax_node(db, node),
10287            )),
10288            SyntaxKind::LetElseClause => {
10289                Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10290            }
10291            _ => None,
10292        }
10293    }
10294    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10295        match self {
10296            OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10297            OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10298        }
10299    }
10300    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10301        OptionLetElseClausePtr(self.as_syntax_node().stable_ptr(db))
10302    }
10303}
10304impl<'db> OptionLetElseClause<'db> {
10305    /// Checks if a kind of a variant of [OptionLetElseClause].
10306    pub fn is_variant(kind: SyntaxKind) -> bool {
10307        matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10308    }
10309}
10310#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10311pub struct OptionLetElseClauseEmpty<'db> {
10312    node: SyntaxNode<'db>,
10313}
10314impl<'db> OptionLetElseClauseEmpty<'db> {
10315    pub fn new_green(db: &'db dyn Database) -> OptionLetElseClauseEmptyGreen<'db> {
10316        let children = [];
10317        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10318        OptionLetElseClauseEmptyGreen(
10319            GreenNode {
10320                kind: SyntaxKind::OptionLetElseClauseEmpty,
10321                details: GreenNodeDetails::Node { children: children.into(), width },
10322            }
10323            .intern(db),
10324        )
10325    }
10326}
10327impl<'db> OptionLetElseClauseEmpty<'db> {}
10328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10329pub struct OptionLetElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10330impl<'db> OptionLetElseClauseEmptyPtr<'db> {}
10331impl<'db> TypedStablePtr<'db> for OptionLetElseClauseEmptyPtr<'db> {
10332    type SyntaxNode = OptionLetElseClauseEmpty<'db>;
10333    fn untyped(self) -> SyntaxStablePtrId<'db> {
10334        self.0
10335    }
10336    fn lookup(&self, db: &'db dyn Database) -> OptionLetElseClauseEmpty<'db> {
10337        OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10338    }
10339}
10340impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10341    fn from(ptr: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10342        ptr.untyped()
10343    }
10344}
10345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10346pub struct OptionLetElseClauseEmptyGreen<'db>(pub GreenId<'db>);
10347impl<'db> TypedSyntaxNode<'db> for OptionLetElseClauseEmpty<'db> {
10348    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10349    type StablePtr = OptionLetElseClauseEmptyPtr<'db>;
10350    type Green = OptionLetElseClauseEmptyGreen<'db>;
10351    fn missing(db: &'db dyn Database) -> Self::Green {
10352        OptionLetElseClauseEmptyGreen(
10353            GreenNode {
10354                kind: SyntaxKind::OptionLetElseClauseEmpty,
10355                details: GreenNodeDetails::Node {
10356                    children: [].into(),
10357                    width: TextWidth::default(),
10358                },
10359            }
10360            .intern(db),
10361        )
10362    }
10363    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10364        let kind = node.kind(db);
10365        assert_eq!(
10366            kind,
10367            SyntaxKind::OptionLetElseClauseEmpty,
10368            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10369            kind,
10370            SyntaxKind::OptionLetElseClauseEmpty
10371        );
10372        Self { node }
10373    }
10374    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10375        let kind = node.kind(db);
10376        if kind == SyntaxKind::OptionLetElseClauseEmpty {
10377            Some(Self::from_syntax_node(db, node))
10378        } else {
10379            None
10380        }
10381    }
10382    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10383        self.node
10384    }
10385    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10386        OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10387    }
10388}
10389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10390pub enum OptionTerminalSemicolon<'db> {
10391    Empty(OptionTerminalSemicolonEmpty<'db>),
10392    TerminalSemicolon(TerminalSemicolon<'db>),
10393}
10394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10395pub struct OptionTerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
10396impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonPtr<'db> {
10397    type SyntaxNode = OptionTerminalSemicolon<'db>;
10398    fn untyped(self) -> SyntaxStablePtrId<'db> {
10399        self.0
10400    }
10401    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10402        OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10403    }
10404}
10405impl<'db> From<OptionTerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
10406    fn from(ptr: OptionTerminalSemicolonPtr<'db>) -> Self {
10407        ptr.untyped()
10408    }
10409}
10410impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10411    fn from(value: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10412        Self(value.0)
10413    }
10414}
10415impl<'db> From<TerminalSemicolonPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10416    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
10417        Self(value.0)
10418    }
10419}
10420impl<'db> From<OptionTerminalSemicolonEmptyGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10421    fn from(value: OptionTerminalSemicolonEmptyGreen<'db>) -> Self {
10422        Self(value.0)
10423    }
10424}
10425impl<'db> From<TerminalSemicolonGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10426    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
10427        Self(value.0)
10428    }
10429}
10430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10431pub struct OptionTerminalSemicolonGreen<'db>(pub GreenId<'db>);
10432impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolon<'db> {
10433    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10434    type StablePtr = OptionTerminalSemicolonPtr<'db>;
10435    type Green = OptionTerminalSemicolonGreen<'db>;
10436    fn missing(db: &'db dyn Database) -> Self::Green {
10437        panic!("No missing variant.");
10438    }
10439    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10440        let kind = node.kind(db);
10441        match kind {
10442            SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10443                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10444            ),
10445            SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10446                TerminalSemicolon::from_syntax_node(db, node),
10447            ),
10448            _ => panic!(
10449                "Unexpected syntax kind {:?} when constructing {}.",
10450                kind, "OptionTerminalSemicolon"
10451            ),
10452        }
10453    }
10454    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10455        let kind = node.kind(db);
10456        match kind {
10457            SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10458                OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10459            )),
10460            SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10461                TerminalSemicolon::from_syntax_node(db, node),
10462            )),
10463            _ => None,
10464        }
10465    }
10466    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10467        match self {
10468            OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10469            OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10470        }
10471    }
10472    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10473        OptionTerminalSemicolonPtr(self.as_syntax_node().stable_ptr(db))
10474    }
10475}
10476impl<'db> OptionTerminalSemicolon<'db> {
10477    /// Checks if a kind of a variant of [OptionTerminalSemicolon].
10478    pub fn is_variant(kind: SyntaxKind) -> bool {
10479        matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10480    }
10481}
10482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10483pub struct OptionTerminalSemicolonEmpty<'db> {
10484    node: SyntaxNode<'db>,
10485}
10486impl<'db> OptionTerminalSemicolonEmpty<'db> {
10487    pub fn new_green(db: &'db dyn Database) -> OptionTerminalSemicolonEmptyGreen<'db> {
10488        let children = [];
10489        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10490        OptionTerminalSemicolonEmptyGreen(
10491            GreenNode {
10492                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10493                details: GreenNodeDetails::Node { children: children.into(), width },
10494            }
10495            .intern(db),
10496        )
10497    }
10498}
10499impl<'db> OptionTerminalSemicolonEmpty<'db> {}
10500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10501pub struct OptionTerminalSemicolonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10502impl<'db> OptionTerminalSemicolonEmptyPtr<'db> {}
10503impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonEmptyPtr<'db> {
10504    type SyntaxNode = OptionTerminalSemicolonEmpty<'db>;
10505    fn untyped(self) -> SyntaxStablePtrId<'db> {
10506        self.0
10507    }
10508    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalSemicolonEmpty<'db> {
10509        OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10510    }
10511}
10512impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10513    fn from(ptr: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10514        ptr.untyped()
10515    }
10516}
10517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10518pub struct OptionTerminalSemicolonEmptyGreen<'db>(pub GreenId<'db>);
10519impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolonEmpty<'db> {
10520    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10521    type StablePtr = OptionTerminalSemicolonEmptyPtr<'db>;
10522    type Green = OptionTerminalSemicolonEmptyGreen<'db>;
10523    fn missing(db: &'db dyn Database) -> Self::Green {
10524        OptionTerminalSemicolonEmptyGreen(
10525            GreenNode {
10526                kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10527                details: GreenNodeDetails::Node {
10528                    children: [].into(),
10529                    width: TextWidth::default(),
10530                },
10531            }
10532            .intern(db),
10533        )
10534    }
10535    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10536        let kind = node.kind(db);
10537        assert_eq!(
10538            kind,
10539            SyntaxKind::OptionTerminalSemicolonEmpty,
10540            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10541            kind,
10542            SyntaxKind::OptionTerminalSemicolonEmpty
10543        );
10544        Self { node }
10545    }
10546    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10547        let kind = node.kind(db);
10548        if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10549            Some(Self::from_syntax_node(db, node))
10550        } else {
10551            None
10552        }
10553    }
10554    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10555        self.node
10556    }
10557    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10558        OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10559    }
10560}
10561#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10562pub struct StatementExpr<'db> {
10563    node: SyntaxNode<'db>,
10564}
10565impl<'db> StatementExpr<'db> {
10566    pub const INDEX_ATTRIBUTES: usize = 0;
10567    pub const INDEX_EXPR: usize = 1;
10568    pub const INDEX_SEMICOLON: usize = 2;
10569    pub fn new_green(
10570        db: &'db dyn Database,
10571        attributes: AttributeListGreen<'db>,
10572        expr: ExprGreen<'db>,
10573        semicolon: OptionTerminalSemicolonGreen<'db>,
10574    ) -> StatementExprGreen<'db> {
10575        let children = [attributes.0, expr.0, semicolon.0];
10576        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10577        StatementExprGreen(
10578            GreenNode {
10579                kind: SyntaxKind::StatementExpr,
10580                details: GreenNodeDetails::Node { children: children.into(), width },
10581            }
10582            .intern(db),
10583        )
10584    }
10585}
10586impl<'db> StatementExpr<'db> {
10587    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10588        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10589    }
10590    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10591        Expr::from_syntax_node(db, self.node.get_children(db)[1])
10592    }
10593    pub fn semicolon(&self, db: &'db dyn Database) -> OptionTerminalSemicolon<'db> {
10594        OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10595    }
10596}
10597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10598pub struct StatementExprPtr<'db>(pub SyntaxStablePtrId<'db>);
10599impl<'db> StatementExprPtr<'db> {}
10600impl<'db> TypedStablePtr<'db> for StatementExprPtr<'db> {
10601    type SyntaxNode = StatementExpr<'db>;
10602    fn untyped(self) -> SyntaxStablePtrId<'db> {
10603        self.0
10604    }
10605    fn lookup(&self, db: &'db dyn Database) -> StatementExpr<'db> {
10606        StatementExpr::from_syntax_node(db, self.0.lookup(db))
10607    }
10608}
10609impl<'db> From<StatementExprPtr<'db>> for SyntaxStablePtrId<'db> {
10610    fn from(ptr: StatementExprPtr<'db>) -> Self {
10611        ptr.untyped()
10612    }
10613}
10614#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10615pub struct StatementExprGreen<'db>(pub GreenId<'db>);
10616impl<'db> TypedSyntaxNode<'db> for StatementExpr<'db> {
10617    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10618    type StablePtr = StatementExprPtr<'db>;
10619    type Green = StatementExprGreen<'db>;
10620    fn missing(db: &'db dyn Database) -> Self::Green {
10621        StatementExprGreen(
10622            GreenNode {
10623                kind: SyntaxKind::StatementExpr,
10624                details: GreenNodeDetails::Node {
10625                    children: [
10626                        AttributeList::missing(db).0,
10627                        Expr::missing(db).0,
10628                        OptionTerminalSemicolon::missing(db).0,
10629                    ]
10630                    .into(),
10631                    width: TextWidth::default(),
10632                },
10633            }
10634            .intern(db),
10635        )
10636    }
10637    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10638        let kind = node.kind(db);
10639        assert_eq!(
10640            kind,
10641            SyntaxKind::StatementExpr,
10642            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10643            kind,
10644            SyntaxKind::StatementExpr
10645        );
10646        Self { node }
10647    }
10648    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10649        let kind = node.kind(db);
10650        if kind == SyntaxKind::StatementExpr {
10651            Some(Self::from_syntax_node(db, node))
10652        } else {
10653            None
10654        }
10655    }
10656    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10657        self.node
10658    }
10659    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10660        StatementExprPtr(self.node.stable_ptr(db))
10661    }
10662}
10663#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10664pub struct StatementContinue<'db> {
10665    node: SyntaxNode<'db>,
10666}
10667impl<'db> StatementContinue<'db> {
10668    pub const INDEX_ATTRIBUTES: usize = 0;
10669    pub const INDEX_CONTINUE_KW: usize = 1;
10670    pub const INDEX_SEMICOLON: usize = 2;
10671    pub fn new_green(
10672        db: &'db dyn Database,
10673        attributes: AttributeListGreen<'db>,
10674        continue_kw: TerminalContinueGreen<'db>,
10675        semicolon: TerminalSemicolonGreen<'db>,
10676    ) -> StatementContinueGreen<'db> {
10677        let children = [attributes.0, continue_kw.0, semicolon.0];
10678        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10679        StatementContinueGreen(
10680            GreenNode {
10681                kind: SyntaxKind::StatementContinue,
10682                details: GreenNodeDetails::Node { children: children.into(), width },
10683            }
10684            .intern(db),
10685        )
10686    }
10687}
10688impl<'db> StatementContinue<'db> {
10689    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10690        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10691    }
10692    pub fn continue_kw(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
10693        TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10694    }
10695    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10696        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10697    }
10698}
10699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10700pub struct StatementContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
10701impl<'db> StatementContinuePtr<'db> {}
10702impl<'db> TypedStablePtr<'db> for StatementContinuePtr<'db> {
10703    type SyntaxNode = StatementContinue<'db>;
10704    fn untyped(self) -> SyntaxStablePtrId<'db> {
10705        self.0
10706    }
10707    fn lookup(&self, db: &'db dyn Database) -> StatementContinue<'db> {
10708        StatementContinue::from_syntax_node(db, self.0.lookup(db))
10709    }
10710}
10711impl<'db> From<StatementContinuePtr<'db>> for SyntaxStablePtrId<'db> {
10712    fn from(ptr: StatementContinuePtr<'db>) -> Self {
10713        ptr.untyped()
10714    }
10715}
10716#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10717pub struct StatementContinueGreen<'db>(pub GreenId<'db>);
10718impl<'db> TypedSyntaxNode<'db> for StatementContinue<'db> {
10719    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10720    type StablePtr = StatementContinuePtr<'db>;
10721    type Green = StatementContinueGreen<'db>;
10722    fn missing(db: &'db dyn Database) -> Self::Green {
10723        StatementContinueGreen(
10724            GreenNode {
10725                kind: SyntaxKind::StatementContinue,
10726                details: GreenNodeDetails::Node {
10727                    children: [
10728                        AttributeList::missing(db).0,
10729                        TerminalContinue::missing(db).0,
10730                        TerminalSemicolon::missing(db).0,
10731                    ]
10732                    .into(),
10733                    width: TextWidth::default(),
10734                },
10735            }
10736            .intern(db),
10737        )
10738    }
10739    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10740        let kind = node.kind(db);
10741        assert_eq!(
10742            kind,
10743            SyntaxKind::StatementContinue,
10744            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10745            kind,
10746            SyntaxKind::StatementContinue
10747        );
10748        Self { node }
10749    }
10750    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10751        let kind = node.kind(db);
10752        if kind == SyntaxKind::StatementContinue {
10753            Some(Self::from_syntax_node(db, node))
10754        } else {
10755            None
10756        }
10757    }
10758    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10759        self.node
10760    }
10761    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10762        StatementContinuePtr(self.node.stable_ptr(db))
10763    }
10764}
10765#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10766pub struct ExprClause<'db> {
10767    node: SyntaxNode<'db>,
10768}
10769impl<'db> ExprClause<'db> {
10770    pub const INDEX_EXPR: usize = 0;
10771    pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ExprClauseGreen<'db> {
10772        let children = [expr.0];
10773        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10774        ExprClauseGreen(
10775            GreenNode {
10776                kind: SyntaxKind::ExprClause,
10777                details: GreenNodeDetails::Node { children: children.into(), width },
10778            }
10779            .intern(db),
10780        )
10781    }
10782}
10783impl<'db> ExprClause<'db> {
10784    pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10785        Expr::from_syntax_node(db, self.node.get_children(db)[0])
10786    }
10787}
10788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10789pub struct ExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10790impl<'db> ExprClausePtr<'db> {}
10791impl<'db> TypedStablePtr<'db> for ExprClausePtr<'db> {
10792    type SyntaxNode = ExprClause<'db>;
10793    fn untyped(self) -> SyntaxStablePtrId<'db> {
10794        self.0
10795    }
10796    fn lookup(&self, db: &'db dyn Database) -> ExprClause<'db> {
10797        ExprClause::from_syntax_node(db, self.0.lookup(db))
10798    }
10799}
10800impl<'db> From<ExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10801    fn from(ptr: ExprClausePtr<'db>) -> Self {
10802        ptr.untyped()
10803    }
10804}
10805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10806pub struct ExprClauseGreen<'db>(pub GreenId<'db>);
10807impl<'db> TypedSyntaxNode<'db> for ExprClause<'db> {
10808    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10809    type StablePtr = ExprClausePtr<'db>;
10810    type Green = ExprClauseGreen<'db>;
10811    fn missing(db: &'db dyn Database) -> Self::Green {
10812        ExprClauseGreen(
10813            GreenNode {
10814                kind: SyntaxKind::ExprClause,
10815                details: GreenNodeDetails::Node {
10816                    children: [Expr::missing(db).0].into(),
10817                    width: TextWidth::default(),
10818                },
10819            }
10820            .intern(db),
10821        )
10822    }
10823    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10824        let kind = node.kind(db);
10825        assert_eq!(
10826            kind,
10827            SyntaxKind::ExprClause,
10828            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10829            kind,
10830            SyntaxKind::ExprClause
10831        );
10832        Self { node }
10833    }
10834    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10835        let kind = node.kind(db);
10836        if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10837    }
10838    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10839        self.node
10840    }
10841    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10842        ExprClausePtr(self.node.stable_ptr(db))
10843    }
10844}
10845#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10846pub enum OptionExprClause<'db> {
10847    Empty(OptionExprClauseEmpty<'db>),
10848    ExprClause(ExprClause<'db>),
10849}
10850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10851pub struct OptionExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10852impl<'db> TypedStablePtr<'db> for OptionExprClausePtr<'db> {
10853    type SyntaxNode = OptionExprClause<'db>;
10854    fn untyped(self) -> SyntaxStablePtrId<'db> {
10855        self.0
10856    }
10857    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10858        OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10859    }
10860}
10861impl<'db> From<OptionExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10862    fn from(ptr: OptionExprClausePtr<'db>) -> Self {
10863        ptr.untyped()
10864    }
10865}
10866impl<'db> From<OptionExprClauseEmptyPtr<'db>> for OptionExprClausePtr<'db> {
10867    fn from(value: OptionExprClauseEmptyPtr<'db>) -> Self {
10868        Self(value.0)
10869    }
10870}
10871impl<'db> From<ExprClausePtr<'db>> for OptionExprClausePtr<'db> {
10872    fn from(value: ExprClausePtr<'db>) -> Self {
10873        Self(value.0)
10874    }
10875}
10876impl<'db> From<OptionExprClauseEmptyGreen<'db>> for OptionExprClauseGreen<'db> {
10877    fn from(value: OptionExprClauseEmptyGreen<'db>) -> Self {
10878        Self(value.0)
10879    }
10880}
10881impl<'db> From<ExprClauseGreen<'db>> for OptionExprClauseGreen<'db> {
10882    fn from(value: ExprClauseGreen<'db>) -> Self {
10883        Self(value.0)
10884    }
10885}
10886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10887pub struct OptionExprClauseGreen<'db>(pub GreenId<'db>);
10888impl<'db> TypedSyntaxNode<'db> for OptionExprClause<'db> {
10889    const OPTIONAL_KIND: Option<SyntaxKind> = None;
10890    type StablePtr = OptionExprClausePtr<'db>;
10891    type Green = OptionExprClauseGreen<'db>;
10892    fn missing(db: &'db dyn Database) -> Self::Green {
10893        panic!("No missing variant.");
10894    }
10895    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10896        let kind = node.kind(db);
10897        match kind {
10898            SyntaxKind::OptionExprClauseEmpty => {
10899                OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10900            }
10901            SyntaxKind::ExprClause => {
10902                OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10903            }
10904            _ => panic!(
10905                "Unexpected syntax kind {:?} when constructing {}.",
10906                kind, "OptionExprClause"
10907            ),
10908        }
10909    }
10910    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10911        let kind = node.kind(db);
10912        match kind {
10913            SyntaxKind::OptionExprClauseEmpty => {
10914                Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10915            }
10916            SyntaxKind::ExprClause => {
10917                Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10918            }
10919            _ => None,
10920        }
10921    }
10922    fn as_syntax_node(&self) -> SyntaxNode<'db> {
10923        match self {
10924            OptionExprClause::Empty(x) => x.as_syntax_node(),
10925            OptionExprClause::ExprClause(x) => x.as_syntax_node(),
10926        }
10927    }
10928    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10929        OptionExprClausePtr(self.as_syntax_node().stable_ptr(db))
10930    }
10931}
10932impl<'db> OptionExprClause<'db> {
10933    /// Checks if a kind of a variant of [OptionExprClause].
10934    pub fn is_variant(kind: SyntaxKind) -> bool {
10935        matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
10936    }
10937}
10938#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10939pub struct OptionExprClauseEmpty<'db> {
10940    node: SyntaxNode<'db>,
10941}
10942impl<'db> OptionExprClauseEmpty<'db> {
10943    pub fn new_green(db: &'db dyn Database) -> OptionExprClauseEmptyGreen<'db> {
10944        let children = [];
10945        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10946        OptionExprClauseEmptyGreen(
10947            GreenNode {
10948                kind: SyntaxKind::OptionExprClauseEmpty,
10949                details: GreenNodeDetails::Node { children: children.into(), width },
10950            }
10951            .intern(db),
10952        )
10953    }
10954}
10955impl<'db> OptionExprClauseEmpty<'db> {}
10956#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
10957pub struct OptionExprClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10958impl<'db> OptionExprClauseEmptyPtr<'db> {}
10959impl<'db> TypedStablePtr<'db> for OptionExprClauseEmptyPtr<'db> {
10960    type SyntaxNode = OptionExprClauseEmpty<'db>;
10961    fn untyped(self) -> SyntaxStablePtrId<'db> {
10962        self.0
10963    }
10964    fn lookup(&self, db: &'db dyn Database) -> OptionExprClauseEmpty<'db> {
10965        OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10966    }
10967}
10968impl<'db> From<OptionExprClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10969    fn from(ptr: OptionExprClauseEmptyPtr<'db>) -> Self {
10970        ptr.untyped()
10971    }
10972}
10973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10974pub struct OptionExprClauseEmptyGreen<'db>(pub GreenId<'db>);
10975impl<'db> TypedSyntaxNode<'db> for OptionExprClauseEmpty<'db> {
10976    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
10977    type StablePtr = OptionExprClauseEmptyPtr<'db>;
10978    type Green = OptionExprClauseEmptyGreen<'db>;
10979    fn missing(db: &'db dyn Database) -> Self::Green {
10980        OptionExprClauseEmptyGreen(
10981            GreenNode {
10982                kind: SyntaxKind::OptionExprClauseEmpty,
10983                details: GreenNodeDetails::Node {
10984                    children: [].into(),
10985                    width: TextWidth::default(),
10986                },
10987            }
10988            .intern(db),
10989        )
10990    }
10991    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10992        let kind = node.kind(db);
10993        assert_eq!(
10994            kind,
10995            SyntaxKind::OptionExprClauseEmpty,
10996            "Unexpected SyntaxKind {:?}. Expected {:?}.",
10997            kind,
10998            SyntaxKind::OptionExprClauseEmpty
10999        );
11000        Self { node }
11001    }
11002    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11003        let kind = node.kind(db);
11004        if kind == SyntaxKind::OptionExprClauseEmpty {
11005            Some(Self::from_syntax_node(db, node))
11006        } else {
11007            None
11008        }
11009    }
11010    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11011        self.node
11012    }
11013    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11014        OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11015    }
11016}
11017#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11018pub struct StatementReturn<'db> {
11019    node: SyntaxNode<'db>,
11020}
11021impl<'db> StatementReturn<'db> {
11022    pub const INDEX_ATTRIBUTES: usize = 0;
11023    pub const INDEX_RETURN_KW: usize = 1;
11024    pub const INDEX_EXPR_CLAUSE: usize = 2;
11025    pub const INDEX_SEMICOLON: usize = 3;
11026    pub fn new_green(
11027        db: &'db dyn Database,
11028        attributes: AttributeListGreen<'db>,
11029        return_kw: TerminalReturnGreen<'db>,
11030        expr_clause: OptionExprClauseGreen<'db>,
11031        semicolon: TerminalSemicolonGreen<'db>,
11032    ) -> StatementReturnGreen<'db> {
11033        let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11034        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11035        StatementReturnGreen(
11036            GreenNode {
11037                kind: SyntaxKind::StatementReturn,
11038                details: GreenNodeDetails::Node { children: children.into(), width },
11039            }
11040            .intern(db),
11041        )
11042    }
11043}
11044impl<'db> StatementReturn<'db> {
11045    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11046        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11047    }
11048    pub fn return_kw(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
11049        TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11050    }
11051    pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11052        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11053    }
11054    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11055        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11056    }
11057}
11058#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11059pub struct StatementReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
11060impl<'db> StatementReturnPtr<'db> {}
11061impl<'db> TypedStablePtr<'db> for StatementReturnPtr<'db> {
11062    type SyntaxNode = StatementReturn<'db>;
11063    fn untyped(self) -> SyntaxStablePtrId<'db> {
11064        self.0
11065    }
11066    fn lookup(&self, db: &'db dyn Database) -> StatementReturn<'db> {
11067        StatementReturn::from_syntax_node(db, self.0.lookup(db))
11068    }
11069}
11070impl<'db> From<StatementReturnPtr<'db>> for SyntaxStablePtrId<'db> {
11071    fn from(ptr: StatementReturnPtr<'db>) -> Self {
11072        ptr.untyped()
11073    }
11074}
11075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11076pub struct StatementReturnGreen<'db>(pub GreenId<'db>);
11077impl<'db> TypedSyntaxNode<'db> for StatementReturn<'db> {
11078    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11079    type StablePtr = StatementReturnPtr<'db>;
11080    type Green = StatementReturnGreen<'db>;
11081    fn missing(db: &'db dyn Database) -> Self::Green {
11082        StatementReturnGreen(
11083            GreenNode {
11084                kind: SyntaxKind::StatementReturn,
11085                details: GreenNodeDetails::Node {
11086                    children: [
11087                        AttributeList::missing(db).0,
11088                        TerminalReturn::missing(db).0,
11089                        OptionExprClause::missing(db).0,
11090                        TerminalSemicolon::missing(db).0,
11091                    ]
11092                    .into(),
11093                    width: TextWidth::default(),
11094                },
11095            }
11096            .intern(db),
11097        )
11098    }
11099    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11100        let kind = node.kind(db);
11101        assert_eq!(
11102            kind,
11103            SyntaxKind::StatementReturn,
11104            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11105            kind,
11106            SyntaxKind::StatementReturn
11107        );
11108        Self { node }
11109    }
11110    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11111        let kind = node.kind(db);
11112        if kind == SyntaxKind::StatementReturn {
11113            Some(Self::from_syntax_node(db, node))
11114        } else {
11115            None
11116        }
11117    }
11118    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11119        self.node
11120    }
11121    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11122        StatementReturnPtr(self.node.stable_ptr(db))
11123    }
11124}
11125#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11126pub struct StatementBreak<'db> {
11127    node: SyntaxNode<'db>,
11128}
11129impl<'db> StatementBreak<'db> {
11130    pub const INDEX_ATTRIBUTES: usize = 0;
11131    pub const INDEX_BREAK_KW: usize = 1;
11132    pub const INDEX_EXPR_CLAUSE: usize = 2;
11133    pub const INDEX_SEMICOLON: usize = 3;
11134    pub fn new_green(
11135        db: &'db dyn Database,
11136        attributes: AttributeListGreen<'db>,
11137        break_kw: TerminalBreakGreen<'db>,
11138        expr_clause: OptionExprClauseGreen<'db>,
11139        semicolon: TerminalSemicolonGreen<'db>,
11140    ) -> StatementBreakGreen<'db> {
11141        let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11142        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11143        StatementBreakGreen(
11144            GreenNode {
11145                kind: SyntaxKind::StatementBreak,
11146                details: GreenNodeDetails::Node { children: children.into(), width },
11147            }
11148            .intern(db),
11149        )
11150    }
11151}
11152impl<'db> StatementBreak<'db> {
11153    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11154        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11155    }
11156    pub fn break_kw(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
11157        TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11158    }
11159    pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11160        OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11161    }
11162    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11163        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11164    }
11165}
11166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11167pub struct StatementBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
11168impl<'db> StatementBreakPtr<'db> {}
11169impl<'db> TypedStablePtr<'db> for StatementBreakPtr<'db> {
11170    type SyntaxNode = StatementBreak<'db>;
11171    fn untyped(self) -> SyntaxStablePtrId<'db> {
11172        self.0
11173    }
11174    fn lookup(&self, db: &'db dyn Database) -> StatementBreak<'db> {
11175        StatementBreak::from_syntax_node(db, self.0.lookup(db))
11176    }
11177}
11178impl<'db> From<StatementBreakPtr<'db>> for SyntaxStablePtrId<'db> {
11179    fn from(ptr: StatementBreakPtr<'db>) -> Self {
11180        ptr.untyped()
11181    }
11182}
11183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11184pub struct StatementBreakGreen<'db>(pub GreenId<'db>);
11185impl<'db> TypedSyntaxNode<'db> for StatementBreak<'db> {
11186    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11187    type StablePtr = StatementBreakPtr<'db>;
11188    type Green = StatementBreakGreen<'db>;
11189    fn missing(db: &'db dyn Database) -> Self::Green {
11190        StatementBreakGreen(
11191            GreenNode {
11192                kind: SyntaxKind::StatementBreak,
11193                details: GreenNodeDetails::Node {
11194                    children: [
11195                        AttributeList::missing(db).0,
11196                        TerminalBreak::missing(db).0,
11197                        OptionExprClause::missing(db).0,
11198                        TerminalSemicolon::missing(db).0,
11199                    ]
11200                    .into(),
11201                    width: TextWidth::default(),
11202                },
11203            }
11204            .intern(db),
11205        )
11206    }
11207    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11208        let kind = node.kind(db);
11209        assert_eq!(
11210            kind,
11211            SyntaxKind::StatementBreak,
11212            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11213            kind,
11214            SyntaxKind::StatementBreak
11215        );
11216        Self { node }
11217    }
11218    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11219        let kind = node.kind(db);
11220        if kind == SyntaxKind::StatementBreak {
11221            Some(Self::from_syntax_node(db, node))
11222        } else {
11223            None
11224        }
11225    }
11226    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11227        self.node
11228    }
11229    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11230        StatementBreakPtr(self.node.stable_ptr(db))
11231    }
11232}
11233#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11234pub struct StatementItem<'db> {
11235    node: SyntaxNode<'db>,
11236}
11237impl<'db> StatementItem<'db> {
11238    pub const INDEX_ITEM: usize = 0;
11239    pub fn new_green(db: &'db dyn Database, item: ModuleItemGreen<'db>) -> StatementItemGreen<'db> {
11240        let children = [item.0];
11241        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11242        StatementItemGreen(
11243            GreenNode {
11244                kind: SyntaxKind::StatementItem,
11245                details: GreenNodeDetails::Node { children: children.into(), width },
11246            }
11247            .intern(db),
11248        )
11249    }
11250}
11251impl<'db> StatementItem<'db> {
11252    pub fn item(&self, db: &'db dyn Database) -> ModuleItem<'db> {
11253        ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11254    }
11255}
11256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11257pub struct StatementItemPtr<'db>(pub SyntaxStablePtrId<'db>);
11258impl<'db> StatementItemPtr<'db> {}
11259impl<'db> TypedStablePtr<'db> for StatementItemPtr<'db> {
11260    type SyntaxNode = StatementItem<'db>;
11261    fn untyped(self) -> SyntaxStablePtrId<'db> {
11262        self.0
11263    }
11264    fn lookup(&self, db: &'db dyn Database) -> StatementItem<'db> {
11265        StatementItem::from_syntax_node(db, self.0.lookup(db))
11266    }
11267}
11268impl<'db> From<StatementItemPtr<'db>> for SyntaxStablePtrId<'db> {
11269    fn from(ptr: StatementItemPtr<'db>) -> Self {
11270        ptr.untyped()
11271    }
11272}
11273#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11274pub struct StatementItemGreen<'db>(pub GreenId<'db>);
11275impl<'db> TypedSyntaxNode<'db> for StatementItem<'db> {
11276    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11277    type StablePtr = StatementItemPtr<'db>;
11278    type Green = StatementItemGreen<'db>;
11279    fn missing(db: &'db dyn Database) -> Self::Green {
11280        StatementItemGreen(
11281            GreenNode {
11282                kind: SyntaxKind::StatementItem,
11283                details: GreenNodeDetails::Node {
11284                    children: [ModuleItem::missing(db).0].into(),
11285                    width: TextWidth::default(),
11286                },
11287            }
11288            .intern(db),
11289        )
11290    }
11291    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11292        let kind = node.kind(db);
11293        assert_eq!(
11294            kind,
11295            SyntaxKind::StatementItem,
11296            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11297            kind,
11298            SyntaxKind::StatementItem
11299        );
11300        Self { node }
11301    }
11302    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11303        let kind = node.kind(db);
11304        if kind == SyntaxKind::StatementItem {
11305            Some(Self::from_syntax_node(db, node))
11306        } else {
11307            None
11308        }
11309    }
11310    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11311        self.node
11312    }
11313    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11314        StatementItemPtr(self.node.stable_ptr(db))
11315    }
11316}
11317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11318pub struct Param<'db> {
11319    node: SyntaxNode<'db>,
11320}
11321impl<'db> Param<'db> {
11322    pub const INDEX_MODIFIERS: usize = 0;
11323    pub const INDEX_NAME: usize = 1;
11324    pub const INDEX_TYPE_CLAUSE: usize = 2;
11325    pub fn new_green(
11326        db: &'db dyn Database,
11327        modifiers: ModifierListGreen<'db>,
11328        name: TerminalIdentifierGreen<'db>,
11329        type_clause: OptionTypeClauseGreen<'db>,
11330    ) -> ParamGreen<'db> {
11331        let children = [modifiers.0, name.0, type_clause.0];
11332        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11333        ParamGreen(
11334            GreenNode {
11335                kind: SyntaxKind::Param,
11336                details: GreenNodeDetails::Node { children: children.into(), width },
11337            }
11338            .intern(db),
11339        )
11340    }
11341}
11342impl<'db> Param<'db> {
11343    pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
11344        ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11345    }
11346    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
11347        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11348    }
11349    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
11350        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11351    }
11352}
11353#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11354pub struct ParamPtr<'db>(pub SyntaxStablePtrId<'db>);
11355impl<'db> ParamPtr<'db> {
11356    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
11357        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
11358    }
11359}
11360impl<'db> TypedStablePtr<'db> for ParamPtr<'db> {
11361    type SyntaxNode = Param<'db>;
11362    fn untyped(self) -> SyntaxStablePtrId<'db> {
11363        self.0
11364    }
11365    fn lookup(&self, db: &'db dyn Database) -> Param<'db> {
11366        Param::from_syntax_node(db, self.0.lookup(db))
11367    }
11368}
11369impl<'db> From<ParamPtr<'db>> for SyntaxStablePtrId<'db> {
11370    fn from(ptr: ParamPtr<'db>) -> Self {
11371        ptr.untyped()
11372    }
11373}
11374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11375pub struct ParamGreen<'db>(pub GreenId<'db>);
11376impl<'db> TypedSyntaxNode<'db> for Param<'db> {
11377    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11378    type StablePtr = ParamPtr<'db>;
11379    type Green = ParamGreen<'db>;
11380    fn missing(db: &'db dyn Database) -> Self::Green {
11381        ParamGreen(
11382            GreenNode {
11383                kind: SyntaxKind::Param,
11384                details: GreenNodeDetails::Node {
11385                    children: [
11386                        ModifierList::missing(db).0,
11387                        TerminalIdentifier::missing(db).0,
11388                        OptionTypeClause::missing(db).0,
11389                    ]
11390                    .into(),
11391                    width: TextWidth::default(),
11392                },
11393            }
11394            .intern(db),
11395        )
11396    }
11397    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11398        let kind = node.kind(db);
11399        assert_eq!(
11400            kind,
11401            SyntaxKind::Param,
11402            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11403            kind,
11404            SyntaxKind::Param
11405        );
11406        Self { node }
11407    }
11408    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11409        let kind = node.kind(db);
11410        if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11411    }
11412    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11413        self.node
11414    }
11415    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11416        ParamPtr(self.node.stable_ptr(db))
11417    }
11418}
11419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11420pub struct ModifierList<'db>(ElementList<'db, Modifier<'db>, 1>);
11421impl<'db> Deref for ModifierList<'db> {
11422    type Target = ElementList<'db, Modifier<'db>, 1>;
11423    fn deref(&self) -> &Self::Target {
11424        &self.0
11425    }
11426}
11427impl<'db> ModifierList<'db> {
11428    pub fn new_green(
11429        db: &'db dyn Database,
11430        children: &[ModifierGreen<'db>],
11431    ) -> ModifierListGreen<'db> {
11432        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
11433        ModifierListGreen(
11434            GreenNode {
11435                kind: SyntaxKind::ModifierList,
11436                details: GreenNodeDetails::Node {
11437                    children: children.iter().map(|x| x.0).collect(),
11438                    width,
11439                },
11440            }
11441            .intern(db),
11442        )
11443    }
11444}
11445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11446pub struct ModifierListPtr<'db>(pub SyntaxStablePtrId<'db>);
11447impl<'db> TypedStablePtr<'db> for ModifierListPtr<'db> {
11448    type SyntaxNode = ModifierList<'db>;
11449    fn untyped(self) -> SyntaxStablePtrId<'db> {
11450        self.0
11451    }
11452    fn lookup(&self, db: &'db dyn Database) -> ModifierList<'db> {
11453        ModifierList::from_syntax_node(db, self.0.lookup(db))
11454    }
11455}
11456impl<'db> From<ModifierListPtr<'db>> for SyntaxStablePtrId<'db> {
11457    fn from(ptr: ModifierListPtr<'db>) -> Self {
11458        ptr.untyped()
11459    }
11460}
11461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11462pub struct ModifierListGreen<'db>(pub GreenId<'db>);
11463impl<'db> TypedSyntaxNode<'db> for ModifierList<'db> {
11464    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11465    type StablePtr = ModifierListPtr<'db>;
11466    type Green = ModifierListGreen<'db>;
11467    fn missing(db: &'db dyn Database) -> Self::Green {
11468        ModifierListGreen(
11469            GreenNode {
11470                kind: SyntaxKind::ModifierList,
11471                details: GreenNodeDetails::Node {
11472                    children: [].into(),
11473                    width: TextWidth::default(),
11474                },
11475            }
11476            .intern(db),
11477        )
11478    }
11479    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11480        Self(ElementList::new(node))
11481    }
11482    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11483        if node.kind(db) == SyntaxKind::ModifierList {
11484            Some(Self(ElementList::new(node)))
11485        } else {
11486            None
11487        }
11488    }
11489    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11490        self.node
11491    }
11492    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11493        ModifierListPtr(self.node.stable_ptr(db))
11494    }
11495}
11496#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11497pub enum Modifier<'db> {
11498    Ref(TerminalRef<'db>),
11499    Mut(TerminalMut<'db>),
11500}
11501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11502pub struct ModifierPtr<'db>(pub SyntaxStablePtrId<'db>);
11503impl<'db> TypedStablePtr<'db> for ModifierPtr<'db> {
11504    type SyntaxNode = Modifier<'db>;
11505    fn untyped(self) -> SyntaxStablePtrId<'db> {
11506        self.0
11507    }
11508    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11509        Modifier::from_syntax_node(db, self.0.lookup(db))
11510    }
11511}
11512impl<'db> From<ModifierPtr<'db>> for SyntaxStablePtrId<'db> {
11513    fn from(ptr: ModifierPtr<'db>) -> Self {
11514        ptr.untyped()
11515    }
11516}
11517impl<'db> From<TerminalRefPtr<'db>> for ModifierPtr<'db> {
11518    fn from(value: TerminalRefPtr<'db>) -> Self {
11519        Self(value.0)
11520    }
11521}
11522impl<'db> From<TerminalMutPtr<'db>> for ModifierPtr<'db> {
11523    fn from(value: TerminalMutPtr<'db>) -> Self {
11524        Self(value.0)
11525    }
11526}
11527impl<'db> From<TerminalRefGreen<'db>> for ModifierGreen<'db> {
11528    fn from(value: TerminalRefGreen<'db>) -> Self {
11529        Self(value.0)
11530    }
11531}
11532impl<'db> From<TerminalMutGreen<'db>> for ModifierGreen<'db> {
11533    fn from(value: TerminalMutGreen<'db>) -> Self {
11534        Self(value.0)
11535    }
11536}
11537#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11538pub struct ModifierGreen<'db>(pub GreenId<'db>);
11539impl<'db> TypedSyntaxNode<'db> for Modifier<'db> {
11540    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11541    type StablePtr = ModifierPtr<'db>;
11542    type Green = ModifierGreen<'db>;
11543    fn missing(db: &'db dyn Database) -> Self::Green {
11544        panic!("No missing variant.");
11545    }
11546    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11547        let kind = node.kind(db);
11548        match kind {
11549            SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11550            SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11551            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11552        }
11553    }
11554    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11555        let kind = node.kind(db);
11556        match kind {
11557            SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11558            SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11559            _ => None,
11560        }
11561    }
11562    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11563        match self {
11564            Modifier::Ref(x) => x.as_syntax_node(),
11565            Modifier::Mut(x) => x.as_syntax_node(),
11566        }
11567    }
11568    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11569        ModifierPtr(self.as_syntax_node().stable_ptr(db))
11570    }
11571}
11572impl<'db> Modifier<'db> {
11573    /// Checks if a kind of a variant of [Modifier].
11574    pub fn is_variant(kind: SyntaxKind) -> bool {
11575        matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11576    }
11577}
11578#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11579pub struct ParamList<'db>(ElementList<'db, Param<'db>, 2>);
11580impl<'db> Deref for ParamList<'db> {
11581    type Target = ElementList<'db, Param<'db>, 2>;
11582    fn deref(&self) -> &Self::Target {
11583        &self.0
11584    }
11585}
11586impl<'db> ParamList<'db> {
11587    pub fn new_green(
11588        db: &'db dyn Database,
11589        children: &[ParamListElementOrSeparatorGreen<'db>],
11590    ) -> ParamListGreen<'db> {
11591        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11592        ParamListGreen(
11593            GreenNode {
11594                kind: SyntaxKind::ParamList,
11595                details: GreenNodeDetails::Node {
11596                    children: children.iter().map(|x| x.id()).collect(),
11597                    width,
11598                },
11599            }
11600            .intern(db),
11601        )
11602    }
11603}
11604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11605pub struct ParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
11606impl<'db> TypedStablePtr<'db> for ParamListPtr<'db> {
11607    type SyntaxNode = ParamList<'db>;
11608    fn untyped(self) -> SyntaxStablePtrId<'db> {
11609        self.0
11610    }
11611    fn lookup(&self, db: &'db dyn Database) -> ParamList<'db> {
11612        ParamList::from_syntax_node(db, self.0.lookup(db))
11613    }
11614}
11615impl<'db> From<ParamListPtr<'db>> for SyntaxStablePtrId<'db> {
11616    fn from(ptr: ParamListPtr<'db>) -> Self {
11617        ptr.untyped()
11618    }
11619}
11620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11621pub enum ParamListElementOrSeparatorGreen<'db> {
11622    Separator(TerminalCommaGreen<'db>),
11623    Element(ParamGreen<'db>),
11624}
11625impl<'db> From<TerminalCommaGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11626    fn from(value: TerminalCommaGreen<'db>) -> Self {
11627        ParamListElementOrSeparatorGreen::Separator(value)
11628    }
11629}
11630impl<'db> From<ParamGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11631    fn from(value: ParamGreen<'db>) -> Self {
11632        ParamListElementOrSeparatorGreen::Element(value)
11633    }
11634}
11635impl<'db> ParamListElementOrSeparatorGreen<'db> {
11636    fn id(&self) -> GreenId<'db> {
11637        match self {
11638            ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11639            ParamListElementOrSeparatorGreen::Element(green) => green.0,
11640        }
11641    }
11642}
11643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11644pub struct ParamListGreen<'db>(pub GreenId<'db>);
11645impl<'db> TypedSyntaxNode<'db> for ParamList<'db> {
11646    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11647    type StablePtr = ParamListPtr<'db>;
11648    type Green = ParamListGreen<'db>;
11649    fn missing(db: &'db dyn Database) -> Self::Green {
11650        ParamListGreen(
11651            GreenNode {
11652                kind: SyntaxKind::ParamList,
11653                details: GreenNodeDetails::Node {
11654                    children: [].into(),
11655                    width: TextWidth::default(),
11656                },
11657            }
11658            .intern(db),
11659        )
11660    }
11661    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11662        Self(ElementList::new(node))
11663    }
11664    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11665        if node.kind(db) == SyntaxKind::ParamList {
11666            Some(Self(ElementList::new(node)))
11667        } else {
11668            None
11669        }
11670    }
11671    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11672        self.node
11673    }
11674    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11675        ParamListPtr(self.node.stable_ptr(db))
11676    }
11677}
11678#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11679pub struct ImplicitsClause<'db> {
11680    node: SyntaxNode<'db>,
11681}
11682impl<'db> ImplicitsClause<'db> {
11683    pub const INDEX_IMPLICITS_KW: usize = 0;
11684    pub const INDEX_LPAREN: usize = 1;
11685    pub const INDEX_IMPLICITS: usize = 2;
11686    pub const INDEX_RPAREN: usize = 3;
11687    pub fn new_green(
11688        db: &'db dyn Database,
11689        implicits_kw: TerminalImplicitsGreen<'db>,
11690        lparen: TerminalLParenGreen<'db>,
11691        implicits: ImplicitsListGreen<'db>,
11692        rparen: TerminalRParenGreen<'db>,
11693    ) -> ImplicitsClauseGreen<'db> {
11694        let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11695        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11696        ImplicitsClauseGreen(
11697            GreenNode {
11698                kind: SyntaxKind::ImplicitsClause,
11699                details: GreenNodeDetails::Node { children: children.into(), width },
11700            }
11701            .intern(db),
11702        )
11703    }
11704}
11705impl<'db> ImplicitsClause<'db> {
11706    pub fn implicits_kw(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
11707        TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11708    }
11709    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
11710        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11711    }
11712    pub fn implicits(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11713        ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11714    }
11715    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
11716        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11717    }
11718}
11719#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11720pub struct ImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11721impl<'db> ImplicitsClausePtr<'db> {}
11722impl<'db> TypedStablePtr<'db> for ImplicitsClausePtr<'db> {
11723    type SyntaxNode = ImplicitsClause<'db>;
11724    fn untyped(self) -> SyntaxStablePtrId<'db> {
11725        self.0
11726    }
11727    fn lookup(&self, db: &'db dyn Database) -> ImplicitsClause<'db> {
11728        ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11729    }
11730}
11731impl<'db> From<ImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11732    fn from(ptr: ImplicitsClausePtr<'db>) -> Self {
11733        ptr.untyped()
11734    }
11735}
11736#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11737pub struct ImplicitsClauseGreen<'db>(pub GreenId<'db>);
11738impl<'db> TypedSyntaxNode<'db> for ImplicitsClause<'db> {
11739    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11740    type StablePtr = ImplicitsClausePtr<'db>;
11741    type Green = ImplicitsClauseGreen<'db>;
11742    fn missing(db: &'db dyn Database) -> Self::Green {
11743        ImplicitsClauseGreen(
11744            GreenNode {
11745                kind: SyntaxKind::ImplicitsClause,
11746                details: GreenNodeDetails::Node {
11747                    children: [
11748                        TerminalImplicits::missing(db).0,
11749                        TerminalLParen::missing(db).0,
11750                        ImplicitsList::missing(db).0,
11751                        TerminalRParen::missing(db).0,
11752                    ]
11753                    .into(),
11754                    width: TextWidth::default(),
11755                },
11756            }
11757            .intern(db),
11758        )
11759    }
11760    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11761        let kind = node.kind(db);
11762        assert_eq!(
11763            kind,
11764            SyntaxKind::ImplicitsClause,
11765            "Unexpected SyntaxKind {:?}. Expected {:?}.",
11766            kind,
11767            SyntaxKind::ImplicitsClause
11768        );
11769        Self { node }
11770    }
11771    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11772        let kind = node.kind(db);
11773        if kind == SyntaxKind::ImplicitsClause {
11774            Some(Self::from_syntax_node(db, node))
11775        } else {
11776            None
11777        }
11778    }
11779    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11780        self.node
11781    }
11782    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11783        ImplicitsClausePtr(self.node.stable_ptr(db))
11784    }
11785}
11786#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11787pub struct ImplicitsList<'db>(ElementList<'db, ExprPath<'db>, 2>);
11788impl<'db> Deref for ImplicitsList<'db> {
11789    type Target = ElementList<'db, ExprPath<'db>, 2>;
11790    fn deref(&self) -> &Self::Target {
11791        &self.0
11792    }
11793}
11794impl<'db> ImplicitsList<'db> {
11795    pub fn new_green(
11796        db: &'db dyn Database,
11797        children: &[ImplicitsListElementOrSeparatorGreen<'db>],
11798    ) -> ImplicitsListGreen<'db> {
11799        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11800        ImplicitsListGreen(
11801            GreenNode {
11802                kind: SyntaxKind::ImplicitsList,
11803                details: GreenNodeDetails::Node {
11804                    children: children.iter().map(|x| x.id()).collect(),
11805                    width,
11806                },
11807            }
11808            .intern(db),
11809        )
11810    }
11811}
11812#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11813pub struct ImplicitsListPtr<'db>(pub SyntaxStablePtrId<'db>);
11814impl<'db> TypedStablePtr<'db> for ImplicitsListPtr<'db> {
11815    type SyntaxNode = ImplicitsList<'db>;
11816    fn untyped(self) -> SyntaxStablePtrId<'db> {
11817        self.0
11818    }
11819    fn lookup(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11820        ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11821    }
11822}
11823impl<'db> From<ImplicitsListPtr<'db>> for SyntaxStablePtrId<'db> {
11824    fn from(ptr: ImplicitsListPtr<'db>) -> Self {
11825        ptr.untyped()
11826    }
11827}
11828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11829pub enum ImplicitsListElementOrSeparatorGreen<'db> {
11830    Separator(TerminalCommaGreen<'db>),
11831    Element(ExprPathGreen<'db>),
11832}
11833impl<'db> From<TerminalCommaGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11834    fn from(value: TerminalCommaGreen<'db>) -> Self {
11835        ImplicitsListElementOrSeparatorGreen::Separator(value)
11836    }
11837}
11838impl<'db> From<ExprPathGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11839    fn from(value: ExprPathGreen<'db>) -> Self {
11840        ImplicitsListElementOrSeparatorGreen::Element(value)
11841    }
11842}
11843impl<'db> ImplicitsListElementOrSeparatorGreen<'db> {
11844    fn id(&self) -> GreenId<'db> {
11845        match self {
11846            ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11847            ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11848        }
11849    }
11850}
11851#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11852pub struct ImplicitsListGreen<'db>(pub GreenId<'db>);
11853impl<'db> TypedSyntaxNode<'db> for ImplicitsList<'db> {
11854    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11855    type StablePtr = ImplicitsListPtr<'db>;
11856    type Green = ImplicitsListGreen<'db>;
11857    fn missing(db: &'db dyn Database) -> Self::Green {
11858        ImplicitsListGreen(
11859            GreenNode {
11860                kind: SyntaxKind::ImplicitsList,
11861                details: GreenNodeDetails::Node {
11862                    children: [].into(),
11863                    width: TextWidth::default(),
11864                },
11865            }
11866            .intern(db),
11867        )
11868    }
11869    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11870        Self(ElementList::new(node))
11871    }
11872    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11873        if node.kind(db) == SyntaxKind::ImplicitsList {
11874            Some(Self(ElementList::new(node)))
11875        } else {
11876            None
11877        }
11878    }
11879    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11880        self.node
11881    }
11882    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11883        ImplicitsListPtr(self.node.stable_ptr(db))
11884    }
11885}
11886#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11887pub enum OptionImplicitsClause<'db> {
11888    Empty(OptionImplicitsClauseEmpty<'db>),
11889    ImplicitsClause(ImplicitsClause<'db>),
11890}
11891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11892pub struct OptionImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11893impl<'db> TypedStablePtr<'db> for OptionImplicitsClausePtr<'db> {
11894    type SyntaxNode = OptionImplicitsClause<'db>;
11895    fn untyped(self) -> SyntaxStablePtrId<'db> {
11896        self.0
11897    }
11898    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11899        OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11900    }
11901}
11902impl<'db> From<OptionImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11903    fn from(ptr: OptionImplicitsClausePtr<'db>) -> Self {
11904        ptr.untyped()
11905    }
11906}
11907impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for OptionImplicitsClausePtr<'db> {
11908    fn from(value: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
11909        Self(value.0)
11910    }
11911}
11912impl<'db> From<ImplicitsClausePtr<'db>> for OptionImplicitsClausePtr<'db> {
11913    fn from(value: ImplicitsClausePtr<'db>) -> Self {
11914        Self(value.0)
11915    }
11916}
11917impl<'db> From<OptionImplicitsClauseEmptyGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11918    fn from(value: OptionImplicitsClauseEmptyGreen<'db>) -> Self {
11919        Self(value.0)
11920    }
11921}
11922impl<'db> From<ImplicitsClauseGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11923    fn from(value: ImplicitsClauseGreen<'db>) -> Self {
11924        Self(value.0)
11925    }
11926}
11927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11928pub struct OptionImplicitsClauseGreen<'db>(pub GreenId<'db>);
11929impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClause<'db> {
11930    const OPTIONAL_KIND: Option<SyntaxKind> = None;
11931    type StablePtr = OptionImplicitsClausePtr<'db>;
11932    type Green = OptionImplicitsClauseGreen<'db>;
11933    fn missing(db: &'db dyn Database) -> Self::Green {
11934        panic!("No missing variant.");
11935    }
11936    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11937        let kind = node.kind(db);
11938        match kind {
11939            SyntaxKind::OptionImplicitsClauseEmpty => {
11940                OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
11941            }
11942            SyntaxKind::ImplicitsClause => {
11943                OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
11944            }
11945            _ => panic!(
11946                "Unexpected syntax kind {:?} when constructing {}.",
11947                kind, "OptionImplicitsClause"
11948            ),
11949        }
11950    }
11951    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11952        let kind = node.kind(db);
11953        match kind {
11954            SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
11955                OptionImplicitsClauseEmpty::from_syntax_node(db, node),
11956            )),
11957            SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
11958                ImplicitsClause::from_syntax_node(db, node),
11959            )),
11960            _ => None,
11961        }
11962    }
11963    fn as_syntax_node(&self) -> SyntaxNode<'db> {
11964        match self {
11965            OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
11966            OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
11967        }
11968    }
11969    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11970        OptionImplicitsClausePtr(self.as_syntax_node().stable_ptr(db))
11971    }
11972}
11973impl<'db> OptionImplicitsClause<'db> {
11974    /// Checks if a kind of a variant of [OptionImplicitsClause].
11975    pub fn is_variant(kind: SyntaxKind) -> bool {
11976        matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
11977    }
11978}
11979#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11980pub struct OptionImplicitsClauseEmpty<'db> {
11981    node: SyntaxNode<'db>,
11982}
11983impl<'db> OptionImplicitsClauseEmpty<'db> {
11984    pub fn new_green(db: &'db dyn Database) -> OptionImplicitsClauseEmptyGreen<'db> {
11985        let children = [];
11986        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11987        OptionImplicitsClauseEmptyGreen(
11988            GreenNode {
11989                kind: SyntaxKind::OptionImplicitsClauseEmpty,
11990                details: GreenNodeDetails::Node { children: children.into(), width },
11991            }
11992            .intern(db),
11993        )
11994    }
11995}
11996impl<'db> OptionImplicitsClauseEmpty<'db> {}
11997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
11998pub struct OptionImplicitsClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
11999impl<'db> OptionImplicitsClauseEmptyPtr<'db> {}
12000impl<'db> TypedStablePtr<'db> for OptionImplicitsClauseEmptyPtr<'db> {
12001    type SyntaxNode = OptionImplicitsClauseEmpty<'db>;
12002    fn untyped(self) -> SyntaxStablePtrId<'db> {
12003        self.0
12004    }
12005    fn lookup(&self, db: &'db dyn Database) -> OptionImplicitsClauseEmpty<'db> {
12006        OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12007    }
12008}
12009impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12010    fn from(ptr: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
12011        ptr.untyped()
12012    }
12013}
12014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12015pub struct OptionImplicitsClauseEmptyGreen<'db>(pub GreenId<'db>);
12016impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClauseEmpty<'db> {
12017    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12018    type StablePtr = OptionImplicitsClauseEmptyPtr<'db>;
12019    type Green = OptionImplicitsClauseEmptyGreen<'db>;
12020    fn missing(db: &'db dyn Database) -> Self::Green {
12021        OptionImplicitsClauseEmptyGreen(
12022            GreenNode {
12023                kind: SyntaxKind::OptionImplicitsClauseEmpty,
12024                details: GreenNodeDetails::Node {
12025                    children: [].into(),
12026                    width: TextWidth::default(),
12027                },
12028            }
12029            .intern(db),
12030        )
12031    }
12032    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12033        let kind = node.kind(db);
12034        assert_eq!(
12035            kind,
12036            SyntaxKind::OptionImplicitsClauseEmpty,
12037            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12038            kind,
12039            SyntaxKind::OptionImplicitsClauseEmpty
12040        );
12041        Self { node }
12042    }
12043    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12044        let kind = node.kind(db);
12045        if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12046            Some(Self::from_syntax_node(db, node))
12047        } else {
12048            None
12049        }
12050    }
12051    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12052        self.node
12053    }
12054    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12055        OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12056    }
12057}
12058#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12059pub enum OptionTerminalNoPanic<'db> {
12060    Empty(OptionTerminalNoPanicEmpty<'db>),
12061    TerminalNoPanic(TerminalNoPanic<'db>),
12062}
12063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12064pub struct OptionTerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
12065impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicPtr<'db> {
12066    type SyntaxNode = OptionTerminalNoPanic<'db>;
12067    fn untyped(self) -> SyntaxStablePtrId<'db> {
12068        self.0
12069    }
12070    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12071        OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12072    }
12073}
12074impl<'db> From<OptionTerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
12075    fn from(ptr: OptionTerminalNoPanicPtr<'db>) -> Self {
12076        ptr.untyped()
12077    }
12078}
12079impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12080    fn from(value: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12081        Self(value.0)
12082    }
12083}
12084impl<'db> From<TerminalNoPanicPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12085    fn from(value: TerminalNoPanicPtr<'db>) -> Self {
12086        Self(value.0)
12087    }
12088}
12089impl<'db> From<OptionTerminalNoPanicEmptyGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12090    fn from(value: OptionTerminalNoPanicEmptyGreen<'db>) -> Self {
12091        Self(value.0)
12092    }
12093}
12094impl<'db> From<TerminalNoPanicGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12095    fn from(value: TerminalNoPanicGreen<'db>) -> Self {
12096        Self(value.0)
12097    }
12098}
12099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12100pub struct OptionTerminalNoPanicGreen<'db>(pub GreenId<'db>);
12101impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanic<'db> {
12102    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12103    type StablePtr = OptionTerminalNoPanicPtr<'db>;
12104    type Green = OptionTerminalNoPanicGreen<'db>;
12105    fn missing(db: &'db dyn Database) -> Self::Green {
12106        panic!("No missing variant.");
12107    }
12108    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12109        let kind = node.kind(db);
12110        match kind {
12111            SyntaxKind::OptionTerminalNoPanicEmpty => {
12112                OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12113            }
12114            SyntaxKind::TerminalNoPanic => {
12115                OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12116            }
12117            _ => panic!(
12118                "Unexpected syntax kind {:?} when constructing {}.",
12119                kind, "OptionTerminalNoPanic"
12120            ),
12121        }
12122    }
12123    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12124        let kind = node.kind(db);
12125        match kind {
12126            SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12127                OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12128            )),
12129            SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12130                TerminalNoPanic::from_syntax_node(db, node),
12131            )),
12132            _ => None,
12133        }
12134    }
12135    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12136        match self {
12137            OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12138            OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12139        }
12140    }
12141    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12142        OptionTerminalNoPanicPtr(self.as_syntax_node().stable_ptr(db))
12143    }
12144}
12145impl<'db> OptionTerminalNoPanic<'db> {
12146    /// Checks if a kind of a variant of [OptionTerminalNoPanic].
12147    pub fn is_variant(kind: SyntaxKind) -> bool {
12148        matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12149    }
12150}
12151#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12152pub struct OptionTerminalNoPanicEmpty<'db> {
12153    node: SyntaxNode<'db>,
12154}
12155impl<'db> OptionTerminalNoPanicEmpty<'db> {
12156    pub fn new_green(db: &'db dyn Database) -> OptionTerminalNoPanicEmptyGreen<'db> {
12157        let children = [];
12158        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12159        OptionTerminalNoPanicEmptyGreen(
12160            GreenNode {
12161                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12162                details: GreenNodeDetails::Node { children: children.into(), width },
12163            }
12164            .intern(db),
12165        )
12166    }
12167}
12168impl<'db> OptionTerminalNoPanicEmpty<'db> {}
12169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12170pub struct OptionTerminalNoPanicEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12171impl<'db> OptionTerminalNoPanicEmptyPtr<'db> {}
12172impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicEmptyPtr<'db> {
12173    type SyntaxNode = OptionTerminalNoPanicEmpty<'db>;
12174    fn untyped(self) -> SyntaxStablePtrId<'db> {
12175        self.0
12176    }
12177    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalNoPanicEmpty<'db> {
12178        OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12179    }
12180}
12181impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12182    fn from(ptr: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12183        ptr.untyped()
12184    }
12185}
12186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12187pub struct OptionTerminalNoPanicEmptyGreen<'db>(pub GreenId<'db>);
12188impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanicEmpty<'db> {
12189    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12190    type StablePtr = OptionTerminalNoPanicEmptyPtr<'db>;
12191    type Green = OptionTerminalNoPanicEmptyGreen<'db>;
12192    fn missing(db: &'db dyn Database) -> Self::Green {
12193        OptionTerminalNoPanicEmptyGreen(
12194            GreenNode {
12195                kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12196                details: GreenNodeDetails::Node {
12197                    children: [].into(),
12198                    width: TextWidth::default(),
12199                },
12200            }
12201            .intern(db),
12202        )
12203    }
12204    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12205        let kind = node.kind(db);
12206        assert_eq!(
12207            kind,
12208            SyntaxKind::OptionTerminalNoPanicEmpty,
12209            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12210            kind,
12211            SyntaxKind::OptionTerminalNoPanicEmpty
12212        );
12213        Self { node }
12214    }
12215    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12216        let kind = node.kind(db);
12217        if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12218            Some(Self::from_syntax_node(db, node))
12219        } else {
12220            None
12221        }
12222    }
12223    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12224        self.node
12225    }
12226    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12227        OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12228    }
12229}
12230#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12231pub enum OptionTerminalConst<'db> {
12232    Empty(OptionTerminalConstEmpty<'db>),
12233    TerminalConst(TerminalConst<'db>),
12234}
12235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12236pub struct OptionTerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
12237impl<'db> TypedStablePtr<'db> for OptionTerminalConstPtr<'db> {
12238    type SyntaxNode = OptionTerminalConst<'db>;
12239    fn untyped(self) -> SyntaxStablePtrId<'db> {
12240        self.0
12241    }
12242    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12243        OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12244    }
12245}
12246impl<'db> From<OptionTerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
12247    fn from(ptr: OptionTerminalConstPtr<'db>) -> Self {
12248        ptr.untyped()
12249    }
12250}
12251impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for OptionTerminalConstPtr<'db> {
12252    fn from(value: OptionTerminalConstEmptyPtr<'db>) -> Self {
12253        Self(value.0)
12254    }
12255}
12256impl<'db> From<TerminalConstPtr<'db>> for OptionTerminalConstPtr<'db> {
12257    fn from(value: TerminalConstPtr<'db>) -> Self {
12258        Self(value.0)
12259    }
12260}
12261impl<'db> From<OptionTerminalConstEmptyGreen<'db>> for OptionTerminalConstGreen<'db> {
12262    fn from(value: OptionTerminalConstEmptyGreen<'db>) -> Self {
12263        Self(value.0)
12264    }
12265}
12266impl<'db> From<TerminalConstGreen<'db>> for OptionTerminalConstGreen<'db> {
12267    fn from(value: TerminalConstGreen<'db>) -> Self {
12268        Self(value.0)
12269    }
12270}
12271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12272pub struct OptionTerminalConstGreen<'db>(pub GreenId<'db>);
12273impl<'db> TypedSyntaxNode<'db> for OptionTerminalConst<'db> {
12274    const OPTIONAL_KIND: Option<SyntaxKind> = None;
12275    type StablePtr = OptionTerminalConstPtr<'db>;
12276    type Green = OptionTerminalConstGreen<'db>;
12277    fn missing(db: &'db dyn Database) -> Self::Green {
12278        panic!("No missing variant.");
12279    }
12280    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12281        let kind = node.kind(db);
12282        match kind {
12283            SyntaxKind::OptionTerminalConstEmpty => {
12284                OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12285            }
12286            SyntaxKind::TerminalConst => {
12287                OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12288            }
12289            _ => panic!(
12290                "Unexpected syntax kind {:?} when constructing {}.",
12291                kind, "OptionTerminalConst"
12292            ),
12293        }
12294    }
12295    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12296        let kind = node.kind(db);
12297        match kind {
12298            SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12299                OptionTerminalConstEmpty::from_syntax_node(db, node),
12300            )),
12301            SyntaxKind::TerminalConst => {
12302                Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12303            }
12304            _ => None,
12305        }
12306    }
12307    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12308        match self {
12309            OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12310            OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12311        }
12312    }
12313    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12314        OptionTerminalConstPtr(self.as_syntax_node().stable_ptr(db))
12315    }
12316}
12317impl<'db> OptionTerminalConst<'db> {
12318    /// Checks if a kind of a variant of [OptionTerminalConst].
12319    pub fn is_variant(kind: SyntaxKind) -> bool {
12320        matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12321    }
12322}
12323#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12324pub struct OptionTerminalConstEmpty<'db> {
12325    node: SyntaxNode<'db>,
12326}
12327impl<'db> OptionTerminalConstEmpty<'db> {
12328    pub fn new_green(db: &'db dyn Database) -> OptionTerminalConstEmptyGreen<'db> {
12329        let children = [];
12330        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12331        OptionTerminalConstEmptyGreen(
12332            GreenNode {
12333                kind: SyntaxKind::OptionTerminalConstEmpty,
12334                details: GreenNodeDetails::Node { children: children.into(), width },
12335            }
12336            .intern(db),
12337        )
12338    }
12339}
12340impl<'db> OptionTerminalConstEmpty<'db> {}
12341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12342pub struct OptionTerminalConstEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12343impl<'db> OptionTerminalConstEmptyPtr<'db> {}
12344impl<'db> TypedStablePtr<'db> for OptionTerminalConstEmptyPtr<'db> {
12345    type SyntaxNode = OptionTerminalConstEmpty<'db>;
12346    fn untyped(self) -> SyntaxStablePtrId<'db> {
12347        self.0
12348    }
12349    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalConstEmpty<'db> {
12350        OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12351    }
12352}
12353impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12354    fn from(ptr: OptionTerminalConstEmptyPtr<'db>) -> Self {
12355        ptr.untyped()
12356    }
12357}
12358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12359pub struct OptionTerminalConstEmptyGreen<'db>(pub GreenId<'db>);
12360impl<'db> TypedSyntaxNode<'db> for OptionTerminalConstEmpty<'db> {
12361    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12362    type StablePtr = OptionTerminalConstEmptyPtr<'db>;
12363    type Green = OptionTerminalConstEmptyGreen<'db>;
12364    fn missing(db: &'db dyn Database) -> Self::Green {
12365        OptionTerminalConstEmptyGreen(
12366            GreenNode {
12367                kind: SyntaxKind::OptionTerminalConstEmpty,
12368                details: GreenNodeDetails::Node {
12369                    children: [].into(),
12370                    width: TextWidth::default(),
12371                },
12372            }
12373            .intern(db),
12374        )
12375    }
12376    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12377        let kind = node.kind(db);
12378        assert_eq!(
12379            kind,
12380            SyntaxKind::OptionTerminalConstEmpty,
12381            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12382            kind,
12383            SyntaxKind::OptionTerminalConstEmpty
12384        );
12385        Self { node }
12386    }
12387    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12388        let kind = node.kind(db);
12389        if kind == SyntaxKind::OptionTerminalConstEmpty {
12390            Some(Self::from_syntax_node(db, node))
12391        } else {
12392            None
12393        }
12394    }
12395    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12396        self.node
12397    }
12398    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12399        OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12400    }
12401}
12402#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12403pub struct FunctionSignature<'db> {
12404    node: SyntaxNode<'db>,
12405}
12406impl<'db> FunctionSignature<'db> {
12407    pub const INDEX_LPAREN: usize = 0;
12408    pub const INDEX_PARAMETERS: usize = 1;
12409    pub const INDEX_RPAREN: usize = 2;
12410    pub const INDEX_RET_TY: usize = 3;
12411    pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12412    pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12413    pub fn new_green(
12414        db: &'db dyn Database,
12415        lparen: TerminalLParenGreen<'db>,
12416        parameters: ParamListGreen<'db>,
12417        rparen: TerminalRParenGreen<'db>,
12418        ret_ty: OptionReturnTypeClauseGreen<'db>,
12419        implicits_clause: OptionImplicitsClauseGreen<'db>,
12420        optional_no_panic: OptionTerminalNoPanicGreen<'db>,
12421    ) -> FunctionSignatureGreen<'db> {
12422        let children =
12423            [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12424        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12425        FunctionSignatureGreen(
12426            GreenNode {
12427                kind: SyntaxKind::FunctionSignature,
12428                details: GreenNodeDetails::Node { children: children.into(), width },
12429            }
12430            .intern(db),
12431        )
12432    }
12433}
12434impl<'db> FunctionSignature<'db> {
12435    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
12436        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12437    }
12438    pub fn parameters(&self, db: &'db dyn Database) -> ParamList<'db> {
12439        ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12440    }
12441    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
12442        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12443    }
12444    pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
12445        OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12446    }
12447    pub fn implicits_clause(&self, db: &'db dyn Database) -> OptionImplicitsClause<'db> {
12448        OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12449    }
12450    pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
12451        OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12452    }
12453}
12454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12455pub struct FunctionSignaturePtr<'db>(pub SyntaxStablePtrId<'db>);
12456impl<'db> FunctionSignaturePtr<'db> {}
12457impl<'db> TypedStablePtr<'db> for FunctionSignaturePtr<'db> {
12458    type SyntaxNode = FunctionSignature<'db>;
12459    fn untyped(self) -> SyntaxStablePtrId<'db> {
12460        self.0
12461    }
12462    fn lookup(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
12463        FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12464    }
12465}
12466impl<'db> From<FunctionSignaturePtr<'db>> for SyntaxStablePtrId<'db> {
12467    fn from(ptr: FunctionSignaturePtr<'db>) -> Self {
12468        ptr.untyped()
12469    }
12470}
12471#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12472pub struct FunctionSignatureGreen<'db>(pub GreenId<'db>);
12473impl<'db> TypedSyntaxNode<'db> for FunctionSignature<'db> {
12474    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12475    type StablePtr = FunctionSignaturePtr<'db>;
12476    type Green = FunctionSignatureGreen<'db>;
12477    fn missing(db: &'db dyn Database) -> Self::Green {
12478        FunctionSignatureGreen(
12479            GreenNode {
12480                kind: SyntaxKind::FunctionSignature,
12481                details: GreenNodeDetails::Node {
12482                    children: [
12483                        TerminalLParen::missing(db).0,
12484                        ParamList::missing(db).0,
12485                        TerminalRParen::missing(db).0,
12486                        OptionReturnTypeClause::missing(db).0,
12487                        OptionImplicitsClause::missing(db).0,
12488                        OptionTerminalNoPanic::missing(db).0,
12489                    ]
12490                    .into(),
12491                    width: TextWidth::default(),
12492                },
12493            }
12494            .intern(db),
12495        )
12496    }
12497    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12498        let kind = node.kind(db);
12499        assert_eq!(
12500            kind,
12501            SyntaxKind::FunctionSignature,
12502            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12503            kind,
12504            SyntaxKind::FunctionSignature
12505        );
12506        Self { node }
12507    }
12508    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12509        let kind = node.kind(db);
12510        if kind == SyntaxKind::FunctionSignature {
12511            Some(Self::from_syntax_node(db, node))
12512        } else {
12513            None
12514        }
12515    }
12516    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12517        self.node
12518    }
12519    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12520        FunctionSignaturePtr(self.node.stable_ptr(db))
12521    }
12522}
12523#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12524pub struct Member<'db> {
12525    node: SyntaxNode<'db>,
12526}
12527impl<'db> Member<'db> {
12528    pub const INDEX_ATTRIBUTES: usize = 0;
12529    pub const INDEX_VISIBILITY: usize = 1;
12530    pub const INDEX_NAME: usize = 2;
12531    pub const INDEX_TYPE_CLAUSE: usize = 3;
12532    pub fn new_green(
12533        db: &'db dyn Database,
12534        attributes: AttributeListGreen<'db>,
12535        visibility: VisibilityGreen<'db>,
12536        name: TerminalIdentifierGreen<'db>,
12537        type_clause: TypeClauseGreen<'db>,
12538    ) -> MemberGreen<'db> {
12539        let children = [attributes.0, visibility.0, name.0, type_clause.0];
12540        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12541        MemberGreen(
12542            GreenNode {
12543                kind: SyntaxKind::Member,
12544                details: GreenNodeDetails::Node { children: children.into(), width },
12545            }
12546            .intern(db),
12547        )
12548    }
12549}
12550impl<'db> Member<'db> {
12551    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12552        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12553    }
12554    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
12555        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12556    }
12557    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12558        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12559    }
12560    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
12561        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12562    }
12563}
12564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12565pub struct MemberPtr<'db>(pub SyntaxStablePtrId<'db>);
12566impl<'db> MemberPtr<'db> {
12567    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12568        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12569    }
12570}
12571impl<'db> TypedStablePtr<'db> for MemberPtr<'db> {
12572    type SyntaxNode = Member<'db>;
12573    fn untyped(self) -> SyntaxStablePtrId<'db> {
12574        self.0
12575    }
12576    fn lookup(&self, db: &'db dyn Database) -> Member<'db> {
12577        Member::from_syntax_node(db, self.0.lookup(db))
12578    }
12579}
12580impl<'db> From<MemberPtr<'db>> for SyntaxStablePtrId<'db> {
12581    fn from(ptr: MemberPtr<'db>) -> Self {
12582        ptr.untyped()
12583    }
12584}
12585#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12586pub struct MemberGreen<'db>(pub GreenId<'db>);
12587impl<'db> TypedSyntaxNode<'db> for Member<'db> {
12588    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12589    type StablePtr = MemberPtr<'db>;
12590    type Green = MemberGreen<'db>;
12591    fn missing(db: &'db dyn Database) -> Self::Green {
12592        MemberGreen(
12593            GreenNode {
12594                kind: SyntaxKind::Member,
12595                details: GreenNodeDetails::Node {
12596                    children: [
12597                        AttributeList::missing(db).0,
12598                        Visibility::missing(db).0,
12599                        TerminalIdentifier::missing(db).0,
12600                        TypeClause::missing(db).0,
12601                    ]
12602                    .into(),
12603                    width: TextWidth::default(),
12604                },
12605            }
12606            .intern(db),
12607        )
12608    }
12609    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12610        let kind = node.kind(db);
12611        assert_eq!(
12612            kind,
12613            SyntaxKind::Member,
12614            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12615            kind,
12616            SyntaxKind::Member
12617        );
12618        Self { node }
12619    }
12620    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12621        let kind = node.kind(db);
12622        if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12623    }
12624    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12625        self.node
12626    }
12627    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12628        MemberPtr(self.node.stable_ptr(db))
12629    }
12630}
12631#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12632pub struct MemberList<'db>(ElementList<'db, Member<'db>, 2>);
12633impl<'db> Deref for MemberList<'db> {
12634    type Target = ElementList<'db, Member<'db>, 2>;
12635    fn deref(&self) -> &Self::Target {
12636        &self.0
12637    }
12638}
12639impl<'db> MemberList<'db> {
12640    pub fn new_green(
12641        db: &'db dyn Database,
12642        children: &[MemberListElementOrSeparatorGreen<'db>],
12643    ) -> MemberListGreen<'db> {
12644        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12645        MemberListGreen(
12646            GreenNode {
12647                kind: SyntaxKind::MemberList,
12648                details: GreenNodeDetails::Node {
12649                    children: children.iter().map(|x| x.id()).collect(),
12650                    width,
12651                },
12652            }
12653            .intern(db),
12654        )
12655    }
12656}
12657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12658pub struct MemberListPtr<'db>(pub SyntaxStablePtrId<'db>);
12659impl<'db> TypedStablePtr<'db> for MemberListPtr<'db> {
12660    type SyntaxNode = MemberList<'db>;
12661    fn untyped(self) -> SyntaxStablePtrId<'db> {
12662        self.0
12663    }
12664    fn lookup(&self, db: &'db dyn Database) -> MemberList<'db> {
12665        MemberList::from_syntax_node(db, self.0.lookup(db))
12666    }
12667}
12668impl<'db> From<MemberListPtr<'db>> for SyntaxStablePtrId<'db> {
12669    fn from(ptr: MemberListPtr<'db>) -> Self {
12670        ptr.untyped()
12671    }
12672}
12673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12674pub enum MemberListElementOrSeparatorGreen<'db> {
12675    Separator(TerminalCommaGreen<'db>),
12676    Element(MemberGreen<'db>),
12677}
12678impl<'db> From<TerminalCommaGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12679    fn from(value: TerminalCommaGreen<'db>) -> Self {
12680        MemberListElementOrSeparatorGreen::Separator(value)
12681    }
12682}
12683impl<'db> From<MemberGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12684    fn from(value: MemberGreen<'db>) -> Self {
12685        MemberListElementOrSeparatorGreen::Element(value)
12686    }
12687}
12688impl<'db> MemberListElementOrSeparatorGreen<'db> {
12689    fn id(&self) -> GreenId<'db> {
12690        match self {
12691            MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12692            MemberListElementOrSeparatorGreen::Element(green) => green.0,
12693        }
12694    }
12695}
12696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12697pub struct MemberListGreen<'db>(pub GreenId<'db>);
12698impl<'db> TypedSyntaxNode<'db> for MemberList<'db> {
12699    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12700    type StablePtr = MemberListPtr<'db>;
12701    type Green = MemberListGreen<'db>;
12702    fn missing(db: &'db dyn Database) -> Self::Green {
12703        MemberListGreen(
12704            GreenNode {
12705                kind: SyntaxKind::MemberList,
12706                details: GreenNodeDetails::Node {
12707                    children: [].into(),
12708                    width: TextWidth::default(),
12709                },
12710            }
12711            .intern(db),
12712        )
12713    }
12714    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12715        Self(ElementList::new(node))
12716    }
12717    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12718        if node.kind(db) == SyntaxKind::MemberList {
12719            Some(Self(ElementList::new(node)))
12720        } else {
12721            None
12722        }
12723    }
12724    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12725        self.node
12726    }
12727    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12728        MemberListPtr(self.node.stable_ptr(db))
12729    }
12730}
12731#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12732pub struct Variant<'db> {
12733    node: SyntaxNode<'db>,
12734}
12735impl<'db> Variant<'db> {
12736    pub const INDEX_ATTRIBUTES: usize = 0;
12737    pub const INDEX_NAME: usize = 1;
12738    pub const INDEX_TYPE_CLAUSE: usize = 2;
12739    pub fn new_green(
12740        db: &'db dyn Database,
12741        attributes: AttributeListGreen<'db>,
12742        name: TerminalIdentifierGreen<'db>,
12743        type_clause: OptionTypeClauseGreen<'db>,
12744    ) -> VariantGreen<'db> {
12745        let children = [attributes.0, name.0, type_clause.0];
12746        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12747        VariantGreen(
12748            GreenNode {
12749                kind: SyntaxKind::Variant,
12750                details: GreenNodeDetails::Node { children: children.into(), width },
12751            }
12752            .intern(db),
12753        )
12754    }
12755}
12756impl<'db> Variant<'db> {
12757    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12758        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12759    }
12760    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12761        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12762    }
12763    pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
12764        OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12765    }
12766}
12767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12768pub struct VariantPtr<'db>(pub SyntaxStablePtrId<'db>);
12769impl<'db> VariantPtr<'db> {
12770    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12771        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12772    }
12773}
12774impl<'db> TypedStablePtr<'db> for VariantPtr<'db> {
12775    type SyntaxNode = Variant<'db>;
12776    fn untyped(self) -> SyntaxStablePtrId<'db> {
12777        self.0
12778    }
12779    fn lookup(&self, db: &'db dyn Database) -> Variant<'db> {
12780        Variant::from_syntax_node(db, self.0.lookup(db))
12781    }
12782}
12783impl<'db> From<VariantPtr<'db>> for SyntaxStablePtrId<'db> {
12784    fn from(ptr: VariantPtr<'db>) -> Self {
12785        ptr.untyped()
12786    }
12787}
12788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12789pub struct VariantGreen<'db>(pub GreenId<'db>);
12790impl<'db> TypedSyntaxNode<'db> for Variant<'db> {
12791    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12792    type StablePtr = VariantPtr<'db>;
12793    type Green = VariantGreen<'db>;
12794    fn missing(db: &'db dyn Database) -> Self::Green {
12795        VariantGreen(
12796            GreenNode {
12797                kind: SyntaxKind::Variant,
12798                details: GreenNodeDetails::Node {
12799                    children: [
12800                        AttributeList::missing(db).0,
12801                        TerminalIdentifier::missing(db).0,
12802                        OptionTypeClause::missing(db).0,
12803                    ]
12804                    .into(),
12805                    width: TextWidth::default(),
12806                },
12807            }
12808            .intern(db),
12809        )
12810    }
12811    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12812        let kind = node.kind(db);
12813        assert_eq!(
12814            kind,
12815            SyntaxKind::Variant,
12816            "Unexpected SyntaxKind {:?}. Expected {:?}.",
12817            kind,
12818            SyntaxKind::Variant
12819        );
12820        Self { node }
12821    }
12822    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12823        let kind = node.kind(db);
12824        if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12825    }
12826    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12827        self.node
12828    }
12829    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12830        VariantPtr(self.node.stable_ptr(db))
12831    }
12832}
12833#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12834pub struct VariantList<'db>(ElementList<'db, Variant<'db>, 2>);
12835impl<'db> Deref for VariantList<'db> {
12836    type Target = ElementList<'db, Variant<'db>, 2>;
12837    fn deref(&self) -> &Self::Target {
12838        &self.0
12839    }
12840}
12841impl<'db> VariantList<'db> {
12842    pub fn new_green(
12843        db: &'db dyn Database,
12844        children: &[VariantListElementOrSeparatorGreen<'db>],
12845    ) -> VariantListGreen<'db> {
12846        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12847        VariantListGreen(
12848            GreenNode {
12849                kind: SyntaxKind::VariantList,
12850                details: GreenNodeDetails::Node {
12851                    children: children.iter().map(|x| x.id()).collect(),
12852                    width,
12853                },
12854            }
12855            .intern(db),
12856        )
12857    }
12858}
12859#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12860pub struct VariantListPtr<'db>(pub SyntaxStablePtrId<'db>);
12861impl<'db> TypedStablePtr<'db> for VariantListPtr<'db> {
12862    type SyntaxNode = VariantList<'db>;
12863    fn untyped(self) -> SyntaxStablePtrId<'db> {
12864        self.0
12865    }
12866    fn lookup(&self, db: &'db dyn Database) -> VariantList<'db> {
12867        VariantList::from_syntax_node(db, self.0.lookup(db))
12868    }
12869}
12870impl<'db> From<VariantListPtr<'db>> for SyntaxStablePtrId<'db> {
12871    fn from(ptr: VariantListPtr<'db>) -> Self {
12872        ptr.untyped()
12873    }
12874}
12875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12876pub enum VariantListElementOrSeparatorGreen<'db> {
12877    Separator(TerminalCommaGreen<'db>),
12878    Element(VariantGreen<'db>),
12879}
12880impl<'db> From<TerminalCommaGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12881    fn from(value: TerminalCommaGreen<'db>) -> Self {
12882        VariantListElementOrSeparatorGreen::Separator(value)
12883    }
12884}
12885impl<'db> From<VariantGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12886    fn from(value: VariantGreen<'db>) -> Self {
12887        VariantListElementOrSeparatorGreen::Element(value)
12888    }
12889}
12890impl<'db> VariantListElementOrSeparatorGreen<'db> {
12891    fn id(&self) -> GreenId<'db> {
12892        match self {
12893            VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12894            VariantListElementOrSeparatorGreen::Element(green) => green.0,
12895        }
12896    }
12897}
12898#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12899pub struct VariantListGreen<'db>(pub GreenId<'db>);
12900impl<'db> TypedSyntaxNode<'db> for VariantList<'db> {
12901    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12902    type StablePtr = VariantListPtr<'db>;
12903    type Green = VariantListGreen<'db>;
12904    fn missing(db: &'db dyn Database) -> Self::Green {
12905        VariantListGreen(
12906            GreenNode {
12907                kind: SyntaxKind::VariantList,
12908                details: GreenNodeDetails::Node {
12909                    children: [].into(),
12910                    width: TextWidth::default(),
12911                },
12912            }
12913            .intern(db),
12914        )
12915    }
12916    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12917        Self(ElementList::new(node))
12918    }
12919    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12920        if node.kind(db) == SyntaxKind::VariantList {
12921            Some(Self(ElementList::new(node)))
12922        } else {
12923            None
12924        }
12925    }
12926    fn as_syntax_node(&self) -> SyntaxNode<'db> {
12927        self.node
12928    }
12929    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12930        VariantListPtr(self.node.stable_ptr(db))
12931    }
12932}
12933#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12934pub enum ModuleItem<'db> {
12935    Constant(ItemConstant<'db>),
12936    Module(ItemModule<'db>),
12937    Use(ItemUse<'db>),
12938    FreeFunction(FunctionWithBody<'db>),
12939    ExternFunction(ItemExternFunction<'db>),
12940    ExternType(ItemExternType<'db>),
12941    Trait(ItemTrait<'db>),
12942    Impl(ItemImpl<'db>),
12943    ImplAlias(ItemImplAlias<'db>),
12944    Struct(ItemStruct<'db>),
12945    Enum(ItemEnum<'db>),
12946    TypeAlias(ItemTypeAlias<'db>),
12947    InlineMacro(ItemInlineMacro<'db>),
12948    MacroDeclaration(ItemMacroDeclaration<'db>),
12949    HeaderDoc(ItemHeaderDoc<'db>),
12950    Missing(ModuleItemMissing<'db>),
12951}
12952#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
12953pub struct ModuleItemPtr<'db>(pub SyntaxStablePtrId<'db>);
12954impl<'db> TypedStablePtr<'db> for ModuleItemPtr<'db> {
12955    type SyntaxNode = ModuleItem<'db>;
12956    fn untyped(self) -> SyntaxStablePtrId<'db> {
12957        self.0
12958    }
12959    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12960        ModuleItem::from_syntax_node(db, self.0.lookup(db))
12961    }
12962}
12963impl<'db> From<ModuleItemPtr<'db>> for SyntaxStablePtrId<'db> {
12964    fn from(ptr: ModuleItemPtr<'db>) -> Self {
12965        ptr.untyped()
12966    }
12967}
12968impl<'db> From<ItemConstantPtr<'db>> for ModuleItemPtr<'db> {
12969    fn from(value: ItemConstantPtr<'db>) -> Self {
12970        Self(value.0)
12971    }
12972}
12973impl<'db> From<ItemModulePtr<'db>> for ModuleItemPtr<'db> {
12974    fn from(value: ItemModulePtr<'db>) -> Self {
12975        Self(value.0)
12976    }
12977}
12978impl<'db> From<ItemUsePtr<'db>> for ModuleItemPtr<'db> {
12979    fn from(value: ItemUsePtr<'db>) -> Self {
12980        Self(value.0)
12981    }
12982}
12983impl<'db> From<FunctionWithBodyPtr<'db>> for ModuleItemPtr<'db> {
12984    fn from(value: FunctionWithBodyPtr<'db>) -> Self {
12985        Self(value.0)
12986    }
12987}
12988impl<'db> From<ItemExternFunctionPtr<'db>> for ModuleItemPtr<'db> {
12989    fn from(value: ItemExternFunctionPtr<'db>) -> Self {
12990        Self(value.0)
12991    }
12992}
12993impl<'db> From<ItemExternTypePtr<'db>> for ModuleItemPtr<'db> {
12994    fn from(value: ItemExternTypePtr<'db>) -> Self {
12995        Self(value.0)
12996    }
12997}
12998impl<'db> From<ItemTraitPtr<'db>> for ModuleItemPtr<'db> {
12999    fn from(value: ItemTraitPtr<'db>) -> Self {
13000        Self(value.0)
13001    }
13002}
13003impl<'db> From<ItemImplPtr<'db>> for ModuleItemPtr<'db> {
13004    fn from(value: ItemImplPtr<'db>) -> Self {
13005        Self(value.0)
13006    }
13007}
13008impl<'db> From<ItemImplAliasPtr<'db>> for ModuleItemPtr<'db> {
13009    fn from(value: ItemImplAliasPtr<'db>) -> Self {
13010        Self(value.0)
13011    }
13012}
13013impl<'db> From<ItemStructPtr<'db>> for ModuleItemPtr<'db> {
13014    fn from(value: ItemStructPtr<'db>) -> Self {
13015        Self(value.0)
13016    }
13017}
13018impl<'db> From<ItemEnumPtr<'db>> for ModuleItemPtr<'db> {
13019    fn from(value: ItemEnumPtr<'db>) -> Self {
13020        Self(value.0)
13021    }
13022}
13023impl<'db> From<ItemTypeAliasPtr<'db>> for ModuleItemPtr<'db> {
13024    fn from(value: ItemTypeAliasPtr<'db>) -> Self {
13025        Self(value.0)
13026    }
13027}
13028impl<'db> From<ItemInlineMacroPtr<'db>> for ModuleItemPtr<'db> {
13029    fn from(value: ItemInlineMacroPtr<'db>) -> Self {
13030        Self(value.0)
13031    }
13032}
13033impl<'db> From<ItemMacroDeclarationPtr<'db>> for ModuleItemPtr<'db> {
13034    fn from(value: ItemMacroDeclarationPtr<'db>) -> Self {
13035        Self(value.0)
13036    }
13037}
13038impl<'db> From<ItemHeaderDocPtr<'db>> for ModuleItemPtr<'db> {
13039    fn from(value: ItemHeaderDocPtr<'db>) -> Self {
13040        Self(value.0)
13041    }
13042}
13043impl<'db> From<ModuleItemMissingPtr<'db>> for ModuleItemPtr<'db> {
13044    fn from(value: ModuleItemMissingPtr<'db>) -> Self {
13045        Self(value.0)
13046    }
13047}
13048impl<'db> From<ItemConstantGreen<'db>> for ModuleItemGreen<'db> {
13049    fn from(value: ItemConstantGreen<'db>) -> Self {
13050        Self(value.0)
13051    }
13052}
13053impl<'db> From<ItemModuleGreen<'db>> for ModuleItemGreen<'db> {
13054    fn from(value: ItemModuleGreen<'db>) -> Self {
13055        Self(value.0)
13056    }
13057}
13058impl<'db> From<ItemUseGreen<'db>> for ModuleItemGreen<'db> {
13059    fn from(value: ItemUseGreen<'db>) -> Self {
13060        Self(value.0)
13061    }
13062}
13063impl<'db> From<FunctionWithBodyGreen<'db>> for ModuleItemGreen<'db> {
13064    fn from(value: FunctionWithBodyGreen<'db>) -> Self {
13065        Self(value.0)
13066    }
13067}
13068impl<'db> From<ItemExternFunctionGreen<'db>> for ModuleItemGreen<'db> {
13069    fn from(value: ItemExternFunctionGreen<'db>) -> Self {
13070        Self(value.0)
13071    }
13072}
13073impl<'db> From<ItemExternTypeGreen<'db>> for ModuleItemGreen<'db> {
13074    fn from(value: ItemExternTypeGreen<'db>) -> Self {
13075        Self(value.0)
13076    }
13077}
13078impl<'db> From<ItemTraitGreen<'db>> for ModuleItemGreen<'db> {
13079    fn from(value: ItemTraitGreen<'db>) -> Self {
13080        Self(value.0)
13081    }
13082}
13083impl<'db> From<ItemImplGreen<'db>> for ModuleItemGreen<'db> {
13084    fn from(value: ItemImplGreen<'db>) -> Self {
13085        Self(value.0)
13086    }
13087}
13088impl<'db> From<ItemImplAliasGreen<'db>> for ModuleItemGreen<'db> {
13089    fn from(value: ItemImplAliasGreen<'db>) -> Self {
13090        Self(value.0)
13091    }
13092}
13093impl<'db> From<ItemStructGreen<'db>> for ModuleItemGreen<'db> {
13094    fn from(value: ItemStructGreen<'db>) -> Self {
13095        Self(value.0)
13096    }
13097}
13098impl<'db> From<ItemEnumGreen<'db>> for ModuleItemGreen<'db> {
13099    fn from(value: ItemEnumGreen<'db>) -> Self {
13100        Self(value.0)
13101    }
13102}
13103impl<'db> From<ItemTypeAliasGreen<'db>> for ModuleItemGreen<'db> {
13104    fn from(value: ItemTypeAliasGreen<'db>) -> Self {
13105        Self(value.0)
13106    }
13107}
13108impl<'db> From<ItemInlineMacroGreen<'db>> for ModuleItemGreen<'db> {
13109    fn from(value: ItemInlineMacroGreen<'db>) -> Self {
13110        Self(value.0)
13111    }
13112}
13113impl<'db> From<ItemMacroDeclarationGreen<'db>> for ModuleItemGreen<'db> {
13114    fn from(value: ItemMacroDeclarationGreen<'db>) -> Self {
13115        Self(value.0)
13116    }
13117}
13118impl<'db> From<ItemHeaderDocGreen<'db>> for ModuleItemGreen<'db> {
13119    fn from(value: ItemHeaderDocGreen<'db>) -> Self {
13120        Self(value.0)
13121    }
13122}
13123impl<'db> From<ModuleItemMissingGreen<'db>> for ModuleItemGreen<'db> {
13124    fn from(value: ModuleItemMissingGreen<'db>) -> Self {
13125        Self(value.0)
13126    }
13127}
13128#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13129pub struct ModuleItemGreen<'db>(pub GreenId<'db>);
13130impl<'db> TypedSyntaxNode<'db> for ModuleItem<'db> {
13131    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13132    type StablePtr = ModuleItemPtr<'db>;
13133    type Green = ModuleItemGreen<'db>;
13134    fn missing(db: &'db dyn Database) -> Self::Green {
13135        ModuleItemGreen(ModuleItemMissing::missing(db).0)
13136    }
13137    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13138        let kind = node.kind(db);
13139        match kind {
13140            SyntaxKind::ItemConstant => {
13141                ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13142            }
13143            SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13144            SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13145            SyntaxKind::FunctionWithBody => {
13146                ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13147            }
13148            SyntaxKind::ItemExternFunction => {
13149                ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13150            }
13151            SyntaxKind::ItemExternType => {
13152                ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13153            }
13154            SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13155            SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13156            SyntaxKind::ItemImplAlias => {
13157                ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13158            }
13159            SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13160            SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13161            SyntaxKind::ItemTypeAlias => {
13162                ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13163            }
13164            SyntaxKind::ItemInlineMacro => {
13165                ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13166            }
13167            SyntaxKind::ItemMacroDeclaration => {
13168                ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13169            }
13170            SyntaxKind::ItemHeaderDoc => {
13171                ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13172            }
13173            SyntaxKind::ModuleItemMissing => {
13174                ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13175            }
13176            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13177        }
13178    }
13179    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13180        let kind = node.kind(db);
13181        match kind {
13182            SyntaxKind::ItemConstant => {
13183                Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13184            }
13185            SyntaxKind::ItemModule => {
13186                Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13187            }
13188            SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13189            SyntaxKind::FunctionWithBody => {
13190                Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13191            }
13192            SyntaxKind::ItemExternFunction => {
13193                Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13194            }
13195            SyntaxKind::ItemExternType => {
13196                Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13197            }
13198            SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13199            SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13200            SyntaxKind::ItemImplAlias => {
13201                Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13202            }
13203            SyntaxKind::ItemStruct => {
13204                Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13205            }
13206            SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13207            SyntaxKind::ItemTypeAlias => {
13208                Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13209            }
13210            SyntaxKind::ItemInlineMacro => {
13211                Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13212            }
13213            SyntaxKind::ItemMacroDeclaration => {
13214                Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13215            }
13216            SyntaxKind::ItemHeaderDoc => {
13217                Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13218            }
13219            SyntaxKind::ModuleItemMissing => {
13220                Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13221            }
13222            _ => None,
13223        }
13224    }
13225    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13226        match self {
13227            ModuleItem::Constant(x) => x.as_syntax_node(),
13228            ModuleItem::Module(x) => x.as_syntax_node(),
13229            ModuleItem::Use(x) => x.as_syntax_node(),
13230            ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13231            ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13232            ModuleItem::ExternType(x) => x.as_syntax_node(),
13233            ModuleItem::Trait(x) => x.as_syntax_node(),
13234            ModuleItem::Impl(x) => x.as_syntax_node(),
13235            ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13236            ModuleItem::Struct(x) => x.as_syntax_node(),
13237            ModuleItem::Enum(x) => x.as_syntax_node(),
13238            ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13239            ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13240            ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13241            ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13242            ModuleItem::Missing(x) => x.as_syntax_node(),
13243        }
13244    }
13245    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13246        ModuleItemPtr(self.as_syntax_node().stable_ptr(db))
13247    }
13248}
13249impl<'db> ModuleItem<'db> {
13250    /// Checks if a kind of a variant of [ModuleItem].
13251    pub fn is_variant(kind: SyntaxKind) -> bool {
13252        matches!(
13253            kind,
13254            SyntaxKind::ItemConstant
13255                | SyntaxKind::ItemModule
13256                | SyntaxKind::ItemUse
13257                | SyntaxKind::FunctionWithBody
13258                | SyntaxKind::ItemExternFunction
13259                | SyntaxKind::ItemExternType
13260                | SyntaxKind::ItemTrait
13261                | SyntaxKind::ItemImpl
13262                | SyntaxKind::ItemImplAlias
13263                | SyntaxKind::ItemStruct
13264                | SyntaxKind::ItemEnum
13265                | SyntaxKind::ItemTypeAlias
13266                | SyntaxKind::ItemInlineMacro
13267                | SyntaxKind::ItemMacroDeclaration
13268                | SyntaxKind::ItemHeaderDoc
13269                | SyntaxKind::ModuleItemMissing
13270        )
13271    }
13272}
13273#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13274pub struct ModuleItemList<'db>(ElementList<'db, ModuleItem<'db>, 1>);
13275impl<'db> Deref for ModuleItemList<'db> {
13276    type Target = ElementList<'db, ModuleItem<'db>, 1>;
13277    fn deref(&self) -> &Self::Target {
13278        &self.0
13279    }
13280}
13281impl<'db> ModuleItemList<'db> {
13282    pub fn new_green(
13283        db: &'db dyn Database,
13284        children: &[ModuleItemGreen<'db>],
13285    ) -> ModuleItemListGreen<'db> {
13286        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13287        ModuleItemListGreen(
13288            GreenNode {
13289                kind: SyntaxKind::ModuleItemList,
13290                details: GreenNodeDetails::Node {
13291                    children: children.iter().map(|x| x.0).collect(),
13292                    width,
13293                },
13294            }
13295            .intern(db),
13296        )
13297    }
13298}
13299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13300pub struct ModuleItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
13301impl<'db> TypedStablePtr<'db> for ModuleItemListPtr<'db> {
13302    type SyntaxNode = ModuleItemList<'db>;
13303    fn untyped(self) -> SyntaxStablePtrId<'db> {
13304        self.0
13305    }
13306    fn lookup(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
13307        ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13308    }
13309}
13310impl<'db> From<ModuleItemListPtr<'db>> for SyntaxStablePtrId<'db> {
13311    fn from(ptr: ModuleItemListPtr<'db>) -> Self {
13312        ptr.untyped()
13313    }
13314}
13315#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13316pub struct ModuleItemListGreen<'db>(pub GreenId<'db>);
13317impl<'db> TypedSyntaxNode<'db> for ModuleItemList<'db> {
13318    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13319    type StablePtr = ModuleItemListPtr<'db>;
13320    type Green = ModuleItemListGreen<'db>;
13321    fn missing(db: &'db dyn Database) -> Self::Green {
13322        ModuleItemListGreen(
13323            GreenNode {
13324                kind: SyntaxKind::ModuleItemList,
13325                details: GreenNodeDetails::Node {
13326                    children: [].into(),
13327                    width: TextWidth::default(),
13328                },
13329            }
13330            .intern(db),
13331        )
13332    }
13333    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13334        Self(ElementList::new(node))
13335    }
13336    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13337        if node.kind(db) == SyntaxKind::ModuleItemList {
13338            Some(Self(ElementList::new(node)))
13339        } else {
13340            None
13341        }
13342    }
13343    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13344        self.node
13345    }
13346    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13347        ModuleItemListPtr(self.node.stable_ptr(db))
13348    }
13349}
13350#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13351pub struct ModuleItemMissing<'db> {
13352    node: SyntaxNode<'db>,
13353}
13354impl<'db> ModuleItemMissing<'db> {
13355    pub fn new_green(db: &'db dyn Database) -> ModuleItemMissingGreen<'db> {
13356        let children = [];
13357        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13358        ModuleItemMissingGreen(
13359            GreenNode {
13360                kind: SyntaxKind::ModuleItemMissing,
13361                details: GreenNodeDetails::Node { children: children.into(), width },
13362            }
13363            .intern(db),
13364        )
13365    }
13366}
13367impl<'db> ModuleItemMissing<'db> {}
13368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13369pub struct ModuleItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
13370impl<'db> ModuleItemMissingPtr<'db> {}
13371impl<'db> TypedStablePtr<'db> for ModuleItemMissingPtr<'db> {
13372    type SyntaxNode = ModuleItemMissing<'db>;
13373    fn untyped(self) -> SyntaxStablePtrId<'db> {
13374        self.0
13375    }
13376    fn lookup(&self, db: &'db dyn Database) -> ModuleItemMissing<'db> {
13377        ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13378    }
13379}
13380impl<'db> From<ModuleItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
13381    fn from(ptr: ModuleItemMissingPtr<'db>) -> Self {
13382        ptr.untyped()
13383    }
13384}
13385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13386pub struct ModuleItemMissingGreen<'db>(pub GreenId<'db>);
13387impl<'db> TypedSyntaxNode<'db> for ModuleItemMissing<'db> {
13388    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13389    type StablePtr = ModuleItemMissingPtr<'db>;
13390    type Green = ModuleItemMissingGreen<'db>;
13391    fn missing(db: &'db dyn Database) -> Self::Green {
13392        ModuleItemMissingGreen(
13393            GreenNode {
13394                kind: SyntaxKind::ModuleItemMissing,
13395                details: GreenNodeDetails::Node {
13396                    children: [].into(),
13397                    width: TextWidth::default(),
13398                },
13399            }
13400            .intern(db),
13401        )
13402    }
13403    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13404        let kind = node.kind(db);
13405        assert_eq!(
13406            kind,
13407            SyntaxKind::ModuleItemMissing,
13408            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13409            kind,
13410            SyntaxKind::ModuleItemMissing
13411        );
13412        Self { node }
13413    }
13414    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13415        let kind = node.kind(db);
13416        if kind == SyntaxKind::ModuleItemMissing {
13417            Some(Self::from_syntax_node(db, node))
13418        } else {
13419            None
13420        }
13421    }
13422    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13423        self.node
13424    }
13425    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13426        ModuleItemMissingPtr(self.node.stable_ptr(db))
13427    }
13428}
13429#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13430pub struct Attribute<'db> {
13431    node: SyntaxNode<'db>,
13432}
13433impl<'db> Attribute<'db> {
13434    pub const INDEX_HASH: usize = 0;
13435    pub const INDEX_LBRACK: usize = 1;
13436    pub const INDEX_ATTR: usize = 2;
13437    pub const INDEX_ARGUMENTS: usize = 3;
13438    pub const INDEX_RBRACK: usize = 4;
13439    pub fn new_green(
13440        db: &'db dyn Database,
13441        hash: TerminalHashGreen<'db>,
13442        lbrack: TerminalLBrackGreen<'db>,
13443        attr: ExprPathGreen<'db>,
13444        arguments: OptionArgListParenthesizedGreen<'db>,
13445        rbrack: TerminalRBrackGreen<'db>,
13446    ) -> AttributeGreen<'db> {
13447        let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13448        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13449        AttributeGreen(
13450            GreenNode {
13451                kind: SyntaxKind::Attribute,
13452                details: GreenNodeDetails::Node { children: children.into(), width },
13453            }
13454            .intern(db),
13455        )
13456    }
13457}
13458impl<'db> Attribute<'db> {
13459    pub fn hash(&self, db: &'db dyn Database) -> TerminalHash<'db> {
13460        TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13461    }
13462    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
13463        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13464    }
13465    pub fn attr(&self, db: &'db dyn Database) -> ExprPath<'db> {
13466        ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13467    }
13468    pub fn arguments(&self, db: &'db dyn Database) -> OptionArgListParenthesized<'db> {
13469        OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13470    }
13471    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
13472        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13473    }
13474}
13475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13476pub struct AttributePtr<'db>(pub SyntaxStablePtrId<'db>);
13477impl<'db> AttributePtr<'db> {}
13478impl<'db> TypedStablePtr<'db> for AttributePtr<'db> {
13479    type SyntaxNode = Attribute<'db>;
13480    fn untyped(self) -> SyntaxStablePtrId<'db> {
13481        self.0
13482    }
13483    fn lookup(&self, db: &'db dyn Database) -> Attribute<'db> {
13484        Attribute::from_syntax_node(db, self.0.lookup(db))
13485    }
13486}
13487impl<'db> From<AttributePtr<'db>> for SyntaxStablePtrId<'db> {
13488    fn from(ptr: AttributePtr<'db>) -> Self {
13489        ptr.untyped()
13490    }
13491}
13492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13493pub struct AttributeGreen<'db>(pub GreenId<'db>);
13494impl<'db> TypedSyntaxNode<'db> for Attribute<'db> {
13495    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13496    type StablePtr = AttributePtr<'db>;
13497    type Green = AttributeGreen<'db>;
13498    fn missing(db: &'db dyn Database) -> Self::Green {
13499        AttributeGreen(
13500            GreenNode {
13501                kind: SyntaxKind::Attribute,
13502                details: GreenNodeDetails::Node {
13503                    children: [
13504                        TerminalHash::missing(db).0,
13505                        TerminalLBrack::missing(db).0,
13506                        ExprPath::missing(db).0,
13507                        OptionArgListParenthesized::missing(db).0,
13508                        TerminalRBrack::missing(db).0,
13509                    ]
13510                    .into(),
13511                    width: TextWidth::default(),
13512                },
13513            }
13514            .intern(db),
13515        )
13516    }
13517    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13518        let kind = node.kind(db);
13519        assert_eq!(
13520            kind,
13521            SyntaxKind::Attribute,
13522            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13523            kind,
13524            SyntaxKind::Attribute
13525        );
13526        Self { node }
13527    }
13528    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13529        let kind = node.kind(db);
13530        if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13531    }
13532    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13533        self.node
13534    }
13535    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13536        AttributePtr(self.node.stable_ptr(db))
13537    }
13538}
13539#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13540pub struct AttributeList<'db>(ElementList<'db, Attribute<'db>, 1>);
13541impl<'db> Deref for AttributeList<'db> {
13542    type Target = ElementList<'db, Attribute<'db>, 1>;
13543    fn deref(&self) -> &Self::Target {
13544        &self.0
13545    }
13546}
13547impl<'db> AttributeList<'db> {
13548    pub fn new_green(
13549        db: &'db dyn Database,
13550        children: &[AttributeGreen<'db>],
13551    ) -> AttributeListGreen<'db> {
13552        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13553        AttributeListGreen(
13554            GreenNode {
13555                kind: SyntaxKind::AttributeList,
13556                details: GreenNodeDetails::Node {
13557                    children: children.iter().map(|x| x.0).collect(),
13558                    width,
13559                },
13560            }
13561            .intern(db),
13562        )
13563    }
13564}
13565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13566pub struct AttributeListPtr<'db>(pub SyntaxStablePtrId<'db>);
13567impl<'db> TypedStablePtr<'db> for AttributeListPtr<'db> {
13568    type SyntaxNode = AttributeList<'db>;
13569    fn untyped(self) -> SyntaxStablePtrId<'db> {
13570        self.0
13571    }
13572    fn lookup(&self, db: &'db dyn Database) -> AttributeList<'db> {
13573        AttributeList::from_syntax_node(db, self.0.lookup(db))
13574    }
13575}
13576impl<'db> From<AttributeListPtr<'db>> for SyntaxStablePtrId<'db> {
13577    fn from(ptr: AttributeListPtr<'db>) -> Self {
13578        ptr.untyped()
13579    }
13580}
13581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13582pub struct AttributeListGreen<'db>(pub GreenId<'db>);
13583impl<'db> TypedSyntaxNode<'db> for AttributeList<'db> {
13584    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13585    type StablePtr = AttributeListPtr<'db>;
13586    type Green = AttributeListGreen<'db>;
13587    fn missing(db: &'db dyn Database) -> Self::Green {
13588        AttributeListGreen(
13589            GreenNode {
13590                kind: SyntaxKind::AttributeList,
13591                details: GreenNodeDetails::Node {
13592                    children: [].into(),
13593                    width: TextWidth::default(),
13594                },
13595            }
13596            .intern(db),
13597        )
13598    }
13599    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13600        Self(ElementList::new(node))
13601    }
13602    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13603        if node.kind(db) == SyntaxKind::AttributeList {
13604            Some(Self(ElementList::new(node)))
13605        } else {
13606            None
13607        }
13608    }
13609    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13610        self.node
13611    }
13612    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13613        AttributeListPtr(self.node.stable_ptr(db))
13614    }
13615}
13616#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13617pub struct VisibilityDefault<'db> {
13618    node: SyntaxNode<'db>,
13619}
13620impl<'db> VisibilityDefault<'db> {
13621    pub fn new_green(db: &'db dyn Database) -> VisibilityDefaultGreen<'db> {
13622        let children = [];
13623        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13624        VisibilityDefaultGreen(
13625            GreenNode {
13626                kind: SyntaxKind::VisibilityDefault,
13627                details: GreenNodeDetails::Node { children: children.into(), width },
13628            }
13629            .intern(db),
13630        )
13631    }
13632}
13633impl<'db> VisibilityDefault<'db> {}
13634#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13635pub struct VisibilityDefaultPtr<'db>(pub SyntaxStablePtrId<'db>);
13636impl<'db> VisibilityDefaultPtr<'db> {}
13637impl<'db> TypedStablePtr<'db> for VisibilityDefaultPtr<'db> {
13638    type SyntaxNode = VisibilityDefault<'db>;
13639    fn untyped(self) -> SyntaxStablePtrId<'db> {
13640        self.0
13641    }
13642    fn lookup(&self, db: &'db dyn Database) -> VisibilityDefault<'db> {
13643        VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13644    }
13645}
13646impl<'db> From<VisibilityDefaultPtr<'db>> for SyntaxStablePtrId<'db> {
13647    fn from(ptr: VisibilityDefaultPtr<'db>) -> Self {
13648        ptr.untyped()
13649    }
13650}
13651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13652pub struct VisibilityDefaultGreen<'db>(pub GreenId<'db>);
13653impl<'db> TypedSyntaxNode<'db> for VisibilityDefault<'db> {
13654    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13655    type StablePtr = VisibilityDefaultPtr<'db>;
13656    type Green = VisibilityDefaultGreen<'db>;
13657    fn missing(db: &'db dyn Database) -> Self::Green {
13658        VisibilityDefaultGreen(
13659            GreenNode {
13660                kind: SyntaxKind::VisibilityDefault,
13661                details: GreenNodeDetails::Node {
13662                    children: [].into(),
13663                    width: TextWidth::default(),
13664                },
13665            }
13666            .intern(db),
13667        )
13668    }
13669    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13670        let kind = node.kind(db);
13671        assert_eq!(
13672            kind,
13673            SyntaxKind::VisibilityDefault,
13674            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13675            kind,
13676            SyntaxKind::VisibilityDefault
13677        );
13678        Self { node }
13679    }
13680    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13681        let kind = node.kind(db);
13682        if kind == SyntaxKind::VisibilityDefault {
13683            Some(Self::from_syntax_node(db, node))
13684        } else {
13685            None
13686        }
13687    }
13688    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13689        self.node
13690    }
13691    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13692        VisibilityDefaultPtr(self.node.stable_ptr(db))
13693    }
13694}
13695#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13696pub struct VisibilityPubArgumentClause<'db> {
13697    node: SyntaxNode<'db>,
13698}
13699impl<'db> VisibilityPubArgumentClause<'db> {
13700    pub const INDEX_LPAREN: usize = 0;
13701    pub const INDEX_ARGUMENT: usize = 1;
13702    pub const INDEX_RPAREN: usize = 2;
13703    pub fn new_green(
13704        db: &'db dyn Database,
13705        lparen: TerminalLParenGreen<'db>,
13706        argument: TerminalIdentifierGreen<'db>,
13707        rparen: TerminalRParenGreen<'db>,
13708    ) -> VisibilityPubArgumentClauseGreen<'db> {
13709        let children = [lparen.0, argument.0, rparen.0];
13710        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13711        VisibilityPubArgumentClauseGreen(
13712            GreenNode {
13713                kind: SyntaxKind::VisibilityPubArgumentClause,
13714                details: GreenNodeDetails::Node { children: children.into(), width },
13715            }
13716            .intern(db),
13717        )
13718    }
13719}
13720impl<'db> VisibilityPubArgumentClause<'db> {
13721    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
13722        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13723    }
13724    pub fn argument(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
13725        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13726    }
13727    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
13728        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13729    }
13730}
13731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13732pub struct VisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13733impl<'db> VisibilityPubArgumentClausePtr<'db> {}
13734impl<'db> TypedStablePtr<'db> for VisibilityPubArgumentClausePtr<'db> {
13735    type SyntaxNode = VisibilityPubArgumentClause<'db>;
13736    fn untyped(self) -> SyntaxStablePtrId<'db> {
13737        self.0
13738    }
13739    fn lookup(&self, db: &'db dyn Database) -> VisibilityPubArgumentClause<'db> {
13740        VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13741    }
13742}
13743impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13744    fn from(ptr: VisibilityPubArgumentClausePtr<'db>) -> Self {
13745        ptr.untyped()
13746    }
13747}
13748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13749pub struct VisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13750impl<'db> TypedSyntaxNode<'db> for VisibilityPubArgumentClause<'db> {
13751    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13752    type StablePtr = VisibilityPubArgumentClausePtr<'db>;
13753    type Green = VisibilityPubArgumentClauseGreen<'db>;
13754    fn missing(db: &'db dyn Database) -> Self::Green {
13755        VisibilityPubArgumentClauseGreen(
13756            GreenNode {
13757                kind: SyntaxKind::VisibilityPubArgumentClause,
13758                details: GreenNodeDetails::Node {
13759                    children: [
13760                        TerminalLParen::missing(db).0,
13761                        TerminalIdentifier::missing(db).0,
13762                        TerminalRParen::missing(db).0,
13763                    ]
13764                    .into(),
13765                    width: TextWidth::default(),
13766                },
13767            }
13768            .intern(db),
13769        )
13770    }
13771    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13772        let kind = node.kind(db);
13773        assert_eq!(
13774            kind,
13775            SyntaxKind::VisibilityPubArgumentClause,
13776            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13777            kind,
13778            SyntaxKind::VisibilityPubArgumentClause
13779        );
13780        Self { node }
13781    }
13782    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13783        let kind = node.kind(db);
13784        if kind == SyntaxKind::VisibilityPubArgumentClause {
13785            Some(Self::from_syntax_node(db, node))
13786        } else {
13787            None
13788        }
13789    }
13790    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13791        self.node
13792    }
13793    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13794        VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13795    }
13796}
13797#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13798pub enum OptionVisibilityPubArgumentClause<'db> {
13799    Empty(OptionVisibilityPubArgumentClauseEmpty<'db>),
13800    VisibilityPubArgumentClause(VisibilityPubArgumentClause<'db>),
13801}
13802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13803pub struct OptionVisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13804impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClausePtr<'db> {
13805    type SyntaxNode = OptionVisibilityPubArgumentClause<'db>;
13806    fn untyped(self) -> SyntaxStablePtrId<'db> {
13807        self.0
13808    }
13809    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13810        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13811    }
13812}
13813impl<'db> From<OptionVisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13814    fn from(ptr: OptionVisibilityPubArgumentClausePtr<'db>) -> Self {
13815        ptr.untyped()
13816    }
13817}
13818impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>>
13819    for OptionVisibilityPubArgumentClausePtr<'db>
13820{
13821    fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13822        Self(value.0)
13823    }
13824}
13825impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for OptionVisibilityPubArgumentClausePtr<'db> {
13826    fn from(value: VisibilityPubArgumentClausePtr<'db>) -> Self {
13827        Self(value.0)
13828    }
13829}
13830impl<'db> From<OptionVisibilityPubArgumentClauseEmptyGreen<'db>>
13831    for OptionVisibilityPubArgumentClauseGreen<'db>
13832{
13833    fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen<'db>) -> Self {
13834        Self(value.0)
13835    }
13836}
13837impl<'db> From<VisibilityPubArgumentClauseGreen<'db>>
13838    for OptionVisibilityPubArgumentClauseGreen<'db>
13839{
13840    fn from(value: VisibilityPubArgumentClauseGreen<'db>) -> Self {
13841        Self(value.0)
13842    }
13843}
13844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13845pub struct OptionVisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13846impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClause<'db> {
13847    const OPTIONAL_KIND: Option<SyntaxKind> = None;
13848    type StablePtr = OptionVisibilityPubArgumentClausePtr<'db>;
13849    type Green = OptionVisibilityPubArgumentClauseGreen<'db>;
13850    fn missing(db: &'db dyn Database) -> Self::Green {
13851        panic!("No missing variant.");
13852    }
13853    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13854        let kind = node.kind(db);
13855        match kind {
13856            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13857                OptionVisibilityPubArgumentClause::Empty(
13858                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13859                )
13860            }
13861            SyntaxKind::VisibilityPubArgumentClause => {
13862                OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13863                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13864                )
13865            }
13866            _ => panic!(
13867                "Unexpected syntax kind {:?} when constructing {}.",
13868                kind, "OptionVisibilityPubArgumentClause"
13869            ),
13870        }
13871    }
13872    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13873        let kind = node.kind(db);
13874        match kind {
13875            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13876                Some(OptionVisibilityPubArgumentClause::Empty(
13877                    OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13878                ))
13879            }
13880            SyntaxKind::VisibilityPubArgumentClause => {
13881                Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13882                    VisibilityPubArgumentClause::from_syntax_node(db, node),
13883                ))
13884            }
13885            _ => None,
13886        }
13887    }
13888    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13889        match self {
13890            OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13891            OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13892        }
13893    }
13894    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13895        OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().stable_ptr(db))
13896    }
13897}
13898impl<'db> OptionVisibilityPubArgumentClause<'db> {
13899    /// Checks if a kind of a variant of [OptionVisibilityPubArgumentClause].
13900    pub fn is_variant(kind: SyntaxKind) -> bool {
13901        matches!(
13902            kind,
13903            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13904                | SyntaxKind::VisibilityPubArgumentClause
13905        )
13906    }
13907}
13908#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13909pub struct OptionVisibilityPubArgumentClauseEmpty<'db> {
13910    node: SyntaxNode<'db>,
13911}
13912impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {
13913    pub fn new_green(db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmptyGreen<'db> {
13914        let children = [];
13915        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13916        OptionVisibilityPubArgumentClauseEmptyGreen(
13917            GreenNode {
13918                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13919                details: GreenNodeDetails::Node { children: children.into(), width },
13920            }
13921            .intern(db),
13922        )
13923    }
13924}
13925impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {}
13926#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
13927pub struct OptionVisibilityPubArgumentClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
13928impl<'db> OptionVisibilityPubArgumentClauseEmptyPtr<'db> {}
13929impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClauseEmptyPtr<'db> {
13930    type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty<'db>;
13931    fn untyped(self) -> SyntaxStablePtrId<'db> {
13932        self.0
13933    }
13934    fn lookup(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmpty<'db> {
13935        OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
13936    }
13937}
13938impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
13939    fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13940        ptr.untyped()
13941    }
13942}
13943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13944pub struct OptionVisibilityPubArgumentClauseEmptyGreen<'db>(pub GreenId<'db>);
13945impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClauseEmpty<'db> {
13946    const OPTIONAL_KIND: Option<SyntaxKind> =
13947        Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
13948    type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr<'db>;
13949    type Green = OptionVisibilityPubArgumentClauseEmptyGreen<'db>;
13950    fn missing(db: &'db dyn Database) -> Self::Green {
13951        OptionVisibilityPubArgumentClauseEmptyGreen(
13952            GreenNode {
13953                kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13954                details: GreenNodeDetails::Node {
13955                    children: [].into(),
13956                    width: TextWidth::default(),
13957                },
13958            }
13959            .intern(db),
13960        )
13961    }
13962    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13963        let kind = node.kind(db);
13964        assert_eq!(
13965            kind,
13966            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13967            "Unexpected SyntaxKind {:?}. Expected {:?}.",
13968            kind,
13969            SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13970        );
13971        Self { node }
13972    }
13973    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13974        let kind = node.kind(db);
13975        if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
13976            Some(Self::from_syntax_node(db, node))
13977        } else {
13978            None
13979        }
13980    }
13981    fn as_syntax_node(&self) -> SyntaxNode<'db> {
13982        self.node
13983    }
13984    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13985        OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
13986    }
13987}
13988#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13989pub struct VisibilityPub<'db> {
13990    node: SyntaxNode<'db>,
13991}
13992impl<'db> VisibilityPub<'db> {
13993    pub const INDEX_PUB_KW: usize = 0;
13994    pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
13995    pub fn new_green(
13996        db: &'db dyn Database,
13997        pub_kw: TerminalPubGreen<'db>,
13998        argument_clause: OptionVisibilityPubArgumentClauseGreen<'db>,
13999    ) -> VisibilityPubGreen<'db> {
14000        let children = [pub_kw.0, argument_clause.0];
14001        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14002        VisibilityPubGreen(
14003            GreenNode {
14004                kind: SyntaxKind::VisibilityPub,
14005                details: GreenNodeDetails::Node { children: children.into(), width },
14006            }
14007            .intern(db),
14008        )
14009    }
14010}
14011impl<'db> VisibilityPub<'db> {
14012    pub fn pub_kw(&self, db: &'db dyn Database) -> TerminalPub<'db> {
14013        TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14014    }
14015    pub fn argument_clause(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClause<'db> {
14016        OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14017    }
14018}
14019#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14020pub struct VisibilityPubPtr<'db>(pub SyntaxStablePtrId<'db>);
14021impl<'db> VisibilityPubPtr<'db> {}
14022impl<'db> TypedStablePtr<'db> for VisibilityPubPtr<'db> {
14023    type SyntaxNode = VisibilityPub<'db>;
14024    fn untyped(self) -> SyntaxStablePtrId<'db> {
14025        self.0
14026    }
14027    fn lookup(&self, db: &'db dyn Database) -> VisibilityPub<'db> {
14028        VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14029    }
14030}
14031impl<'db> From<VisibilityPubPtr<'db>> for SyntaxStablePtrId<'db> {
14032    fn from(ptr: VisibilityPubPtr<'db>) -> Self {
14033        ptr.untyped()
14034    }
14035}
14036#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14037pub struct VisibilityPubGreen<'db>(pub GreenId<'db>);
14038impl<'db> TypedSyntaxNode<'db> for VisibilityPub<'db> {
14039    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14040    type StablePtr = VisibilityPubPtr<'db>;
14041    type Green = VisibilityPubGreen<'db>;
14042    fn missing(db: &'db dyn Database) -> Self::Green {
14043        VisibilityPubGreen(
14044            GreenNode {
14045                kind: SyntaxKind::VisibilityPub,
14046                details: GreenNodeDetails::Node {
14047                    children: [
14048                        TerminalPub::missing(db).0,
14049                        OptionVisibilityPubArgumentClause::missing(db).0,
14050                    ]
14051                    .into(),
14052                    width: TextWidth::default(),
14053                },
14054            }
14055            .intern(db),
14056        )
14057    }
14058    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14059        let kind = node.kind(db);
14060        assert_eq!(
14061            kind,
14062            SyntaxKind::VisibilityPub,
14063            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14064            kind,
14065            SyntaxKind::VisibilityPub
14066        );
14067        Self { node }
14068    }
14069    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14070        let kind = node.kind(db);
14071        if kind == SyntaxKind::VisibilityPub {
14072            Some(Self::from_syntax_node(db, node))
14073        } else {
14074            None
14075        }
14076    }
14077    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14078        self.node
14079    }
14080    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14081        VisibilityPubPtr(self.node.stable_ptr(db))
14082    }
14083}
14084#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14085pub enum Visibility<'db> {
14086    Default(VisibilityDefault<'db>),
14087    Pub(VisibilityPub<'db>),
14088}
14089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14090pub struct VisibilityPtr<'db>(pub SyntaxStablePtrId<'db>);
14091impl<'db> TypedStablePtr<'db> for VisibilityPtr<'db> {
14092    type SyntaxNode = Visibility<'db>;
14093    fn untyped(self) -> SyntaxStablePtrId<'db> {
14094        self.0
14095    }
14096    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14097        Visibility::from_syntax_node(db, self.0.lookup(db))
14098    }
14099}
14100impl<'db> From<VisibilityPtr<'db>> for SyntaxStablePtrId<'db> {
14101    fn from(ptr: VisibilityPtr<'db>) -> Self {
14102        ptr.untyped()
14103    }
14104}
14105impl<'db> From<VisibilityDefaultPtr<'db>> for VisibilityPtr<'db> {
14106    fn from(value: VisibilityDefaultPtr<'db>) -> Self {
14107        Self(value.0)
14108    }
14109}
14110impl<'db> From<VisibilityPubPtr<'db>> for VisibilityPtr<'db> {
14111    fn from(value: VisibilityPubPtr<'db>) -> Self {
14112        Self(value.0)
14113    }
14114}
14115impl<'db> From<VisibilityDefaultGreen<'db>> for VisibilityGreen<'db> {
14116    fn from(value: VisibilityDefaultGreen<'db>) -> Self {
14117        Self(value.0)
14118    }
14119}
14120impl<'db> From<VisibilityPubGreen<'db>> for VisibilityGreen<'db> {
14121    fn from(value: VisibilityPubGreen<'db>) -> Self {
14122        Self(value.0)
14123    }
14124}
14125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14126pub struct VisibilityGreen<'db>(pub GreenId<'db>);
14127impl<'db> TypedSyntaxNode<'db> for Visibility<'db> {
14128    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14129    type StablePtr = VisibilityPtr<'db>;
14130    type Green = VisibilityGreen<'db>;
14131    fn missing(db: &'db dyn Database) -> Self::Green {
14132        panic!("No missing variant.");
14133    }
14134    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14135        let kind = node.kind(db);
14136        match kind {
14137            SyntaxKind::VisibilityDefault => {
14138                Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14139            }
14140            SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14141            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14142        }
14143    }
14144    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14145        let kind = node.kind(db);
14146        match kind {
14147            SyntaxKind::VisibilityDefault => {
14148                Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14149            }
14150            SyntaxKind::VisibilityPub => {
14151                Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14152            }
14153            _ => None,
14154        }
14155    }
14156    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14157        match self {
14158            Visibility::Default(x) => x.as_syntax_node(),
14159            Visibility::Pub(x) => x.as_syntax_node(),
14160        }
14161    }
14162    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14163        VisibilityPtr(self.as_syntax_node().stable_ptr(db))
14164    }
14165}
14166impl<'db> Visibility<'db> {
14167    /// Checks if a kind of a variant of [Visibility].
14168    pub fn is_variant(kind: SyntaxKind) -> bool {
14169        matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14170    }
14171}
14172#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14173pub struct ItemModule<'db> {
14174    node: SyntaxNode<'db>,
14175}
14176impl<'db> ItemModule<'db> {
14177    pub const INDEX_ATTRIBUTES: usize = 0;
14178    pub const INDEX_VISIBILITY: usize = 1;
14179    pub const INDEX_MODULE_KW: usize = 2;
14180    pub const INDEX_NAME: usize = 3;
14181    pub const INDEX_BODY: usize = 4;
14182    pub fn new_green(
14183        db: &'db dyn Database,
14184        attributes: AttributeListGreen<'db>,
14185        visibility: VisibilityGreen<'db>,
14186        module_kw: TerminalModuleGreen<'db>,
14187        name: TerminalIdentifierGreen<'db>,
14188        body: MaybeModuleBodyGreen<'db>,
14189    ) -> ItemModuleGreen<'db> {
14190        let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14191        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14192        ItemModuleGreen(
14193            GreenNode {
14194                kind: SyntaxKind::ItemModule,
14195                details: GreenNodeDetails::Node { children: children.into(), width },
14196            }
14197            .intern(db),
14198        )
14199    }
14200}
14201impl<'db> ItemModule<'db> {
14202    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14203        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14204    }
14205    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14206        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14207    }
14208    pub fn module_kw(&self, db: &'db dyn Database) -> TerminalModule<'db> {
14209        TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14210    }
14211    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14212        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14213    }
14214    pub fn body(&self, db: &'db dyn Database) -> MaybeModuleBody<'db> {
14215        MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14216    }
14217}
14218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14219pub struct ItemModulePtr<'db>(pub SyntaxStablePtrId<'db>);
14220impl<'db> ItemModulePtr<'db> {
14221    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14222        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14223    }
14224}
14225impl<'db> TypedStablePtr<'db> for ItemModulePtr<'db> {
14226    type SyntaxNode = ItemModule<'db>;
14227    fn untyped(self) -> SyntaxStablePtrId<'db> {
14228        self.0
14229    }
14230    fn lookup(&self, db: &'db dyn Database) -> ItemModule<'db> {
14231        ItemModule::from_syntax_node(db, self.0.lookup(db))
14232    }
14233}
14234impl<'db> From<ItemModulePtr<'db>> for SyntaxStablePtrId<'db> {
14235    fn from(ptr: ItemModulePtr<'db>) -> Self {
14236        ptr.untyped()
14237    }
14238}
14239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14240pub struct ItemModuleGreen<'db>(pub GreenId<'db>);
14241impl<'db> TypedSyntaxNode<'db> for ItemModule<'db> {
14242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14243    type StablePtr = ItemModulePtr<'db>;
14244    type Green = ItemModuleGreen<'db>;
14245    fn missing(db: &'db dyn Database) -> Self::Green {
14246        ItemModuleGreen(
14247            GreenNode {
14248                kind: SyntaxKind::ItemModule,
14249                details: GreenNodeDetails::Node {
14250                    children: [
14251                        AttributeList::missing(db).0,
14252                        Visibility::missing(db).0,
14253                        TerminalModule::missing(db).0,
14254                        TerminalIdentifier::missing(db).0,
14255                        MaybeModuleBody::missing(db).0,
14256                    ]
14257                    .into(),
14258                    width: TextWidth::default(),
14259                },
14260            }
14261            .intern(db),
14262        )
14263    }
14264    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14265        let kind = node.kind(db);
14266        assert_eq!(
14267            kind,
14268            SyntaxKind::ItemModule,
14269            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14270            kind,
14271            SyntaxKind::ItemModule
14272        );
14273        Self { node }
14274    }
14275    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14276        let kind = node.kind(db);
14277        if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14278    }
14279    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14280        self.node
14281    }
14282    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14283        ItemModulePtr(self.node.stable_ptr(db))
14284    }
14285}
14286#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14287pub enum MaybeModuleBody<'db> {
14288    Some(ModuleBody<'db>),
14289    None(TerminalSemicolon<'db>),
14290}
14291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14292pub struct MaybeModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14293impl<'db> TypedStablePtr<'db> for MaybeModuleBodyPtr<'db> {
14294    type SyntaxNode = MaybeModuleBody<'db>;
14295    fn untyped(self) -> SyntaxStablePtrId<'db> {
14296        self.0
14297    }
14298    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14299        MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14300    }
14301}
14302impl<'db> From<MaybeModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14303    fn from(ptr: MaybeModuleBodyPtr<'db>) -> Self {
14304        ptr.untyped()
14305    }
14306}
14307impl<'db> From<ModuleBodyPtr<'db>> for MaybeModuleBodyPtr<'db> {
14308    fn from(value: ModuleBodyPtr<'db>) -> Self {
14309        Self(value.0)
14310    }
14311}
14312impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeModuleBodyPtr<'db> {
14313    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
14314        Self(value.0)
14315    }
14316}
14317impl<'db> From<ModuleBodyGreen<'db>> for MaybeModuleBodyGreen<'db> {
14318    fn from(value: ModuleBodyGreen<'db>) -> Self {
14319        Self(value.0)
14320    }
14321}
14322impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeModuleBodyGreen<'db> {
14323    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
14324        Self(value.0)
14325    }
14326}
14327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14328pub struct MaybeModuleBodyGreen<'db>(pub GreenId<'db>);
14329impl<'db> TypedSyntaxNode<'db> for MaybeModuleBody<'db> {
14330    const OPTIONAL_KIND: Option<SyntaxKind> = None;
14331    type StablePtr = MaybeModuleBodyPtr<'db>;
14332    type Green = MaybeModuleBodyGreen<'db>;
14333    fn missing(db: &'db dyn Database) -> Self::Green {
14334        panic!("No missing variant.");
14335    }
14336    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14337        let kind = node.kind(db);
14338        match kind {
14339            SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14340            SyntaxKind::TerminalSemicolon => {
14341                MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14342            }
14343            _ => {
14344                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14345            }
14346        }
14347    }
14348    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14349        let kind = node.kind(db);
14350        match kind {
14351            SyntaxKind::ModuleBody => {
14352                Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14353            }
14354            SyntaxKind::TerminalSemicolon => {
14355                Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14356            }
14357            _ => None,
14358        }
14359    }
14360    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14361        match self {
14362            MaybeModuleBody::Some(x) => x.as_syntax_node(),
14363            MaybeModuleBody::None(x) => x.as_syntax_node(),
14364        }
14365    }
14366    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14367        MaybeModuleBodyPtr(self.as_syntax_node().stable_ptr(db))
14368    }
14369}
14370impl<'db> MaybeModuleBody<'db> {
14371    /// Checks if a kind of a variant of [MaybeModuleBody].
14372    pub fn is_variant(kind: SyntaxKind) -> bool {
14373        matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14374    }
14375}
14376#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14377pub struct ModuleBody<'db> {
14378    node: SyntaxNode<'db>,
14379}
14380impl<'db> ModuleBody<'db> {
14381    pub const INDEX_LBRACE: usize = 0;
14382    pub const INDEX_ITEMS: usize = 1;
14383    pub const INDEX_RBRACE: usize = 2;
14384    pub fn new_green(
14385        db: &'db dyn Database,
14386        lbrace: TerminalLBraceGreen<'db>,
14387        items: ModuleItemListGreen<'db>,
14388        rbrace: TerminalRBraceGreen<'db>,
14389    ) -> ModuleBodyGreen<'db> {
14390        let children = [lbrace.0, items.0, rbrace.0];
14391        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14392        ModuleBodyGreen(
14393            GreenNode {
14394                kind: SyntaxKind::ModuleBody,
14395                details: GreenNodeDetails::Node { children: children.into(), width },
14396            }
14397            .intern(db),
14398        )
14399    }
14400}
14401impl<'db> ModuleBody<'db> {
14402    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
14403        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14404    }
14405    pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
14406        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14407    }
14408    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
14409        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14410    }
14411}
14412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14413pub struct ModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14414impl<'db> ModuleBodyPtr<'db> {}
14415impl<'db> TypedStablePtr<'db> for ModuleBodyPtr<'db> {
14416    type SyntaxNode = ModuleBody<'db>;
14417    fn untyped(self) -> SyntaxStablePtrId<'db> {
14418        self.0
14419    }
14420    fn lookup(&self, db: &'db dyn Database) -> ModuleBody<'db> {
14421        ModuleBody::from_syntax_node(db, self.0.lookup(db))
14422    }
14423}
14424impl<'db> From<ModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14425    fn from(ptr: ModuleBodyPtr<'db>) -> Self {
14426        ptr.untyped()
14427    }
14428}
14429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14430pub struct ModuleBodyGreen<'db>(pub GreenId<'db>);
14431impl<'db> TypedSyntaxNode<'db> for ModuleBody<'db> {
14432    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14433    type StablePtr = ModuleBodyPtr<'db>;
14434    type Green = ModuleBodyGreen<'db>;
14435    fn missing(db: &'db dyn Database) -> Self::Green {
14436        ModuleBodyGreen(
14437            GreenNode {
14438                kind: SyntaxKind::ModuleBody,
14439                details: GreenNodeDetails::Node {
14440                    children: [
14441                        TerminalLBrace::missing(db).0,
14442                        ModuleItemList::missing(db).0,
14443                        TerminalRBrace::missing(db).0,
14444                    ]
14445                    .into(),
14446                    width: TextWidth::default(),
14447                },
14448            }
14449            .intern(db),
14450        )
14451    }
14452    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14453        let kind = node.kind(db);
14454        assert_eq!(
14455            kind,
14456            SyntaxKind::ModuleBody,
14457            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14458            kind,
14459            SyntaxKind::ModuleBody
14460        );
14461        Self { node }
14462    }
14463    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14464        let kind = node.kind(db);
14465        if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14466    }
14467    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14468        self.node
14469    }
14470    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14471        ModuleBodyPtr(self.node.stable_ptr(db))
14472    }
14473}
14474#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14475pub struct FunctionDeclaration<'db> {
14476    node: SyntaxNode<'db>,
14477}
14478impl<'db> FunctionDeclaration<'db> {
14479    pub const INDEX_OPTIONAL_CONST: usize = 0;
14480    pub const INDEX_FUNCTION_KW: usize = 1;
14481    pub const INDEX_NAME: usize = 2;
14482    pub const INDEX_GENERIC_PARAMS: usize = 3;
14483    pub const INDEX_SIGNATURE: usize = 4;
14484    pub fn new_green(
14485        db: &'db dyn Database,
14486        optional_const: OptionTerminalConstGreen<'db>,
14487        function_kw: TerminalFunctionGreen<'db>,
14488        name: TerminalIdentifierGreen<'db>,
14489        generic_params: OptionWrappedGenericParamListGreen<'db>,
14490        signature: FunctionSignatureGreen<'db>,
14491    ) -> FunctionDeclarationGreen<'db> {
14492        let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14493        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14494        FunctionDeclarationGreen(
14495            GreenNode {
14496                kind: SyntaxKind::FunctionDeclaration,
14497                details: GreenNodeDetails::Node { children: children.into(), width },
14498            }
14499            .intern(db),
14500        )
14501    }
14502}
14503impl<'db> FunctionDeclaration<'db> {
14504    pub fn optional_const(&self, db: &'db dyn Database) -> OptionTerminalConst<'db> {
14505        OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14506    }
14507    pub fn function_kw(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
14508        TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14509    }
14510    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14511        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14512    }
14513    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
14514        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14515    }
14516    pub fn signature(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
14517        FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14518    }
14519}
14520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14521pub struct FunctionDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
14522impl<'db> FunctionDeclarationPtr<'db> {
14523    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14524        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14525    }
14526}
14527impl<'db> TypedStablePtr<'db> for FunctionDeclarationPtr<'db> {
14528    type SyntaxNode = FunctionDeclaration<'db>;
14529    fn untyped(self) -> SyntaxStablePtrId<'db> {
14530        self.0
14531    }
14532    fn lookup(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14533        FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14534    }
14535}
14536impl<'db> From<FunctionDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
14537    fn from(ptr: FunctionDeclarationPtr<'db>) -> Self {
14538        ptr.untyped()
14539    }
14540}
14541#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14542pub struct FunctionDeclarationGreen<'db>(pub GreenId<'db>);
14543impl<'db> TypedSyntaxNode<'db> for FunctionDeclaration<'db> {
14544    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14545    type StablePtr = FunctionDeclarationPtr<'db>;
14546    type Green = FunctionDeclarationGreen<'db>;
14547    fn missing(db: &'db dyn Database) -> Self::Green {
14548        FunctionDeclarationGreen(
14549            GreenNode {
14550                kind: SyntaxKind::FunctionDeclaration,
14551                details: GreenNodeDetails::Node {
14552                    children: [
14553                        OptionTerminalConst::missing(db).0,
14554                        TerminalFunction::missing(db).0,
14555                        TerminalIdentifier::missing(db).0,
14556                        OptionWrappedGenericParamList::missing(db).0,
14557                        FunctionSignature::missing(db).0,
14558                    ]
14559                    .into(),
14560                    width: TextWidth::default(),
14561                },
14562            }
14563            .intern(db),
14564        )
14565    }
14566    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14567        let kind = node.kind(db);
14568        assert_eq!(
14569            kind,
14570            SyntaxKind::FunctionDeclaration,
14571            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14572            kind,
14573            SyntaxKind::FunctionDeclaration
14574        );
14575        Self { node }
14576    }
14577    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14578        let kind = node.kind(db);
14579        if kind == SyntaxKind::FunctionDeclaration {
14580            Some(Self::from_syntax_node(db, node))
14581        } else {
14582            None
14583        }
14584    }
14585    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14586        self.node
14587    }
14588    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14589        FunctionDeclarationPtr(self.node.stable_ptr(db))
14590    }
14591}
14592#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14593pub struct ItemConstant<'db> {
14594    node: SyntaxNode<'db>,
14595}
14596impl<'db> ItemConstant<'db> {
14597    pub const INDEX_ATTRIBUTES: usize = 0;
14598    pub const INDEX_VISIBILITY: usize = 1;
14599    pub const INDEX_CONST_KW: usize = 2;
14600    pub const INDEX_NAME: usize = 3;
14601    pub const INDEX_TYPE_CLAUSE: usize = 4;
14602    pub const INDEX_EQ: usize = 5;
14603    pub const INDEX_VALUE: usize = 6;
14604    pub const INDEX_SEMICOLON: usize = 7;
14605    pub fn new_green(
14606        db: &'db dyn Database,
14607        attributes: AttributeListGreen<'db>,
14608        visibility: VisibilityGreen<'db>,
14609        const_kw: TerminalConstGreen<'db>,
14610        name: TerminalIdentifierGreen<'db>,
14611        type_clause: TypeClauseGreen<'db>,
14612        eq: TerminalEqGreen<'db>,
14613        value: ExprGreen<'db>,
14614        semicolon: TerminalSemicolonGreen<'db>,
14615    ) -> ItemConstantGreen<'db> {
14616        let children = [
14617            attributes.0,
14618            visibility.0,
14619            const_kw.0,
14620            name.0,
14621            type_clause.0,
14622            eq.0,
14623            value.0,
14624            semicolon.0,
14625        ];
14626        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14627        ItemConstantGreen(
14628            GreenNode {
14629                kind: SyntaxKind::ItemConstant,
14630                details: GreenNodeDetails::Node { children: children.into(), width },
14631            }
14632            .intern(db),
14633        )
14634    }
14635}
14636impl<'db> ItemConstant<'db> {
14637    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14638        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14639    }
14640    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14641        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14642    }
14643    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
14644        TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14645    }
14646    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14647        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14648    }
14649    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
14650        TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14651    }
14652    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
14653        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14654    }
14655    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
14656        Expr::from_syntax_node(db, self.node.get_children(db)[6])
14657    }
14658    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14659        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14660    }
14661}
14662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14663pub struct ItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
14664impl<'db> ItemConstantPtr<'db> {
14665    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14666        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14667    }
14668}
14669impl<'db> TypedStablePtr<'db> for ItemConstantPtr<'db> {
14670    type SyntaxNode = ItemConstant<'db>;
14671    fn untyped(self) -> SyntaxStablePtrId<'db> {
14672        self.0
14673    }
14674    fn lookup(&self, db: &'db dyn Database) -> ItemConstant<'db> {
14675        ItemConstant::from_syntax_node(db, self.0.lookup(db))
14676    }
14677}
14678impl<'db> From<ItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
14679    fn from(ptr: ItemConstantPtr<'db>) -> Self {
14680        ptr.untyped()
14681    }
14682}
14683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14684pub struct ItemConstantGreen<'db>(pub GreenId<'db>);
14685impl<'db> TypedSyntaxNode<'db> for ItemConstant<'db> {
14686    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14687    type StablePtr = ItemConstantPtr<'db>;
14688    type Green = ItemConstantGreen<'db>;
14689    fn missing(db: &'db dyn Database) -> Self::Green {
14690        ItemConstantGreen(
14691            GreenNode {
14692                kind: SyntaxKind::ItemConstant,
14693                details: GreenNodeDetails::Node {
14694                    children: [
14695                        AttributeList::missing(db).0,
14696                        Visibility::missing(db).0,
14697                        TerminalConst::missing(db).0,
14698                        TerminalIdentifier::missing(db).0,
14699                        TypeClause::missing(db).0,
14700                        TerminalEq::missing(db).0,
14701                        Expr::missing(db).0,
14702                        TerminalSemicolon::missing(db).0,
14703                    ]
14704                    .into(),
14705                    width: TextWidth::default(),
14706                },
14707            }
14708            .intern(db),
14709        )
14710    }
14711    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14712        let kind = node.kind(db);
14713        assert_eq!(
14714            kind,
14715            SyntaxKind::ItemConstant,
14716            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14717            kind,
14718            SyntaxKind::ItemConstant
14719        );
14720        Self { node }
14721    }
14722    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14723        let kind = node.kind(db);
14724        if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14725    }
14726    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14727        self.node
14728    }
14729    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14730        ItemConstantPtr(self.node.stable_ptr(db))
14731    }
14732}
14733#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14734pub struct FunctionWithBody<'db> {
14735    node: SyntaxNode<'db>,
14736}
14737impl<'db> FunctionWithBody<'db> {
14738    pub const INDEX_ATTRIBUTES: usize = 0;
14739    pub const INDEX_VISIBILITY: usize = 1;
14740    pub const INDEX_DECLARATION: usize = 2;
14741    pub const INDEX_BODY: usize = 3;
14742    pub fn new_green(
14743        db: &'db dyn Database,
14744        attributes: AttributeListGreen<'db>,
14745        visibility: VisibilityGreen<'db>,
14746        declaration: FunctionDeclarationGreen<'db>,
14747        body: ExprBlockGreen<'db>,
14748    ) -> FunctionWithBodyGreen<'db> {
14749        let children = [attributes.0, visibility.0, declaration.0, body.0];
14750        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14751        FunctionWithBodyGreen(
14752            GreenNode {
14753                kind: SyntaxKind::FunctionWithBody,
14754                details: GreenNodeDetails::Node { children: children.into(), width },
14755            }
14756            .intern(db),
14757        )
14758    }
14759}
14760impl<'db> FunctionWithBody<'db> {
14761    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14762        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14763    }
14764    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14765        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14766    }
14767    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14768        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14769    }
14770    pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
14771        ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14772    }
14773}
14774#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14775pub struct FunctionWithBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14776impl<'db> FunctionWithBodyPtr<'db> {
14777    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14778        FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14779    }
14780}
14781impl<'db> TypedStablePtr<'db> for FunctionWithBodyPtr<'db> {
14782    type SyntaxNode = FunctionWithBody<'db>;
14783    fn untyped(self) -> SyntaxStablePtrId<'db> {
14784        self.0
14785    }
14786    fn lookup(&self, db: &'db dyn Database) -> FunctionWithBody<'db> {
14787        FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14788    }
14789}
14790impl<'db> From<FunctionWithBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14791    fn from(ptr: FunctionWithBodyPtr<'db>) -> Self {
14792        ptr.untyped()
14793    }
14794}
14795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14796pub struct FunctionWithBodyGreen<'db>(pub GreenId<'db>);
14797impl<'db> TypedSyntaxNode<'db> for FunctionWithBody<'db> {
14798    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14799    type StablePtr = FunctionWithBodyPtr<'db>;
14800    type Green = FunctionWithBodyGreen<'db>;
14801    fn missing(db: &'db dyn Database) -> Self::Green {
14802        FunctionWithBodyGreen(
14803            GreenNode {
14804                kind: SyntaxKind::FunctionWithBody,
14805                details: GreenNodeDetails::Node {
14806                    children: [
14807                        AttributeList::missing(db).0,
14808                        Visibility::missing(db).0,
14809                        FunctionDeclaration::missing(db).0,
14810                        ExprBlock::missing(db).0,
14811                    ]
14812                    .into(),
14813                    width: TextWidth::default(),
14814                },
14815            }
14816            .intern(db),
14817        )
14818    }
14819    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14820        let kind = node.kind(db);
14821        assert_eq!(
14822            kind,
14823            SyntaxKind::FunctionWithBody,
14824            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14825            kind,
14826            SyntaxKind::FunctionWithBody
14827        );
14828        Self { node }
14829    }
14830    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14831        let kind = node.kind(db);
14832        if kind == SyntaxKind::FunctionWithBody {
14833            Some(Self::from_syntax_node(db, node))
14834        } else {
14835            None
14836        }
14837    }
14838    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14839        self.node
14840    }
14841    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14842        FunctionWithBodyPtr(self.node.stable_ptr(db))
14843    }
14844}
14845#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14846pub struct ItemExternFunction<'db> {
14847    node: SyntaxNode<'db>,
14848}
14849impl<'db> ItemExternFunction<'db> {
14850    pub const INDEX_ATTRIBUTES: usize = 0;
14851    pub const INDEX_VISIBILITY: usize = 1;
14852    pub const INDEX_EXTERN_KW: usize = 2;
14853    pub const INDEX_DECLARATION: usize = 3;
14854    pub const INDEX_SEMICOLON: usize = 4;
14855    pub fn new_green(
14856        db: &'db dyn Database,
14857        attributes: AttributeListGreen<'db>,
14858        visibility: VisibilityGreen<'db>,
14859        extern_kw: TerminalExternGreen<'db>,
14860        declaration: FunctionDeclarationGreen<'db>,
14861        semicolon: TerminalSemicolonGreen<'db>,
14862    ) -> ItemExternFunctionGreen<'db> {
14863        let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14864        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14865        ItemExternFunctionGreen(
14866            GreenNode {
14867                kind: SyntaxKind::ItemExternFunction,
14868                details: GreenNodeDetails::Node { children: children.into(), width },
14869            }
14870            .intern(db),
14871        )
14872    }
14873}
14874impl<'db> ItemExternFunction<'db> {
14875    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14876        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14877    }
14878    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14879        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14880    }
14881    pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
14882        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
14883    }
14884    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14885        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
14886    }
14887    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14888        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
14889    }
14890}
14891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
14892pub struct ItemExternFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
14893impl<'db> ItemExternFunctionPtr<'db> {
14894    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14895        FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14896    }
14897}
14898impl<'db> TypedStablePtr<'db> for ItemExternFunctionPtr<'db> {
14899    type SyntaxNode = ItemExternFunction<'db>;
14900    fn untyped(self) -> SyntaxStablePtrId<'db> {
14901        self.0
14902    }
14903    fn lookup(&self, db: &'db dyn Database) -> ItemExternFunction<'db> {
14904        ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
14905    }
14906}
14907impl<'db> From<ItemExternFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
14908    fn from(ptr: ItemExternFunctionPtr<'db>) -> Self {
14909        ptr.untyped()
14910    }
14911}
14912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14913pub struct ItemExternFunctionGreen<'db>(pub GreenId<'db>);
14914impl<'db> TypedSyntaxNode<'db> for ItemExternFunction<'db> {
14915    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
14916    type StablePtr = ItemExternFunctionPtr<'db>;
14917    type Green = ItemExternFunctionGreen<'db>;
14918    fn missing(db: &'db dyn Database) -> Self::Green {
14919        ItemExternFunctionGreen(
14920            GreenNode {
14921                kind: SyntaxKind::ItemExternFunction,
14922                details: GreenNodeDetails::Node {
14923                    children: [
14924                        AttributeList::missing(db).0,
14925                        Visibility::missing(db).0,
14926                        TerminalExtern::missing(db).0,
14927                        FunctionDeclaration::missing(db).0,
14928                        TerminalSemicolon::missing(db).0,
14929                    ]
14930                    .into(),
14931                    width: TextWidth::default(),
14932                },
14933            }
14934            .intern(db),
14935        )
14936    }
14937    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14938        let kind = node.kind(db);
14939        assert_eq!(
14940            kind,
14941            SyntaxKind::ItemExternFunction,
14942            "Unexpected SyntaxKind {:?}. Expected {:?}.",
14943            kind,
14944            SyntaxKind::ItemExternFunction
14945        );
14946        Self { node }
14947    }
14948    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14949        let kind = node.kind(db);
14950        if kind == SyntaxKind::ItemExternFunction {
14951            Some(Self::from_syntax_node(db, node))
14952        } else {
14953            None
14954        }
14955    }
14956    fn as_syntax_node(&self) -> SyntaxNode<'db> {
14957        self.node
14958    }
14959    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14960        ItemExternFunctionPtr(self.node.stable_ptr(db))
14961    }
14962}
14963#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14964pub struct ItemExternType<'db> {
14965    node: SyntaxNode<'db>,
14966}
14967impl<'db> ItemExternType<'db> {
14968    pub const INDEX_ATTRIBUTES: usize = 0;
14969    pub const INDEX_VISIBILITY: usize = 1;
14970    pub const INDEX_EXTERN_KW: usize = 2;
14971    pub const INDEX_TYPE_KW: usize = 3;
14972    pub const INDEX_NAME: usize = 4;
14973    pub const INDEX_GENERIC_PARAMS: usize = 5;
14974    pub const INDEX_SEMICOLON: usize = 6;
14975    pub fn new_green(
14976        db: &'db dyn Database,
14977        attributes: AttributeListGreen<'db>,
14978        visibility: VisibilityGreen<'db>,
14979        extern_kw: TerminalExternGreen<'db>,
14980        type_kw: TerminalTypeGreen<'db>,
14981        name: TerminalIdentifierGreen<'db>,
14982        generic_params: OptionWrappedGenericParamListGreen<'db>,
14983        semicolon: TerminalSemicolonGreen<'db>,
14984    ) -> ItemExternTypeGreen<'db> {
14985        let children = [
14986            attributes.0,
14987            visibility.0,
14988            extern_kw.0,
14989            type_kw.0,
14990            name.0,
14991            generic_params.0,
14992            semicolon.0,
14993        ];
14994        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14995        ItemExternTypeGreen(
14996            GreenNode {
14997                kind: SyntaxKind::ItemExternType,
14998                details: GreenNodeDetails::Node { children: children.into(), width },
14999            }
15000            .intern(db),
15001        )
15002    }
15003}
15004impl<'db> ItemExternType<'db> {
15005    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15006        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15007    }
15008    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15009        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15010    }
15011    pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
15012        TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15013    }
15014    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15015        TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15016    }
15017    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15018        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15019    }
15020    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15021        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15022    }
15023    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15024        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15025    }
15026}
15027#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15028pub struct ItemExternTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15029impl<'db> ItemExternTypePtr<'db> {
15030    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15031        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15032    }
15033}
15034impl<'db> TypedStablePtr<'db> for ItemExternTypePtr<'db> {
15035    type SyntaxNode = ItemExternType<'db>;
15036    fn untyped(self) -> SyntaxStablePtrId<'db> {
15037        self.0
15038    }
15039    fn lookup(&self, db: &'db dyn Database) -> ItemExternType<'db> {
15040        ItemExternType::from_syntax_node(db, self.0.lookup(db))
15041    }
15042}
15043impl<'db> From<ItemExternTypePtr<'db>> for SyntaxStablePtrId<'db> {
15044    fn from(ptr: ItemExternTypePtr<'db>) -> Self {
15045        ptr.untyped()
15046    }
15047}
15048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15049pub struct ItemExternTypeGreen<'db>(pub GreenId<'db>);
15050impl<'db> TypedSyntaxNode<'db> for ItemExternType<'db> {
15051    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15052    type StablePtr = ItemExternTypePtr<'db>;
15053    type Green = ItemExternTypeGreen<'db>;
15054    fn missing(db: &'db dyn Database) -> Self::Green {
15055        ItemExternTypeGreen(
15056            GreenNode {
15057                kind: SyntaxKind::ItemExternType,
15058                details: GreenNodeDetails::Node {
15059                    children: [
15060                        AttributeList::missing(db).0,
15061                        Visibility::missing(db).0,
15062                        TerminalExtern::missing(db).0,
15063                        TerminalType::missing(db).0,
15064                        TerminalIdentifier::missing(db).0,
15065                        OptionWrappedGenericParamList::missing(db).0,
15066                        TerminalSemicolon::missing(db).0,
15067                    ]
15068                    .into(),
15069                    width: TextWidth::default(),
15070                },
15071            }
15072            .intern(db),
15073        )
15074    }
15075    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15076        let kind = node.kind(db);
15077        assert_eq!(
15078            kind,
15079            SyntaxKind::ItemExternType,
15080            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15081            kind,
15082            SyntaxKind::ItemExternType
15083        );
15084        Self { node }
15085    }
15086    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15087        let kind = node.kind(db);
15088        if kind == SyntaxKind::ItemExternType {
15089            Some(Self::from_syntax_node(db, node))
15090        } else {
15091            None
15092        }
15093    }
15094    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15095        self.node
15096    }
15097    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15098        ItemExternTypePtr(self.node.stable_ptr(db))
15099    }
15100}
15101#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15102pub struct ItemTrait<'db> {
15103    node: SyntaxNode<'db>,
15104}
15105impl<'db> ItemTrait<'db> {
15106    pub const INDEX_ATTRIBUTES: usize = 0;
15107    pub const INDEX_VISIBILITY: usize = 1;
15108    pub const INDEX_TRAIT_KW: usize = 2;
15109    pub const INDEX_NAME: usize = 3;
15110    pub const INDEX_GENERIC_PARAMS: usize = 4;
15111    pub const INDEX_BODY: usize = 5;
15112    pub fn new_green(
15113        db: &'db dyn Database,
15114        attributes: AttributeListGreen<'db>,
15115        visibility: VisibilityGreen<'db>,
15116        trait_kw: TerminalTraitGreen<'db>,
15117        name: TerminalIdentifierGreen<'db>,
15118        generic_params: OptionWrappedGenericParamListGreen<'db>,
15119        body: MaybeTraitBodyGreen<'db>,
15120    ) -> ItemTraitGreen<'db> {
15121        let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15122        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15123        ItemTraitGreen(
15124            GreenNode {
15125                kind: SyntaxKind::ItemTrait,
15126                details: GreenNodeDetails::Node { children: children.into(), width },
15127            }
15128            .intern(db),
15129        )
15130    }
15131}
15132impl<'db> ItemTrait<'db> {
15133    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15134        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15135    }
15136    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15137        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15138    }
15139    pub fn trait_kw(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
15140        TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15141    }
15142    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15143        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15144    }
15145    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15146        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15147    }
15148    pub fn body(&self, db: &'db dyn Database) -> MaybeTraitBody<'db> {
15149        MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15150    }
15151}
15152#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15153pub struct ItemTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
15154impl<'db> ItemTraitPtr<'db> {
15155    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15156        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15157    }
15158}
15159impl<'db> TypedStablePtr<'db> for ItemTraitPtr<'db> {
15160    type SyntaxNode = ItemTrait<'db>;
15161    fn untyped(self) -> SyntaxStablePtrId<'db> {
15162        self.0
15163    }
15164    fn lookup(&self, db: &'db dyn Database) -> ItemTrait<'db> {
15165        ItemTrait::from_syntax_node(db, self.0.lookup(db))
15166    }
15167}
15168impl<'db> From<ItemTraitPtr<'db>> for SyntaxStablePtrId<'db> {
15169    fn from(ptr: ItemTraitPtr<'db>) -> Self {
15170        ptr.untyped()
15171    }
15172}
15173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15174pub struct ItemTraitGreen<'db>(pub GreenId<'db>);
15175impl<'db> TypedSyntaxNode<'db> for ItemTrait<'db> {
15176    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15177    type StablePtr = ItemTraitPtr<'db>;
15178    type Green = ItemTraitGreen<'db>;
15179    fn missing(db: &'db dyn Database) -> Self::Green {
15180        ItemTraitGreen(
15181            GreenNode {
15182                kind: SyntaxKind::ItemTrait,
15183                details: GreenNodeDetails::Node {
15184                    children: [
15185                        AttributeList::missing(db).0,
15186                        Visibility::missing(db).0,
15187                        TerminalTrait::missing(db).0,
15188                        TerminalIdentifier::missing(db).0,
15189                        OptionWrappedGenericParamList::missing(db).0,
15190                        MaybeTraitBody::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::ItemTrait,
15204            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15205            kind,
15206            SyntaxKind::ItemTrait
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::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15213    }
15214    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15215        self.node
15216    }
15217    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15218        ItemTraitPtr(self.node.stable_ptr(db))
15219    }
15220}
15221#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15222pub enum MaybeTraitBody<'db> {
15223    Some(TraitBody<'db>),
15224    None(TerminalSemicolon<'db>),
15225}
15226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15227pub struct MaybeTraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15228impl<'db> TypedStablePtr<'db> for MaybeTraitBodyPtr<'db> {
15229    type SyntaxNode = MaybeTraitBody<'db>;
15230    fn untyped(self) -> SyntaxStablePtrId<'db> {
15231        self.0
15232    }
15233    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15234        MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15235    }
15236}
15237impl<'db> From<MaybeTraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15238    fn from(ptr: MaybeTraitBodyPtr<'db>) -> Self {
15239        ptr.untyped()
15240    }
15241}
15242impl<'db> From<TraitBodyPtr<'db>> for MaybeTraitBodyPtr<'db> {
15243    fn from(value: TraitBodyPtr<'db>) -> Self {
15244        Self(value.0)
15245    }
15246}
15247impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitBodyPtr<'db> {
15248    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
15249        Self(value.0)
15250    }
15251}
15252impl<'db> From<TraitBodyGreen<'db>> for MaybeTraitBodyGreen<'db> {
15253    fn from(value: TraitBodyGreen<'db>) -> Self {
15254        Self(value.0)
15255    }
15256}
15257impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitBodyGreen<'db> {
15258    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
15259        Self(value.0)
15260    }
15261}
15262#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15263pub struct MaybeTraitBodyGreen<'db>(pub GreenId<'db>);
15264impl<'db> TypedSyntaxNode<'db> for MaybeTraitBody<'db> {
15265    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15266    type StablePtr = MaybeTraitBodyPtr<'db>;
15267    type Green = MaybeTraitBodyGreen<'db>;
15268    fn missing(db: &'db dyn Database) -> Self::Green {
15269        panic!("No missing variant.");
15270    }
15271    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15272        let kind = node.kind(db);
15273        match kind {
15274            SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15275            SyntaxKind::TerminalSemicolon => {
15276                MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15277            }
15278            _ => {
15279                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15280            }
15281        }
15282    }
15283    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15284        let kind = node.kind(db);
15285        match kind {
15286            SyntaxKind::TraitBody => {
15287                Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15288            }
15289            SyntaxKind::TerminalSemicolon => {
15290                Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15291            }
15292            _ => None,
15293        }
15294    }
15295    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15296        match self {
15297            MaybeTraitBody::Some(x) => x.as_syntax_node(),
15298            MaybeTraitBody::None(x) => x.as_syntax_node(),
15299        }
15300    }
15301    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15302        MaybeTraitBodyPtr(self.as_syntax_node().stable_ptr(db))
15303    }
15304}
15305impl<'db> MaybeTraitBody<'db> {
15306    /// Checks if a kind of a variant of [MaybeTraitBody].
15307    pub fn is_variant(kind: SyntaxKind) -> bool {
15308        matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15309    }
15310}
15311#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15312pub struct TraitBody<'db> {
15313    node: SyntaxNode<'db>,
15314}
15315impl<'db> TraitBody<'db> {
15316    pub const INDEX_LBRACE: usize = 0;
15317    pub const INDEX_ITEMS: usize = 1;
15318    pub const INDEX_RBRACE: usize = 2;
15319    pub fn new_green(
15320        db: &'db dyn Database,
15321        lbrace: TerminalLBraceGreen<'db>,
15322        items: TraitItemListGreen<'db>,
15323        rbrace: TerminalRBraceGreen<'db>,
15324    ) -> TraitBodyGreen<'db> {
15325        let children = [lbrace.0, items.0, rbrace.0];
15326        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15327        TraitBodyGreen(
15328            GreenNode {
15329                kind: SyntaxKind::TraitBody,
15330                details: GreenNodeDetails::Node { children: children.into(), width },
15331            }
15332            .intern(db),
15333        )
15334    }
15335}
15336impl<'db> TraitBody<'db> {
15337    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
15338        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15339    }
15340    pub fn items(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15341        TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15342    }
15343    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
15344        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15345    }
15346}
15347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15348pub struct TraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15349impl<'db> TraitBodyPtr<'db> {}
15350impl<'db> TypedStablePtr<'db> for TraitBodyPtr<'db> {
15351    type SyntaxNode = TraitBody<'db>;
15352    fn untyped(self) -> SyntaxStablePtrId<'db> {
15353        self.0
15354    }
15355    fn lookup(&self, db: &'db dyn Database) -> TraitBody<'db> {
15356        TraitBody::from_syntax_node(db, self.0.lookup(db))
15357    }
15358}
15359impl<'db> From<TraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15360    fn from(ptr: TraitBodyPtr<'db>) -> Self {
15361        ptr.untyped()
15362    }
15363}
15364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15365pub struct TraitBodyGreen<'db>(pub GreenId<'db>);
15366impl<'db> TypedSyntaxNode<'db> for TraitBody<'db> {
15367    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15368    type StablePtr = TraitBodyPtr<'db>;
15369    type Green = TraitBodyGreen<'db>;
15370    fn missing(db: &'db dyn Database) -> Self::Green {
15371        TraitBodyGreen(
15372            GreenNode {
15373                kind: SyntaxKind::TraitBody,
15374                details: GreenNodeDetails::Node {
15375                    children: [
15376                        TerminalLBrace::missing(db).0,
15377                        TraitItemList::missing(db).0,
15378                        TerminalRBrace::missing(db).0,
15379                    ]
15380                    .into(),
15381                    width: TextWidth::default(),
15382                },
15383            }
15384            .intern(db),
15385        )
15386    }
15387    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15388        let kind = node.kind(db);
15389        assert_eq!(
15390            kind,
15391            SyntaxKind::TraitBody,
15392            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15393            kind,
15394            SyntaxKind::TraitBody
15395        );
15396        Self { node }
15397    }
15398    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15399        let kind = node.kind(db);
15400        if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15401    }
15402    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15403        self.node
15404    }
15405    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15406        TraitBodyPtr(self.node.stable_ptr(db))
15407    }
15408}
15409#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15410pub struct TraitItemList<'db>(ElementList<'db, TraitItem<'db>, 1>);
15411impl<'db> Deref for TraitItemList<'db> {
15412    type Target = ElementList<'db, TraitItem<'db>, 1>;
15413    fn deref(&self) -> &Self::Target {
15414        &self.0
15415    }
15416}
15417impl<'db> TraitItemList<'db> {
15418    pub fn new_green(
15419        db: &'db dyn Database,
15420        children: &[TraitItemGreen<'db>],
15421    ) -> TraitItemListGreen<'db> {
15422        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
15423        TraitItemListGreen(
15424            GreenNode {
15425                kind: SyntaxKind::TraitItemList,
15426                details: GreenNodeDetails::Node {
15427                    children: children.iter().map(|x| x.0).collect(),
15428                    width,
15429                },
15430            }
15431            .intern(db),
15432        )
15433    }
15434}
15435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15436pub struct TraitItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
15437impl<'db> TypedStablePtr<'db> for TraitItemListPtr<'db> {
15438    type SyntaxNode = TraitItemList<'db>;
15439    fn untyped(self) -> SyntaxStablePtrId<'db> {
15440        self.0
15441    }
15442    fn lookup(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15443        TraitItemList::from_syntax_node(db, self.0.lookup(db))
15444    }
15445}
15446impl<'db> From<TraitItemListPtr<'db>> for SyntaxStablePtrId<'db> {
15447    fn from(ptr: TraitItemListPtr<'db>) -> Self {
15448        ptr.untyped()
15449    }
15450}
15451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15452pub struct TraitItemListGreen<'db>(pub GreenId<'db>);
15453impl<'db> TypedSyntaxNode<'db> for TraitItemList<'db> {
15454    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15455    type StablePtr = TraitItemListPtr<'db>;
15456    type Green = TraitItemListGreen<'db>;
15457    fn missing(db: &'db dyn Database) -> Self::Green {
15458        TraitItemListGreen(
15459            GreenNode {
15460                kind: SyntaxKind::TraitItemList,
15461                details: GreenNodeDetails::Node {
15462                    children: [].into(),
15463                    width: TextWidth::default(),
15464                },
15465            }
15466            .intern(db),
15467        )
15468    }
15469    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15470        Self(ElementList::new(node))
15471    }
15472    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15473        if node.kind(db) == SyntaxKind::TraitItemList {
15474            Some(Self(ElementList::new(node)))
15475        } else {
15476            None
15477        }
15478    }
15479    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15480        self.node
15481    }
15482    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15483        TraitItemListPtr(self.node.stable_ptr(db))
15484    }
15485}
15486#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15487pub enum TraitItem<'db> {
15488    Function(TraitItemFunction<'db>),
15489    Type(TraitItemType<'db>),
15490    Constant(TraitItemConstant<'db>),
15491    Impl(TraitItemImpl<'db>),
15492    Missing(TraitItemMissing<'db>),
15493}
15494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15495pub struct TraitItemPtr<'db>(pub SyntaxStablePtrId<'db>);
15496impl<'db> TypedStablePtr<'db> for TraitItemPtr<'db> {
15497    type SyntaxNode = TraitItem<'db>;
15498    fn untyped(self) -> SyntaxStablePtrId<'db> {
15499        self.0
15500    }
15501    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15502        TraitItem::from_syntax_node(db, self.0.lookup(db))
15503    }
15504}
15505impl<'db> From<TraitItemPtr<'db>> for SyntaxStablePtrId<'db> {
15506    fn from(ptr: TraitItemPtr<'db>) -> Self {
15507        ptr.untyped()
15508    }
15509}
15510impl<'db> From<TraitItemFunctionPtr<'db>> for TraitItemPtr<'db> {
15511    fn from(value: TraitItemFunctionPtr<'db>) -> Self {
15512        Self(value.0)
15513    }
15514}
15515impl<'db> From<TraitItemTypePtr<'db>> for TraitItemPtr<'db> {
15516    fn from(value: TraitItemTypePtr<'db>) -> Self {
15517        Self(value.0)
15518    }
15519}
15520impl<'db> From<TraitItemConstantPtr<'db>> for TraitItemPtr<'db> {
15521    fn from(value: TraitItemConstantPtr<'db>) -> Self {
15522        Self(value.0)
15523    }
15524}
15525impl<'db> From<TraitItemImplPtr<'db>> for TraitItemPtr<'db> {
15526    fn from(value: TraitItemImplPtr<'db>) -> Self {
15527        Self(value.0)
15528    }
15529}
15530impl<'db> From<TraitItemMissingPtr<'db>> for TraitItemPtr<'db> {
15531    fn from(value: TraitItemMissingPtr<'db>) -> Self {
15532        Self(value.0)
15533    }
15534}
15535impl<'db> From<TraitItemFunctionGreen<'db>> for TraitItemGreen<'db> {
15536    fn from(value: TraitItemFunctionGreen<'db>) -> Self {
15537        Self(value.0)
15538    }
15539}
15540impl<'db> From<TraitItemTypeGreen<'db>> for TraitItemGreen<'db> {
15541    fn from(value: TraitItemTypeGreen<'db>) -> Self {
15542        Self(value.0)
15543    }
15544}
15545impl<'db> From<TraitItemConstantGreen<'db>> for TraitItemGreen<'db> {
15546    fn from(value: TraitItemConstantGreen<'db>) -> Self {
15547        Self(value.0)
15548    }
15549}
15550impl<'db> From<TraitItemImplGreen<'db>> for TraitItemGreen<'db> {
15551    fn from(value: TraitItemImplGreen<'db>) -> Self {
15552        Self(value.0)
15553    }
15554}
15555impl<'db> From<TraitItemMissingGreen<'db>> for TraitItemGreen<'db> {
15556    fn from(value: TraitItemMissingGreen<'db>) -> Self {
15557        Self(value.0)
15558    }
15559}
15560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15561pub struct TraitItemGreen<'db>(pub GreenId<'db>);
15562impl<'db> TypedSyntaxNode<'db> for TraitItem<'db> {
15563    const OPTIONAL_KIND: Option<SyntaxKind> = None;
15564    type StablePtr = TraitItemPtr<'db>;
15565    type Green = TraitItemGreen<'db>;
15566    fn missing(db: &'db dyn Database) -> Self::Green {
15567        TraitItemGreen(TraitItemMissing::missing(db).0)
15568    }
15569    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15570        let kind = node.kind(db);
15571        match kind {
15572            SyntaxKind::TraitItemFunction => {
15573                TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15574            }
15575            SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15576            SyntaxKind::TraitItemConstant => {
15577                TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15578            }
15579            SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15580            SyntaxKind::TraitItemMissing => {
15581                TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15582            }
15583            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15584        }
15585    }
15586    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15587        let kind = node.kind(db);
15588        match kind {
15589            SyntaxKind::TraitItemFunction => {
15590                Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15591            }
15592            SyntaxKind::TraitItemType => {
15593                Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15594            }
15595            SyntaxKind::TraitItemConstant => {
15596                Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15597            }
15598            SyntaxKind::TraitItemImpl => {
15599                Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15600            }
15601            SyntaxKind::TraitItemMissing => {
15602                Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15603            }
15604            _ => None,
15605        }
15606    }
15607    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15608        match self {
15609            TraitItem::Function(x) => x.as_syntax_node(),
15610            TraitItem::Type(x) => x.as_syntax_node(),
15611            TraitItem::Constant(x) => x.as_syntax_node(),
15612            TraitItem::Impl(x) => x.as_syntax_node(),
15613            TraitItem::Missing(x) => x.as_syntax_node(),
15614        }
15615    }
15616    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15617        TraitItemPtr(self.as_syntax_node().stable_ptr(db))
15618    }
15619}
15620impl<'db> TraitItem<'db> {
15621    /// Checks if a kind of a variant of [TraitItem].
15622    pub fn is_variant(kind: SyntaxKind) -> bool {
15623        matches!(
15624            kind,
15625            SyntaxKind::TraitItemFunction
15626                | SyntaxKind::TraitItemType
15627                | SyntaxKind::TraitItemConstant
15628                | SyntaxKind::TraitItemImpl
15629                | SyntaxKind::TraitItemMissing
15630        )
15631    }
15632}
15633#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15634pub struct TraitItemMissing<'db> {
15635    node: SyntaxNode<'db>,
15636}
15637impl<'db> TraitItemMissing<'db> {
15638    pub fn new_green(db: &'db dyn Database) -> TraitItemMissingGreen<'db> {
15639        let children = [];
15640        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15641        TraitItemMissingGreen(
15642            GreenNode {
15643                kind: SyntaxKind::TraitItemMissing,
15644                details: GreenNodeDetails::Node { children: children.into(), width },
15645            }
15646            .intern(db),
15647        )
15648    }
15649}
15650impl<'db> TraitItemMissing<'db> {}
15651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15652pub struct TraitItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
15653impl<'db> TraitItemMissingPtr<'db> {}
15654impl<'db> TypedStablePtr<'db> for TraitItemMissingPtr<'db> {
15655    type SyntaxNode = TraitItemMissing<'db>;
15656    fn untyped(self) -> SyntaxStablePtrId<'db> {
15657        self.0
15658    }
15659    fn lookup(&self, db: &'db dyn Database) -> TraitItemMissing<'db> {
15660        TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15661    }
15662}
15663impl<'db> From<TraitItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
15664    fn from(ptr: TraitItemMissingPtr<'db>) -> Self {
15665        ptr.untyped()
15666    }
15667}
15668#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15669pub struct TraitItemMissingGreen<'db>(pub GreenId<'db>);
15670impl<'db> TypedSyntaxNode<'db> for TraitItemMissing<'db> {
15671    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15672    type StablePtr = TraitItemMissingPtr<'db>;
15673    type Green = TraitItemMissingGreen<'db>;
15674    fn missing(db: &'db dyn Database) -> Self::Green {
15675        TraitItemMissingGreen(
15676            GreenNode {
15677                kind: SyntaxKind::TraitItemMissing,
15678                details: GreenNodeDetails::Node {
15679                    children: [].into(),
15680                    width: TextWidth::default(),
15681                },
15682            }
15683            .intern(db),
15684        )
15685    }
15686    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15687        let kind = node.kind(db);
15688        assert_eq!(
15689            kind,
15690            SyntaxKind::TraitItemMissing,
15691            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15692            kind,
15693            SyntaxKind::TraitItemMissing
15694        );
15695        Self { node }
15696    }
15697    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15698        let kind = node.kind(db);
15699        if kind == SyntaxKind::TraitItemMissing {
15700            Some(Self::from_syntax_node(db, node))
15701        } else {
15702            None
15703        }
15704    }
15705    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15706        self.node
15707    }
15708    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15709        TraitItemMissingPtr(self.node.stable_ptr(db))
15710    }
15711}
15712#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15713pub struct TraitItemFunction<'db> {
15714    node: SyntaxNode<'db>,
15715}
15716impl<'db> TraitItemFunction<'db> {
15717    pub const INDEX_ATTRIBUTES: usize = 0;
15718    pub const INDEX_DECLARATION: usize = 1;
15719    pub const INDEX_BODY: usize = 2;
15720    pub fn new_green(
15721        db: &'db dyn Database,
15722        attributes: AttributeListGreen<'db>,
15723        declaration: FunctionDeclarationGreen<'db>,
15724        body: MaybeTraitFunctionBodyGreen<'db>,
15725    ) -> TraitItemFunctionGreen<'db> {
15726        let children = [attributes.0, declaration.0, body.0];
15727        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15728        TraitItemFunctionGreen(
15729            GreenNode {
15730                kind: SyntaxKind::TraitItemFunction,
15731                details: GreenNodeDetails::Node { children: children.into(), width },
15732            }
15733            .intern(db),
15734        )
15735    }
15736}
15737impl<'db> TraitItemFunction<'db> {
15738    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15739        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15740    }
15741    pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
15742        FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15743    }
15744    pub fn body(&self, db: &'db dyn Database) -> MaybeTraitFunctionBody<'db> {
15745        MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15746    }
15747}
15748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15749pub struct TraitItemFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15750impl<'db> TraitItemFunctionPtr<'db> {
15751    pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15752        FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
15753    }
15754}
15755impl<'db> TypedStablePtr<'db> for TraitItemFunctionPtr<'db> {
15756    type SyntaxNode = TraitItemFunction<'db>;
15757    fn untyped(self) -> SyntaxStablePtrId<'db> {
15758        self.0
15759    }
15760    fn lookup(&self, db: &'db dyn Database) -> TraitItemFunction<'db> {
15761        TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15762    }
15763}
15764impl<'db> From<TraitItemFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15765    fn from(ptr: TraitItemFunctionPtr<'db>) -> Self {
15766        ptr.untyped()
15767    }
15768}
15769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15770pub struct TraitItemFunctionGreen<'db>(pub GreenId<'db>);
15771impl<'db> TypedSyntaxNode<'db> for TraitItemFunction<'db> {
15772    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15773    type StablePtr = TraitItemFunctionPtr<'db>;
15774    type Green = TraitItemFunctionGreen<'db>;
15775    fn missing(db: &'db dyn Database) -> Self::Green {
15776        TraitItemFunctionGreen(
15777            GreenNode {
15778                kind: SyntaxKind::TraitItemFunction,
15779                details: GreenNodeDetails::Node {
15780                    children: [
15781                        AttributeList::missing(db).0,
15782                        FunctionDeclaration::missing(db).0,
15783                        MaybeTraitFunctionBody::missing(db).0,
15784                    ]
15785                    .into(),
15786                    width: TextWidth::default(),
15787                },
15788            }
15789            .intern(db),
15790        )
15791    }
15792    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15793        let kind = node.kind(db);
15794        assert_eq!(
15795            kind,
15796            SyntaxKind::TraitItemFunction,
15797            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15798            kind,
15799            SyntaxKind::TraitItemFunction
15800        );
15801        Self { node }
15802    }
15803    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15804        let kind = node.kind(db);
15805        if kind == SyntaxKind::TraitItemFunction {
15806            Some(Self::from_syntax_node(db, node))
15807        } else {
15808            None
15809        }
15810    }
15811    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15812        self.node
15813    }
15814    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15815        TraitItemFunctionPtr(self.node.stable_ptr(db))
15816    }
15817}
15818#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15819pub struct TraitItemType<'db> {
15820    node: SyntaxNode<'db>,
15821}
15822impl<'db> TraitItemType<'db> {
15823    pub const INDEX_ATTRIBUTES: usize = 0;
15824    pub const INDEX_TYPE_KW: usize = 1;
15825    pub const INDEX_NAME: usize = 2;
15826    pub const INDEX_GENERIC_PARAMS: usize = 3;
15827    pub const INDEX_SEMICOLON: usize = 4;
15828    pub fn new_green(
15829        db: &'db dyn Database,
15830        attributes: AttributeListGreen<'db>,
15831        type_kw: TerminalTypeGreen<'db>,
15832        name: TerminalIdentifierGreen<'db>,
15833        generic_params: OptionWrappedGenericParamListGreen<'db>,
15834        semicolon: TerminalSemicolonGreen<'db>,
15835    ) -> TraitItemTypeGreen<'db> {
15836        let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
15837        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15838        TraitItemTypeGreen(
15839            GreenNode {
15840                kind: SyntaxKind::TraitItemType,
15841                details: GreenNodeDetails::Node { children: children.into(), width },
15842            }
15843            .intern(db),
15844        )
15845    }
15846}
15847impl<'db> TraitItemType<'db> {
15848    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15849        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15850    }
15851    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15852        TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
15853    }
15854    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15855        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15856    }
15857    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15858        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
15859    }
15860    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15861        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15862    }
15863}
15864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15865pub struct TraitItemTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15866impl<'db> TraitItemTypePtr<'db> {
15867    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15868        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15869    }
15870}
15871impl<'db> TypedStablePtr<'db> for TraitItemTypePtr<'db> {
15872    type SyntaxNode = TraitItemType<'db>;
15873    fn untyped(self) -> SyntaxStablePtrId<'db> {
15874        self.0
15875    }
15876    fn lookup(&self, db: &'db dyn Database) -> TraitItemType<'db> {
15877        TraitItemType::from_syntax_node(db, self.0.lookup(db))
15878    }
15879}
15880impl<'db> From<TraitItemTypePtr<'db>> for SyntaxStablePtrId<'db> {
15881    fn from(ptr: TraitItemTypePtr<'db>) -> Self {
15882        ptr.untyped()
15883    }
15884}
15885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15886pub struct TraitItemTypeGreen<'db>(pub GreenId<'db>);
15887impl<'db> TypedSyntaxNode<'db> for TraitItemType<'db> {
15888    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
15889    type StablePtr = TraitItemTypePtr<'db>;
15890    type Green = TraitItemTypeGreen<'db>;
15891    fn missing(db: &'db dyn Database) -> Self::Green {
15892        TraitItemTypeGreen(
15893            GreenNode {
15894                kind: SyntaxKind::TraitItemType,
15895                details: GreenNodeDetails::Node {
15896                    children: [
15897                        AttributeList::missing(db).0,
15898                        TerminalType::missing(db).0,
15899                        TerminalIdentifier::missing(db).0,
15900                        OptionWrappedGenericParamList::missing(db).0,
15901                        TerminalSemicolon::missing(db).0,
15902                    ]
15903                    .into(),
15904                    width: TextWidth::default(),
15905                },
15906            }
15907            .intern(db),
15908        )
15909    }
15910    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15911        let kind = node.kind(db);
15912        assert_eq!(
15913            kind,
15914            SyntaxKind::TraitItemType,
15915            "Unexpected SyntaxKind {:?}. Expected {:?}.",
15916            kind,
15917            SyntaxKind::TraitItemType
15918        );
15919        Self { node }
15920    }
15921    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15922        let kind = node.kind(db);
15923        if kind == SyntaxKind::TraitItemType {
15924            Some(Self::from_syntax_node(db, node))
15925        } else {
15926            None
15927        }
15928    }
15929    fn as_syntax_node(&self) -> SyntaxNode<'db> {
15930        self.node
15931    }
15932    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15933        TraitItemTypePtr(self.node.stable_ptr(db))
15934    }
15935}
15936#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15937pub struct TraitItemConstant<'db> {
15938    node: SyntaxNode<'db>,
15939}
15940impl<'db> TraitItemConstant<'db> {
15941    pub const INDEX_ATTRIBUTES: usize = 0;
15942    pub const INDEX_CONST_KW: usize = 1;
15943    pub const INDEX_NAME: usize = 2;
15944    pub const INDEX_TYPE_CLAUSE: usize = 3;
15945    pub const INDEX_SEMICOLON: usize = 4;
15946    pub fn new_green(
15947        db: &'db dyn Database,
15948        attributes: AttributeListGreen<'db>,
15949        const_kw: TerminalConstGreen<'db>,
15950        name: TerminalIdentifierGreen<'db>,
15951        type_clause: TypeClauseGreen<'db>,
15952        semicolon: TerminalSemicolonGreen<'db>,
15953    ) -> TraitItemConstantGreen<'db> {
15954        let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
15955        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15956        TraitItemConstantGreen(
15957            GreenNode {
15958                kind: SyntaxKind::TraitItemConstant,
15959                details: GreenNodeDetails::Node { children: children.into(), width },
15960            }
15961            .intern(db),
15962        )
15963    }
15964}
15965impl<'db> TraitItemConstant<'db> {
15966    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15967        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15968    }
15969    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
15970        TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
15971    }
15972    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15973        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15974    }
15975    pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
15976        TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
15977    }
15978    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15979        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15980    }
15981}
15982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
15983pub struct TraitItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
15984impl<'db> TraitItemConstantPtr<'db> {
15985    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15986        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15987    }
15988}
15989impl<'db> TypedStablePtr<'db> for TraitItemConstantPtr<'db> {
15990    type SyntaxNode = TraitItemConstant<'db>;
15991    fn untyped(self) -> SyntaxStablePtrId<'db> {
15992        self.0
15993    }
15994    fn lookup(&self, db: &'db dyn Database) -> TraitItemConstant<'db> {
15995        TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
15996    }
15997}
15998impl<'db> From<TraitItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
15999    fn from(ptr: TraitItemConstantPtr<'db>) -> Self {
16000        ptr.untyped()
16001    }
16002}
16003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16004pub struct TraitItemConstantGreen<'db>(pub GreenId<'db>);
16005impl<'db> TypedSyntaxNode<'db> for TraitItemConstant<'db> {
16006    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16007    type StablePtr = TraitItemConstantPtr<'db>;
16008    type Green = TraitItemConstantGreen<'db>;
16009    fn missing(db: &'db dyn Database) -> Self::Green {
16010        TraitItemConstantGreen(
16011            GreenNode {
16012                kind: SyntaxKind::TraitItemConstant,
16013                details: GreenNodeDetails::Node {
16014                    children: [
16015                        AttributeList::missing(db).0,
16016                        TerminalConst::missing(db).0,
16017                        TerminalIdentifier::missing(db).0,
16018                        TypeClause::missing(db).0,
16019                        TerminalSemicolon::missing(db).0,
16020                    ]
16021                    .into(),
16022                    width: TextWidth::default(),
16023                },
16024            }
16025            .intern(db),
16026        )
16027    }
16028    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16029        let kind = node.kind(db);
16030        assert_eq!(
16031            kind,
16032            SyntaxKind::TraitItemConstant,
16033            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16034            kind,
16035            SyntaxKind::TraitItemConstant
16036        );
16037        Self { node }
16038    }
16039    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16040        let kind = node.kind(db);
16041        if kind == SyntaxKind::TraitItemConstant {
16042            Some(Self::from_syntax_node(db, node))
16043        } else {
16044            None
16045        }
16046    }
16047    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16048        self.node
16049    }
16050    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16051        TraitItemConstantPtr(self.node.stable_ptr(db))
16052    }
16053}
16054#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16055pub struct TraitItemImpl<'db> {
16056    node: SyntaxNode<'db>,
16057}
16058impl<'db> TraitItemImpl<'db> {
16059    pub const INDEX_ATTRIBUTES: usize = 0;
16060    pub const INDEX_IMPL_KW: usize = 1;
16061    pub const INDEX_NAME: usize = 2;
16062    pub const INDEX_COLON: usize = 3;
16063    pub const INDEX_TRAIT_PATH: usize = 4;
16064    pub const INDEX_SEMICOLON: usize = 5;
16065    pub fn new_green(
16066        db: &'db dyn Database,
16067        attributes: AttributeListGreen<'db>,
16068        impl_kw: TerminalImplGreen<'db>,
16069        name: TerminalIdentifierGreen<'db>,
16070        colon: TerminalColonGreen<'db>,
16071        trait_path: ExprPathGreen<'db>,
16072        semicolon: TerminalSemicolonGreen<'db>,
16073    ) -> TraitItemImplGreen<'db> {
16074        let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16075        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16076        TraitItemImplGreen(
16077            GreenNode {
16078                kind: SyntaxKind::TraitItemImpl,
16079                details: GreenNodeDetails::Node { children: children.into(), width },
16080            }
16081            .intern(db),
16082        )
16083    }
16084}
16085impl<'db> TraitItemImpl<'db> {
16086    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16087        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16088    }
16089    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16090        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16091    }
16092    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16093        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16094    }
16095    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
16096        TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16097    }
16098    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16099        ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16100    }
16101    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16102        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16103    }
16104}
16105#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16106pub struct TraitItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16107impl<'db> TraitItemImplPtr<'db> {
16108    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16109        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16110    }
16111}
16112impl<'db> TypedStablePtr<'db> for TraitItemImplPtr<'db> {
16113    type SyntaxNode = TraitItemImpl<'db>;
16114    fn untyped(self) -> SyntaxStablePtrId<'db> {
16115        self.0
16116    }
16117    fn lookup(&self, db: &'db dyn Database) -> TraitItemImpl<'db> {
16118        TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16119    }
16120}
16121impl<'db> From<TraitItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16122    fn from(ptr: TraitItemImplPtr<'db>) -> Self {
16123        ptr.untyped()
16124    }
16125}
16126#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16127pub struct TraitItemImplGreen<'db>(pub GreenId<'db>);
16128impl<'db> TypedSyntaxNode<'db> for TraitItemImpl<'db> {
16129    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16130    type StablePtr = TraitItemImplPtr<'db>;
16131    type Green = TraitItemImplGreen<'db>;
16132    fn missing(db: &'db dyn Database) -> Self::Green {
16133        TraitItemImplGreen(
16134            GreenNode {
16135                kind: SyntaxKind::TraitItemImpl,
16136                details: GreenNodeDetails::Node {
16137                    children: [
16138                        AttributeList::missing(db).0,
16139                        TerminalImpl::missing(db).0,
16140                        TerminalIdentifier::missing(db).0,
16141                        TerminalColon::missing(db).0,
16142                        ExprPath::missing(db).0,
16143                        TerminalSemicolon::missing(db).0,
16144                    ]
16145                    .into(),
16146                    width: TextWidth::default(),
16147                },
16148            }
16149            .intern(db),
16150        )
16151    }
16152    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16153        let kind = node.kind(db);
16154        assert_eq!(
16155            kind,
16156            SyntaxKind::TraitItemImpl,
16157            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16158            kind,
16159            SyntaxKind::TraitItemImpl
16160        );
16161        Self { node }
16162    }
16163    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16164        let kind = node.kind(db);
16165        if kind == SyntaxKind::TraitItemImpl {
16166            Some(Self::from_syntax_node(db, node))
16167        } else {
16168            None
16169        }
16170    }
16171    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16172        self.node
16173    }
16174    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16175        TraitItemImplPtr(self.node.stable_ptr(db))
16176    }
16177}
16178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16179pub enum MaybeTraitFunctionBody<'db> {
16180    Some(ExprBlock<'db>),
16181    None(TerminalSemicolon<'db>),
16182}
16183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16184pub struct MaybeTraitFunctionBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16185impl<'db> TypedStablePtr<'db> for MaybeTraitFunctionBodyPtr<'db> {
16186    type SyntaxNode = MaybeTraitFunctionBody<'db>;
16187    fn untyped(self) -> SyntaxStablePtrId<'db> {
16188        self.0
16189    }
16190    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16191        MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16192    }
16193}
16194impl<'db> From<MaybeTraitFunctionBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16195    fn from(ptr: MaybeTraitFunctionBodyPtr<'db>) -> Self {
16196        ptr.untyped()
16197    }
16198}
16199impl<'db> From<ExprBlockPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16200    fn from(value: ExprBlockPtr<'db>) -> Self {
16201        Self(value.0)
16202    }
16203}
16204impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16205    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16206        Self(value.0)
16207    }
16208}
16209impl<'db> From<ExprBlockGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16210    fn from(value: ExprBlockGreen<'db>) -> Self {
16211        Self(value.0)
16212    }
16213}
16214impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16215    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16216        Self(value.0)
16217    }
16218}
16219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16220pub struct MaybeTraitFunctionBodyGreen<'db>(pub GreenId<'db>);
16221impl<'db> TypedSyntaxNode<'db> for MaybeTraitFunctionBody<'db> {
16222    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16223    type StablePtr = MaybeTraitFunctionBodyPtr<'db>;
16224    type Green = MaybeTraitFunctionBodyGreen<'db>;
16225    fn missing(db: &'db dyn Database) -> Self::Green {
16226        panic!("No missing variant.");
16227    }
16228    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16229        let kind = node.kind(db);
16230        match kind {
16231            SyntaxKind::ExprBlock => {
16232                MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16233            }
16234            SyntaxKind::TerminalSemicolon => {
16235                MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16236            }
16237            _ => panic!(
16238                "Unexpected syntax kind {:?} when constructing {}.",
16239                kind, "MaybeTraitFunctionBody"
16240            ),
16241        }
16242    }
16243    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16244        let kind = node.kind(db);
16245        match kind {
16246            SyntaxKind::ExprBlock => {
16247                Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16248            }
16249            SyntaxKind::TerminalSemicolon => {
16250                Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16251            }
16252            _ => None,
16253        }
16254    }
16255    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16256        match self {
16257            MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16258            MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16259        }
16260    }
16261    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16262        MaybeTraitFunctionBodyPtr(self.as_syntax_node().stable_ptr(db))
16263    }
16264}
16265impl<'db> MaybeTraitFunctionBody<'db> {
16266    /// Checks if a kind of a variant of [MaybeTraitFunctionBody].
16267    pub fn is_variant(kind: SyntaxKind) -> bool {
16268        matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16269    }
16270}
16271#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16272pub struct ItemImpl<'db> {
16273    node: SyntaxNode<'db>,
16274}
16275impl<'db> ItemImpl<'db> {
16276    pub const INDEX_ATTRIBUTES: usize = 0;
16277    pub const INDEX_VISIBILITY: usize = 1;
16278    pub const INDEX_IMPL_KW: usize = 2;
16279    pub const INDEX_NAME: usize = 3;
16280    pub const INDEX_GENERIC_PARAMS: usize = 4;
16281    pub const INDEX_OF_KW: usize = 5;
16282    pub const INDEX_TRAIT_PATH: usize = 6;
16283    pub const INDEX_BODY: usize = 7;
16284    pub fn new_green(
16285        db: &'db dyn Database,
16286        attributes: AttributeListGreen<'db>,
16287        visibility: VisibilityGreen<'db>,
16288        impl_kw: TerminalImplGreen<'db>,
16289        name: TerminalIdentifierGreen<'db>,
16290        generic_params: OptionWrappedGenericParamListGreen<'db>,
16291        of_kw: TerminalOfGreen<'db>,
16292        trait_path: ExprPathGreen<'db>,
16293        body: MaybeImplBodyGreen<'db>,
16294    ) -> ItemImplGreen<'db> {
16295        let children = [
16296            attributes.0,
16297            visibility.0,
16298            impl_kw.0,
16299            name.0,
16300            generic_params.0,
16301            of_kw.0,
16302            trait_path.0,
16303            body.0,
16304        ];
16305        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16306        ItemImplGreen(
16307            GreenNode {
16308                kind: SyntaxKind::ItemImpl,
16309                details: GreenNodeDetails::Node { children: children.into(), width },
16310            }
16311            .intern(db),
16312        )
16313    }
16314}
16315impl<'db> ItemImpl<'db> {
16316    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16317        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16318    }
16319    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
16320        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16321    }
16322    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16323        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16324    }
16325    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16326        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16327    }
16328    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
16329        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16330    }
16331    pub fn of_kw(&self, db: &'db dyn Database) -> TerminalOf<'db> {
16332        TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16333    }
16334    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16335        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16336    }
16337    pub fn body(&self, db: &'db dyn Database) -> MaybeImplBody<'db> {
16338        MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16339    }
16340}
16341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16342pub struct ItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16343impl<'db> ItemImplPtr<'db> {
16344    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16345        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16346    }
16347}
16348impl<'db> TypedStablePtr<'db> for ItemImplPtr<'db> {
16349    type SyntaxNode = ItemImpl<'db>;
16350    fn untyped(self) -> SyntaxStablePtrId<'db> {
16351        self.0
16352    }
16353    fn lookup(&self, db: &'db dyn Database) -> ItemImpl<'db> {
16354        ItemImpl::from_syntax_node(db, self.0.lookup(db))
16355    }
16356}
16357impl<'db> From<ItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16358    fn from(ptr: ItemImplPtr<'db>) -> Self {
16359        ptr.untyped()
16360    }
16361}
16362#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16363pub struct ItemImplGreen<'db>(pub GreenId<'db>);
16364impl<'db> TypedSyntaxNode<'db> for ItemImpl<'db> {
16365    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16366    type StablePtr = ItemImplPtr<'db>;
16367    type Green = ItemImplGreen<'db>;
16368    fn missing(db: &'db dyn Database) -> Self::Green {
16369        ItemImplGreen(
16370            GreenNode {
16371                kind: SyntaxKind::ItemImpl,
16372                details: GreenNodeDetails::Node {
16373                    children: [
16374                        AttributeList::missing(db).0,
16375                        Visibility::missing(db).0,
16376                        TerminalImpl::missing(db).0,
16377                        TerminalIdentifier::missing(db).0,
16378                        OptionWrappedGenericParamList::missing(db).0,
16379                        TerminalOf::missing(db).0,
16380                        ExprPath::missing(db).0,
16381                        MaybeImplBody::missing(db).0,
16382                    ]
16383                    .into(),
16384                    width: TextWidth::default(),
16385                },
16386            }
16387            .intern(db),
16388        )
16389    }
16390    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16391        let kind = node.kind(db);
16392        assert_eq!(
16393            kind,
16394            SyntaxKind::ItemImpl,
16395            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16396            kind,
16397            SyntaxKind::ItemImpl
16398        );
16399        Self { node }
16400    }
16401    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16402        let kind = node.kind(db);
16403        if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16404    }
16405    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16406        self.node
16407    }
16408    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16409        ItemImplPtr(self.node.stable_ptr(db))
16410    }
16411}
16412#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16413pub struct ItemHeaderDoc<'db> {
16414    node: SyntaxNode<'db>,
16415}
16416impl<'db> ItemHeaderDoc<'db> {
16417    pub const INDEX_EMPTY: usize = 0;
16418    pub fn new_green(
16419        db: &'db dyn Database,
16420        empty: TerminalEmptyGreen<'db>,
16421    ) -> ItemHeaderDocGreen<'db> {
16422        let children = [empty.0];
16423        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16424        ItemHeaderDocGreen(
16425            GreenNode {
16426                kind: SyntaxKind::ItemHeaderDoc,
16427                details: GreenNodeDetails::Node { children: children.into(), width },
16428            }
16429            .intern(db),
16430        )
16431    }
16432}
16433impl<'db> ItemHeaderDoc<'db> {
16434    pub fn empty(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
16435        TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16436    }
16437}
16438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16439pub struct ItemHeaderDocPtr<'db>(pub SyntaxStablePtrId<'db>);
16440impl<'db> ItemHeaderDocPtr<'db> {}
16441impl<'db> TypedStablePtr<'db> for ItemHeaderDocPtr<'db> {
16442    type SyntaxNode = ItemHeaderDoc<'db>;
16443    fn untyped(self) -> SyntaxStablePtrId<'db> {
16444        self.0
16445    }
16446    fn lookup(&self, db: &'db dyn Database) -> ItemHeaderDoc<'db> {
16447        ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16448    }
16449}
16450impl<'db> From<ItemHeaderDocPtr<'db>> for SyntaxStablePtrId<'db> {
16451    fn from(ptr: ItemHeaderDocPtr<'db>) -> Self {
16452        ptr.untyped()
16453    }
16454}
16455#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16456pub struct ItemHeaderDocGreen<'db>(pub GreenId<'db>);
16457impl<'db> TypedSyntaxNode<'db> for ItemHeaderDoc<'db> {
16458    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16459    type StablePtr = ItemHeaderDocPtr<'db>;
16460    type Green = ItemHeaderDocGreen<'db>;
16461    fn missing(db: &'db dyn Database) -> Self::Green {
16462        ItemHeaderDocGreen(
16463            GreenNode {
16464                kind: SyntaxKind::ItemHeaderDoc,
16465                details: GreenNodeDetails::Node {
16466                    children: [TerminalEmpty::missing(db).0].into(),
16467                    width: TextWidth::default(),
16468                },
16469            }
16470            .intern(db),
16471        )
16472    }
16473    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16474        let kind = node.kind(db);
16475        assert_eq!(
16476            kind,
16477            SyntaxKind::ItemHeaderDoc,
16478            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16479            kind,
16480            SyntaxKind::ItemHeaderDoc
16481        );
16482        Self { node }
16483    }
16484    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16485        let kind = node.kind(db);
16486        if kind == SyntaxKind::ItemHeaderDoc {
16487            Some(Self::from_syntax_node(db, node))
16488        } else {
16489            None
16490        }
16491    }
16492    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16493        self.node
16494    }
16495    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16496        ItemHeaderDocPtr(self.node.stable_ptr(db))
16497    }
16498}
16499#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16500pub enum MaybeImplBody<'db> {
16501    Some(ImplBody<'db>),
16502    None(TerminalSemicolon<'db>),
16503}
16504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16505pub struct MaybeImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16506impl<'db> TypedStablePtr<'db> for MaybeImplBodyPtr<'db> {
16507    type SyntaxNode = MaybeImplBody<'db>;
16508    fn untyped(self) -> SyntaxStablePtrId<'db> {
16509        self.0
16510    }
16511    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16512        MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16513    }
16514}
16515impl<'db> From<MaybeImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16516    fn from(ptr: MaybeImplBodyPtr<'db>) -> Self {
16517        ptr.untyped()
16518    }
16519}
16520impl<'db> From<ImplBodyPtr<'db>> for MaybeImplBodyPtr<'db> {
16521    fn from(value: ImplBodyPtr<'db>) -> Self {
16522        Self(value.0)
16523    }
16524}
16525impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeImplBodyPtr<'db> {
16526    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16527        Self(value.0)
16528    }
16529}
16530impl<'db> From<ImplBodyGreen<'db>> for MaybeImplBodyGreen<'db> {
16531    fn from(value: ImplBodyGreen<'db>) -> Self {
16532        Self(value.0)
16533    }
16534}
16535impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeImplBodyGreen<'db> {
16536    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16537        Self(value.0)
16538    }
16539}
16540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16541pub struct MaybeImplBodyGreen<'db>(pub GreenId<'db>);
16542impl<'db> TypedSyntaxNode<'db> for MaybeImplBody<'db> {
16543    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16544    type StablePtr = MaybeImplBodyPtr<'db>;
16545    type Green = MaybeImplBodyGreen<'db>;
16546    fn missing(db: &'db dyn Database) -> Self::Green {
16547        panic!("No missing variant.");
16548    }
16549    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16550        let kind = node.kind(db);
16551        match kind {
16552            SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16553            SyntaxKind::TerminalSemicolon => {
16554                MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16555            }
16556            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16557        }
16558    }
16559    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16560        let kind = node.kind(db);
16561        match kind {
16562            SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16563            SyntaxKind::TerminalSemicolon => {
16564                Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16565            }
16566            _ => None,
16567        }
16568    }
16569    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16570        match self {
16571            MaybeImplBody::Some(x) => x.as_syntax_node(),
16572            MaybeImplBody::None(x) => x.as_syntax_node(),
16573        }
16574    }
16575    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16576        MaybeImplBodyPtr(self.as_syntax_node().stable_ptr(db))
16577    }
16578}
16579impl<'db> MaybeImplBody<'db> {
16580    /// Checks if a kind of a variant of [MaybeImplBody].
16581    pub fn is_variant(kind: SyntaxKind) -> bool {
16582        matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16583    }
16584}
16585#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16586pub struct ImplBody<'db> {
16587    node: SyntaxNode<'db>,
16588}
16589impl<'db> ImplBody<'db> {
16590    pub const INDEX_LBRACE: usize = 0;
16591    pub const INDEX_ITEMS: usize = 1;
16592    pub const INDEX_RBRACE: usize = 2;
16593    pub fn new_green(
16594        db: &'db dyn Database,
16595        lbrace: TerminalLBraceGreen<'db>,
16596        items: ImplItemListGreen<'db>,
16597        rbrace: TerminalRBraceGreen<'db>,
16598    ) -> ImplBodyGreen<'db> {
16599        let children = [lbrace.0, items.0, rbrace.0];
16600        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16601        ImplBodyGreen(
16602            GreenNode {
16603                kind: SyntaxKind::ImplBody,
16604                details: GreenNodeDetails::Node { children: children.into(), width },
16605            }
16606            .intern(db),
16607        )
16608    }
16609}
16610impl<'db> ImplBody<'db> {
16611    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
16612        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16613    }
16614    pub fn items(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16615        ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16616    }
16617    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
16618        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16619    }
16620}
16621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16622pub struct ImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16623impl<'db> ImplBodyPtr<'db> {}
16624impl<'db> TypedStablePtr<'db> for ImplBodyPtr<'db> {
16625    type SyntaxNode = ImplBody<'db>;
16626    fn untyped(self) -> SyntaxStablePtrId<'db> {
16627        self.0
16628    }
16629    fn lookup(&self, db: &'db dyn Database) -> ImplBody<'db> {
16630        ImplBody::from_syntax_node(db, self.0.lookup(db))
16631    }
16632}
16633impl<'db> From<ImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16634    fn from(ptr: ImplBodyPtr<'db>) -> Self {
16635        ptr.untyped()
16636    }
16637}
16638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16639pub struct ImplBodyGreen<'db>(pub GreenId<'db>);
16640impl<'db> TypedSyntaxNode<'db> for ImplBody<'db> {
16641    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16642    type StablePtr = ImplBodyPtr<'db>;
16643    type Green = ImplBodyGreen<'db>;
16644    fn missing(db: &'db dyn Database) -> Self::Green {
16645        ImplBodyGreen(
16646            GreenNode {
16647                kind: SyntaxKind::ImplBody,
16648                details: GreenNodeDetails::Node {
16649                    children: [
16650                        TerminalLBrace::missing(db).0,
16651                        ImplItemList::missing(db).0,
16652                        TerminalRBrace::missing(db).0,
16653                    ]
16654                    .into(),
16655                    width: TextWidth::default(),
16656                },
16657            }
16658            .intern(db),
16659        )
16660    }
16661    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16662        let kind = node.kind(db);
16663        assert_eq!(
16664            kind,
16665            SyntaxKind::ImplBody,
16666            "Unexpected SyntaxKind {:?}. Expected {:?}.",
16667            kind,
16668            SyntaxKind::ImplBody
16669        );
16670        Self { node }
16671    }
16672    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16673        let kind = node.kind(db);
16674        if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16675    }
16676    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16677        self.node
16678    }
16679    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16680        ImplBodyPtr(self.node.stable_ptr(db))
16681    }
16682}
16683#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16684pub struct ImplItemList<'db>(ElementList<'db, ImplItem<'db>, 1>);
16685impl<'db> Deref for ImplItemList<'db> {
16686    type Target = ElementList<'db, ImplItem<'db>, 1>;
16687    fn deref(&self) -> &Self::Target {
16688        &self.0
16689    }
16690}
16691impl<'db> ImplItemList<'db> {
16692    pub fn new_green(
16693        db: &'db dyn Database,
16694        children: &[ImplItemGreen<'db>],
16695    ) -> ImplItemListGreen<'db> {
16696        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
16697        ImplItemListGreen(
16698            GreenNode {
16699                kind: SyntaxKind::ImplItemList,
16700                details: GreenNodeDetails::Node {
16701                    children: children.iter().map(|x| x.0).collect(),
16702                    width,
16703                },
16704            }
16705            .intern(db),
16706        )
16707    }
16708}
16709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16710pub struct ImplItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
16711impl<'db> TypedStablePtr<'db> for ImplItemListPtr<'db> {
16712    type SyntaxNode = ImplItemList<'db>;
16713    fn untyped(self) -> SyntaxStablePtrId<'db> {
16714        self.0
16715    }
16716    fn lookup(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16717        ImplItemList::from_syntax_node(db, self.0.lookup(db))
16718    }
16719}
16720impl<'db> From<ImplItemListPtr<'db>> for SyntaxStablePtrId<'db> {
16721    fn from(ptr: ImplItemListPtr<'db>) -> Self {
16722        ptr.untyped()
16723    }
16724}
16725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16726pub struct ImplItemListGreen<'db>(pub GreenId<'db>);
16727impl<'db> TypedSyntaxNode<'db> for ImplItemList<'db> {
16728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16729    type StablePtr = ImplItemListPtr<'db>;
16730    type Green = ImplItemListGreen<'db>;
16731    fn missing(db: &'db dyn Database) -> Self::Green {
16732        ImplItemListGreen(
16733            GreenNode {
16734                kind: SyntaxKind::ImplItemList,
16735                details: GreenNodeDetails::Node {
16736                    children: [].into(),
16737                    width: TextWidth::default(),
16738                },
16739            }
16740            .intern(db),
16741        )
16742    }
16743    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16744        Self(ElementList::new(node))
16745    }
16746    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16747        if node.kind(db) == SyntaxKind::ImplItemList {
16748            Some(Self(ElementList::new(node)))
16749        } else {
16750            None
16751        }
16752    }
16753    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16754        self.node
16755    }
16756    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16757        ImplItemListPtr(self.node.stable_ptr(db))
16758    }
16759}
16760#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16761pub enum ImplItem<'db> {
16762    Function(FunctionWithBody<'db>),
16763    Type(ItemTypeAlias<'db>),
16764    Constant(ItemConstant<'db>),
16765    Impl(ItemImplAlias<'db>),
16766    Module(ItemModule<'db>),
16767    Use(ItemUse<'db>),
16768    ExternFunction(ItemExternFunction<'db>),
16769    ExternType(ItemExternType<'db>),
16770    Trait(ItemTrait<'db>),
16771    Struct(ItemStruct<'db>),
16772    Enum(ItemEnum<'db>),
16773    Missing(ImplItemMissing<'db>),
16774}
16775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
16776pub struct ImplItemPtr<'db>(pub SyntaxStablePtrId<'db>);
16777impl<'db> TypedStablePtr<'db> for ImplItemPtr<'db> {
16778    type SyntaxNode = ImplItem<'db>;
16779    fn untyped(self) -> SyntaxStablePtrId<'db> {
16780        self.0
16781    }
16782    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16783        ImplItem::from_syntax_node(db, self.0.lookup(db))
16784    }
16785}
16786impl<'db> From<ImplItemPtr<'db>> for SyntaxStablePtrId<'db> {
16787    fn from(ptr: ImplItemPtr<'db>) -> Self {
16788        ptr.untyped()
16789    }
16790}
16791impl<'db> From<FunctionWithBodyPtr<'db>> for ImplItemPtr<'db> {
16792    fn from(value: FunctionWithBodyPtr<'db>) -> Self {
16793        Self(value.0)
16794    }
16795}
16796impl<'db> From<ItemTypeAliasPtr<'db>> for ImplItemPtr<'db> {
16797    fn from(value: ItemTypeAliasPtr<'db>) -> Self {
16798        Self(value.0)
16799    }
16800}
16801impl<'db> From<ItemConstantPtr<'db>> for ImplItemPtr<'db> {
16802    fn from(value: ItemConstantPtr<'db>) -> Self {
16803        Self(value.0)
16804    }
16805}
16806impl<'db> From<ItemImplAliasPtr<'db>> for ImplItemPtr<'db> {
16807    fn from(value: ItemImplAliasPtr<'db>) -> Self {
16808        Self(value.0)
16809    }
16810}
16811impl<'db> From<ItemModulePtr<'db>> for ImplItemPtr<'db> {
16812    fn from(value: ItemModulePtr<'db>) -> Self {
16813        Self(value.0)
16814    }
16815}
16816impl<'db> From<ItemUsePtr<'db>> for ImplItemPtr<'db> {
16817    fn from(value: ItemUsePtr<'db>) -> Self {
16818        Self(value.0)
16819    }
16820}
16821impl<'db> From<ItemExternFunctionPtr<'db>> for ImplItemPtr<'db> {
16822    fn from(value: ItemExternFunctionPtr<'db>) -> Self {
16823        Self(value.0)
16824    }
16825}
16826impl<'db> From<ItemExternTypePtr<'db>> for ImplItemPtr<'db> {
16827    fn from(value: ItemExternTypePtr<'db>) -> Self {
16828        Self(value.0)
16829    }
16830}
16831impl<'db> From<ItemTraitPtr<'db>> for ImplItemPtr<'db> {
16832    fn from(value: ItemTraitPtr<'db>) -> Self {
16833        Self(value.0)
16834    }
16835}
16836impl<'db> From<ItemStructPtr<'db>> for ImplItemPtr<'db> {
16837    fn from(value: ItemStructPtr<'db>) -> Self {
16838        Self(value.0)
16839    }
16840}
16841impl<'db> From<ItemEnumPtr<'db>> for ImplItemPtr<'db> {
16842    fn from(value: ItemEnumPtr<'db>) -> Self {
16843        Self(value.0)
16844    }
16845}
16846impl<'db> From<ImplItemMissingPtr<'db>> for ImplItemPtr<'db> {
16847    fn from(value: ImplItemMissingPtr<'db>) -> Self {
16848        Self(value.0)
16849    }
16850}
16851impl<'db> From<FunctionWithBodyGreen<'db>> for ImplItemGreen<'db> {
16852    fn from(value: FunctionWithBodyGreen<'db>) -> Self {
16853        Self(value.0)
16854    }
16855}
16856impl<'db> From<ItemTypeAliasGreen<'db>> for ImplItemGreen<'db> {
16857    fn from(value: ItemTypeAliasGreen<'db>) -> Self {
16858        Self(value.0)
16859    }
16860}
16861impl<'db> From<ItemConstantGreen<'db>> for ImplItemGreen<'db> {
16862    fn from(value: ItemConstantGreen<'db>) -> Self {
16863        Self(value.0)
16864    }
16865}
16866impl<'db> From<ItemImplAliasGreen<'db>> for ImplItemGreen<'db> {
16867    fn from(value: ItemImplAliasGreen<'db>) -> Self {
16868        Self(value.0)
16869    }
16870}
16871impl<'db> From<ItemModuleGreen<'db>> for ImplItemGreen<'db> {
16872    fn from(value: ItemModuleGreen<'db>) -> Self {
16873        Self(value.0)
16874    }
16875}
16876impl<'db> From<ItemUseGreen<'db>> for ImplItemGreen<'db> {
16877    fn from(value: ItemUseGreen<'db>) -> Self {
16878        Self(value.0)
16879    }
16880}
16881impl<'db> From<ItemExternFunctionGreen<'db>> for ImplItemGreen<'db> {
16882    fn from(value: ItemExternFunctionGreen<'db>) -> Self {
16883        Self(value.0)
16884    }
16885}
16886impl<'db> From<ItemExternTypeGreen<'db>> for ImplItemGreen<'db> {
16887    fn from(value: ItemExternTypeGreen<'db>) -> Self {
16888        Self(value.0)
16889    }
16890}
16891impl<'db> From<ItemTraitGreen<'db>> for ImplItemGreen<'db> {
16892    fn from(value: ItemTraitGreen<'db>) -> Self {
16893        Self(value.0)
16894    }
16895}
16896impl<'db> From<ItemStructGreen<'db>> for ImplItemGreen<'db> {
16897    fn from(value: ItemStructGreen<'db>) -> Self {
16898        Self(value.0)
16899    }
16900}
16901impl<'db> From<ItemEnumGreen<'db>> for ImplItemGreen<'db> {
16902    fn from(value: ItemEnumGreen<'db>) -> Self {
16903        Self(value.0)
16904    }
16905}
16906impl<'db> From<ImplItemMissingGreen<'db>> for ImplItemGreen<'db> {
16907    fn from(value: ImplItemMissingGreen<'db>) -> Self {
16908        Self(value.0)
16909    }
16910}
16911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16912pub struct ImplItemGreen<'db>(pub GreenId<'db>);
16913impl<'db> TypedSyntaxNode<'db> for ImplItem<'db> {
16914    const OPTIONAL_KIND: Option<SyntaxKind> = None;
16915    type StablePtr = ImplItemPtr<'db>;
16916    type Green = ImplItemGreen<'db>;
16917    fn missing(db: &'db dyn Database) -> Self::Green {
16918        ImplItemGreen(ImplItemMissing::missing(db).0)
16919    }
16920    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16921        let kind = node.kind(db);
16922        match kind {
16923            SyntaxKind::FunctionWithBody => {
16924                ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
16925            }
16926            SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
16927            SyntaxKind::ItemConstant => {
16928                ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
16929            }
16930            SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
16931            SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
16932            SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
16933            SyntaxKind::ItemExternFunction => {
16934                ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
16935            }
16936            SyntaxKind::ItemExternType => {
16937                ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
16938            }
16939            SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
16940            SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
16941            SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
16942            SyntaxKind::ImplItemMissing => {
16943                ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
16944            }
16945            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
16946        }
16947    }
16948    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16949        let kind = node.kind(db);
16950        match kind {
16951            SyntaxKind::FunctionWithBody => {
16952                Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
16953            }
16954            SyntaxKind::ItemTypeAlias => {
16955                Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
16956            }
16957            SyntaxKind::ItemConstant => {
16958                Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
16959            }
16960            SyntaxKind::ItemImplAlias => {
16961                Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
16962            }
16963            SyntaxKind::ItemModule => {
16964                Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
16965            }
16966            SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
16967            SyntaxKind::ItemExternFunction => {
16968                Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
16969            }
16970            SyntaxKind::ItemExternType => {
16971                Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
16972            }
16973            SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
16974            SyntaxKind::ItemStruct => {
16975                Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
16976            }
16977            SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
16978            SyntaxKind::ImplItemMissing => {
16979                Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
16980            }
16981            _ => None,
16982        }
16983    }
16984    fn as_syntax_node(&self) -> SyntaxNode<'db> {
16985        match self {
16986            ImplItem::Function(x) => x.as_syntax_node(),
16987            ImplItem::Type(x) => x.as_syntax_node(),
16988            ImplItem::Constant(x) => x.as_syntax_node(),
16989            ImplItem::Impl(x) => x.as_syntax_node(),
16990            ImplItem::Module(x) => x.as_syntax_node(),
16991            ImplItem::Use(x) => x.as_syntax_node(),
16992            ImplItem::ExternFunction(x) => x.as_syntax_node(),
16993            ImplItem::ExternType(x) => x.as_syntax_node(),
16994            ImplItem::Trait(x) => x.as_syntax_node(),
16995            ImplItem::Struct(x) => x.as_syntax_node(),
16996            ImplItem::Enum(x) => x.as_syntax_node(),
16997            ImplItem::Missing(x) => x.as_syntax_node(),
16998        }
16999    }
17000    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17001        ImplItemPtr(self.as_syntax_node().stable_ptr(db))
17002    }
17003}
17004impl<'db> ImplItem<'db> {
17005    /// Checks if a kind of a variant of [ImplItem].
17006    pub fn is_variant(kind: SyntaxKind) -> bool {
17007        matches!(
17008            kind,
17009            SyntaxKind::FunctionWithBody
17010                | SyntaxKind::ItemTypeAlias
17011                | SyntaxKind::ItemConstant
17012                | SyntaxKind::ItemImplAlias
17013                | SyntaxKind::ItemModule
17014                | SyntaxKind::ItemUse
17015                | SyntaxKind::ItemExternFunction
17016                | SyntaxKind::ItemExternType
17017                | SyntaxKind::ItemTrait
17018                | SyntaxKind::ItemStruct
17019                | SyntaxKind::ItemEnum
17020                | SyntaxKind::ImplItemMissing
17021        )
17022    }
17023}
17024#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17025pub struct ImplItemMissing<'db> {
17026    node: SyntaxNode<'db>,
17027}
17028impl<'db> ImplItemMissing<'db> {
17029    pub fn new_green(db: &'db dyn Database) -> ImplItemMissingGreen<'db> {
17030        let children = [];
17031        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17032        ImplItemMissingGreen(
17033            GreenNode {
17034                kind: SyntaxKind::ImplItemMissing,
17035                details: GreenNodeDetails::Node { children: children.into(), width },
17036            }
17037            .intern(db),
17038        )
17039    }
17040}
17041impl<'db> ImplItemMissing<'db> {}
17042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17043pub struct ImplItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
17044impl<'db> ImplItemMissingPtr<'db> {}
17045impl<'db> TypedStablePtr<'db> for ImplItemMissingPtr<'db> {
17046    type SyntaxNode = ImplItemMissing<'db>;
17047    fn untyped(self) -> SyntaxStablePtrId<'db> {
17048        self.0
17049    }
17050    fn lookup(&self, db: &'db dyn Database) -> ImplItemMissing<'db> {
17051        ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17052    }
17053}
17054impl<'db> From<ImplItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
17055    fn from(ptr: ImplItemMissingPtr<'db>) -> Self {
17056        ptr.untyped()
17057    }
17058}
17059#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17060pub struct ImplItemMissingGreen<'db>(pub GreenId<'db>);
17061impl<'db> TypedSyntaxNode<'db> for ImplItemMissing<'db> {
17062    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17063    type StablePtr = ImplItemMissingPtr<'db>;
17064    type Green = ImplItemMissingGreen<'db>;
17065    fn missing(db: &'db dyn Database) -> Self::Green {
17066        ImplItemMissingGreen(
17067            GreenNode {
17068                kind: SyntaxKind::ImplItemMissing,
17069                details: GreenNodeDetails::Node {
17070                    children: [].into(),
17071                    width: TextWidth::default(),
17072                },
17073            }
17074            .intern(db),
17075        )
17076    }
17077    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17078        let kind = node.kind(db);
17079        assert_eq!(
17080            kind,
17081            SyntaxKind::ImplItemMissing,
17082            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17083            kind,
17084            SyntaxKind::ImplItemMissing
17085        );
17086        Self { node }
17087    }
17088    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17089        let kind = node.kind(db);
17090        if kind == SyntaxKind::ImplItemMissing {
17091            Some(Self::from_syntax_node(db, node))
17092        } else {
17093            None
17094        }
17095    }
17096    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17097        self.node
17098    }
17099    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17100        ImplItemMissingPtr(self.node.stable_ptr(db))
17101    }
17102}
17103#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17104pub struct ItemImplAlias<'db> {
17105    node: SyntaxNode<'db>,
17106}
17107impl<'db> ItemImplAlias<'db> {
17108    pub const INDEX_ATTRIBUTES: usize = 0;
17109    pub const INDEX_VISIBILITY: usize = 1;
17110    pub const INDEX_IMPL_KW: usize = 2;
17111    pub const INDEX_NAME: usize = 3;
17112    pub const INDEX_GENERIC_PARAMS: usize = 4;
17113    pub const INDEX_EQ: usize = 5;
17114    pub const INDEX_IMPL_PATH: usize = 6;
17115    pub const INDEX_SEMICOLON: usize = 7;
17116    pub fn new_green(
17117        db: &'db dyn Database,
17118        attributes: AttributeListGreen<'db>,
17119        visibility: VisibilityGreen<'db>,
17120        impl_kw: TerminalImplGreen<'db>,
17121        name: TerminalIdentifierGreen<'db>,
17122        generic_params: OptionWrappedGenericParamListGreen<'db>,
17123        eq: TerminalEqGreen<'db>,
17124        impl_path: ExprPathGreen<'db>,
17125        semicolon: TerminalSemicolonGreen<'db>,
17126    ) -> ItemImplAliasGreen<'db> {
17127        let children = [
17128            attributes.0,
17129            visibility.0,
17130            impl_kw.0,
17131            name.0,
17132            generic_params.0,
17133            eq.0,
17134            impl_path.0,
17135            semicolon.0,
17136        ];
17137        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17138        ItemImplAliasGreen(
17139            GreenNode {
17140                kind: SyntaxKind::ItemImplAlias,
17141                details: GreenNodeDetails::Node { children: children.into(), width },
17142            }
17143            .intern(db),
17144        )
17145    }
17146}
17147impl<'db> ItemImplAlias<'db> {
17148    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17149        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17150    }
17151    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17152        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17153    }
17154    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
17155        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17156    }
17157    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17158        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17159    }
17160    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17161        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17162    }
17163    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17164        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17165    }
17166    pub fn impl_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
17167        ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17168    }
17169    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17170        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17171    }
17172}
17173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17174pub struct ItemImplAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17175impl<'db> ItemImplAliasPtr<'db> {
17176    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17177        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17178    }
17179}
17180impl<'db> TypedStablePtr<'db> for ItemImplAliasPtr<'db> {
17181    type SyntaxNode = ItemImplAlias<'db>;
17182    fn untyped(self) -> SyntaxStablePtrId<'db> {
17183        self.0
17184    }
17185    fn lookup(&self, db: &'db dyn Database) -> ItemImplAlias<'db> {
17186        ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17187    }
17188}
17189impl<'db> From<ItemImplAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17190    fn from(ptr: ItemImplAliasPtr<'db>) -> Self {
17191        ptr.untyped()
17192    }
17193}
17194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17195pub struct ItemImplAliasGreen<'db>(pub GreenId<'db>);
17196impl<'db> TypedSyntaxNode<'db> for ItemImplAlias<'db> {
17197    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17198    type StablePtr = ItemImplAliasPtr<'db>;
17199    type Green = ItemImplAliasGreen<'db>;
17200    fn missing(db: &'db dyn Database) -> Self::Green {
17201        ItemImplAliasGreen(
17202            GreenNode {
17203                kind: SyntaxKind::ItemImplAlias,
17204                details: GreenNodeDetails::Node {
17205                    children: [
17206                        AttributeList::missing(db).0,
17207                        Visibility::missing(db).0,
17208                        TerminalImpl::missing(db).0,
17209                        TerminalIdentifier::missing(db).0,
17210                        OptionWrappedGenericParamList::missing(db).0,
17211                        TerminalEq::missing(db).0,
17212                        ExprPath::missing(db).0,
17213                        TerminalSemicolon::missing(db).0,
17214                    ]
17215                    .into(),
17216                    width: TextWidth::default(),
17217                },
17218            }
17219            .intern(db),
17220        )
17221    }
17222    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17223        let kind = node.kind(db);
17224        assert_eq!(
17225            kind,
17226            SyntaxKind::ItemImplAlias,
17227            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17228            kind,
17229            SyntaxKind::ItemImplAlias
17230        );
17231        Self { node }
17232    }
17233    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17234        let kind = node.kind(db);
17235        if kind == SyntaxKind::ItemImplAlias {
17236            Some(Self::from_syntax_node(db, node))
17237        } else {
17238            None
17239        }
17240    }
17241    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17242        self.node
17243    }
17244    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17245        ItemImplAliasPtr(self.node.stable_ptr(db))
17246    }
17247}
17248#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17249pub struct ItemStruct<'db> {
17250    node: SyntaxNode<'db>,
17251}
17252impl<'db> ItemStruct<'db> {
17253    pub const INDEX_ATTRIBUTES: usize = 0;
17254    pub const INDEX_VISIBILITY: usize = 1;
17255    pub const INDEX_STRUCT_KW: usize = 2;
17256    pub const INDEX_NAME: usize = 3;
17257    pub const INDEX_GENERIC_PARAMS: usize = 4;
17258    pub const INDEX_LBRACE: usize = 5;
17259    pub const INDEX_MEMBERS: usize = 6;
17260    pub const INDEX_RBRACE: usize = 7;
17261    pub fn new_green(
17262        db: &'db dyn Database,
17263        attributes: AttributeListGreen<'db>,
17264        visibility: VisibilityGreen<'db>,
17265        struct_kw: TerminalStructGreen<'db>,
17266        name: TerminalIdentifierGreen<'db>,
17267        generic_params: OptionWrappedGenericParamListGreen<'db>,
17268        lbrace: TerminalLBraceGreen<'db>,
17269        members: MemberListGreen<'db>,
17270        rbrace: TerminalRBraceGreen<'db>,
17271    ) -> ItemStructGreen<'db> {
17272        let children = [
17273            attributes.0,
17274            visibility.0,
17275            struct_kw.0,
17276            name.0,
17277            generic_params.0,
17278            lbrace.0,
17279            members.0,
17280            rbrace.0,
17281        ];
17282        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17283        ItemStructGreen(
17284            GreenNode {
17285                kind: SyntaxKind::ItemStruct,
17286                details: GreenNodeDetails::Node { children: children.into(), width },
17287            }
17288            .intern(db),
17289        )
17290    }
17291}
17292impl<'db> ItemStruct<'db> {
17293    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17294        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17295    }
17296    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17297        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17298    }
17299    pub fn struct_kw(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
17300        TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17301    }
17302    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17303        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17304    }
17305    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17306        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17307    }
17308    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17309        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17310    }
17311    pub fn members(&self, db: &'db dyn Database) -> MemberList<'db> {
17312        MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17313    }
17314    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17315        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17316    }
17317}
17318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17319pub struct ItemStructPtr<'db>(pub SyntaxStablePtrId<'db>);
17320impl<'db> ItemStructPtr<'db> {
17321    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17322        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17323    }
17324}
17325impl<'db> TypedStablePtr<'db> for ItemStructPtr<'db> {
17326    type SyntaxNode = ItemStruct<'db>;
17327    fn untyped(self) -> SyntaxStablePtrId<'db> {
17328        self.0
17329    }
17330    fn lookup(&self, db: &'db dyn Database) -> ItemStruct<'db> {
17331        ItemStruct::from_syntax_node(db, self.0.lookup(db))
17332    }
17333}
17334impl<'db> From<ItemStructPtr<'db>> for SyntaxStablePtrId<'db> {
17335    fn from(ptr: ItemStructPtr<'db>) -> Self {
17336        ptr.untyped()
17337    }
17338}
17339#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17340pub struct ItemStructGreen<'db>(pub GreenId<'db>);
17341impl<'db> TypedSyntaxNode<'db> for ItemStruct<'db> {
17342    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17343    type StablePtr = ItemStructPtr<'db>;
17344    type Green = ItemStructGreen<'db>;
17345    fn missing(db: &'db dyn Database) -> Self::Green {
17346        ItemStructGreen(
17347            GreenNode {
17348                kind: SyntaxKind::ItemStruct,
17349                details: GreenNodeDetails::Node {
17350                    children: [
17351                        AttributeList::missing(db).0,
17352                        Visibility::missing(db).0,
17353                        TerminalStruct::missing(db).0,
17354                        TerminalIdentifier::missing(db).0,
17355                        OptionWrappedGenericParamList::missing(db).0,
17356                        TerminalLBrace::missing(db).0,
17357                        MemberList::missing(db).0,
17358                        TerminalRBrace::missing(db).0,
17359                    ]
17360                    .into(),
17361                    width: TextWidth::default(),
17362                },
17363            }
17364            .intern(db),
17365        )
17366    }
17367    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17368        let kind = node.kind(db);
17369        assert_eq!(
17370            kind,
17371            SyntaxKind::ItemStruct,
17372            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17373            kind,
17374            SyntaxKind::ItemStruct
17375        );
17376        Self { node }
17377    }
17378    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17379        let kind = node.kind(db);
17380        if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17381    }
17382    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17383        self.node
17384    }
17385    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17386        ItemStructPtr(self.node.stable_ptr(db))
17387    }
17388}
17389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17390pub struct ItemEnum<'db> {
17391    node: SyntaxNode<'db>,
17392}
17393impl<'db> ItemEnum<'db> {
17394    pub const INDEX_ATTRIBUTES: usize = 0;
17395    pub const INDEX_VISIBILITY: usize = 1;
17396    pub const INDEX_ENUM_KW: usize = 2;
17397    pub const INDEX_NAME: usize = 3;
17398    pub const INDEX_GENERIC_PARAMS: usize = 4;
17399    pub const INDEX_LBRACE: usize = 5;
17400    pub const INDEX_VARIANTS: usize = 6;
17401    pub const INDEX_RBRACE: usize = 7;
17402    pub fn new_green(
17403        db: &'db dyn Database,
17404        attributes: AttributeListGreen<'db>,
17405        visibility: VisibilityGreen<'db>,
17406        enum_kw: TerminalEnumGreen<'db>,
17407        name: TerminalIdentifierGreen<'db>,
17408        generic_params: OptionWrappedGenericParamListGreen<'db>,
17409        lbrace: TerminalLBraceGreen<'db>,
17410        variants: VariantListGreen<'db>,
17411        rbrace: TerminalRBraceGreen<'db>,
17412    ) -> ItemEnumGreen<'db> {
17413        let children = [
17414            attributes.0,
17415            visibility.0,
17416            enum_kw.0,
17417            name.0,
17418            generic_params.0,
17419            lbrace.0,
17420            variants.0,
17421            rbrace.0,
17422        ];
17423        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17424        ItemEnumGreen(
17425            GreenNode {
17426                kind: SyntaxKind::ItemEnum,
17427                details: GreenNodeDetails::Node { children: children.into(), width },
17428            }
17429            .intern(db),
17430        )
17431    }
17432}
17433impl<'db> ItemEnum<'db> {
17434    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17435        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17436    }
17437    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17438        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17439    }
17440    pub fn enum_kw(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
17441        TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17442    }
17443    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17444        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17445    }
17446    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17447        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17448    }
17449    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17450        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17451    }
17452    pub fn variants(&self, db: &'db dyn Database) -> VariantList<'db> {
17453        VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17454    }
17455    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17456        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17457    }
17458}
17459#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17460pub struct ItemEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
17461impl<'db> ItemEnumPtr<'db> {
17462    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17463        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17464    }
17465}
17466impl<'db> TypedStablePtr<'db> for ItemEnumPtr<'db> {
17467    type SyntaxNode = ItemEnum<'db>;
17468    fn untyped(self) -> SyntaxStablePtrId<'db> {
17469        self.0
17470    }
17471    fn lookup(&self, db: &'db dyn Database) -> ItemEnum<'db> {
17472        ItemEnum::from_syntax_node(db, self.0.lookup(db))
17473    }
17474}
17475impl<'db> From<ItemEnumPtr<'db>> for SyntaxStablePtrId<'db> {
17476    fn from(ptr: ItemEnumPtr<'db>) -> Self {
17477        ptr.untyped()
17478    }
17479}
17480#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17481pub struct ItemEnumGreen<'db>(pub GreenId<'db>);
17482impl<'db> TypedSyntaxNode<'db> for ItemEnum<'db> {
17483    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17484    type StablePtr = ItemEnumPtr<'db>;
17485    type Green = ItemEnumGreen<'db>;
17486    fn missing(db: &'db dyn Database) -> Self::Green {
17487        ItemEnumGreen(
17488            GreenNode {
17489                kind: SyntaxKind::ItemEnum,
17490                details: GreenNodeDetails::Node {
17491                    children: [
17492                        AttributeList::missing(db).0,
17493                        Visibility::missing(db).0,
17494                        TerminalEnum::missing(db).0,
17495                        TerminalIdentifier::missing(db).0,
17496                        OptionWrappedGenericParamList::missing(db).0,
17497                        TerminalLBrace::missing(db).0,
17498                        VariantList::missing(db).0,
17499                        TerminalRBrace::missing(db).0,
17500                    ]
17501                    .into(),
17502                    width: TextWidth::default(),
17503                },
17504            }
17505            .intern(db),
17506        )
17507    }
17508    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17509        let kind = node.kind(db);
17510        assert_eq!(
17511            kind,
17512            SyntaxKind::ItemEnum,
17513            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17514            kind,
17515            SyntaxKind::ItemEnum
17516        );
17517        Self { node }
17518    }
17519    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17520        let kind = node.kind(db);
17521        if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17522    }
17523    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17524        self.node
17525    }
17526    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17527        ItemEnumPtr(self.node.stable_ptr(db))
17528    }
17529}
17530#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17531pub struct ItemTypeAlias<'db> {
17532    node: SyntaxNode<'db>,
17533}
17534impl<'db> ItemTypeAlias<'db> {
17535    pub const INDEX_ATTRIBUTES: usize = 0;
17536    pub const INDEX_VISIBILITY: usize = 1;
17537    pub const INDEX_TYPE_KW: usize = 2;
17538    pub const INDEX_NAME: usize = 3;
17539    pub const INDEX_GENERIC_PARAMS: usize = 4;
17540    pub const INDEX_EQ: usize = 5;
17541    pub const INDEX_TY: usize = 6;
17542    pub const INDEX_SEMICOLON: usize = 7;
17543    pub fn new_green(
17544        db: &'db dyn Database,
17545        attributes: AttributeListGreen<'db>,
17546        visibility: VisibilityGreen<'db>,
17547        type_kw: TerminalTypeGreen<'db>,
17548        name: TerminalIdentifierGreen<'db>,
17549        generic_params: OptionWrappedGenericParamListGreen<'db>,
17550        eq: TerminalEqGreen<'db>,
17551        ty: ExprGreen<'db>,
17552        semicolon: TerminalSemicolonGreen<'db>,
17553    ) -> ItemTypeAliasGreen<'db> {
17554        let children = [
17555            attributes.0,
17556            visibility.0,
17557            type_kw.0,
17558            name.0,
17559            generic_params.0,
17560            eq.0,
17561            ty.0,
17562            semicolon.0,
17563        ];
17564        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17565        ItemTypeAliasGreen(
17566            GreenNode {
17567                kind: SyntaxKind::ItemTypeAlias,
17568                details: GreenNodeDetails::Node { children: children.into(), width },
17569            }
17570            .intern(db),
17571        )
17572    }
17573}
17574impl<'db> ItemTypeAlias<'db> {
17575    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17576        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17577    }
17578    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17579        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17580    }
17581    pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
17582        TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17583    }
17584    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17585        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17586    }
17587    pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17588        OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17589    }
17590    pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17591        TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17592    }
17593    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
17594        Expr::from_syntax_node(db, self.node.get_children(db)[6])
17595    }
17596    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17597        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17598    }
17599}
17600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17601pub struct ItemTypeAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17602impl<'db> ItemTypeAliasPtr<'db> {
17603    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17604        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17605    }
17606}
17607impl<'db> TypedStablePtr<'db> for ItemTypeAliasPtr<'db> {
17608    type SyntaxNode = ItemTypeAlias<'db>;
17609    fn untyped(self) -> SyntaxStablePtrId<'db> {
17610        self.0
17611    }
17612    fn lookup(&self, db: &'db dyn Database) -> ItemTypeAlias<'db> {
17613        ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17614    }
17615}
17616impl<'db> From<ItemTypeAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17617    fn from(ptr: ItemTypeAliasPtr<'db>) -> Self {
17618        ptr.untyped()
17619    }
17620}
17621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17622pub struct ItemTypeAliasGreen<'db>(pub GreenId<'db>);
17623impl<'db> TypedSyntaxNode<'db> for ItemTypeAlias<'db> {
17624    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17625    type StablePtr = ItemTypeAliasPtr<'db>;
17626    type Green = ItemTypeAliasGreen<'db>;
17627    fn missing(db: &'db dyn Database) -> Self::Green {
17628        ItemTypeAliasGreen(
17629            GreenNode {
17630                kind: SyntaxKind::ItemTypeAlias,
17631                details: GreenNodeDetails::Node {
17632                    children: [
17633                        AttributeList::missing(db).0,
17634                        Visibility::missing(db).0,
17635                        TerminalType::missing(db).0,
17636                        TerminalIdentifier::missing(db).0,
17637                        OptionWrappedGenericParamList::missing(db).0,
17638                        TerminalEq::missing(db).0,
17639                        Expr::missing(db).0,
17640                        TerminalSemicolon::missing(db).0,
17641                    ]
17642                    .into(),
17643                    width: TextWidth::default(),
17644                },
17645            }
17646            .intern(db),
17647        )
17648    }
17649    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17650        let kind = node.kind(db);
17651        assert_eq!(
17652            kind,
17653            SyntaxKind::ItemTypeAlias,
17654            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17655            kind,
17656            SyntaxKind::ItemTypeAlias
17657        );
17658        Self { node }
17659    }
17660    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17661        let kind = node.kind(db);
17662        if kind == SyntaxKind::ItemTypeAlias {
17663            Some(Self::from_syntax_node(db, node))
17664        } else {
17665            None
17666        }
17667    }
17668    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17669        self.node
17670    }
17671    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17672        ItemTypeAliasPtr(self.node.stable_ptr(db))
17673    }
17674}
17675#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17676pub struct ItemUse<'db> {
17677    node: SyntaxNode<'db>,
17678}
17679impl<'db> ItemUse<'db> {
17680    pub const INDEX_ATTRIBUTES: usize = 0;
17681    pub const INDEX_VISIBILITY: usize = 1;
17682    pub const INDEX_USE_KW: usize = 2;
17683    pub const INDEX_DOLLAR: usize = 3;
17684    pub const INDEX_USE_PATH: usize = 4;
17685    pub const INDEX_SEMICOLON: usize = 5;
17686    pub fn new_green(
17687        db: &'db dyn Database,
17688        attributes: AttributeListGreen<'db>,
17689        visibility: VisibilityGreen<'db>,
17690        use_kw: TerminalUseGreen<'db>,
17691        dollar: OptionTerminalDollarGreen<'db>,
17692        use_path: UsePathGreen<'db>,
17693        semicolon: TerminalSemicolonGreen<'db>,
17694    ) -> ItemUseGreen<'db> {
17695        let children = [attributes.0, visibility.0, use_kw.0, dollar.0, use_path.0, semicolon.0];
17696        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17697        ItemUseGreen(
17698            GreenNode {
17699                kind: SyntaxKind::ItemUse,
17700                details: GreenNodeDetails::Node { children: children.into(), width },
17701            }
17702            .intern(db),
17703        )
17704    }
17705}
17706impl<'db> ItemUse<'db> {
17707    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17708        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17709    }
17710    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17711        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17712    }
17713    pub fn use_kw(&self, db: &'db dyn Database) -> TerminalUse<'db> {
17714        TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17715    }
17716    pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
17717        OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[3])
17718    }
17719    pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
17720        UsePath::from_syntax_node(db, self.node.get_children(db)[4])
17721    }
17722    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17723        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
17724    }
17725}
17726#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17727pub struct ItemUsePtr<'db>(pub SyntaxStablePtrId<'db>);
17728impl<'db> ItemUsePtr<'db> {
17729    pub fn use_path_green(self, db: &'db dyn Database) -> UsePathGreen<'db> {
17730        UsePathGreen(self.0.0.key_fields(db)[0])
17731    }
17732}
17733impl<'db> TypedStablePtr<'db> for ItemUsePtr<'db> {
17734    type SyntaxNode = ItemUse<'db>;
17735    fn untyped(self) -> SyntaxStablePtrId<'db> {
17736        self.0
17737    }
17738    fn lookup(&self, db: &'db dyn Database) -> ItemUse<'db> {
17739        ItemUse::from_syntax_node(db, self.0.lookup(db))
17740    }
17741}
17742impl<'db> From<ItemUsePtr<'db>> for SyntaxStablePtrId<'db> {
17743    fn from(ptr: ItemUsePtr<'db>) -> Self {
17744        ptr.untyped()
17745    }
17746}
17747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17748pub struct ItemUseGreen<'db>(pub GreenId<'db>);
17749impl<'db> TypedSyntaxNode<'db> for ItemUse<'db> {
17750    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
17751    type StablePtr = ItemUsePtr<'db>;
17752    type Green = ItemUseGreen<'db>;
17753    fn missing(db: &'db dyn Database) -> Self::Green {
17754        ItemUseGreen(
17755            GreenNode {
17756                kind: SyntaxKind::ItemUse,
17757                details: GreenNodeDetails::Node {
17758                    children: [
17759                        AttributeList::missing(db).0,
17760                        Visibility::missing(db).0,
17761                        TerminalUse::missing(db).0,
17762                        OptionTerminalDollar::missing(db).0,
17763                        UsePath::missing(db).0,
17764                        TerminalSemicolon::missing(db).0,
17765                    ]
17766                    .into(),
17767                    width: TextWidth::default(),
17768                },
17769            }
17770            .intern(db),
17771        )
17772    }
17773    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17774        let kind = node.kind(db);
17775        assert_eq!(
17776            kind,
17777            SyntaxKind::ItemUse,
17778            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17779            kind,
17780            SyntaxKind::ItemUse
17781        );
17782        Self { node }
17783    }
17784    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17785        let kind = node.kind(db);
17786        if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
17787    }
17788    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17789        self.node
17790    }
17791    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17792        ItemUsePtr(self.node.stable_ptr(db))
17793    }
17794}
17795#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17796pub enum UsePath<'db> {
17797    Leaf(UsePathLeaf<'db>),
17798    Single(UsePathSingle<'db>),
17799    Multi(UsePathMulti<'db>),
17800    Star(UsePathStar<'db>),
17801}
17802#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17803pub struct UsePathPtr<'db>(pub SyntaxStablePtrId<'db>);
17804impl<'db> TypedStablePtr<'db> for UsePathPtr<'db> {
17805    type SyntaxNode = UsePath<'db>;
17806    fn untyped(self) -> SyntaxStablePtrId<'db> {
17807        self.0
17808    }
17809    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
17810        UsePath::from_syntax_node(db, self.0.lookup(db))
17811    }
17812}
17813impl<'db> From<UsePathPtr<'db>> for SyntaxStablePtrId<'db> {
17814    fn from(ptr: UsePathPtr<'db>) -> Self {
17815        ptr.untyped()
17816    }
17817}
17818impl<'db> From<UsePathLeafPtr<'db>> for UsePathPtr<'db> {
17819    fn from(value: UsePathLeafPtr<'db>) -> Self {
17820        Self(value.0)
17821    }
17822}
17823impl<'db> From<UsePathSinglePtr<'db>> for UsePathPtr<'db> {
17824    fn from(value: UsePathSinglePtr<'db>) -> Self {
17825        Self(value.0)
17826    }
17827}
17828impl<'db> From<UsePathMultiPtr<'db>> for UsePathPtr<'db> {
17829    fn from(value: UsePathMultiPtr<'db>) -> Self {
17830        Self(value.0)
17831    }
17832}
17833impl<'db> From<UsePathStarPtr<'db>> for UsePathPtr<'db> {
17834    fn from(value: UsePathStarPtr<'db>) -> Self {
17835        Self(value.0)
17836    }
17837}
17838impl<'db> From<UsePathLeafGreen<'db>> for UsePathGreen<'db> {
17839    fn from(value: UsePathLeafGreen<'db>) -> Self {
17840        Self(value.0)
17841    }
17842}
17843impl<'db> From<UsePathSingleGreen<'db>> for UsePathGreen<'db> {
17844    fn from(value: UsePathSingleGreen<'db>) -> Self {
17845        Self(value.0)
17846    }
17847}
17848impl<'db> From<UsePathMultiGreen<'db>> for UsePathGreen<'db> {
17849    fn from(value: UsePathMultiGreen<'db>) -> Self {
17850        Self(value.0)
17851    }
17852}
17853impl<'db> From<UsePathStarGreen<'db>> for UsePathGreen<'db> {
17854    fn from(value: UsePathStarGreen<'db>) -> Self {
17855        Self(value.0)
17856    }
17857}
17858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17859pub struct UsePathGreen<'db>(pub GreenId<'db>);
17860impl<'db> TypedSyntaxNode<'db> for UsePath<'db> {
17861    const OPTIONAL_KIND: Option<SyntaxKind> = None;
17862    type StablePtr = UsePathPtr<'db>;
17863    type Green = UsePathGreen<'db>;
17864    fn missing(db: &'db dyn Database) -> Self::Green {
17865        panic!("No missing variant.");
17866    }
17867    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17868        let kind = node.kind(db);
17869        match kind {
17870            SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
17871            SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
17872            SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
17873            SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
17874            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
17875        }
17876    }
17877    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17878        let kind = node.kind(db);
17879        match kind {
17880            SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
17881            SyntaxKind::UsePathSingle => {
17882                Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
17883            }
17884            SyntaxKind::UsePathMulti => {
17885                Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
17886            }
17887            SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
17888            _ => None,
17889        }
17890    }
17891    fn as_syntax_node(&self) -> SyntaxNode<'db> {
17892        match self {
17893            UsePath::Leaf(x) => x.as_syntax_node(),
17894            UsePath::Single(x) => x.as_syntax_node(),
17895            UsePath::Multi(x) => x.as_syntax_node(),
17896            UsePath::Star(x) => x.as_syntax_node(),
17897        }
17898    }
17899    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17900        UsePathPtr(self.as_syntax_node().stable_ptr(db))
17901    }
17902}
17903impl<'db> UsePath<'db> {
17904    /// Checks if a kind of a variant of [UsePath].
17905    pub fn is_variant(kind: SyntaxKind) -> bool {
17906        matches!(
17907            kind,
17908            SyntaxKind::UsePathLeaf
17909                | SyntaxKind::UsePathSingle
17910                | SyntaxKind::UsePathMulti
17911                | SyntaxKind::UsePathStar
17912        )
17913    }
17914}
17915#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17916pub struct UsePathLeaf<'db> {
17917    node: SyntaxNode<'db>,
17918}
17919impl<'db> UsePathLeaf<'db> {
17920    pub const INDEX_IDENT: usize = 0;
17921    pub const INDEX_ALIAS_CLAUSE: usize = 1;
17922    pub fn new_green(
17923        db: &'db dyn Database,
17924        ident: PathSegmentGreen<'db>,
17925        alias_clause: OptionAliasClauseGreen<'db>,
17926    ) -> UsePathLeafGreen<'db> {
17927        let children = [ident.0, alias_clause.0];
17928        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17929        UsePathLeafGreen(
17930            GreenNode {
17931                kind: SyntaxKind::UsePathLeaf,
17932                details: GreenNodeDetails::Node { children: children.into(), width },
17933            }
17934            .intern(db),
17935        )
17936    }
17937}
17938impl<'db> UsePathLeaf<'db> {
17939    pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
17940        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
17941    }
17942    pub fn alias_clause(&self, db: &'db dyn Database) -> OptionAliasClause<'db> {
17943        OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
17944    }
17945}
17946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
17947pub struct UsePathLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
17948impl<'db> UsePathLeafPtr<'db> {
17949    pub fn ident_green(self, db: &'db dyn Database) -> PathSegmentGreen<'db> {
17950        PathSegmentGreen(self.0.0.key_fields(db)[0])
17951    }
17952    pub fn alias_clause_green(self, db: &'db dyn Database) -> OptionAliasClauseGreen<'db> {
17953        OptionAliasClauseGreen(self.0.0.key_fields(db)[1])
17954    }
17955}
17956impl<'db> TypedStablePtr<'db> for UsePathLeafPtr<'db> {
17957    type SyntaxNode = UsePathLeaf<'db>;
17958    fn untyped(self) -> SyntaxStablePtrId<'db> {
17959        self.0
17960    }
17961    fn lookup(&self, db: &'db dyn Database) -> UsePathLeaf<'db> {
17962        UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
17963    }
17964}
17965impl<'db> From<UsePathLeafPtr<'db>> for SyntaxStablePtrId<'db> {
17966    fn from(ptr: UsePathLeafPtr<'db>) -> Self {
17967        ptr.untyped()
17968    }
17969}
17970#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17971pub struct UsePathLeafGreen<'db>(pub GreenId<'db>);
17972impl<'db> TypedSyntaxNode<'db> for UsePathLeaf<'db> {
17973    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
17974    type StablePtr = UsePathLeafPtr<'db>;
17975    type Green = UsePathLeafGreen<'db>;
17976    fn missing(db: &'db dyn Database) -> Self::Green {
17977        UsePathLeafGreen(
17978            GreenNode {
17979                kind: SyntaxKind::UsePathLeaf,
17980                details: GreenNodeDetails::Node {
17981                    children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
17982                    width: TextWidth::default(),
17983                },
17984            }
17985            .intern(db),
17986        )
17987    }
17988    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17989        let kind = node.kind(db);
17990        assert_eq!(
17991            kind,
17992            SyntaxKind::UsePathLeaf,
17993            "Unexpected SyntaxKind {:?}. Expected {:?}.",
17994            kind,
17995            SyntaxKind::UsePathLeaf
17996        );
17997        Self { node }
17998    }
17999    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18000        let kind = node.kind(db);
18001        if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18002    }
18003    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18004        self.node
18005    }
18006    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18007        UsePathLeafPtr(self.node.stable_ptr(db))
18008    }
18009}
18010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18011pub struct UsePathSingle<'db> {
18012    node: SyntaxNode<'db>,
18013}
18014impl<'db> UsePathSingle<'db> {
18015    pub const INDEX_IDENT: usize = 0;
18016    pub const INDEX_COLON_COLON: usize = 1;
18017    pub const INDEX_USE_PATH: usize = 2;
18018    pub fn new_green(
18019        db: &'db dyn Database,
18020        ident: PathSegmentGreen<'db>,
18021        colon_colon: TerminalColonColonGreen<'db>,
18022        use_path: UsePathGreen<'db>,
18023    ) -> UsePathSingleGreen<'db> {
18024        let children = [ident.0, colon_colon.0, use_path.0];
18025        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18026        UsePathSingleGreen(
18027            GreenNode {
18028                kind: SyntaxKind::UsePathSingle,
18029                details: GreenNodeDetails::Node { children: children.into(), width },
18030            }
18031            .intern(db),
18032        )
18033    }
18034}
18035impl<'db> UsePathSingle<'db> {
18036    pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18037        PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18038    }
18039    pub fn colon_colon(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
18040        TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18041    }
18042    pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
18043        UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18044    }
18045}
18046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18047pub struct UsePathSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
18048impl<'db> UsePathSinglePtr<'db> {}
18049impl<'db> TypedStablePtr<'db> for UsePathSinglePtr<'db> {
18050    type SyntaxNode = UsePathSingle<'db>;
18051    fn untyped(self) -> SyntaxStablePtrId<'db> {
18052        self.0
18053    }
18054    fn lookup(&self, db: &'db dyn Database) -> UsePathSingle<'db> {
18055        UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18056    }
18057}
18058impl<'db> From<UsePathSinglePtr<'db>> for SyntaxStablePtrId<'db> {
18059    fn from(ptr: UsePathSinglePtr<'db>) -> Self {
18060        ptr.untyped()
18061    }
18062}
18063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18064pub struct UsePathSingleGreen<'db>(pub GreenId<'db>);
18065impl<'db> TypedSyntaxNode<'db> for UsePathSingle<'db> {
18066    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18067    type StablePtr = UsePathSinglePtr<'db>;
18068    type Green = UsePathSingleGreen<'db>;
18069    fn missing(db: &'db dyn Database) -> Self::Green {
18070        UsePathSingleGreen(
18071            GreenNode {
18072                kind: SyntaxKind::UsePathSingle,
18073                details: GreenNodeDetails::Node {
18074                    children: [
18075                        PathSegment::missing(db).0,
18076                        TerminalColonColon::missing(db).0,
18077                        UsePath::missing(db).0,
18078                    ]
18079                    .into(),
18080                    width: TextWidth::default(),
18081                },
18082            }
18083            .intern(db),
18084        )
18085    }
18086    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18087        let kind = node.kind(db);
18088        assert_eq!(
18089            kind,
18090            SyntaxKind::UsePathSingle,
18091            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18092            kind,
18093            SyntaxKind::UsePathSingle
18094        );
18095        Self { node }
18096    }
18097    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18098        let kind = node.kind(db);
18099        if kind == SyntaxKind::UsePathSingle {
18100            Some(Self::from_syntax_node(db, node))
18101        } else {
18102            None
18103        }
18104    }
18105    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18106        self.node
18107    }
18108    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18109        UsePathSinglePtr(self.node.stable_ptr(db))
18110    }
18111}
18112#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18113pub struct UsePathMulti<'db> {
18114    node: SyntaxNode<'db>,
18115}
18116impl<'db> UsePathMulti<'db> {
18117    pub const INDEX_LBRACE: usize = 0;
18118    pub const INDEX_USE_PATHS: usize = 1;
18119    pub const INDEX_RBRACE: usize = 2;
18120    pub fn new_green(
18121        db: &'db dyn Database,
18122        lbrace: TerminalLBraceGreen<'db>,
18123        use_paths: UsePathListGreen<'db>,
18124        rbrace: TerminalRBraceGreen<'db>,
18125    ) -> UsePathMultiGreen<'db> {
18126        let children = [lbrace.0, use_paths.0, rbrace.0];
18127        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18128        UsePathMultiGreen(
18129            GreenNode {
18130                kind: SyntaxKind::UsePathMulti,
18131                details: GreenNodeDetails::Node { children: children.into(), width },
18132            }
18133            .intern(db),
18134        )
18135    }
18136}
18137impl<'db> UsePathMulti<'db> {
18138    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
18139        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18140    }
18141    pub fn use_paths(&self, db: &'db dyn Database) -> UsePathList<'db> {
18142        UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18143    }
18144    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
18145        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18146    }
18147}
18148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18149pub struct UsePathMultiPtr<'db>(pub SyntaxStablePtrId<'db>);
18150impl<'db> UsePathMultiPtr<'db> {}
18151impl<'db> TypedStablePtr<'db> for UsePathMultiPtr<'db> {
18152    type SyntaxNode = UsePathMulti<'db>;
18153    fn untyped(self) -> SyntaxStablePtrId<'db> {
18154        self.0
18155    }
18156    fn lookup(&self, db: &'db dyn Database) -> UsePathMulti<'db> {
18157        UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18158    }
18159}
18160impl<'db> From<UsePathMultiPtr<'db>> for SyntaxStablePtrId<'db> {
18161    fn from(ptr: UsePathMultiPtr<'db>) -> Self {
18162        ptr.untyped()
18163    }
18164}
18165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18166pub struct UsePathMultiGreen<'db>(pub GreenId<'db>);
18167impl<'db> TypedSyntaxNode<'db> for UsePathMulti<'db> {
18168    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18169    type StablePtr = UsePathMultiPtr<'db>;
18170    type Green = UsePathMultiGreen<'db>;
18171    fn missing(db: &'db dyn Database) -> Self::Green {
18172        UsePathMultiGreen(
18173            GreenNode {
18174                kind: SyntaxKind::UsePathMulti,
18175                details: GreenNodeDetails::Node {
18176                    children: [
18177                        TerminalLBrace::missing(db).0,
18178                        UsePathList::missing(db).0,
18179                        TerminalRBrace::missing(db).0,
18180                    ]
18181                    .into(),
18182                    width: TextWidth::default(),
18183                },
18184            }
18185            .intern(db),
18186        )
18187    }
18188    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18189        let kind = node.kind(db);
18190        assert_eq!(
18191            kind,
18192            SyntaxKind::UsePathMulti,
18193            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18194            kind,
18195            SyntaxKind::UsePathMulti
18196        );
18197        Self { node }
18198    }
18199    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18200        let kind = node.kind(db);
18201        if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18202    }
18203    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18204        self.node
18205    }
18206    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18207        UsePathMultiPtr(self.node.stable_ptr(db))
18208    }
18209}
18210#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18211pub struct UsePathStar<'db> {
18212    node: SyntaxNode<'db>,
18213}
18214impl<'db> UsePathStar<'db> {
18215    pub const INDEX_STAR: usize = 0;
18216    pub fn new_green(db: &'db dyn Database, star: TerminalMulGreen<'db>) -> UsePathStarGreen<'db> {
18217        let children = [star.0];
18218        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18219        UsePathStarGreen(
18220            GreenNode {
18221                kind: SyntaxKind::UsePathStar,
18222                details: GreenNodeDetails::Node { children: children.into(), width },
18223            }
18224            .intern(db),
18225        )
18226    }
18227}
18228impl<'db> UsePathStar<'db> {
18229    pub fn star(&self, db: &'db dyn Database) -> TerminalMul<'db> {
18230        TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18231    }
18232}
18233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18234pub struct UsePathStarPtr<'db>(pub SyntaxStablePtrId<'db>);
18235impl<'db> UsePathStarPtr<'db> {}
18236impl<'db> TypedStablePtr<'db> for UsePathStarPtr<'db> {
18237    type SyntaxNode = UsePathStar<'db>;
18238    fn untyped(self) -> SyntaxStablePtrId<'db> {
18239        self.0
18240    }
18241    fn lookup(&self, db: &'db dyn Database) -> UsePathStar<'db> {
18242        UsePathStar::from_syntax_node(db, self.0.lookup(db))
18243    }
18244}
18245impl<'db> From<UsePathStarPtr<'db>> for SyntaxStablePtrId<'db> {
18246    fn from(ptr: UsePathStarPtr<'db>) -> Self {
18247        ptr.untyped()
18248    }
18249}
18250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18251pub struct UsePathStarGreen<'db>(pub GreenId<'db>);
18252impl<'db> TypedSyntaxNode<'db> for UsePathStar<'db> {
18253    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18254    type StablePtr = UsePathStarPtr<'db>;
18255    type Green = UsePathStarGreen<'db>;
18256    fn missing(db: &'db dyn Database) -> Self::Green {
18257        UsePathStarGreen(
18258            GreenNode {
18259                kind: SyntaxKind::UsePathStar,
18260                details: GreenNodeDetails::Node {
18261                    children: [TerminalMul::missing(db).0].into(),
18262                    width: TextWidth::default(),
18263                },
18264            }
18265            .intern(db),
18266        )
18267    }
18268    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18269        let kind = node.kind(db);
18270        assert_eq!(
18271            kind,
18272            SyntaxKind::UsePathStar,
18273            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18274            kind,
18275            SyntaxKind::UsePathStar
18276        );
18277        Self { node }
18278    }
18279    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18280        let kind = node.kind(db);
18281        if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18282    }
18283    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18284        self.node
18285    }
18286    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18287        UsePathStarPtr(self.node.stable_ptr(db))
18288    }
18289}
18290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18291pub struct UsePathList<'db>(ElementList<'db, UsePath<'db>, 2>);
18292impl<'db> Deref for UsePathList<'db> {
18293    type Target = ElementList<'db, UsePath<'db>, 2>;
18294    fn deref(&self) -> &Self::Target {
18295        &self.0
18296    }
18297}
18298impl<'db> UsePathList<'db> {
18299    pub fn new_green(
18300        db: &'db dyn Database,
18301        children: &[UsePathListElementOrSeparatorGreen<'db>],
18302    ) -> UsePathListGreen<'db> {
18303        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
18304        UsePathListGreen(
18305            GreenNode {
18306                kind: SyntaxKind::UsePathList,
18307                details: GreenNodeDetails::Node {
18308                    children: children.iter().map(|x| x.id()).collect(),
18309                    width,
18310                },
18311            }
18312            .intern(db),
18313        )
18314    }
18315}
18316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18317pub struct UsePathListPtr<'db>(pub SyntaxStablePtrId<'db>);
18318impl<'db> TypedStablePtr<'db> for UsePathListPtr<'db> {
18319    type SyntaxNode = UsePathList<'db>;
18320    fn untyped(self) -> SyntaxStablePtrId<'db> {
18321        self.0
18322    }
18323    fn lookup(&self, db: &'db dyn Database) -> UsePathList<'db> {
18324        UsePathList::from_syntax_node(db, self.0.lookup(db))
18325    }
18326}
18327impl<'db> From<UsePathListPtr<'db>> for SyntaxStablePtrId<'db> {
18328    fn from(ptr: UsePathListPtr<'db>) -> Self {
18329        ptr.untyped()
18330    }
18331}
18332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18333pub enum UsePathListElementOrSeparatorGreen<'db> {
18334    Separator(TerminalCommaGreen<'db>),
18335    Element(UsePathGreen<'db>),
18336}
18337impl<'db> From<TerminalCommaGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18338    fn from(value: TerminalCommaGreen<'db>) -> Self {
18339        UsePathListElementOrSeparatorGreen::Separator(value)
18340    }
18341}
18342impl<'db> From<UsePathGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18343    fn from(value: UsePathGreen<'db>) -> Self {
18344        UsePathListElementOrSeparatorGreen::Element(value)
18345    }
18346}
18347impl<'db> UsePathListElementOrSeparatorGreen<'db> {
18348    fn id(&self) -> GreenId<'db> {
18349        match self {
18350            UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18351            UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18352        }
18353    }
18354}
18355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18356pub struct UsePathListGreen<'db>(pub GreenId<'db>);
18357impl<'db> TypedSyntaxNode<'db> for UsePathList<'db> {
18358    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18359    type StablePtr = UsePathListPtr<'db>;
18360    type Green = UsePathListGreen<'db>;
18361    fn missing(db: &'db dyn Database) -> Self::Green {
18362        UsePathListGreen(
18363            GreenNode {
18364                kind: SyntaxKind::UsePathList,
18365                details: GreenNodeDetails::Node {
18366                    children: [].into(),
18367                    width: TextWidth::default(),
18368                },
18369            }
18370            .intern(db),
18371        )
18372    }
18373    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18374        Self(ElementList::new(node))
18375    }
18376    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18377        if node.kind(db) == SyntaxKind::UsePathList {
18378            Some(Self(ElementList::new(node)))
18379        } else {
18380            None
18381        }
18382    }
18383    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18384        self.node
18385    }
18386    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18387        UsePathListPtr(self.node.stable_ptr(db))
18388    }
18389}
18390#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18391pub struct AliasClause<'db> {
18392    node: SyntaxNode<'db>,
18393}
18394impl<'db> AliasClause<'db> {
18395    pub const INDEX_AS_KW: usize = 0;
18396    pub const INDEX_ALIAS: usize = 1;
18397    pub fn new_green(
18398        db: &'db dyn Database,
18399        as_kw: TerminalAsGreen<'db>,
18400        alias: TerminalIdentifierGreen<'db>,
18401    ) -> AliasClauseGreen<'db> {
18402        let children = [as_kw.0, alias.0];
18403        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18404        AliasClauseGreen(
18405            GreenNode {
18406                kind: SyntaxKind::AliasClause,
18407                details: GreenNodeDetails::Node { children: children.into(), width },
18408            }
18409            .intern(db),
18410        )
18411    }
18412}
18413impl<'db> AliasClause<'db> {
18414    pub fn as_kw(&self, db: &'db dyn Database) -> TerminalAs<'db> {
18415        TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18416    }
18417    pub fn alias(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18418        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18419    }
18420}
18421#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18422pub struct AliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18423impl<'db> AliasClausePtr<'db> {
18424    pub fn alias_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
18425        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
18426    }
18427}
18428impl<'db> TypedStablePtr<'db> for AliasClausePtr<'db> {
18429    type SyntaxNode = AliasClause<'db>;
18430    fn untyped(self) -> SyntaxStablePtrId<'db> {
18431        self.0
18432    }
18433    fn lookup(&self, db: &'db dyn Database) -> AliasClause<'db> {
18434        AliasClause::from_syntax_node(db, self.0.lookup(db))
18435    }
18436}
18437impl<'db> From<AliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18438    fn from(ptr: AliasClausePtr<'db>) -> Self {
18439        ptr.untyped()
18440    }
18441}
18442#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18443pub struct AliasClauseGreen<'db>(pub GreenId<'db>);
18444impl<'db> TypedSyntaxNode<'db> for AliasClause<'db> {
18445    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18446    type StablePtr = AliasClausePtr<'db>;
18447    type Green = AliasClauseGreen<'db>;
18448    fn missing(db: &'db dyn Database) -> Self::Green {
18449        AliasClauseGreen(
18450            GreenNode {
18451                kind: SyntaxKind::AliasClause,
18452                details: GreenNodeDetails::Node {
18453                    children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18454                    width: TextWidth::default(),
18455                },
18456            }
18457            .intern(db),
18458        )
18459    }
18460    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18461        let kind = node.kind(db);
18462        assert_eq!(
18463            kind,
18464            SyntaxKind::AliasClause,
18465            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18466            kind,
18467            SyntaxKind::AliasClause
18468        );
18469        Self { node }
18470    }
18471    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18472        let kind = node.kind(db);
18473        if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18474    }
18475    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18476        self.node
18477    }
18478    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18479        AliasClausePtr(self.node.stable_ptr(db))
18480    }
18481}
18482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18483pub enum OptionAliasClause<'db> {
18484    Empty(OptionAliasClauseEmpty<'db>),
18485    AliasClause(AliasClause<'db>),
18486}
18487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18488pub struct OptionAliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18489impl<'db> TypedStablePtr<'db> for OptionAliasClausePtr<'db> {
18490    type SyntaxNode = OptionAliasClause<'db>;
18491    fn untyped(self) -> SyntaxStablePtrId<'db> {
18492        self.0
18493    }
18494    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18495        OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18496    }
18497}
18498impl<'db> From<OptionAliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18499    fn from(ptr: OptionAliasClausePtr<'db>) -> Self {
18500        ptr.untyped()
18501    }
18502}
18503impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for OptionAliasClausePtr<'db> {
18504    fn from(value: OptionAliasClauseEmptyPtr<'db>) -> Self {
18505        Self(value.0)
18506    }
18507}
18508impl<'db> From<AliasClausePtr<'db>> for OptionAliasClausePtr<'db> {
18509    fn from(value: AliasClausePtr<'db>) -> Self {
18510        Self(value.0)
18511    }
18512}
18513impl<'db> From<OptionAliasClauseEmptyGreen<'db>> for OptionAliasClauseGreen<'db> {
18514    fn from(value: OptionAliasClauseEmptyGreen<'db>) -> Self {
18515        Self(value.0)
18516    }
18517}
18518impl<'db> From<AliasClauseGreen<'db>> for OptionAliasClauseGreen<'db> {
18519    fn from(value: AliasClauseGreen<'db>) -> Self {
18520        Self(value.0)
18521    }
18522}
18523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18524pub struct OptionAliasClauseGreen<'db>(pub GreenId<'db>);
18525impl<'db> TypedSyntaxNode<'db> for OptionAliasClause<'db> {
18526    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18527    type StablePtr = OptionAliasClausePtr<'db>;
18528    type Green = OptionAliasClauseGreen<'db>;
18529    fn missing(db: &'db dyn Database) -> Self::Green {
18530        panic!("No missing variant.");
18531    }
18532    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18533        let kind = node.kind(db);
18534        match kind {
18535            SyntaxKind::OptionAliasClauseEmpty => {
18536                OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18537            }
18538            SyntaxKind::AliasClause => {
18539                OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18540            }
18541            _ => panic!(
18542                "Unexpected syntax kind {:?} when constructing {}.",
18543                kind, "OptionAliasClause"
18544            ),
18545        }
18546    }
18547    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18548        let kind = node.kind(db);
18549        match kind {
18550            SyntaxKind::OptionAliasClauseEmpty => {
18551                Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18552            }
18553            SyntaxKind::AliasClause => {
18554                Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18555            }
18556            _ => None,
18557        }
18558    }
18559    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18560        match self {
18561            OptionAliasClause::Empty(x) => x.as_syntax_node(),
18562            OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18563        }
18564    }
18565    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18566        OptionAliasClausePtr(self.as_syntax_node().stable_ptr(db))
18567    }
18568}
18569impl<'db> OptionAliasClause<'db> {
18570    /// Checks if a kind of a variant of [OptionAliasClause].
18571    pub fn is_variant(kind: SyntaxKind) -> bool {
18572        matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18573    }
18574}
18575#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18576pub struct OptionAliasClauseEmpty<'db> {
18577    node: SyntaxNode<'db>,
18578}
18579impl<'db> OptionAliasClauseEmpty<'db> {
18580    pub fn new_green(db: &'db dyn Database) -> OptionAliasClauseEmptyGreen<'db> {
18581        let children = [];
18582        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18583        OptionAliasClauseEmptyGreen(
18584            GreenNode {
18585                kind: SyntaxKind::OptionAliasClauseEmpty,
18586                details: GreenNodeDetails::Node { children: children.into(), width },
18587            }
18588            .intern(db),
18589        )
18590    }
18591}
18592impl<'db> OptionAliasClauseEmpty<'db> {}
18593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18594pub struct OptionAliasClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
18595impl<'db> OptionAliasClauseEmptyPtr<'db> {}
18596impl<'db> TypedStablePtr<'db> for OptionAliasClauseEmptyPtr<'db> {
18597    type SyntaxNode = OptionAliasClauseEmpty<'db>;
18598    fn untyped(self) -> SyntaxStablePtrId<'db> {
18599        self.0
18600    }
18601    fn lookup(&self, db: &'db dyn Database) -> OptionAliasClauseEmpty<'db> {
18602        OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18603    }
18604}
18605impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
18606    fn from(ptr: OptionAliasClauseEmptyPtr<'db>) -> Self {
18607        ptr.untyped()
18608    }
18609}
18610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18611pub struct OptionAliasClauseEmptyGreen<'db>(pub GreenId<'db>);
18612impl<'db> TypedSyntaxNode<'db> for OptionAliasClauseEmpty<'db> {
18613    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18614    type StablePtr = OptionAliasClauseEmptyPtr<'db>;
18615    type Green = OptionAliasClauseEmptyGreen<'db>;
18616    fn missing(db: &'db dyn Database) -> Self::Green {
18617        OptionAliasClauseEmptyGreen(
18618            GreenNode {
18619                kind: SyntaxKind::OptionAliasClauseEmpty,
18620                details: GreenNodeDetails::Node {
18621                    children: [].into(),
18622                    width: TextWidth::default(),
18623                },
18624            }
18625            .intern(db),
18626        )
18627    }
18628    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18629        let kind = node.kind(db);
18630        assert_eq!(
18631            kind,
18632            SyntaxKind::OptionAliasClauseEmpty,
18633            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18634            kind,
18635            SyntaxKind::OptionAliasClauseEmpty
18636        );
18637        Self { node }
18638    }
18639    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18640        let kind = node.kind(db);
18641        if kind == SyntaxKind::OptionAliasClauseEmpty {
18642            Some(Self::from_syntax_node(db, node))
18643        } else {
18644            None
18645        }
18646    }
18647    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18648        self.node
18649    }
18650    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18651        OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18652    }
18653}
18654#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18655pub enum GenericArg<'db> {
18656    Unnamed(GenericArgUnnamed<'db>),
18657    Named(GenericArgNamed<'db>),
18658}
18659#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18660pub struct GenericArgPtr<'db>(pub SyntaxStablePtrId<'db>);
18661impl<'db> TypedStablePtr<'db> for GenericArgPtr<'db> {
18662    type SyntaxNode = GenericArg<'db>;
18663    fn untyped(self) -> SyntaxStablePtrId<'db> {
18664        self.0
18665    }
18666    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18667        GenericArg::from_syntax_node(db, self.0.lookup(db))
18668    }
18669}
18670impl<'db> From<GenericArgPtr<'db>> for SyntaxStablePtrId<'db> {
18671    fn from(ptr: GenericArgPtr<'db>) -> Self {
18672        ptr.untyped()
18673    }
18674}
18675impl<'db> From<GenericArgUnnamedPtr<'db>> for GenericArgPtr<'db> {
18676    fn from(value: GenericArgUnnamedPtr<'db>) -> Self {
18677        Self(value.0)
18678    }
18679}
18680impl<'db> From<GenericArgNamedPtr<'db>> for GenericArgPtr<'db> {
18681    fn from(value: GenericArgNamedPtr<'db>) -> Self {
18682        Self(value.0)
18683    }
18684}
18685impl<'db> From<GenericArgUnnamedGreen<'db>> for GenericArgGreen<'db> {
18686    fn from(value: GenericArgUnnamedGreen<'db>) -> Self {
18687        Self(value.0)
18688    }
18689}
18690impl<'db> From<GenericArgNamedGreen<'db>> for GenericArgGreen<'db> {
18691    fn from(value: GenericArgNamedGreen<'db>) -> Self {
18692        Self(value.0)
18693    }
18694}
18695#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18696pub struct GenericArgGreen<'db>(pub GreenId<'db>);
18697impl<'db> TypedSyntaxNode<'db> for GenericArg<'db> {
18698    const OPTIONAL_KIND: Option<SyntaxKind> = None;
18699    type StablePtr = GenericArgPtr<'db>;
18700    type Green = GenericArgGreen<'db>;
18701    fn missing(db: &'db dyn Database) -> Self::Green {
18702        panic!("No missing variant.");
18703    }
18704    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18705        let kind = node.kind(db);
18706        match kind {
18707            SyntaxKind::GenericArgUnnamed => {
18708                GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18709            }
18710            SyntaxKind::GenericArgNamed => {
18711                GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18712            }
18713            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18714        }
18715    }
18716    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18717        let kind = node.kind(db);
18718        match kind {
18719            SyntaxKind::GenericArgUnnamed => {
18720                Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18721            }
18722            SyntaxKind::GenericArgNamed => {
18723                Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18724            }
18725            _ => None,
18726        }
18727    }
18728    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18729        match self {
18730            GenericArg::Unnamed(x) => x.as_syntax_node(),
18731            GenericArg::Named(x) => x.as_syntax_node(),
18732        }
18733    }
18734    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18735        GenericArgPtr(self.as_syntax_node().stable_ptr(db))
18736    }
18737}
18738impl<'db> GenericArg<'db> {
18739    /// Checks if a kind of a variant of [GenericArg].
18740    pub fn is_variant(kind: SyntaxKind) -> bool {
18741        matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
18742    }
18743}
18744#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18745pub struct GenericArgNamed<'db> {
18746    node: SyntaxNode<'db>,
18747}
18748impl<'db> GenericArgNamed<'db> {
18749    pub const INDEX_NAME: usize = 0;
18750    pub const INDEX_COLON: usize = 1;
18751    pub const INDEX_VALUE: usize = 2;
18752    pub fn new_green(
18753        db: &'db dyn Database,
18754        name: TerminalIdentifierGreen<'db>,
18755        colon: TerminalColonGreen<'db>,
18756        value: ExprGreen<'db>,
18757    ) -> GenericArgNamedGreen<'db> {
18758        let children = [name.0, colon.0, value.0];
18759        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18760        GenericArgNamedGreen(
18761            GreenNode {
18762                kind: SyntaxKind::GenericArgNamed,
18763                details: GreenNodeDetails::Node { children: children.into(), width },
18764            }
18765            .intern(db),
18766        )
18767    }
18768}
18769impl<'db> GenericArgNamed<'db> {
18770    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18771        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
18772    }
18773    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
18774        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
18775    }
18776    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
18777        Expr::from_syntax_node(db, self.node.get_children(db)[2])
18778    }
18779}
18780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18781pub struct GenericArgNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18782impl<'db> GenericArgNamedPtr<'db> {}
18783impl<'db> TypedStablePtr<'db> for GenericArgNamedPtr<'db> {
18784    type SyntaxNode = GenericArgNamed<'db>;
18785    fn untyped(self) -> SyntaxStablePtrId<'db> {
18786        self.0
18787    }
18788    fn lookup(&self, db: &'db dyn Database) -> GenericArgNamed<'db> {
18789        GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
18790    }
18791}
18792impl<'db> From<GenericArgNamedPtr<'db>> for SyntaxStablePtrId<'db> {
18793    fn from(ptr: GenericArgNamedPtr<'db>) -> Self {
18794        ptr.untyped()
18795    }
18796}
18797#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18798pub struct GenericArgNamedGreen<'db>(pub GreenId<'db>);
18799impl<'db> TypedSyntaxNode<'db> for GenericArgNamed<'db> {
18800    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
18801    type StablePtr = GenericArgNamedPtr<'db>;
18802    type Green = GenericArgNamedGreen<'db>;
18803    fn missing(db: &'db dyn Database) -> Self::Green {
18804        GenericArgNamedGreen(
18805            GreenNode {
18806                kind: SyntaxKind::GenericArgNamed,
18807                details: GreenNodeDetails::Node {
18808                    children: [
18809                        TerminalIdentifier::missing(db).0,
18810                        TerminalColon::missing(db).0,
18811                        Expr::missing(db).0,
18812                    ]
18813                    .into(),
18814                    width: TextWidth::default(),
18815                },
18816            }
18817            .intern(db),
18818        )
18819    }
18820    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18821        let kind = node.kind(db);
18822        assert_eq!(
18823            kind,
18824            SyntaxKind::GenericArgNamed,
18825            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18826            kind,
18827            SyntaxKind::GenericArgNamed
18828        );
18829        Self { node }
18830    }
18831    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18832        let kind = node.kind(db);
18833        if kind == SyntaxKind::GenericArgNamed {
18834            Some(Self::from_syntax_node(db, node))
18835        } else {
18836            None
18837        }
18838    }
18839    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18840        self.node
18841    }
18842    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18843        GenericArgNamedPtr(self.node.stable_ptr(db))
18844    }
18845}
18846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18847pub struct GenericArgUnnamed<'db> {
18848    node: SyntaxNode<'db>,
18849}
18850impl<'db> GenericArgUnnamed<'db> {
18851    pub const INDEX_VALUE: usize = 0;
18852    pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> GenericArgUnnamedGreen<'db> {
18853        let children = [value.0];
18854        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18855        GenericArgUnnamedGreen(
18856            GreenNode {
18857                kind: SyntaxKind::GenericArgUnnamed,
18858                details: GreenNodeDetails::Node { children: children.into(), width },
18859            }
18860            .intern(db),
18861        )
18862    }
18863}
18864impl<'db> GenericArgUnnamed<'db> {
18865    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
18866        Expr::from_syntax_node(db, self.node.get_children(db)[0])
18867    }
18868}
18869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18870pub struct GenericArgUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18871impl<'db> GenericArgUnnamedPtr<'db> {}
18872impl<'db> TypedStablePtr<'db> for GenericArgUnnamedPtr<'db> {
18873    type SyntaxNode = GenericArgUnnamed<'db>;
18874    fn untyped(self) -> SyntaxStablePtrId<'db> {
18875        self.0
18876    }
18877    fn lookup(&self, db: &'db dyn Database) -> GenericArgUnnamed<'db> {
18878        GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
18879    }
18880}
18881impl<'db> From<GenericArgUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
18882    fn from(ptr: GenericArgUnnamedPtr<'db>) -> Self {
18883        ptr.untyped()
18884    }
18885}
18886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18887pub struct GenericArgUnnamedGreen<'db>(pub GreenId<'db>);
18888impl<'db> TypedSyntaxNode<'db> for GenericArgUnnamed<'db> {
18889    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
18890    type StablePtr = GenericArgUnnamedPtr<'db>;
18891    type Green = GenericArgUnnamedGreen<'db>;
18892    fn missing(db: &'db dyn Database) -> Self::Green {
18893        GenericArgUnnamedGreen(
18894            GreenNode {
18895                kind: SyntaxKind::GenericArgUnnamed,
18896                details: GreenNodeDetails::Node {
18897                    children: [Expr::missing(db).0].into(),
18898                    width: TextWidth::default(),
18899                },
18900            }
18901            .intern(db),
18902        )
18903    }
18904    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18905        let kind = node.kind(db);
18906        assert_eq!(
18907            kind,
18908            SyntaxKind::GenericArgUnnamed,
18909            "Unexpected SyntaxKind {:?}. Expected {:?}.",
18910            kind,
18911            SyntaxKind::GenericArgUnnamed
18912        );
18913        Self { node }
18914    }
18915    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18916        let kind = node.kind(db);
18917        if kind == SyntaxKind::GenericArgUnnamed {
18918            Some(Self::from_syntax_node(db, node))
18919        } else {
18920            None
18921        }
18922    }
18923    fn as_syntax_node(&self) -> SyntaxNode<'db> {
18924        self.node
18925    }
18926    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18927        GenericArgUnnamedPtr(self.node.stable_ptr(db))
18928    }
18929}
18930#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18931pub struct GenericArgs<'db> {
18932    node: SyntaxNode<'db>,
18933}
18934impl<'db> GenericArgs<'db> {
18935    pub const INDEX_LANGLE: usize = 0;
18936    pub const INDEX_GENERIC_ARGS: usize = 1;
18937    pub const INDEX_RANGLE: usize = 2;
18938    pub fn new_green(
18939        db: &'db dyn Database,
18940        langle: TerminalLTGreen<'db>,
18941        generic_args: GenericArgListGreen<'db>,
18942        rangle: TerminalGTGreen<'db>,
18943    ) -> GenericArgsGreen<'db> {
18944        let children = [langle.0, generic_args.0, rangle.0];
18945        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18946        GenericArgsGreen(
18947            GreenNode {
18948                kind: SyntaxKind::GenericArgs,
18949                details: GreenNodeDetails::Node { children: children.into(), width },
18950            }
18951            .intern(db),
18952        )
18953    }
18954}
18955impl<'db> GenericArgs<'db> {
18956    pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
18957        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
18958    }
18959    pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgList<'db> {
18960        GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
18961    }
18962    pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
18963        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
18964    }
18965}
18966#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
18967pub struct GenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
18968impl<'db> GenericArgsPtr<'db> {}
18969impl<'db> TypedStablePtr<'db> for GenericArgsPtr<'db> {
18970    type SyntaxNode = GenericArgs<'db>;
18971    fn untyped(self) -> SyntaxStablePtrId<'db> {
18972        self.0
18973    }
18974    fn lookup(&self, db: &'db dyn Database) -> GenericArgs<'db> {
18975        GenericArgs::from_syntax_node(db, self.0.lookup(db))
18976    }
18977}
18978impl<'db> From<GenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
18979    fn from(ptr: GenericArgsPtr<'db>) -> Self {
18980        ptr.untyped()
18981    }
18982}
18983#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18984pub struct GenericArgsGreen<'db>(pub GreenId<'db>);
18985impl<'db> TypedSyntaxNode<'db> for GenericArgs<'db> {
18986    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
18987    type StablePtr = GenericArgsPtr<'db>;
18988    type Green = GenericArgsGreen<'db>;
18989    fn missing(db: &'db dyn Database) -> Self::Green {
18990        GenericArgsGreen(
18991            GreenNode {
18992                kind: SyntaxKind::GenericArgs,
18993                details: GreenNodeDetails::Node {
18994                    children: [
18995                        TerminalLT::missing(db).0,
18996                        GenericArgList::missing(db).0,
18997                        TerminalGT::missing(db).0,
18998                    ]
18999                    .into(),
19000                    width: TextWidth::default(),
19001                },
19002            }
19003            .intern(db),
19004        )
19005    }
19006    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19007        let kind = node.kind(db);
19008        assert_eq!(
19009            kind,
19010            SyntaxKind::GenericArgs,
19011            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19012            kind,
19013            SyntaxKind::GenericArgs
19014        );
19015        Self { node }
19016    }
19017    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19018        let kind = node.kind(db);
19019        if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19020    }
19021    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19022        self.node
19023    }
19024    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19025        GenericArgsPtr(self.node.stable_ptr(db))
19026    }
19027}
19028#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19029pub struct GenericArgList<'db>(ElementList<'db, GenericArg<'db>, 2>);
19030impl<'db> Deref for GenericArgList<'db> {
19031    type Target = ElementList<'db, GenericArg<'db>, 2>;
19032    fn deref(&self) -> &Self::Target {
19033        &self.0
19034    }
19035}
19036impl<'db> GenericArgList<'db> {
19037    pub fn new_green(
19038        db: &'db dyn Database,
19039        children: &[GenericArgListElementOrSeparatorGreen<'db>],
19040    ) -> GenericArgListGreen<'db> {
19041        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19042        GenericArgListGreen(
19043            GreenNode {
19044                kind: SyntaxKind::GenericArgList,
19045                details: GreenNodeDetails::Node {
19046                    children: children.iter().map(|x| x.id()).collect(),
19047                    width,
19048                },
19049            }
19050            .intern(db),
19051        )
19052    }
19053}
19054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19055pub struct GenericArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
19056impl<'db> TypedStablePtr<'db> for GenericArgListPtr<'db> {
19057    type SyntaxNode = GenericArgList<'db>;
19058    fn untyped(self) -> SyntaxStablePtrId<'db> {
19059        self.0
19060    }
19061    fn lookup(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19062        GenericArgList::from_syntax_node(db, self.0.lookup(db))
19063    }
19064}
19065impl<'db> From<GenericArgListPtr<'db>> for SyntaxStablePtrId<'db> {
19066    fn from(ptr: GenericArgListPtr<'db>) -> Self {
19067        ptr.untyped()
19068    }
19069}
19070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19071pub enum GenericArgListElementOrSeparatorGreen<'db> {
19072    Separator(TerminalCommaGreen<'db>),
19073    Element(GenericArgGreen<'db>),
19074}
19075impl<'db> From<TerminalCommaGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19076    fn from(value: TerminalCommaGreen<'db>) -> Self {
19077        GenericArgListElementOrSeparatorGreen::Separator(value)
19078    }
19079}
19080impl<'db> From<GenericArgGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19081    fn from(value: GenericArgGreen<'db>) -> Self {
19082        GenericArgListElementOrSeparatorGreen::Element(value)
19083    }
19084}
19085impl<'db> GenericArgListElementOrSeparatorGreen<'db> {
19086    fn id(&self) -> GreenId<'db> {
19087        match self {
19088            GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19089            GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19090        }
19091    }
19092}
19093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19094pub struct GenericArgListGreen<'db>(pub GreenId<'db>);
19095impl<'db> TypedSyntaxNode<'db> for GenericArgList<'db> {
19096    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19097    type StablePtr = GenericArgListPtr<'db>;
19098    type Green = GenericArgListGreen<'db>;
19099    fn missing(db: &'db dyn Database) -> Self::Green {
19100        GenericArgListGreen(
19101            GreenNode {
19102                kind: SyntaxKind::GenericArgList,
19103                details: GreenNodeDetails::Node {
19104                    children: [].into(),
19105                    width: TextWidth::default(),
19106                },
19107            }
19108            .intern(db),
19109        )
19110    }
19111    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19112        Self(ElementList::new(node))
19113    }
19114    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19115        if node.kind(db) == SyntaxKind::GenericArgList {
19116            Some(Self(ElementList::new(node)))
19117        } else {
19118            None
19119        }
19120    }
19121    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19122        self.node
19123    }
19124    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19125        GenericArgListPtr(self.node.stable_ptr(db))
19126    }
19127}
19128#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19129pub struct AssociatedItemConstraint<'db> {
19130    node: SyntaxNode<'db>,
19131}
19132impl<'db> AssociatedItemConstraint<'db> {
19133    pub const INDEX_ITEM: usize = 0;
19134    pub const INDEX_COLON: usize = 1;
19135    pub const INDEX_VALUE: usize = 2;
19136    pub fn new_green(
19137        db: &'db dyn Database,
19138        item: TerminalIdentifierGreen<'db>,
19139        colon: TerminalColonGreen<'db>,
19140        value: ExprGreen<'db>,
19141    ) -> AssociatedItemConstraintGreen<'db> {
19142        let children = [item.0, colon.0, value.0];
19143        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19144        AssociatedItemConstraintGreen(
19145            GreenNode {
19146                kind: SyntaxKind::AssociatedItemConstraint,
19147                details: GreenNodeDetails::Node { children: children.into(), width },
19148            }
19149            .intern(db),
19150        )
19151    }
19152}
19153impl<'db> AssociatedItemConstraint<'db> {
19154    pub fn item(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
19155        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19156    }
19157    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
19158        TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19159    }
19160    pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
19161        Expr::from_syntax_node(db, self.node.get_children(db)[2])
19162    }
19163}
19164#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19165pub struct AssociatedItemConstraintPtr<'db>(pub SyntaxStablePtrId<'db>);
19166impl<'db> AssociatedItemConstraintPtr<'db> {}
19167impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintPtr<'db> {
19168    type SyntaxNode = AssociatedItemConstraint<'db>;
19169    fn untyped(self) -> SyntaxStablePtrId<'db> {
19170        self.0
19171    }
19172    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraint<'db> {
19173        AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19174    }
19175}
19176impl<'db> From<AssociatedItemConstraintPtr<'db>> for SyntaxStablePtrId<'db> {
19177    fn from(ptr: AssociatedItemConstraintPtr<'db>) -> Self {
19178        ptr.untyped()
19179    }
19180}
19181#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19182pub struct AssociatedItemConstraintGreen<'db>(pub GreenId<'db>);
19183impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraint<'db> {
19184    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19185    type StablePtr = AssociatedItemConstraintPtr<'db>;
19186    type Green = AssociatedItemConstraintGreen<'db>;
19187    fn missing(db: &'db dyn Database) -> Self::Green {
19188        AssociatedItemConstraintGreen(
19189            GreenNode {
19190                kind: SyntaxKind::AssociatedItemConstraint,
19191                details: GreenNodeDetails::Node {
19192                    children: [
19193                        TerminalIdentifier::missing(db).0,
19194                        TerminalColon::missing(db).0,
19195                        Expr::missing(db).0,
19196                    ]
19197                    .into(),
19198                    width: TextWidth::default(),
19199                },
19200            }
19201            .intern(db),
19202        )
19203    }
19204    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19205        let kind = node.kind(db);
19206        assert_eq!(
19207            kind,
19208            SyntaxKind::AssociatedItemConstraint,
19209            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19210            kind,
19211            SyntaxKind::AssociatedItemConstraint
19212        );
19213        Self { node }
19214    }
19215    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19216        let kind = node.kind(db);
19217        if kind == SyntaxKind::AssociatedItemConstraint {
19218            Some(Self::from_syntax_node(db, node))
19219        } else {
19220            None
19221        }
19222    }
19223    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19224        self.node
19225    }
19226    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19227        AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19228    }
19229}
19230#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19231pub struct AssociatedItemConstraints<'db> {
19232    node: SyntaxNode<'db>,
19233}
19234impl<'db> AssociatedItemConstraints<'db> {
19235    pub const INDEX_LBRACK: usize = 0;
19236    pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19237    pub const INDEX_RBRACK: usize = 2;
19238    pub fn new_green(
19239        db: &'db dyn Database,
19240        lbrack: TerminalLBrackGreen<'db>,
19241        associated_item_constraints: AssociatedItemConstraintListGreen<'db>,
19242        rbrack: TerminalRBrackGreen<'db>,
19243    ) -> AssociatedItemConstraintsGreen<'db> {
19244        let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19245        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19246        AssociatedItemConstraintsGreen(
19247            GreenNode {
19248                kind: SyntaxKind::AssociatedItemConstraints,
19249                details: GreenNodeDetails::Node { children: children.into(), width },
19250            }
19251            .intern(db),
19252        )
19253    }
19254}
19255impl<'db> AssociatedItemConstraints<'db> {
19256    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
19257        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19258    }
19259    pub fn associated_item_constraints(
19260        &self,
19261        db: &'db dyn Database,
19262    ) -> AssociatedItemConstraintList<'db> {
19263        AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19264    }
19265    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
19266        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19267    }
19268}
19269#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19270pub struct AssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19271impl<'db> AssociatedItemConstraintsPtr<'db> {}
19272impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintsPtr<'db> {
19273    type SyntaxNode = AssociatedItemConstraints<'db>;
19274    fn untyped(self) -> SyntaxStablePtrId<'db> {
19275        self.0
19276    }
19277    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraints<'db> {
19278        AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19279    }
19280}
19281impl<'db> From<AssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19282    fn from(ptr: AssociatedItemConstraintsPtr<'db>) -> Self {
19283        ptr.untyped()
19284    }
19285}
19286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19287pub struct AssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19288impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraints<'db> {
19289    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19290    type StablePtr = AssociatedItemConstraintsPtr<'db>;
19291    type Green = AssociatedItemConstraintsGreen<'db>;
19292    fn missing(db: &'db dyn Database) -> Self::Green {
19293        AssociatedItemConstraintsGreen(
19294            GreenNode {
19295                kind: SyntaxKind::AssociatedItemConstraints,
19296                details: GreenNodeDetails::Node {
19297                    children: [
19298                        TerminalLBrack::missing(db).0,
19299                        AssociatedItemConstraintList::missing(db).0,
19300                        TerminalRBrack::missing(db).0,
19301                    ]
19302                    .into(),
19303                    width: TextWidth::default(),
19304                },
19305            }
19306            .intern(db),
19307        )
19308    }
19309    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19310        let kind = node.kind(db);
19311        assert_eq!(
19312            kind,
19313            SyntaxKind::AssociatedItemConstraints,
19314            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19315            kind,
19316            SyntaxKind::AssociatedItemConstraints
19317        );
19318        Self { node }
19319    }
19320    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19321        let kind = node.kind(db);
19322        if kind == SyntaxKind::AssociatedItemConstraints {
19323            Some(Self::from_syntax_node(db, node))
19324        } else {
19325            None
19326        }
19327    }
19328    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19329        self.node
19330    }
19331    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19332        AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19333    }
19334}
19335#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19336pub struct AssociatedItemConstraintList<'db>(ElementList<'db, AssociatedItemConstraint<'db>, 2>);
19337impl<'db> Deref for AssociatedItemConstraintList<'db> {
19338    type Target = ElementList<'db, AssociatedItemConstraint<'db>, 2>;
19339    fn deref(&self) -> &Self::Target {
19340        &self.0
19341    }
19342}
19343impl<'db> AssociatedItemConstraintList<'db> {
19344    pub fn new_green(
19345        db: &'db dyn Database,
19346        children: &[AssociatedItemConstraintListElementOrSeparatorGreen<'db>],
19347    ) -> AssociatedItemConstraintListGreen<'db> {
19348        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19349        AssociatedItemConstraintListGreen(
19350            GreenNode {
19351                kind: SyntaxKind::AssociatedItemConstraintList,
19352                details: GreenNodeDetails::Node {
19353                    children: children.iter().map(|x| x.id()).collect(),
19354                    width,
19355                },
19356            }
19357            .intern(db),
19358        )
19359    }
19360}
19361#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19362pub struct AssociatedItemConstraintListPtr<'db>(pub SyntaxStablePtrId<'db>);
19363impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintListPtr<'db> {
19364    type SyntaxNode = AssociatedItemConstraintList<'db>;
19365    fn untyped(self) -> SyntaxStablePtrId<'db> {
19366        self.0
19367    }
19368    fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraintList<'db> {
19369        AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19370    }
19371}
19372impl<'db> From<AssociatedItemConstraintListPtr<'db>> for SyntaxStablePtrId<'db> {
19373    fn from(ptr: AssociatedItemConstraintListPtr<'db>) -> Self {
19374        ptr.untyped()
19375    }
19376}
19377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19378pub enum AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19379    Separator(TerminalCommaGreen<'db>),
19380    Element(AssociatedItemConstraintGreen<'db>),
19381}
19382impl<'db> From<TerminalCommaGreen<'db>>
19383    for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19384{
19385    fn from(value: TerminalCommaGreen<'db>) -> Self {
19386        AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19387    }
19388}
19389impl<'db> From<AssociatedItemConstraintGreen<'db>>
19390    for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19391{
19392    fn from(value: AssociatedItemConstraintGreen<'db>) -> Self {
19393        AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19394    }
19395}
19396impl<'db> AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19397    fn id(&self) -> GreenId<'db> {
19398        match self {
19399            AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19400            AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19401        }
19402    }
19403}
19404#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19405pub struct AssociatedItemConstraintListGreen<'db>(pub GreenId<'db>);
19406impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraintList<'db> {
19407    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19408    type StablePtr = AssociatedItemConstraintListPtr<'db>;
19409    type Green = AssociatedItemConstraintListGreen<'db>;
19410    fn missing(db: &'db dyn Database) -> Self::Green {
19411        AssociatedItemConstraintListGreen(
19412            GreenNode {
19413                kind: SyntaxKind::AssociatedItemConstraintList,
19414                details: GreenNodeDetails::Node {
19415                    children: [].into(),
19416                    width: TextWidth::default(),
19417                },
19418            }
19419            .intern(db),
19420        )
19421    }
19422    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19423        Self(ElementList::new(node))
19424    }
19425    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19426        if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19427            Some(Self(ElementList::new(node)))
19428        } else {
19429            None
19430        }
19431    }
19432    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19433        self.node
19434    }
19435    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19436        AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19437    }
19438}
19439#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19440pub enum OptionAssociatedItemConstraints<'db> {
19441    Empty(OptionAssociatedItemConstraintsEmpty<'db>),
19442    AssociatedItemConstraints(AssociatedItemConstraints<'db>),
19443}
19444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19445pub struct OptionAssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19446impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsPtr<'db> {
19447    type SyntaxNode = OptionAssociatedItemConstraints<'db>;
19448    fn untyped(self) -> SyntaxStablePtrId<'db> {
19449        self.0
19450    }
19451    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19452        OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19453    }
19454}
19455impl<'db> From<OptionAssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19456    fn from(ptr: OptionAssociatedItemConstraintsPtr<'db>) -> Self {
19457        ptr.untyped()
19458    }
19459}
19460impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>>
19461    for OptionAssociatedItemConstraintsPtr<'db>
19462{
19463    fn from(value: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19464        Self(value.0)
19465    }
19466}
19467impl<'db> From<AssociatedItemConstraintsPtr<'db>> for OptionAssociatedItemConstraintsPtr<'db> {
19468    fn from(value: AssociatedItemConstraintsPtr<'db>) -> Self {
19469        Self(value.0)
19470    }
19471}
19472impl<'db> From<OptionAssociatedItemConstraintsEmptyGreen<'db>>
19473    for OptionAssociatedItemConstraintsGreen<'db>
19474{
19475    fn from(value: OptionAssociatedItemConstraintsEmptyGreen<'db>) -> Self {
19476        Self(value.0)
19477    }
19478}
19479impl<'db> From<AssociatedItemConstraintsGreen<'db>> for OptionAssociatedItemConstraintsGreen<'db> {
19480    fn from(value: AssociatedItemConstraintsGreen<'db>) -> Self {
19481        Self(value.0)
19482    }
19483}
19484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19485pub struct OptionAssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19486impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraints<'db> {
19487    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19488    type StablePtr = OptionAssociatedItemConstraintsPtr<'db>;
19489    type Green = OptionAssociatedItemConstraintsGreen<'db>;
19490    fn missing(db: &'db dyn Database) -> Self::Green {
19491        panic!("No missing variant.");
19492    }
19493    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19494        let kind = node.kind(db);
19495        match kind {
19496            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19497                OptionAssociatedItemConstraints::Empty(
19498                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19499                )
19500            }
19501            SyntaxKind::AssociatedItemConstraints => {
19502                OptionAssociatedItemConstraints::AssociatedItemConstraints(
19503                    AssociatedItemConstraints::from_syntax_node(db, node),
19504                )
19505            }
19506            _ => panic!(
19507                "Unexpected syntax kind {:?} when constructing {}.",
19508                kind, "OptionAssociatedItemConstraints"
19509            ),
19510        }
19511    }
19512    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19513        let kind = node.kind(db);
19514        match kind {
19515            SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19516                Some(OptionAssociatedItemConstraints::Empty(
19517                    OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19518                ))
19519            }
19520            SyntaxKind::AssociatedItemConstraints => {
19521                Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19522                    AssociatedItemConstraints::from_syntax_node(db, node),
19523                ))
19524            }
19525            _ => None,
19526        }
19527    }
19528    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19529        match self {
19530            OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19531            OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19532        }
19533    }
19534    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19535        OptionAssociatedItemConstraintsPtr(self.as_syntax_node().stable_ptr(db))
19536    }
19537}
19538impl<'db> OptionAssociatedItemConstraints<'db> {
19539    /// Checks if a kind of a variant of [OptionAssociatedItemConstraints].
19540    pub fn is_variant(kind: SyntaxKind) -> bool {
19541        matches!(
19542            kind,
19543            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19544                | SyntaxKind::AssociatedItemConstraints
19545        )
19546    }
19547}
19548#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19549pub struct OptionAssociatedItemConstraintsEmpty<'db> {
19550    node: SyntaxNode<'db>,
19551}
19552impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {
19553    pub fn new_green(db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmptyGreen<'db> {
19554        let children = [];
19555        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19556        OptionAssociatedItemConstraintsEmptyGreen(
19557            GreenNode {
19558                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19559                details: GreenNodeDetails::Node { children: children.into(), width },
19560            }
19561            .intern(db),
19562        )
19563    }
19564}
19565impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {}
19566#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19567pub struct OptionAssociatedItemConstraintsEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19568impl<'db> OptionAssociatedItemConstraintsEmptyPtr<'db> {}
19569impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsEmptyPtr<'db> {
19570    type SyntaxNode = OptionAssociatedItemConstraintsEmpty<'db>;
19571    fn untyped(self) -> SyntaxStablePtrId<'db> {
19572        self.0
19573    }
19574    fn lookup(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmpty<'db> {
19575        OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
19576    }
19577}
19578impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19579    fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19580        ptr.untyped()
19581    }
19582}
19583#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19584pub struct OptionAssociatedItemConstraintsEmptyGreen<'db>(pub GreenId<'db>);
19585impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraintsEmpty<'db> {
19586    const OPTIONAL_KIND: Option<SyntaxKind> =
19587        Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
19588    type StablePtr = OptionAssociatedItemConstraintsEmptyPtr<'db>;
19589    type Green = OptionAssociatedItemConstraintsEmptyGreen<'db>;
19590    fn missing(db: &'db dyn Database) -> Self::Green {
19591        OptionAssociatedItemConstraintsEmptyGreen(
19592            GreenNode {
19593                kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19594                details: GreenNodeDetails::Node {
19595                    children: [].into(),
19596                    width: TextWidth::default(),
19597                },
19598            }
19599            .intern(db),
19600        )
19601    }
19602    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19603        let kind = node.kind(db);
19604        assert_eq!(
19605            kind,
19606            SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19607            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19608            kind,
19609            SyntaxKind::OptionAssociatedItemConstraintsEmpty
19610        );
19611        Self { node }
19612    }
19613    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19614        let kind = node.kind(db);
19615        if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
19616            Some(Self::from_syntax_node(db, node))
19617        } else {
19618            None
19619        }
19620    }
19621    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19622        self.node
19623    }
19624    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19625        OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
19626    }
19627}
19628#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19629pub enum OptionWrappedGenericParamList<'db> {
19630    Empty(OptionWrappedGenericParamListEmpty<'db>),
19631    WrappedGenericParamList(WrappedGenericParamList<'db>),
19632}
19633#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19634pub struct OptionWrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19635impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListPtr<'db> {
19636    type SyntaxNode = OptionWrappedGenericParamList<'db>;
19637    fn untyped(self) -> SyntaxStablePtrId<'db> {
19638        self.0
19639    }
19640    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19641        OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
19642    }
19643}
19644impl<'db> From<OptionWrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19645    fn from(ptr: OptionWrappedGenericParamListPtr<'db>) -> Self {
19646        ptr.untyped()
19647    }
19648}
19649impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>>
19650    for OptionWrappedGenericParamListPtr<'db>
19651{
19652    fn from(value: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
19653        Self(value.0)
19654    }
19655}
19656impl<'db> From<WrappedGenericParamListPtr<'db>> for OptionWrappedGenericParamListPtr<'db> {
19657    fn from(value: WrappedGenericParamListPtr<'db>) -> Self {
19658        Self(value.0)
19659    }
19660}
19661impl<'db> From<OptionWrappedGenericParamListEmptyGreen<'db>>
19662    for OptionWrappedGenericParamListGreen<'db>
19663{
19664    fn from(value: OptionWrappedGenericParamListEmptyGreen<'db>) -> Self {
19665        Self(value.0)
19666    }
19667}
19668impl<'db> From<WrappedGenericParamListGreen<'db>> for OptionWrappedGenericParamListGreen<'db> {
19669    fn from(value: WrappedGenericParamListGreen<'db>) -> Self {
19670        Self(value.0)
19671    }
19672}
19673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19674pub struct OptionWrappedGenericParamListGreen<'db>(pub GreenId<'db>);
19675impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamList<'db> {
19676    const OPTIONAL_KIND: Option<SyntaxKind> = None;
19677    type StablePtr = OptionWrappedGenericParamListPtr<'db>;
19678    type Green = OptionWrappedGenericParamListGreen<'db>;
19679    fn missing(db: &'db dyn Database) -> Self::Green {
19680        panic!("No missing variant.");
19681    }
19682    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19683        let kind = node.kind(db);
19684        match kind {
19685            SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
19686                OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19687            ),
19688            SyntaxKind::WrappedGenericParamList => {
19689                OptionWrappedGenericParamList::WrappedGenericParamList(
19690                    WrappedGenericParamList::from_syntax_node(db, node),
19691                )
19692            }
19693            _ => panic!(
19694                "Unexpected syntax kind {:?} when constructing {}.",
19695                kind, "OptionWrappedGenericParamList"
19696            ),
19697        }
19698    }
19699    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19700        let kind = node.kind(db);
19701        match kind {
19702            SyntaxKind::OptionWrappedGenericParamListEmpty => {
19703                Some(OptionWrappedGenericParamList::Empty(
19704                    OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19705                ))
19706            }
19707            SyntaxKind::WrappedGenericParamList => {
19708                Some(OptionWrappedGenericParamList::WrappedGenericParamList(
19709                    WrappedGenericParamList::from_syntax_node(db, node),
19710                ))
19711            }
19712            _ => None,
19713        }
19714    }
19715    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19716        match self {
19717            OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
19718            OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
19719        }
19720    }
19721    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19722        OptionWrappedGenericParamListPtr(self.as_syntax_node().stable_ptr(db))
19723    }
19724}
19725impl<'db> OptionWrappedGenericParamList<'db> {
19726    /// Checks if a kind of a variant of [OptionWrappedGenericParamList].
19727    pub fn is_variant(kind: SyntaxKind) -> bool {
19728        matches!(
19729            kind,
19730            SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
19731        )
19732    }
19733}
19734#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19735pub struct OptionWrappedGenericParamListEmpty<'db> {
19736    node: SyntaxNode<'db>,
19737}
19738impl<'db> OptionWrappedGenericParamListEmpty<'db> {
19739    pub fn new_green(db: &'db dyn Database) -> OptionWrappedGenericParamListEmptyGreen<'db> {
19740        let children = [];
19741        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19742        OptionWrappedGenericParamListEmptyGreen(
19743            GreenNode {
19744                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
19745                details: GreenNodeDetails::Node { children: children.into(), width },
19746            }
19747            .intern(db),
19748        )
19749    }
19750}
19751impl<'db> OptionWrappedGenericParamListEmpty<'db> {}
19752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19753pub struct OptionWrappedGenericParamListEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19754impl<'db> OptionWrappedGenericParamListEmptyPtr<'db> {}
19755impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListEmptyPtr<'db> {
19756    type SyntaxNode = OptionWrappedGenericParamListEmpty<'db>;
19757    fn untyped(self) -> SyntaxStablePtrId<'db> {
19758        self.0
19759    }
19760    fn lookup(&self, db: &'db dyn Database) -> OptionWrappedGenericParamListEmpty<'db> {
19761        OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
19762    }
19763}
19764impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19765    fn from(ptr: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
19766        ptr.untyped()
19767    }
19768}
19769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19770pub struct OptionWrappedGenericParamListEmptyGreen<'db>(pub GreenId<'db>);
19771impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamListEmpty<'db> {
19772    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
19773    type StablePtr = OptionWrappedGenericParamListEmptyPtr<'db>;
19774    type Green = OptionWrappedGenericParamListEmptyGreen<'db>;
19775    fn missing(db: &'db dyn Database) -> Self::Green {
19776        OptionWrappedGenericParamListEmptyGreen(
19777            GreenNode {
19778                kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
19779                details: GreenNodeDetails::Node {
19780                    children: [].into(),
19781                    width: TextWidth::default(),
19782                },
19783            }
19784            .intern(db),
19785        )
19786    }
19787    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19788        let kind = node.kind(db);
19789        assert_eq!(
19790            kind,
19791            SyntaxKind::OptionWrappedGenericParamListEmpty,
19792            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19793            kind,
19794            SyntaxKind::OptionWrappedGenericParamListEmpty
19795        );
19796        Self { node }
19797    }
19798    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19799        let kind = node.kind(db);
19800        if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
19801            Some(Self::from_syntax_node(db, node))
19802        } else {
19803            None
19804        }
19805    }
19806    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19807        self.node
19808    }
19809    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19810        OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
19811    }
19812}
19813#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19814pub struct WrappedGenericParamList<'db> {
19815    node: SyntaxNode<'db>,
19816}
19817impl<'db> WrappedGenericParamList<'db> {
19818    pub const INDEX_LANGLE: usize = 0;
19819    pub const INDEX_GENERIC_PARAMS: usize = 1;
19820    pub const INDEX_RANGLE: usize = 2;
19821    pub fn new_green(
19822        db: &'db dyn Database,
19823        langle: TerminalLTGreen<'db>,
19824        generic_params: GenericParamListGreen<'db>,
19825        rangle: TerminalGTGreen<'db>,
19826    ) -> WrappedGenericParamListGreen<'db> {
19827        let children = [langle.0, generic_params.0, rangle.0];
19828        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19829        WrappedGenericParamListGreen(
19830            GreenNode {
19831                kind: SyntaxKind::WrappedGenericParamList,
19832                details: GreenNodeDetails::Node { children: children.into(), width },
19833            }
19834            .intern(db),
19835        )
19836    }
19837}
19838impl<'db> WrappedGenericParamList<'db> {
19839    pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
19840        TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19841    }
19842    pub fn generic_params(&self, db: &'db dyn Database) -> GenericParamList<'db> {
19843        GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
19844    }
19845    pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
19846        TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19847    }
19848}
19849#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19850pub struct WrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19851impl<'db> WrappedGenericParamListPtr<'db> {}
19852impl<'db> TypedStablePtr<'db> for WrappedGenericParamListPtr<'db> {
19853    type SyntaxNode = WrappedGenericParamList<'db>;
19854    fn untyped(self) -> SyntaxStablePtrId<'db> {
19855        self.0
19856    }
19857    fn lookup(&self, db: &'db dyn Database) -> WrappedGenericParamList<'db> {
19858        WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
19859    }
19860}
19861impl<'db> From<WrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19862    fn from(ptr: WrappedGenericParamListPtr<'db>) -> Self {
19863        ptr.untyped()
19864    }
19865}
19866#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19867pub struct WrappedGenericParamListGreen<'db>(pub GreenId<'db>);
19868impl<'db> TypedSyntaxNode<'db> for WrappedGenericParamList<'db> {
19869    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
19870    type StablePtr = WrappedGenericParamListPtr<'db>;
19871    type Green = WrappedGenericParamListGreen<'db>;
19872    fn missing(db: &'db dyn Database) -> Self::Green {
19873        WrappedGenericParamListGreen(
19874            GreenNode {
19875                kind: SyntaxKind::WrappedGenericParamList,
19876                details: GreenNodeDetails::Node {
19877                    children: [
19878                        TerminalLT::missing(db).0,
19879                        GenericParamList::missing(db).0,
19880                        TerminalGT::missing(db).0,
19881                    ]
19882                    .into(),
19883                    width: TextWidth::default(),
19884                },
19885            }
19886            .intern(db),
19887        )
19888    }
19889    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19890        let kind = node.kind(db);
19891        assert_eq!(
19892            kind,
19893            SyntaxKind::WrappedGenericParamList,
19894            "Unexpected SyntaxKind {:?}. Expected {:?}.",
19895            kind,
19896            SyntaxKind::WrappedGenericParamList
19897        );
19898        Self { node }
19899    }
19900    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19901        let kind = node.kind(db);
19902        if kind == SyntaxKind::WrappedGenericParamList {
19903            Some(Self::from_syntax_node(db, node))
19904        } else {
19905            None
19906        }
19907    }
19908    fn as_syntax_node(&self) -> SyntaxNode<'db> {
19909        self.node
19910    }
19911    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19912        WrappedGenericParamListPtr(self.node.stable_ptr(db))
19913    }
19914}
19915#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19916pub struct GenericParamList<'db>(ElementList<'db, GenericParam<'db>, 2>);
19917impl<'db> Deref for GenericParamList<'db> {
19918    type Target = ElementList<'db, GenericParam<'db>, 2>;
19919    fn deref(&self) -> &Self::Target {
19920        &self.0
19921    }
19922}
19923impl<'db> GenericParamList<'db> {
19924    pub fn new_green(
19925        db: &'db dyn Database,
19926        children: &[GenericParamListElementOrSeparatorGreen<'db>],
19927    ) -> GenericParamListGreen<'db> {
19928        let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19929        GenericParamListGreen(
19930            GreenNode {
19931                kind: SyntaxKind::GenericParamList,
19932                details: GreenNodeDetails::Node {
19933                    children: children.iter().map(|x| x.id()).collect(),
19934                    width,
19935                },
19936            }
19937            .intern(db),
19938        )
19939    }
19940}
19941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
19942pub struct GenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19943impl<'db> TypedStablePtr<'db> for GenericParamListPtr<'db> {
19944    type SyntaxNode = GenericParamList<'db>;
19945    fn untyped(self) -> SyntaxStablePtrId<'db> {
19946        self.0
19947    }
19948    fn lookup(&self, db: &'db dyn Database) -> GenericParamList<'db> {
19949        GenericParamList::from_syntax_node(db, self.0.lookup(db))
19950    }
19951}
19952impl<'db> From<GenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19953    fn from(ptr: GenericParamListPtr<'db>) -> Self {
19954        ptr.untyped()
19955    }
19956}
19957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19958pub enum GenericParamListElementOrSeparatorGreen<'db> {
19959    Separator(TerminalCommaGreen<'db>),
19960    Element(GenericParamGreen<'db>),
19961}
19962impl<'db> From<TerminalCommaGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
19963    fn from(value: TerminalCommaGreen<'db>) -> Self {
19964        GenericParamListElementOrSeparatorGreen::Separator(value)
19965    }
19966}
19967impl<'db> From<GenericParamGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
19968    fn from(value: GenericParamGreen<'db>) -> Self {
19969        GenericParamListElementOrSeparatorGreen::Element(value)
19970    }
19971}
19972impl<'db> GenericParamListElementOrSeparatorGreen<'db> {
19973    fn id(&self) -> GreenId<'db> {
19974        match self {
19975            GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
19976            GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
19977        }
19978    }
19979}
19980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19981pub struct GenericParamListGreen<'db>(pub GreenId<'db>);
19982impl<'db> TypedSyntaxNode<'db> for GenericParamList<'db> {
19983    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
19984    type StablePtr = GenericParamListPtr<'db>;
19985    type Green = GenericParamListGreen<'db>;
19986    fn missing(db: &'db dyn Database) -> Self::Green {
19987        GenericParamListGreen(
19988            GreenNode {
19989                kind: SyntaxKind::GenericParamList,
19990                details: GreenNodeDetails::Node {
19991                    children: [].into(),
19992                    width: TextWidth::default(),
19993                },
19994            }
19995            .intern(db),
19996        )
19997    }
19998    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19999        Self(ElementList::new(node))
20000    }
20001    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20002        if node.kind(db) == SyntaxKind::GenericParamList {
20003            Some(Self(ElementList::new(node)))
20004        } else {
20005            None
20006        }
20007    }
20008    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20009        self.node
20010    }
20011    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20012        GenericParamListPtr(self.node.stable_ptr(db))
20013    }
20014}
20015#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20016pub enum GenericParam<'db> {
20017    Type(GenericParamType<'db>),
20018    Const(GenericParamConst<'db>),
20019    ImplNamed(GenericParamImplNamed<'db>),
20020    ImplAnonymous(GenericParamImplAnonymous<'db>),
20021    NegativeImpl(GenericParamNegativeImpl<'db>),
20022}
20023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20024pub struct GenericParamPtr<'db>(pub SyntaxStablePtrId<'db>);
20025impl<'db> TypedStablePtr<'db> for GenericParamPtr<'db> {
20026    type SyntaxNode = GenericParam<'db>;
20027    fn untyped(self) -> SyntaxStablePtrId<'db> {
20028        self.0
20029    }
20030    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20031        GenericParam::from_syntax_node(db, self.0.lookup(db))
20032    }
20033}
20034impl<'db> From<GenericParamPtr<'db>> for SyntaxStablePtrId<'db> {
20035    fn from(ptr: GenericParamPtr<'db>) -> Self {
20036        ptr.untyped()
20037    }
20038}
20039impl<'db> From<GenericParamTypePtr<'db>> for GenericParamPtr<'db> {
20040    fn from(value: GenericParamTypePtr<'db>) -> Self {
20041        Self(value.0)
20042    }
20043}
20044impl<'db> From<GenericParamConstPtr<'db>> for GenericParamPtr<'db> {
20045    fn from(value: GenericParamConstPtr<'db>) -> Self {
20046        Self(value.0)
20047    }
20048}
20049impl<'db> From<GenericParamImplNamedPtr<'db>> for GenericParamPtr<'db> {
20050    fn from(value: GenericParamImplNamedPtr<'db>) -> Self {
20051        Self(value.0)
20052    }
20053}
20054impl<'db> From<GenericParamImplAnonymousPtr<'db>> for GenericParamPtr<'db> {
20055    fn from(value: GenericParamImplAnonymousPtr<'db>) -> Self {
20056        Self(value.0)
20057    }
20058}
20059impl<'db> From<GenericParamNegativeImplPtr<'db>> for GenericParamPtr<'db> {
20060    fn from(value: GenericParamNegativeImplPtr<'db>) -> Self {
20061        Self(value.0)
20062    }
20063}
20064impl<'db> From<GenericParamTypeGreen<'db>> for GenericParamGreen<'db> {
20065    fn from(value: GenericParamTypeGreen<'db>) -> Self {
20066        Self(value.0)
20067    }
20068}
20069impl<'db> From<GenericParamConstGreen<'db>> for GenericParamGreen<'db> {
20070    fn from(value: GenericParamConstGreen<'db>) -> Self {
20071        Self(value.0)
20072    }
20073}
20074impl<'db> From<GenericParamImplNamedGreen<'db>> for GenericParamGreen<'db> {
20075    fn from(value: GenericParamImplNamedGreen<'db>) -> Self {
20076        Self(value.0)
20077    }
20078}
20079impl<'db> From<GenericParamImplAnonymousGreen<'db>> for GenericParamGreen<'db> {
20080    fn from(value: GenericParamImplAnonymousGreen<'db>) -> Self {
20081        Self(value.0)
20082    }
20083}
20084impl<'db> From<GenericParamNegativeImplGreen<'db>> for GenericParamGreen<'db> {
20085    fn from(value: GenericParamNegativeImplGreen<'db>) -> Self {
20086        Self(value.0)
20087    }
20088}
20089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20090pub struct GenericParamGreen<'db>(pub GreenId<'db>);
20091impl<'db> TypedSyntaxNode<'db> for GenericParam<'db> {
20092    const OPTIONAL_KIND: Option<SyntaxKind> = None;
20093    type StablePtr = GenericParamPtr<'db>;
20094    type Green = GenericParamGreen<'db>;
20095    fn missing(db: &'db dyn Database) -> Self::Green {
20096        panic!("No missing variant.");
20097    }
20098    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20099        let kind = node.kind(db);
20100        match kind {
20101            SyntaxKind::GenericParamType => {
20102                GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20103            }
20104            SyntaxKind::GenericParamConst => {
20105                GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20106            }
20107            SyntaxKind::GenericParamImplNamed => {
20108                GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20109            }
20110            SyntaxKind::GenericParamImplAnonymous => {
20111                GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20112            }
20113            SyntaxKind::GenericParamNegativeImpl => {
20114                GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20115            }
20116            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20117        }
20118    }
20119    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20120        let kind = node.kind(db);
20121        match kind {
20122            SyntaxKind::GenericParamType => {
20123                Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20124            }
20125            SyntaxKind::GenericParamConst => {
20126                Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20127            }
20128            SyntaxKind::GenericParamImplNamed => {
20129                Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20130            }
20131            SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20132                GenericParamImplAnonymous::from_syntax_node(db, node),
20133            )),
20134            SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20135                GenericParamNegativeImpl::from_syntax_node(db, node),
20136            )),
20137            _ => None,
20138        }
20139    }
20140    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20141        match self {
20142            GenericParam::Type(x) => x.as_syntax_node(),
20143            GenericParam::Const(x) => x.as_syntax_node(),
20144            GenericParam::ImplNamed(x) => x.as_syntax_node(),
20145            GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20146            GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20147        }
20148    }
20149    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20150        GenericParamPtr(self.as_syntax_node().stable_ptr(db))
20151    }
20152}
20153impl<'db> GenericParam<'db> {
20154    /// Checks if a kind of a variant of [GenericParam].
20155    pub fn is_variant(kind: SyntaxKind) -> bool {
20156        matches!(
20157            kind,
20158            SyntaxKind::GenericParamType
20159                | SyntaxKind::GenericParamConst
20160                | SyntaxKind::GenericParamImplNamed
20161                | SyntaxKind::GenericParamImplAnonymous
20162                | SyntaxKind::GenericParamNegativeImpl
20163        )
20164    }
20165}
20166#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20167pub struct GenericParamType<'db> {
20168    node: SyntaxNode<'db>,
20169}
20170impl<'db> GenericParamType<'db> {
20171    pub const INDEX_NAME: usize = 0;
20172    pub fn new_green(
20173        db: &'db dyn Database,
20174        name: TerminalIdentifierGreen<'db>,
20175    ) -> GenericParamTypeGreen<'db> {
20176        let children = [name.0];
20177        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20178        GenericParamTypeGreen(
20179            GreenNode {
20180                kind: SyntaxKind::GenericParamType,
20181                details: GreenNodeDetails::Node { children: children.into(), width },
20182            }
20183            .intern(db),
20184        )
20185    }
20186}
20187impl<'db> GenericParamType<'db> {
20188    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20189        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20190    }
20191}
20192#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20193pub struct GenericParamTypePtr<'db>(pub SyntaxStablePtrId<'db>);
20194impl<'db> GenericParamTypePtr<'db> {
20195    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20196        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20197    }
20198}
20199impl<'db> TypedStablePtr<'db> for GenericParamTypePtr<'db> {
20200    type SyntaxNode = GenericParamType<'db>;
20201    fn untyped(self) -> SyntaxStablePtrId<'db> {
20202        self.0
20203    }
20204    fn lookup(&self, db: &'db dyn Database) -> GenericParamType<'db> {
20205        GenericParamType::from_syntax_node(db, self.0.lookup(db))
20206    }
20207}
20208impl<'db> From<GenericParamTypePtr<'db>> for SyntaxStablePtrId<'db> {
20209    fn from(ptr: GenericParamTypePtr<'db>) -> Self {
20210        ptr.untyped()
20211    }
20212}
20213#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20214pub struct GenericParamTypeGreen<'db>(pub GreenId<'db>);
20215impl<'db> TypedSyntaxNode<'db> for GenericParamType<'db> {
20216    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20217    type StablePtr = GenericParamTypePtr<'db>;
20218    type Green = GenericParamTypeGreen<'db>;
20219    fn missing(db: &'db dyn Database) -> Self::Green {
20220        GenericParamTypeGreen(
20221            GreenNode {
20222                kind: SyntaxKind::GenericParamType,
20223                details: GreenNodeDetails::Node {
20224                    children: [TerminalIdentifier::missing(db).0].into(),
20225                    width: TextWidth::default(),
20226                },
20227            }
20228            .intern(db),
20229        )
20230    }
20231    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20232        let kind = node.kind(db);
20233        assert_eq!(
20234            kind,
20235            SyntaxKind::GenericParamType,
20236            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20237            kind,
20238            SyntaxKind::GenericParamType
20239        );
20240        Self { node }
20241    }
20242    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20243        let kind = node.kind(db);
20244        if kind == SyntaxKind::GenericParamType {
20245            Some(Self::from_syntax_node(db, node))
20246        } else {
20247            None
20248        }
20249    }
20250    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20251        self.node
20252    }
20253    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20254        GenericParamTypePtr(self.node.stable_ptr(db))
20255    }
20256}
20257#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20258pub struct GenericParamConst<'db> {
20259    node: SyntaxNode<'db>,
20260}
20261impl<'db> GenericParamConst<'db> {
20262    pub const INDEX_CONST_KW: usize = 0;
20263    pub const INDEX_NAME: usize = 1;
20264    pub const INDEX_COLON: usize = 2;
20265    pub const INDEX_TY: usize = 3;
20266    pub fn new_green(
20267        db: &'db dyn Database,
20268        const_kw: TerminalConstGreen<'db>,
20269        name: TerminalIdentifierGreen<'db>,
20270        colon: TerminalColonGreen<'db>,
20271        ty: ExprGreen<'db>,
20272    ) -> GenericParamConstGreen<'db> {
20273        let children = [const_kw.0, name.0, colon.0, ty.0];
20274        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20275        GenericParamConstGreen(
20276            GreenNode {
20277                kind: SyntaxKind::GenericParamConst,
20278                details: GreenNodeDetails::Node { children: children.into(), width },
20279            }
20280            .intern(db),
20281        )
20282    }
20283}
20284impl<'db> GenericParamConst<'db> {
20285    pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
20286        TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20287    }
20288    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20289        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20290    }
20291    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20292        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20293    }
20294    pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
20295        Expr::from_syntax_node(db, self.node.get_children(db)[3])
20296    }
20297}
20298#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20299pub struct GenericParamConstPtr<'db>(pub SyntaxStablePtrId<'db>);
20300impl<'db> GenericParamConstPtr<'db> {
20301    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20302        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20303    }
20304}
20305impl<'db> TypedStablePtr<'db> for GenericParamConstPtr<'db> {
20306    type SyntaxNode = GenericParamConst<'db>;
20307    fn untyped(self) -> SyntaxStablePtrId<'db> {
20308        self.0
20309    }
20310    fn lookup(&self, db: &'db dyn Database) -> GenericParamConst<'db> {
20311        GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20312    }
20313}
20314impl<'db> From<GenericParamConstPtr<'db>> for SyntaxStablePtrId<'db> {
20315    fn from(ptr: GenericParamConstPtr<'db>) -> Self {
20316        ptr.untyped()
20317    }
20318}
20319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20320pub struct GenericParamConstGreen<'db>(pub GreenId<'db>);
20321impl<'db> TypedSyntaxNode<'db> for GenericParamConst<'db> {
20322    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20323    type StablePtr = GenericParamConstPtr<'db>;
20324    type Green = GenericParamConstGreen<'db>;
20325    fn missing(db: &'db dyn Database) -> Self::Green {
20326        GenericParamConstGreen(
20327            GreenNode {
20328                kind: SyntaxKind::GenericParamConst,
20329                details: GreenNodeDetails::Node {
20330                    children: [
20331                        TerminalConst::missing(db).0,
20332                        TerminalIdentifier::missing(db).0,
20333                        TerminalColon::missing(db).0,
20334                        Expr::missing(db).0,
20335                    ]
20336                    .into(),
20337                    width: TextWidth::default(),
20338                },
20339            }
20340            .intern(db),
20341        )
20342    }
20343    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20344        let kind = node.kind(db);
20345        assert_eq!(
20346            kind,
20347            SyntaxKind::GenericParamConst,
20348            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20349            kind,
20350            SyntaxKind::GenericParamConst
20351        );
20352        Self { node }
20353    }
20354    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20355        let kind = node.kind(db);
20356        if kind == SyntaxKind::GenericParamConst {
20357            Some(Self::from_syntax_node(db, node))
20358        } else {
20359            None
20360        }
20361    }
20362    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20363        self.node
20364    }
20365    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20366        GenericParamConstPtr(self.node.stable_ptr(db))
20367    }
20368}
20369#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20370pub struct GenericParamImplNamed<'db> {
20371    node: SyntaxNode<'db>,
20372}
20373impl<'db> GenericParamImplNamed<'db> {
20374    pub const INDEX_IMPL_KW: usize = 0;
20375    pub const INDEX_NAME: usize = 1;
20376    pub const INDEX_COLON: usize = 2;
20377    pub const INDEX_TRAIT_PATH: usize = 3;
20378    pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20379    pub fn new_green(
20380        db: &'db dyn Database,
20381        impl_kw: TerminalImplGreen<'db>,
20382        name: TerminalIdentifierGreen<'db>,
20383        colon: TerminalColonGreen<'db>,
20384        trait_path: ExprPathGreen<'db>,
20385        type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20386    ) -> GenericParamImplNamedGreen<'db> {
20387        let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20388        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20389        GenericParamImplNamedGreen(
20390            GreenNode {
20391                kind: SyntaxKind::GenericParamImplNamed,
20392                details: GreenNodeDetails::Node { children: children.into(), width },
20393            }
20394            .intern(db),
20395        )
20396    }
20397}
20398impl<'db> GenericParamImplNamed<'db> {
20399    pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
20400        TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20401    }
20402    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20403        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20404    }
20405    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20406        TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20407    }
20408    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20409        ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20410    }
20411    pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20412        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20413    }
20414}
20415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20416pub struct GenericParamImplNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
20417impl<'db> GenericParamImplNamedPtr<'db> {
20418    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20419        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20420    }
20421}
20422impl<'db> TypedStablePtr<'db> for GenericParamImplNamedPtr<'db> {
20423    type SyntaxNode = GenericParamImplNamed<'db>;
20424    fn untyped(self) -> SyntaxStablePtrId<'db> {
20425        self.0
20426    }
20427    fn lookup(&self, db: &'db dyn Database) -> GenericParamImplNamed<'db> {
20428        GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20429    }
20430}
20431impl<'db> From<GenericParamImplNamedPtr<'db>> for SyntaxStablePtrId<'db> {
20432    fn from(ptr: GenericParamImplNamedPtr<'db>) -> Self {
20433        ptr.untyped()
20434    }
20435}
20436#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20437pub struct GenericParamImplNamedGreen<'db>(pub GreenId<'db>);
20438impl<'db> TypedSyntaxNode<'db> for GenericParamImplNamed<'db> {
20439    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20440    type StablePtr = GenericParamImplNamedPtr<'db>;
20441    type Green = GenericParamImplNamedGreen<'db>;
20442    fn missing(db: &'db dyn Database) -> Self::Green {
20443        GenericParamImplNamedGreen(
20444            GreenNode {
20445                kind: SyntaxKind::GenericParamImplNamed,
20446                details: GreenNodeDetails::Node {
20447                    children: [
20448                        TerminalImpl::missing(db).0,
20449                        TerminalIdentifier::missing(db).0,
20450                        TerminalColon::missing(db).0,
20451                        ExprPath::missing(db).0,
20452                        OptionAssociatedItemConstraints::missing(db).0,
20453                    ]
20454                    .into(),
20455                    width: TextWidth::default(),
20456                },
20457            }
20458            .intern(db),
20459        )
20460    }
20461    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20462        let kind = node.kind(db);
20463        assert_eq!(
20464            kind,
20465            SyntaxKind::GenericParamImplNamed,
20466            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20467            kind,
20468            SyntaxKind::GenericParamImplNamed
20469        );
20470        Self { node }
20471    }
20472    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20473        let kind = node.kind(db);
20474        if kind == SyntaxKind::GenericParamImplNamed {
20475            Some(Self::from_syntax_node(db, node))
20476        } else {
20477            None
20478        }
20479    }
20480    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20481        self.node
20482    }
20483    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20484        GenericParamImplNamedPtr(self.node.stable_ptr(db))
20485    }
20486}
20487#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20488pub struct GenericParamImplAnonymous<'db> {
20489    node: SyntaxNode<'db>,
20490}
20491impl<'db> GenericParamImplAnonymous<'db> {
20492    pub const INDEX_PLUS: usize = 0;
20493    pub const INDEX_TRAIT_PATH: usize = 1;
20494    pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20495    pub fn new_green(
20496        db: &'db dyn Database,
20497        plus: TerminalPlusGreen<'db>,
20498        trait_path: ExprPathGreen<'db>,
20499        type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20500    ) -> GenericParamImplAnonymousGreen<'db> {
20501        let children = [plus.0, trait_path.0, type_constrains.0];
20502        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20503        GenericParamImplAnonymousGreen(
20504            GreenNode {
20505                kind: SyntaxKind::GenericParamImplAnonymous,
20506                details: GreenNodeDetails::Node { children: children.into(), width },
20507            }
20508            .intern(db),
20509        )
20510    }
20511}
20512impl<'db> GenericParamImplAnonymous<'db> {
20513    pub fn plus(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
20514        TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20515    }
20516    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20517        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20518    }
20519    pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20520        OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20521    }
20522}
20523#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20524pub struct GenericParamImplAnonymousPtr<'db>(pub SyntaxStablePtrId<'db>);
20525impl<'db> GenericParamImplAnonymousPtr<'db> {}
20526impl<'db> TypedStablePtr<'db> for GenericParamImplAnonymousPtr<'db> {
20527    type SyntaxNode = GenericParamImplAnonymous<'db>;
20528    fn untyped(self) -> SyntaxStablePtrId<'db> {
20529        self.0
20530    }
20531    fn lookup(&self, db: &'db dyn Database) -> GenericParamImplAnonymous<'db> {
20532        GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20533    }
20534}
20535impl<'db> From<GenericParamImplAnonymousPtr<'db>> for SyntaxStablePtrId<'db> {
20536    fn from(ptr: GenericParamImplAnonymousPtr<'db>) -> Self {
20537        ptr.untyped()
20538    }
20539}
20540#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20541pub struct GenericParamImplAnonymousGreen<'db>(pub GreenId<'db>);
20542impl<'db> TypedSyntaxNode<'db> for GenericParamImplAnonymous<'db> {
20543    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20544    type StablePtr = GenericParamImplAnonymousPtr<'db>;
20545    type Green = GenericParamImplAnonymousGreen<'db>;
20546    fn missing(db: &'db dyn Database) -> Self::Green {
20547        GenericParamImplAnonymousGreen(
20548            GreenNode {
20549                kind: SyntaxKind::GenericParamImplAnonymous,
20550                details: GreenNodeDetails::Node {
20551                    children: [
20552                        TerminalPlus::missing(db).0,
20553                        ExprPath::missing(db).0,
20554                        OptionAssociatedItemConstraints::missing(db).0,
20555                    ]
20556                    .into(),
20557                    width: TextWidth::default(),
20558                },
20559            }
20560            .intern(db),
20561        )
20562    }
20563    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20564        let kind = node.kind(db);
20565        assert_eq!(
20566            kind,
20567            SyntaxKind::GenericParamImplAnonymous,
20568            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20569            kind,
20570            SyntaxKind::GenericParamImplAnonymous
20571        );
20572        Self { node }
20573    }
20574    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20575        let kind = node.kind(db);
20576        if kind == SyntaxKind::GenericParamImplAnonymous {
20577            Some(Self::from_syntax_node(db, node))
20578        } else {
20579            None
20580        }
20581    }
20582    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20583        self.node
20584    }
20585    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20586        GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
20587    }
20588}
20589#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20590pub struct GenericParamNegativeImpl<'db> {
20591    node: SyntaxNode<'db>,
20592}
20593impl<'db> GenericParamNegativeImpl<'db> {
20594    pub const INDEX_MINUS: usize = 0;
20595    pub const INDEX_TRAIT_PATH: usize = 1;
20596    pub fn new_green(
20597        db: &'db dyn Database,
20598        minus: TerminalMinusGreen<'db>,
20599        trait_path: ExprPathGreen<'db>,
20600    ) -> GenericParamNegativeImplGreen<'db> {
20601        let children = [minus.0, trait_path.0];
20602        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20603        GenericParamNegativeImplGreen(
20604            GreenNode {
20605                kind: SyntaxKind::GenericParamNegativeImpl,
20606                details: GreenNodeDetails::Node { children: children.into(), width },
20607            }
20608            .intern(db),
20609        )
20610    }
20611}
20612impl<'db> GenericParamNegativeImpl<'db> {
20613    pub fn minus(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
20614        TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
20615    }
20616    pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20617        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20618    }
20619}
20620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20621pub struct GenericParamNegativeImplPtr<'db>(pub SyntaxStablePtrId<'db>);
20622impl<'db> GenericParamNegativeImplPtr<'db> {}
20623impl<'db> TypedStablePtr<'db> for GenericParamNegativeImplPtr<'db> {
20624    type SyntaxNode = GenericParamNegativeImpl<'db>;
20625    fn untyped(self) -> SyntaxStablePtrId<'db> {
20626        self.0
20627    }
20628    fn lookup(&self, db: &'db dyn Database) -> GenericParamNegativeImpl<'db> {
20629        GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
20630    }
20631}
20632impl<'db> From<GenericParamNegativeImplPtr<'db>> for SyntaxStablePtrId<'db> {
20633    fn from(ptr: GenericParamNegativeImplPtr<'db>) -> Self {
20634        ptr.untyped()
20635    }
20636}
20637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20638pub struct GenericParamNegativeImplGreen<'db>(pub GreenId<'db>);
20639impl<'db> TypedSyntaxNode<'db> for GenericParamNegativeImpl<'db> {
20640    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
20641    type StablePtr = GenericParamNegativeImplPtr<'db>;
20642    type Green = GenericParamNegativeImplGreen<'db>;
20643    fn missing(db: &'db dyn Database) -> Self::Green {
20644        GenericParamNegativeImplGreen(
20645            GreenNode {
20646                kind: SyntaxKind::GenericParamNegativeImpl,
20647                details: GreenNodeDetails::Node {
20648                    children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
20649                    width: TextWidth::default(),
20650                },
20651            }
20652            .intern(db),
20653        )
20654    }
20655    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20656        let kind = node.kind(db);
20657        assert_eq!(
20658            kind,
20659            SyntaxKind::GenericParamNegativeImpl,
20660            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20661            kind,
20662            SyntaxKind::GenericParamNegativeImpl
20663        );
20664        Self { node }
20665    }
20666    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20667        let kind = node.kind(db);
20668        if kind == SyntaxKind::GenericParamNegativeImpl {
20669            Some(Self::from_syntax_node(db, node))
20670        } else {
20671            None
20672        }
20673    }
20674    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20675        self.node
20676    }
20677    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20678        GenericParamNegativeImplPtr(self.node.stable_ptr(db))
20679    }
20680}
20681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20682pub struct TokenList<'db>(ElementList<'db, TokenTree<'db>, 1>);
20683impl<'db> Deref for TokenList<'db> {
20684    type Target = ElementList<'db, TokenTree<'db>, 1>;
20685    fn deref(&self) -> &Self::Target {
20686        &self.0
20687    }
20688}
20689impl<'db> TokenList<'db> {
20690    pub fn new_green(
20691        db: &'db dyn Database,
20692        children: &[TokenTreeGreen<'db>],
20693    ) -> TokenListGreen<'db> {
20694        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
20695        TokenListGreen(
20696            GreenNode {
20697                kind: SyntaxKind::TokenList,
20698                details: GreenNodeDetails::Node {
20699                    children: children.iter().map(|x| x.0).collect(),
20700                    width,
20701                },
20702            }
20703            .intern(db),
20704        )
20705    }
20706}
20707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20708pub struct TokenListPtr<'db>(pub SyntaxStablePtrId<'db>);
20709impl<'db> TypedStablePtr<'db> for TokenListPtr<'db> {
20710    type SyntaxNode = TokenList<'db>;
20711    fn untyped(self) -> SyntaxStablePtrId<'db> {
20712        self.0
20713    }
20714    fn lookup(&self, db: &'db dyn Database) -> TokenList<'db> {
20715        TokenList::from_syntax_node(db, self.0.lookup(db))
20716    }
20717}
20718impl<'db> From<TokenListPtr<'db>> for SyntaxStablePtrId<'db> {
20719    fn from(ptr: TokenListPtr<'db>) -> Self {
20720        ptr.untyped()
20721    }
20722}
20723#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20724pub struct TokenListGreen<'db>(pub GreenId<'db>);
20725impl<'db> TypedSyntaxNode<'db> for TokenList<'db> {
20726    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
20727    type StablePtr = TokenListPtr<'db>;
20728    type Green = TokenListGreen<'db>;
20729    fn missing(db: &'db dyn Database) -> Self::Green {
20730        TokenListGreen(
20731            GreenNode {
20732                kind: SyntaxKind::TokenList,
20733                details: GreenNodeDetails::Node {
20734                    children: [].into(),
20735                    width: TextWidth::default(),
20736                },
20737            }
20738            .intern(db),
20739        )
20740    }
20741    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20742        Self(ElementList::new(node))
20743    }
20744    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20745        if node.kind(db) == SyntaxKind::TokenList {
20746            Some(Self(ElementList::new(node)))
20747        } else {
20748            None
20749        }
20750    }
20751    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20752        self.node
20753    }
20754    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20755        TokenListPtr(self.node.stable_ptr(db))
20756    }
20757}
20758#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20759pub struct TokenTreeLeaf<'db> {
20760    node: SyntaxNode<'db>,
20761}
20762impl<'db> TokenTreeLeaf<'db> {
20763    pub const INDEX_LEAF: usize = 0;
20764    pub fn new_green(db: &'db dyn Database, leaf: TokenNodeGreen<'db>) -> TokenTreeLeafGreen<'db> {
20765        let children = [leaf.0];
20766        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20767        TokenTreeLeafGreen(
20768            GreenNode {
20769                kind: SyntaxKind::TokenTreeLeaf,
20770                details: GreenNodeDetails::Node { children: children.into(), width },
20771            }
20772            .intern(db),
20773        )
20774    }
20775}
20776impl<'db> TokenTreeLeaf<'db> {
20777    pub fn leaf(&self, db: &'db dyn Database) -> TokenNode<'db> {
20778        TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
20779    }
20780}
20781#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20782pub struct TokenTreeLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
20783impl<'db> TokenTreeLeafPtr<'db> {}
20784impl<'db> TypedStablePtr<'db> for TokenTreeLeafPtr<'db> {
20785    type SyntaxNode = TokenTreeLeaf<'db>;
20786    fn untyped(self) -> SyntaxStablePtrId<'db> {
20787        self.0
20788    }
20789    fn lookup(&self, db: &'db dyn Database) -> TokenTreeLeaf<'db> {
20790        TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
20791    }
20792}
20793impl<'db> From<TokenTreeLeafPtr<'db>> for SyntaxStablePtrId<'db> {
20794    fn from(ptr: TokenTreeLeafPtr<'db>) -> Self {
20795        ptr.untyped()
20796    }
20797}
20798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20799pub struct TokenTreeLeafGreen<'db>(pub GreenId<'db>);
20800impl<'db> TypedSyntaxNode<'db> for TokenTreeLeaf<'db> {
20801    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
20802    type StablePtr = TokenTreeLeafPtr<'db>;
20803    type Green = TokenTreeLeafGreen<'db>;
20804    fn missing(db: &'db dyn Database) -> Self::Green {
20805        TokenTreeLeafGreen(
20806            GreenNode {
20807                kind: SyntaxKind::TokenTreeLeaf,
20808                details: GreenNodeDetails::Node {
20809                    children: [TokenNode::missing(db).0].into(),
20810                    width: TextWidth::default(),
20811                },
20812            }
20813            .intern(db),
20814        )
20815    }
20816    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20817        let kind = node.kind(db);
20818        assert_eq!(
20819            kind,
20820            SyntaxKind::TokenTreeLeaf,
20821            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20822            kind,
20823            SyntaxKind::TokenTreeLeaf
20824        );
20825        Self { node }
20826    }
20827    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20828        let kind = node.kind(db);
20829        if kind == SyntaxKind::TokenTreeLeaf {
20830            Some(Self::from_syntax_node(db, node))
20831        } else {
20832            None
20833        }
20834    }
20835    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20836        self.node
20837    }
20838    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20839        TokenTreeLeafPtr(self.node.stable_ptr(db))
20840    }
20841}
20842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20843pub struct TokenTreeNode<'db> {
20844    node: SyntaxNode<'db>,
20845}
20846impl<'db> TokenTreeNode<'db> {
20847    pub const INDEX_SUBTREE: usize = 0;
20848    pub fn new_green(
20849        db: &'db dyn Database,
20850        subtree: WrappedTokenTreeGreen<'db>,
20851    ) -> TokenTreeNodeGreen<'db> {
20852        let children = [subtree.0];
20853        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20854        TokenTreeNodeGreen(
20855            GreenNode {
20856                kind: SyntaxKind::TokenTreeNode,
20857                details: GreenNodeDetails::Node { children: children.into(), width },
20858            }
20859            .intern(db),
20860        )
20861    }
20862}
20863impl<'db> TokenTreeNode<'db> {
20864    pub fn subtree(&self, db: &'db dyn Database) -> WrappedTokenTree<'db> {
20865        WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
20866    }
20867}
20868#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20869pub struct TokenTreeNodePtr<'db>(pub SyntaxStablePtrId<'db>);
20870impl<'db> TokenTreeNodePtr<'db> {}
20871impl<'db> TypedStablePtr<'db> for TokenTreeNodePtr<'db> {
20872    type SyntaxNode = TokenTreeNode<'db>;
20873    fn untyped(self) -> SyntaxStablePtrId<'db> {
20874        self.0
20875    }
20876    fn lookup(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
20877        TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
20878    }
20879}
20880impl<'db> From<TokenTreeNodePtr<'db>> for SyntaxStablePtrId<'db> {
20881    fn from(ptr: TokenTreeNodePtr<'db>) -> Self {
20882        ptr.untyped()
20883    }
20884}
20885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20886pub struct TokenTreeNodeGreen<'db>(pub GreenId<'db>);
20887impl<'db> TypedSyntaxNode<'db> for TokenTreeNode<'db> {
20888    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
20889    type StablePtr = TokenTreeNodePtr<'db>;
20890    type Green = TokenTreeNodeGreen<'db>;
20891    fn missing(db: &'db dyn Database) -> Self::Green {
20892        TokenTreeNodeGreen(
20893            GreenNode {
20894                kind: SyntaxKind::TokenTreeNode,
20895                details: GreenNodeDetails::Node {
20896                    children: [WrappedTokenTree::missing(db).0].into(),
20897                    width: TextWidth::default(),
20898                },
20899            }
20900            .intern(db),
20901        )
20902    }
20903    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20904        let kind = node.kind(db);
20905        assert_eq!(
20906            kind,
20907            SyntaxKind::TokenTreeNode,
20908            "Unexpected SyntaxKind {:?}. Expected {:?}.",
20909            kind,
20910            SyntaxKind::TokenTreeNode
20911        );
20912        Self { node }
20913    }
20914    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20915        let kind = node.kind(db);
20916        if kind == SyntaxKind::TokenTreeNode {
20917            Some(Self::from_syntax_node(db, node))
20918        } else {
20919            None
20920        }
20921    }
20922    fn as_syntax_node(&self) -> SyntaxNode<'db> {
20923        self.node
20924    }
20925    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20926        TokenTreeNodePtr(self.node.stable_ptr(db))
20927    }
20928}
20929#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20930pub struct TokenTreeRepetition<'db> {
20931    node: SyntaxNode<'db>,
20932}
20933impl<'db> TokenTreeRepetition<'db> {
20934    pub const INDEX_DOLLAR: usize = 0;
20935    pub const INDEX_LPAREN: usize = 1;
20936    pub const INDEX_ELEMENTS: usize = 2;
20937    pub const INDEX_RPAREN: usize = 3;
20938    pub const INDEX_SEPARATOR: usize = 4;
20939    pub const INDEX_OPERATOR: usize = 5;
20940    pub fn new_green(
20941        db: &'db dyn Database,
20942        dollar: TerminalDollarGreen<'db>,
20943        lparen: TerminalLParenGreen<'db>,
20944        elements: TokenListGreen<'db>,
20945        rparen: TerminalRParenGreen<'db>,
20946        separator: OptionTerminalCommaGreen<'db>,
20947        operator: MacroRepetitionOperatorGreen<'db>,
20948    ) -> TokenTreeRepetitionGreen<'db> {
20949        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
20950        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20951        TokenTreeRepetitionGreen(
20952            GreenNode {
20953                kind: SyntaxKind::TokenTreeRepetition,
20954                details: GreenNodeDetails::Node { children: children.into(), width },
20955            }
20956            .intern(db),
20957        )
20958    }
20959}
20960impl<'db> TokenTreeRepetition<'db> {
20961    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
20962        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
20963    }
20964    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
20965        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
20966    }
20967    pub fn elements(&self, db: &'db dyn Database) -> TokenList<'db> {
20968        TokenList::from_syntax_node(db, self.node.get_children(db)[2])
20969    }
20970    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
20971        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
20972    }
20973    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
20974        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
20975    }
20976    pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
20977        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
20978    }
20979}
20980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
20981pub struct TokenTreeRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
20982impl<'db> TokenTreeRepetitionPtr<'db> {}
20983impl<'db> TypedStablePtr<'db> for TokenTreeRepetitionPtr<'db> {
20984    type SyntaxNode = TokenTreeRepetition<'db>;
20985    fn untyped(self) -> SyntaxStablePtrId<'db> {
20986        self.0
20987    }
20988    fn lookup(&self, db: &'db dyn Database) -> TokenTreeRepetition<'db> {
20989        TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
20990    }
20991}
20992impl<'db> From<TokenTreeRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
20993    fn from(ptr: TokenTreeRepetitionPtr<'db>) -> Self {
20994        ptr.untyped()
20995    }
20996}
20997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20998pub struct TokenTreeRepetitionGreen<'db>(pub GreenId<'db>);
20999impl<'db> TypedSyntaxNode<'db> for TokenTreeRepetition<'db> {
21000    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21001    type StablePtr = TokenTreeRepetitionPtr<'db>;
21002    type Green = TokenTreeRepetitionGreen<'db>;
21003    fn missing(db: &'db dyn Database) -> Self::Green {
21004        TokenTreeRepetitionGreen(
21005            GreenNode {
21006                kind: SyntaxKind::TokenTreeRepetition,
21007                details: GreenNodeDetails::Node {
21008                    children: [
21009                        TerminalDollar::missing(db).0,
21010                        TerminalLParen::missing(db).0,
21011                        TokenList::missing(db).0,
21012                        TerminalRParen::missing(db).0,
21013                        OptionTerminalComma::missing(db).0,
21014                        MacroRepetitionOperator::missing(db).0,
21015                    ]
21016                    .into(),
21017                    width: TextWidth::default(),
21018                },
21019            }
21020            .intern(db),
21021        )
21022    }
21023    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21024        let kind = node.kind(db);
21025        assert_eq!(
21026            kind,
21027            SyntaxKind::TokenTreeRepetition,
21028            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21029            kind,
21030            SyntaxKind::TokenTreeRepetition
21031        );
21032        Self { node }
21033    }
21034    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21035        let kind = node.kind(db);
21036        if kind == SyntaxKind::TokenTreeRepetition {
21037            Some(Self::from_syntax_node(db, node))
21038        } else {
21039            None
21040        }
21041    }
21042    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21043        self.node
21044    }
21045    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21046        TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21047    }
21048}
21049#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21050pub struct TokenTreeParam<'db> {
21051    node: SyntaxNode<'db>,
21052}
21053impl<'db> TokenTreeParam<'db> {
21054    pub const INDEX_DOLLAR: usize = 0;
21055    pub const INDEX_NAME: usize = 1;
21056    pub fn new_green(
21057        db: &'db dyn Database,
21058        dollar: TerminalDollarGreen<'db>,
21059        name: TerminalIdentifierGreen<'db>,
21060    ) -> TokenTreeParamGreen<'db> {
21061        let children = [dollar.0, name.0];
21062        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21063        TokenTreeParamGreen(
21064            GreenNode {
21065                kind: SyntaxKind::TokenTreeParam,
21066                details: GreenNodeDetails::Node { children: children.into(), width },
21067            }
21068            .intern(db),
21069        )
21070    }
21071}
21072impl<'db> TokenTreeParam<'db> {
21073    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21074        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21075    }
21076    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
21077        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21078    }
21079}
21080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21081pub struct TokenTreeParamPtr<'db>(pub SyntaxStablePtrId<'db>);
21082impl<'db> TokenTreeParamPtr<'db> {}
21083impl<'db> TypedStablePtr<'db> for TokenTreeParamPtr<'db> {
21084    type SyntaxNode = TokenTreeParam<'db>;
21085    fn untyped(self) -> SyntaxStablePtrId<'db> {
21086        self.0
21087    }
21088    fn lookup(&self, db: &'db dyn Database) -> TokenTreeParam<'db> {
21089        TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21090    }
21091}
21092impl<'db> From<TokenTreeParamPtr<'db>> for SyntaxStablePtrId<'db> {
21093    fn from(ptr: TokenTreeParamPtr<'db>) -> Self {
21094        ptr.untyped()
21095    }
21096}
21097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21098pub struct TokenTreeParamGreen<'db>(pub GreenId<'db>);
21099impl<'db> TypedSyntaxNode<'db> for TokenTreeParam<'db> {
21100    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21101    type StablePtr = TokenTreeParamPtr<'db>;
21102    type Green = TokenTreeParamGreen<'db>;
21103    fn missing(db: &'db dyn Database) -> Self::Green {
21104        TokenTreeParamGreen(
21105            GreenNode {
21106                kind: SyntaxKind::TokenTreeParam,
21107                details: GreenNodeDetails::Node {
21108                    children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21109                        .into(),
21110                    width: TextWidth::default(),
21111                },
21112            }
21113            .intern(db),
21114        )
21115    }
21116    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21117        let kind = node.kind(db);
21118        assert_eq!(
21119            kind,
21120            SyntaxKind::TokenTreeParam,
21121            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21122            kind,
21123            SyntaxKind::TokenTreeParam
21124        );
21125        Self { node }
21126    }
21127    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21128        let kind = node.kind(db);
21129        if kind == SyntaxKind::TokenTreeParam {
21130            Some(Self::from_syntax_node(db, node))
21131        } else {
21132            None
21133        }
21134    }
21135    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21136        self.node
21137    }
21138    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21139        TokenTreeParamPtr(self.node.stable_ptr(db))
21140    }
21141}
21142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21143pub enum TokenTree<'db> {
21144    Token(TokenTreeLeaf<'db>),
21145    Subtree(TokenTreeNode<'db>),
21146    Repetition(TokenTreeRepetition<'db>),
21147    Param(TokenTreeParam<'db>),
21148    Missing(TokenTreeMissing<'db>),
21149}
21150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21151pub struct TokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21152impl<'db> TypedStablePtr<'db> for TokenTreePtr<'db> {
21153    type SyntaxNode = TokenTree<'db>;
21154    fn untyped(self) -> SyntaxStablePtrId<'db> {
21155        self.0
21156    }
21157    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21158        TokenTree::from_syntax_node(db, self.0.lookup(db))
21159    }
21160}
21161impl<'db> From<TokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21162    fn from(ptr: TokenTreePtr<'db>) -> Self {
21163        ptr.untyped()
21164    }
21165}
21166impl<'db> From<TokenTreeLeafPtr<'db>> for TokenTreePtr<'db> {
21167    fn from(value: TokenTreeLeafPtr<'db>) -> Self {
21168        Self(value.0)
21169    }
21170}
21171impl<'db> From<TokenTreeNodePtr<'db>> for TokenTreePtr<'db> {
21172    fn from(value: TokenTreeNodePtr<'db>) -> Self {
21173        Self(value.0)
21174    }
21175}
21176impl<'db> From<TokenTreeRepetitionPtr<'db>> for TokenTreePtr<'db> {
21177    fn from(value: TokenTreeRepetitionPtr<'db>) -> Self {
21178        Self(value.0)
21179    }
21180}
21181impl<'db> From<TokenTreeParamPtr<'db>> for TokenTreePtr<'db> {
21182    fn from(value: TokenTreeParamPtr<'db>) -> Self {
21183        Self(value.0)
21184    }
21185}
21186impl<'db> From<TokenTreeMissingPtr<'db>> for TokenTreePtr<'db> {
21187    fn from(value: TokenTreeMissingPtr<'db>) -> Self {
21188        Self(value.0)
21189    }
21190}
21191impl<'db> From<TokenTreeLeafGreen<'db>> for TokenTreeGreen<'db> {
21192    fn from(value: TokenTreeLeafGreen<'db>) -> Self {
21193        Self(value.0)
21194    }
21195}
21196impl<'db> From<TokenTreeNodeGreen<'db>> for TokenTreeGreen<'db> {
21197    fn from(value: TokenTreeNodeGreen<'db>) -> Self {
21198        Self(value.0)
21199    }
21200}
21201impl<'db> From<TokenTreeRepetitionGreen<'db>> for TokenTreeGreen<'db> {
21202    fn from(value: TokenTreeRepetitionGreen<'db>) -> Self {
21203        Self(value.0)
21204    }
21205}
21206impl<'db> From<TokenTreeParamGreen<'db>> for TokenTreeGreen<'db> {
21207    fn from(value: TokenTreeParamGreen<'db>) -> Self {
21208        Self(value.0)
21209    }
21210}
21211impl<'db> From<TokenTreeMissingGreen<'db>> for TokenTreeGreen<'db> {
21212    fn from(value: TokenTreeMissingGreen<'db>) -> Self {
21213        Self(value.0)
21214    }
21215}
21216#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21217pub struct TokenTreeGreen<'db>(pub GreenId<'db>);
21218impl<'db> TypedSyntaxNode<'db> for TokenTree<'db> {
21219    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21220    type StablePtr = TokenTreePtr<'db>;
21221    type Green = TokenTreeGreen<'db>;
21222    fn missing(db: &'db dyn Database) -> Self::Green {
21223        TokenTreeGreen(TokenTreeMissing::missing(db).0)
21224    }
21225    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21226        let kind = node.kind(db);
21227        match kind {
21228            SyntaxKind::TokenTreeLeaf => {
21229                TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21230            }
21231            SyntaxKind::TokenTreeNode => {
21232                TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21233            }
21234            SyntaxKind::TokenTreeRepetition => {
21235                TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21236            }
21237            SyntaxKind::TokenTreeParam => {
21238                TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21239            }
21240            SyntaxKind::TokenTreeMissing => {
21241                TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21242            }
21243            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21244        }
21245    }
21246    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21247        let kind = node.kind(db);
21248        match kind {
21249            SyntaxKind::TokenTreeLeaf => {
21250                Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21251            }
21252            SyntaxKind::TokenTreeNode => {
21253                Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21254            }
21255            SyntaxKind::TokenTreeRepetition => {
21256                Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21257            }
21258            SyntaxKind::TokenTreeParam => {
21259                Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21260            }
21261            SyntaxKind::TokenTreeMissing => {
21262                Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21263            }
21264            _ => None,
21265        }
21266    }
21267    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21268        match self {
21269            TokenTree::Token(x) => x.as_syntax_node(),
21270            TokenTree::Subtree(x) => x.as_syntax_node(),
21271            TokenTree::Repetition(x) => x.as_syntax_node(),
21272            TokenTree::Param(x) => x.as_syntax_node(),
21273            TokenTree::Missing(x) => x.as_syntax_node(),
21274        }
21275    }
21276    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21277        TokenTreePtr(self.as_syntax_node().stable_ptr(db))
21278    }
21279}
21280impl<'db> TokenTree<'db> {
21281    /// Checks if a kind of a variant of [TokenTree].
21282    pub fn is_variant(kind: SyntaxKind) -> bool {
21283        matches!(
21284            kind,
21285            SyntaxKind::TokenTreeLeaf
21286                | SyntaxKind::TokenTreeNode
21287                | SyntaxKind::TokenTreeRepetition
21288                | SyntaxKind::TokenTreeParam
21289                | SyntaxKind::TokenTreeMissing
21290        )
21291    }
21292}
21293#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21294pub struct TokenTreeMissing<'db> {
21295    node: SyntaxNode<'db>,
21296}
21297impl<'db> TokenTreeMissing<'db> {
21298    pub fn new_green(db: &'db dyn Database) -> TokenTreeMissingGreen<'db> {
21299        let children = [];
21300        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21301        TokenTreeMissingGreen(
21302            GreenNode {
21303                kind: SyntaxKind::TokenTreeMissing,
21304                details: GreenNodeDetails::Node { children: children.into(), width },
21305            }
21306            .intern(db),
21307        )
21308    }
21309}
21310impl<'db> TokenTreeMissing<'db> {}
21311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21312pub struct TokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21313impl<'db> TokenTreeMissingPtr<'db> {}
21314impl<'db> TypedStablePtr<'db> for TokenTreeMissingPtr<'db> {
21315    type SyntaxNode = TokenTreeMissing<'db>;
21316    fn untyped(self) -> SyntaxStablePtrId<'db> {
21317        self.0
21318    }
21319    fn lookup(&self, db: &'db dyn Database) -> TokenTreeMissing<'db> {
21320        TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21321    }
21322}
21323impl<'db> From<TokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21324    fn from(ptr: TokenTreeMissingPtr<'db>) -> Self {
21325        ptr.untyped()
21326    }
21327}
21328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21329pub struct TokenTreeMissingGreen<'db>(pub GreenId<'db>);
21330impl<'db> TypedSyntaxNode<'db> for TokenTreeMissing<'db> {
21331    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21332    type StablePtr = TokenTreeMissingPtr<'db>;
21333    type Green = TokenTreeMissingGreen<'db>;
21334    fn missing(db: &'db dyn Database) -> Self::Green {
21335        TokenTreeMissingGreen(
21336            GreenNode {
21337                kind: SyntaxKind::TokenTreeMissing,
21338                details: GreenNodeDetails::Node {
21339                    children: [].into(),
21340                    width: TextWidth::default(),
21341                },
21342            }
21343            .intern(db),
21344        )
21345    }
21346    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21347        let kind = node.kind(db);
21348        assert_eq!(
21349            kind,
21350            SyntaxKind::TokenTreeMissing,
21351            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21352            kind,
21353            SyntaxKind::TokenTreeMissing
21354        );
21355        Self { node }
21356    }
21357    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21358        let kind = node.kind(db);
21359        if kind == SyntaxKind::TokenTreeMissing {
21360            Some(Self::from_syntax_node(db, node))
21361        } else {
21362            None
21363        }
21364    }
21365    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21366        self.node
21367    }
21368    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21369        TokenTreeMissingPtr(self.node.stable_ptr(db))
21370    }
21371}
21372#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21373pub enum WrappedTokenTree<'db> {
21374    Parenthesized(ParenthesizedTokenTree<'db>),
21375    Braced(BracedTokenTree<'db>),
21376    Bracketed(BracketedTokenTree<'db>),
21377    Missing(WrappedTokenTreeMissing<'db>),
21378}
21379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21380pub struct WrappedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21381impl<'db> TypedStablePtr<'db> for WrappedTokenTreePtr<'db> {
21382    type SyntaxNode = WrappedTokenTree<'db>;
21383    fn untyped(self) -> SyntaxStablePtrId<'db> {
21384        self.0
21385    }
21386    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21387        WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21388    }
21389}
21390impl<'db> From<WrappedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21391    fn from(ptr: WrappedTokenTreePtr<'db>) -> Self {
21392        ptr.untyped()
21393    }
21394}
21395impl<'db> From<ParenthesizedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21396    fn from(value: ParenthesizedTokenTreePtr<'db>) -> Self {
21397        Self(value.0)
21398    }
21399}
21400impl<'db> From<BracedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21401    fn from(value: BracedTokenTreePtr<'db>) -> Self {
21402        Self(value.0)
21403    }
21404}
21405impl<'db> From<BracketedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21406    fn from(value: BracketedTokenTreePtr<'db>) -> Self {
21407        Self(value.0)
21408    }
21409}
21410impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for WrappedTokenTreePtr<'db> {
21411    fn from(value: WrappedTokenTreeMissingPtr<'db>) -> Self {
21412        Self(value.0)
21413    }
21414}
21415impl<'db> From<ParenthesizedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21416    fn from(value: ParenthesizedTokenTreeGreen<'db>) -> Self {
21417        Self(value.0)
21418    }
21419}
21420impl<'db> From<BracedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21421    fn from(value: BracedTokenTreeGreen<'db>) -> Self {
21422        Self(value.0)
21423    }
21424}
21425impl<'db> From<BracketedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21426    fn from(value: BracketedTokenTreeGreen<'db>) -> Self {
21427        Self(value.0)
21428    }
21429}
21430impl<'db> From<WrappedTokenTreeMissingGreen<'db>> for WrappedTokenTreeGreen<'db> {
21431    fn from(value: WrappedTokenTreeMissingGreen<'db>) -> Self {
21432        Self(value.0)
21433    }
21434}
21435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21436pub struct WrappedTokenTreeGreen<'db>(pub GreenId<'db>);
21437impl<'db> TypedSyntaxNode<'db> for WrappedTokenTree<'db> {
21438    const OPTIONAL_KIND: Option<SyntaxKind> = None;
21439    type StablePtr = WrappedTokenTreePtr<'db>;
21440    type Green = WrappedTokenTreeGreen<'db>;
21441    fn missing(db: &'db dyn Database) -> Self::Green {
21442        WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21443    }
21444    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21445        let kind = node.kind(db);
21446        match kind {
21447            SyntaxKind::ParenthesizedTokenTree => {
21448                WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21449            }
21450            SyntaxKind::BracedTokenTree => {
21451                WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21452            }
21453            SyntaxKind::BracketedTokenTree => {
21454                WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21455            }
21456            SyntaxKind::WrappedTokenTreeMissing => {
21457                WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21458            }
21459            _ => panic!(
21460                "Unexpected syntax kind {:?} when constructing {}.",
21461                kind, "WrappedTokenTree"
21462            ),
21463        }
21464    }
21465    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21466        let kind = node.kind(db);
21467        match kind {
21468            SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21469                ParenthesizedTokenTree::from_syntax_node(db, node),
21470            )),
21471            SyntaxKind::BracedTokenTree => {
21472                Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21473            }
21474            SyntaxKind::BracketedTokenTree => {
21475                Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21476            }
21477            SyntaxKind::WrappedTokenTreeMissing => {
21478                Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21479            }
21480            _ => None,
21481        }
21482    }
21483    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21484        match self {
21485            WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21486            WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21487            WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21488            WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21489        }
21490    }
21491    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21492        WrappedTokenTreePtr(self.as_syntax_node().stable_ptr(db))
21493    }
21494}
21495impl<'db> WrappedTokenTree<'db> {
21496    /// Checks if a kind of a variant of [WrappedTokenTree].
21497    pub fn is_variant(kind: SyntaxKind) -> bool {
21498        matches!(
21499            kind,
21500            SyntaxKind::ParenthesizedTokenTree
21501                | SyntaxKind::BracedTokenTree
21502                | SyntaxKind::BracketedTokenTree
21503                | SyntaxKind::WrappedTokenTreeMissing
21504        )
21505    }
21506}
21507#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21508pub struct WrappedTokenTreeMissing<'db> {
21509    node: SyntaxNode<'db>,
21510}
21511impl<'db> WrappedTokenTreeMissing<'db> {
21512    pub fn new_green(db: &'db dyn Database) -> WrappedTokenTreeMissingGreen<'db> {
21513        let children = [];
21514        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21515        WrappedTokenTreeMissingGreen(
21516            GreenNode {
21517                kind: SyntaxKind::WrappedTokenTreeMissing,
21518                details: GreenNodeDetails::Node { children: children.into(), width },
21519            }
21520            .intern(db),
21521        )
21522    }
21523}
21524impl<'db> WrappedTokenTreeMissing<'db> {}
21525#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21526pub struct WrappedTokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21527impl<'db> WrappedTokenTreeMissingPtr<'db> {}
21528impl<'db> TypedStablePtr<'db> for WrappedTokenTreeMissingPtr<'db> {
21529    type SyntaxNode = WrappedTokenTreeMissing<'db>;
21530    fn untyped(self) -> SyntaxStablePtrId<'db> {
21531        self.0
21532    }
21533    fn lookup(&self, db: &'db dyn Database) -> WrappedTokenTreeMissing<'db> {
21534        WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21535    }
21536}
21537impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21538    fn from(ptr: WrappedTokenTreeMissingPtr<'db>) -> Self {
21539        ptr.untyped()
21540    }
21541}
21542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21543pub struct WrappedTokenTreeMissingGreen<'db>(pub GreenId<'db>);
21544impl<'db> TypedSyntaxNode<'db> for WrappedTokenTreeMissing<'db> {
21545    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21546    type StablePtr = WrappedTokenTreeMissingPtr<'db>;
21547    type Green = WrappedTokenTreeMissingGreen<'db>;
21548    fn missing(db: &'db dyn Database) -> Self::Green {
21549        WrappedTokenTreeMissingGreen(
21550            GreenNode {
21551                kind: SyntaxKind::WrappedTokenTreeMissing,
21552                details: GreenNodeDetails::Node {
21553                    children: [].into(),
21554                    width: TextWidth::default(),
21555                },
21556            }
21557            .intern(db),
21558        )
21559    }
21560    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21561        let kind = node.kind(db);
21562        assert_eq!(
21563            kind,
21564            SyntaxKind::WrappedTokenTreeMissing,
21565            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21566            kind,
21567            SyntaxKind::WrappedTokenTreeMissing
21568        );
21569        Self { node }
21570    }
21571    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21572        let kind = node.kind(db);
21573        if kind == SyntaxKind::WrappedTokenTreeMissing {
21574            Some(Self::from_syntax_node(db, node))
21575        } else {
21576            None
21577        }
21578    }
21579    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21580        self.node
21581    }
21582    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21583        WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
21584    }
21585}
21586#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21587pub struct ParenthesizedTokenTree<'db> {
21588    node: SyntaxNode<'db>,
21589}
21590impl<'db> ParenthesizedTokenTree<'db> {
21591    pub const INDEX_LPAREN: usize = 0;
21592    pub const INDEX_TOKENS: usize = 1;
21593    pub const INDEX_RPAREN: usize = 2;
21594    pub fn new_green(
21595        db: &'db dyn Database,
21596        lparen: TerminalLParenGreen<'db>,
21597        tokens: TokenListGreen<'db>,
21598        rparen: TerminalRParenGreen<'db>,
21599    ) -> ParenthesizedTokenTreeGreen<'db> {
21600        let children = [lparen.0, tokens.0, rparen.0];
21601        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21602        ParenthesizedTokenTreeGreen(
21603            GreenNode {
21604                kind: SyntaxKind::ParenthesizedTokenTree,
21605                details: GreenNodeDetails::Node { children: children.into(), width },
21606            }
21607            .intern(db),
21608        )
21609    }
21610}
21611impl<'db> ParenthesizedTokenTree<'db> {
21612    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21613        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
21614    }
21615    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21616        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21617    }
21618    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21619        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
21620    }
21621}
21622#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21623pub struct ParenthesizedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21624impl<'db> ParenthesizedTokenTreePtr<'db> {}
21625impl<'db> TypedStablePtr<'db> for ParenthesizedTokenTreePtr<'db> {
21626    type SyntaxNode = ParenthesizedTokenTree<'db>;
21627    fn untyped(self) -> SyntaxStablePtrId<'db> {
21628        self.0
21629    }
21630    fn lookup(&self, db: &'db dyn Database) -> ParenthesizedTokenTree<'db> {
21631        ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
21632    }
21633}
21634impl<'db> From<ParenthesizedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21635    fn from(ptr: ParenthesizedTokenTreePtr<'db>) -> Self {
21636        ptr.untyped()
21637    }
21638}
21639#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21640pub struct ParenthesizedTokenTreeGreen<'db>(pub GreenId<'db>);
21641impl<'db> TypedSyntaxNode<'db> for ParenthesizedTokenTree<'db> {
21642    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
21643    type StablePtr = ParenthesizedTokenTreePtr<'db>;
21644    type Green = ParenthesizedTokenTreeGreen<'db>;
21645    fn missing(db: &'db dyn Database) -> Self::Green {
21646        ParenthesizedTokenTreeGreen(
21647            GreenNode {
21648                kind: SyntaxKind::ParenthesizedTokenTree,
21649                details: GreenNodeDetails::Node {
21650                    children: [
21651                        TerminalLParen::missing(db).0,
21652                        TokenList::missing(db).0,
21653                        TerminalRParen::missing(db).0,
21654                    ]
21655                    .into(),
21656                    width: TextWidth::default(),
21657                },
21658            }
21659            .intern(db),
21660        )
21661    }
21662    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21663        let kind = node.kind(db);
21664        assert_eq!(
21665            kind,
21666            SyntaxKind::ParenthesizedTokenTree,
21667            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21668            kind,
21669            SyntaxKind::ParenthesizedTokenTree
21670        );
21671        Self { node }
21672    }
21673    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21674        let kind = node.kind(db);
21675        if kind == SyntaxKind::ParenthesizedTokenTree {
21676            Some(Self::from_syntax_node(db, node))
21677        } else {
21678            None
21679        }
21680    }
21681    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21682        self.node
21683    }
21684    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21685        ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
21686    }
21687}
21688#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21689pub struct BracedTokenTree<'db> {
21690    node: SyntaxNode<'db>,
21691}
21692impl<'db> BracedTokenTree<'db> {
21693    pub const INDEX_LBRACE: usize = 0;
21694    pub const INDEX_TOKENS: usize = 1;
21695    pub const INDEX_RBRACE: usize = 2;
21696    pub fn new_green(
21697        db: &'db dyn Database,
21698        lbrace: TerminalLBraceGreen<'db>,
21699        tokens: TokenListGreen<'db>,
21700        rbrace: TerminalRBraceGreen<'db>,
21701    ) -> BracedTokenTreeGreen<'db> {
21702        let children = [lbrace.0, tokens.0, rbrace.0];
21703        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21704        BracedTokenTreeGreen(
21705            GreenNode {
21706                kind: SyntaxKind::BracedTokenTree,
21707                details: GreenNodeDetails::Node { children: children.into(), width },
21708            }
21709            .intern(db),
21710        )
21711    }
21712}
21713impl<'db> BracedTokenTree<'db> {
21714    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
21715        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
21716    }
21717    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21718        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21719    }
21720    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
21721        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
21722    }
21723}
21724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21725pub struct BracedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21726impl<'db> BracedTokenTreePtr<'db> {}
21727impl<'db> TypedStablePtr<'db> for BracedTokenTreePtr<'db> {
21728    type SyntaxNode = BracedTokenTree<'db>;
21729    fn untyped(self) -> SyntaxStablePtrId<'db> {
21730        self.0
21731    }
21732    fn lookup(&self, db: &'db dyn Database) -> BracedTokenTree<'db> {
21733        BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
21734    }
21735}
21736impl<'db> From<BracedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21737    fn from(ptr: BracedTokenTreePtr<'db>) -> Self {
21738        ptr.untyped()
21739    }
21740}
21741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21742pub struct BracedTokenTreeGreen<'db>(pub GreenId<'db>);
21743impl<'db> TypedSyntaxNode<'db> for BracedTokenTree<'db> {
21744    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
21745    type StablePtr = BracedTokenTreePtr<'db>;
21746    type Green = BracedTokenTreeGreen<'db>;
21747    fn missing(db: &'db dyn Database) -> Self::Green {
21748        BracedTokenTreeGreen(
21749            GreenNode {
21750                kind: SyntaxKind::BracedTokenTree,
21751                details: GreenNodeDetails::Node {
21752                    children: [
21753                        TerminalLBrace::missing(db).0,
21754                        TokenList::missing(db).0,
21755                        TerminalRBrace::missing(db).0,
21756                    ]
21757                    .into(),
21758                    width: TextWidth::default(),
21759                },
21760            }
21761            .intern(db),
21762        )
21763    }
21764    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21765        let kind = node.kind(db);
21766        assert_eq!(
21767            kind,
21768            SyntaxKind::BracedTokenTree,
21769            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21770            kind,
21771            SyntaxKind::BracedTokenTree
21772        );
21773        Self { node }
21774    }
21775    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21776        let kind = node.kind(db);
21777        if kind == SyntaxKind::BracedTokenTree {
21778            Some(Self::from_syntax_node(db, node))
21779        } else {
21780            None
21781        }
21782    }
21783    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21784        self.node
21785    }
21786    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21787        BracedTokenTreePtr(self.node.stable_ptr(db))
21788    }
21789}
21790#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21791pub struct BracketedTokenTree<'db> {
21792    node: SyntaxNode<'db>,
21793}
21794impl<'db> BracketedTokenTree<'db> {
21795    pub const INDEX_LBRACK: usize = 0;
21796    pub const INDEX_TOKENS: usize = 1;
21797    pub const INDEX_RBRACK: usize = 2;
21798    pub fn new_green(
21799        db: &'db dyn Database,
21800        lbrack: TerminalLBrackGreen<'db>,
21801        tokens: TokenListGreen<'db>,
21802        rbrack: TerminalRBrackGreen<'db>,
21803    ) -> BracketedTokenTreeGreen<'db> {
21804        let children = [lbrack.0, tokens.0, rbrack.0];
21805        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21806        BracketedTokenTreeGreen(
21807            GreenNode {
21808                kind: SyntaxKind::BracketedTokenTree,
21809                details: GreenNodeDetails::Node { children: children.into(), width },
21810            }
21811            .intern(db),
21812        )
21813    }
21814}
21815impl<'db> BracketedTokenTree<'db> {
21816    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
21817        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
21818    }
21819    pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21820        TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21821    }
21822    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
21823        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
21824    }
21825}
21826#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21827pub struct BracketedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21828impl<'db> BracketedTokenTreePtr<'db> {}
21829impl<'db> TypedStablePtr<'db> for BracketedTokenTreePtr<'db> {
21830    type SyntaxNode = BracketedTokenTree<'db>;
21831    fn untyped(self) -> SyntaxStablePtrId<'db> {
21832        self.0
21833    }
21834    fn lookup(&self, db: &'db dyn Database) -> BracketedTokenTree<'db> {
21835        BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
21836    }
21837}
21838impl<'db> From<BracketedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21839    fn from(ptr: BracketedTokenTreePtr<'db>) -> Self {
21840        ptr.untyped()
21841    }
21842}
21843#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21844pub struct BracketedTokenTreeGreen<'db>(pub GreenId<'db>);
21845impl<'db> TypedSyntaxNode<'db> for BracketedTokenTree<'db> {
21846    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
21847    type StablePtr = BracketedTokenTreePtr<'db>;
21848    type Green = BracketedTokenTreeGreen<'db>;
21849    fn missing(db: &'db dyn Database) -> Self::Green {
21850        BracketedTokenTreeGreen(
21851            GreenNode {
21852                kind: SyntaxKind::BracketedTokenTree,
21853                details: GreenNodeDetails::Node {
21854                    children: [
21855                        TerminalLBrack::missing(db).0,
21856                        TokenList::missing(db).0,
21857                        TerminalRBrack::missing(db).0,
21858                    ]
21859                    .into(),
21860                    width: TextWidth::default(),
21861                },
21862            }
21863            .intern(db),
21864        )
21865    }
21866    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21867        let kind = node.kind(db);
21868        assert_eq!(
21869            kind,
21870            SyntaxKind::BracketedTokenTree,
21871            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21872            kind,
21873            SyntaxKind::BracketedTokenTree
21874        );
21875        Self { node }
21876    }
21877    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21878        let kind = node.kind(db);
21879        if kind == SyntaxKind::BracketedTokenTree {
21880            Some(Self::from_syntax_node(db, node))
21881        } else {
21882            None
21883        }
21884    }
21885    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21886        self.node
21887    }
21888    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21889        BracketedTokenTreePtr(self.node.stable_ptr(db))
21890    }
21891}
21892#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21893pub struct ExprInlineMacro<'db> {
21894    node: SyntaxNode<'db>,
21895}
21896impl<'db> ExprInlineMacro<'db> {
21897    pub const INDEX_PATH: usize = 0;
21898    pub const INDEX_BANG: usize = 1;
21899    pub const INDEX_ARGUMENTS: usize = 2;
21900    pub fn new_green(
21901        db: &'db dyn Database,
21902        path: ExprPathGreen<'db>,
21903        bang: TerminalNotGreen<'db>,
21904        arguments: TokenTreeNodeGreen<'db>,
21905    ) -> ExprInlineMacroGreen<'db> {
21906        let children = [path.0, bang.0, arguments.0];
21907        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21908        ExprInlineMacroGreen(
21909            GreenNode {
21910                kind: SyntaxKind::ExprInlineMacro,
21911                details: GreenNodeDetails::Node { children: children.into(), width },
21912            }
21913            .intern(db),
21914        )
21915    }
21916}
21917impl<'db> ExprInlineMacro<'db> {
21918    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
21919        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
21920    }
21921    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
21922        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
21923    }
21924    pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
21925        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
21926    }
21927}
21928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
21929pub struct ExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
21930impl<'db> ExprInlineMacroPtr<'db> {}
21931impl<'db> TypedStablePtr<'db> for ExprInlineMacroPtr<'db> {
21932    type SyntaxNode = ExprInlineMacro<'db>;
21933    fn untyped(self) -> SyntaxStablePtrId<'db> {
21934        self.0
21935    }
21936    fn lookup(&self, db: &'db dyn Database) -> ExprInlineMacro<'db> {
21937        ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
21938    }
21939}
21940impl<'db> From<ExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
21941    fn from(ptr: ExprInlineMacroPtr<'db>) -> Self {
21942        ptr.untyped()
21943    }
21944}
21945#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21946pub struct ExprInlineMacroGreen<'db>(pub GreenId<'db>);
21947impl<'db> TypedSyntaxNode<'db> for ExprInlineMacro<'db> {
21948    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
21949    type StablePtr = ExprInlineMacroPtr<'db>;
21950    type Green = ExprInlineMacroGreen<'db>;
21951    fn missing(db: &'db dyn Database) -> Self::Green {
21952        ExprInlineMacroGreen(
21953            GreenNode {
21954                kind: SyntaxKind::ExprInlineMacro,
21955                details: GreenNodeDetails::Node {
21956                    children: [
21957                        ExprPath::missing(db).0,
21958                        TerminalNot::missing(db).0,
21959                        TokenTreeNode::missing(db).0,
21960                    ]
21961                    .into(),
21962                    width: TextWidth::default(),
21963                },
21964            }
21965            .intern(db),
21966        )
21967    }
21968    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21969        let kind = node.kind(db);
21970        assert_eq!(
21971            kind,
21972            SyntaxKind::ExprInlineMacro,
21973            "Unexpected SyntaxKind {:?}. Expected {:?}.",
21974            kind,
21975            SyntaxKind::ExprInlineMacro
21976        );
21977        Self { node }
21978    }
21979    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21980        let kind = node.kind(db);
21981        if kind == SyntaxKind::ExprInlineMacro {
21982            Some(Self::from_syntax_node(db, node))
21983        } else {
21984            None
21985        }
21986    }
21987    fn as_syntax_node(&self) -> SyntaxNode<'db> {
21988        self.node
21989    }
21990    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21991        ExprInlineMacroPtr(self.node.stable_ptr(db))
21992    }
21993}
21994#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21995pub struct ItemInlineMacro<'db> {
21996    node: SyntaxNode<'db>,
21997}
21998impl<'db> ItemInlineMacro<'db> {
21999    pub const INDEX_ATTRIBUTES: usize = 0;
22000    pub const INDEX_PATH: usize = 1;
22001    pub const INDEX_BANG: usize = 2;
22002    pub const INDEX_ARGUMENTS: usize = 3;
22003    pub const INDEX_SEMICOLON: usize = 4;
22004    pub fn new_green(
22005        db: &'db dyn Database,
22006        attributes: AttributeListGreen<'db>,
22007        path: ExprPathGreen<'db>,
22008        bang: TerminalNotGreen<'db>,
22009        arguments: TokenTreeNodeGreen<'db>,
22010        semicolon: TerminalSemicolonGreen<'db>,
22011    ) -> ItemInlineMacroGreen<'db> {
22012        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22013        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22014        ItemInlineMacroGreen(
22015            GreenNode {
22016                kind: SyntaxKind::ItemInlineMacro,
22017                details: GreenNodeDetails::Node { children: children.into(), width },
22018            }
22019            .intern(db),
22020        )
22021    }
22022}
22023impl<'db> ItemInlineMacro<'db> {
22024    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22025        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22026    }
22027    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22028        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22029    }
22030    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22031        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22032    }
22033    pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22034        TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22035    }
22036    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22037        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22038    }
22039}
22040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22041pub struct ItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22042impl<'db> ItemInlineMacroPtr<'db> {}
22043impl<'db> TypedStablePtr<'db> for ItemInlineMacroPtr<'db> {
22044    type SyntaxNode = ItemInlineMacro<'db>;
22045    fn untyped(self) -> SyntaxStablePtrId<'db> {
22046        self.0
22047    }
22048    fn lookup(&self, db: &'db dyn Database) -> ItemInlineMacro<'db> {
22049        ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22050    }
22051}
22052impl<'db> From<ItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22053    fn from(ptr: ItemInlineMacroPtr<'db>) -> Self {
22054        ptr.untyped()
22055    }
22056}
22057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22058pub struct ItemInlineMacroGreen<'db>(pub GreenId<'db>);
22059impl<'db> TypedSyntaxNode<'db> for ItemInlineMacro<'db> {
22060    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22061    type StablePtr = ItemInlineMacroPtr<'db>;
22062    type Green = ItemInlineMacroGreen<'db>;
22063    fn missing(db: &'db dyn Database) -> Self::Green {
22064        ItemInlineMacroGreen(
22065            GreenNode {
22066                kind: SyntaxKind::ItemInlineMacro,
22067                details: GreenNodeDetails::Node {
22068                    children: [
22069                        AttributeList::missing(db).0,
22070                        ExprPath::missing(db).0,
22071                        TerminalNot::missing(db).0,
22072                        TokenTreeNode::missing(db).0,
22073                        TerminalSemicolon::missing(db).0,
22074                    ]
22075                    .into(),
22076                    width: TextWidth::default(),
22077                },
22078            }
22079            .intern(db),
22080        )
22081    }
22082    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22083        let kind = node.kind(db);
22084        assert_eq!(
22085            kind,
22086            SyntaxKind::ItemInlineMacro,
22087            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22088            kind,
22089            SyntaxKind::ItemInlineMacro
22090        );
22091        Self { node }
22092    }
22093    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22094        let kind = node.kind(db);
22095        if kind == SyntaxKind::ItemInlineMacro {
22096            Some(Self::from_syntax_node(db, node))
22097        } else {
22098            None
22099        }
22100    }
22101    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22102        self.node
22103    }
22104    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22105        ItemInlineMacroPtr(self.node.stable_ptr(db))
22106    }
22107}
22108#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22109pub struct ItemMacroDeclaration<'db> {
22110    node: SyntaxNode<'db>,
22111}
22112impl<'db> ItemMacroDeclaration<'db> {
22113    pub const INDEX_ATTRIBUTES: usize = 0;
22114    pub const INDEX_VISIBILITY: usize = 1;
22115    pub const INDEX_MACRO_KW: usize = 2;
22116    pub const INDEX_NAME: usize = 3;
22117    pub const INDEX_LBRACE: usize = 4;
22118    pub const INDEX_RULES: usize = 5;
22119    pub const INDEX_RBRACE: usize = 6;
22120    pub fn new_green(
22121        db: &'db dyn Database,
22122        attributes: AttributeListGreen<'db>,
22123        visibility: VisibilityGreen<'db>,
22124        macro_kw: TerminalMacroGreen<'db>,
22125        name: TerminalIdentifierGreen<'db>,
22126        lbrace: TerminalLBraceGreen<'db>,
22127        rules: MacroRulesListGreen<'db>,
22128        rbrace: TerminalRBraceGreen<'db>,
22129    ) -> ItemMacroDeclarationGreen<'db> {
22130        let children =
22131            [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22132        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22133        ItemMacroDeclarationGreen(
22134            GreenNode {
22135                kind: SyntaxKind::ItemMacroDeclaration,
22136                details: GreenNodeDetails::Node { children: children.into(), width },
22137            }
22138            .intern(db),
22139        )
22140    }
22141}
22142impl<'db> ItemMacroDeclaration<'db> {
22143    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22144        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22145    }
22146    pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
22147        Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22148    }
22149    pub fn macro_kw(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
22150        TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22151    }
22152    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22153        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22154    }
22155    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22156        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22157    }
22158    pub fn rules(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22159        MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22160    }
22161    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22162        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22163    }
22164}
22165#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22166pub struct ItemMacroDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
22167impl<'db> ItemMacroDeclarationPtr<'db> {
22168    pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
22169        TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
22170    }
22171}
22172impl<'db> TypedStablePtr<'db> for ItemMacroDeclarationPtr<'db> {
22173    type SyntaxNode = ItemMacroDeclaration<'db>;
22174    fn untyped(self) -> SyntaxStablePtrId<'db> {
22175        self.0
22176    }
22177    fn lookup(&self, db: &'db dyn Database) -> ItemMacroDeclaration<'db> {
22178        ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22179    }
22180}
22181impl<'db> From<ItemMacroDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
22182    fn from(ptr: ItemMacroDeclarationPtr<'db>) -> Self {
22183        ptr.untyped()
22184    }
22185}
22186#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22187pub struct ItemMacroDeclarationGreen<'db>(pub GreenId<'db>);
22188impl<'db> TypedSyntaxNode<'db> for ItemMacroDeclaration<'db> {
22189    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22190    type StablePtr = ItemMacroDeclarationPtr<'db>;
22191    type Green = ItemMacroDeclarationGreen<'db>;
22192    fn missing(db: &'db dyn Database) -> Self::Green {
22193        ItemMacroDeclarationGreen(
22194            GreenNode {
22195                kind: SyntaxKind::ItemMacroDeclaration,
22196                details: GreenNodeDetails::Node {
22197                    children: [
22198                        AttributeList::missing(db).0,
22199                        Visibility::missing(db).0,
22200                        TerminalMacro::missing(db).0,
22201                        TerminalIdentifier::missing(db).0,
22202                        TerminalLBrace::missing(db).0,
22203                        MacroRulesList::missing(db).0,
22204                        TerminalRBrace::missing(db).0,
22205                    ]
22206                    .into(),
22207                    width: TextWidth::default(),
22208                },
22209            }
22210            .intern(db),
22211        )
22212    }
22213    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22214        let kind = node.kind(db);
22215        assert_eq!(
22216            kind,
22217            SyntaxKind::ItemMacroDeclaration,
22218            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22219            kind,
22220            SyntaxKind::ItemMacroDeclaration
22221        );
22222        Self { node }
22223    }
22224    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22225        let kind = node.kind(db);
22226        if kind == SyntaxKind::ItemMacroDeclaration {
22227            Some(Self::from_syntax_node(db, node))
22228        } else {
22229            None
22230        }
22231    }
22232    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22233        self.node
22234    }
22235    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22236        ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22237    }
22238}
22239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22240pub struct MacroRulesList<'db>(ElementList<'db, MacroRule<'db>, 1>);
22241impl<'db> Deref for MacroRulesList<'db> {
22242    type Target = ElementList<'db, MacroRule<'db>, 1>;
22243    fn deref(&self) -> &Self::Target {
22244        &self.0
22245    }
22246}
22247impl<'db> MacroRulesList<'db> {
22248    pub fn new_green(
22249        db: &'db dyn Database,
22250        children: &[MacroRuleGreen<'db>],
22251    ) -> MacroRulesListGreen<'db> {
22252        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
22253        MacroRulesListGreen(
22254            GreenNode {
22255                kind: SyntaxKind::MacroRulesList,
22256                details: GreenNodeDetails::Node {
22257                    children: children.iter().map(|x| x.0).collect(),
22258                    width,
22259                },
22260            }
22261            .intern(db),
22262        )
22263    }
22264}
22265#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22266pub struct MacroRulesListPtr<'db>(pub SyntaxStablePtrId<'db>);
22267impl<'db> TypedStablePtr<'db> for MacroRulesListPtr<'db> {
22268    type SyntaxNode = MacroRulesList<'db>;
22269    fn untyped(self) -> SyntaxStablePtrId<'db> {
22270        self.0
22271    }
22272    fn lookup(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22273        MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22274    }
22275}
22276impl<'db> From<MacroRulesListPtr<'db>> for SyntaxStablePtrId<'db> {
22277    fn from(ptr: MacroRulesListPtr<'db>) -> Self {
22278        ptr.untyped()
22279    }
22280}
22281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22282pub struct MacroRulesListGreen<'db>(pub GreenId<'db>);
22283impl<'db> TypedSyntaxNode<'db> for MacroRulesList<'db> {
22284    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22285    type StablePtr = MacroRulesListPtr<'db>;
22286    type Green = MacroRulesListGreen<'db>;
22287    fn missing(db: &'db dyn Database) -> Self::Green {
22288        MacroRulesListGreen(
22289            GreenNode {
22290                kind: SyntaxKind::MacroRulesList,
22291                details: GreenNodeDetails::Node {
22292                    children: [].into(),
22293                    width: TextWidth::default(),
22294                },
22295            }
22296            .intern(db),
22297        )
22298    }
22299    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22300        Self(ElementList::new(node))
22301    }
22302    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22303        if node.kind(db) == SyntaxKind::MacroRulesList {
22304            Some(Self(ElementList::new(node)))
22305        } else {
22306            None
22307        }
22308    }
22309    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22310        self.node
22311    }
22312    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22313        MacroRulesListPtr(self.node.stable_ptr(db))
22314    }
22315}
22316#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22317pub struct MacroRule<'db> {
22318    node: SyntaxNode<'db>,
22319}
22320impl<'db> MacroRule<'db> {
22321    pub const INDEX_LHS: usize = 0;
22322    pub const INDEX_FAT_ARROW: usize = 1;
22323    pub const INDEX_RHS: usize = 2;
22324    pub const INDEX_SEMICOLON: usize = 3;
22325    pub fn new_green(
22326        db: &'db dyn Database,
22327        lhs: WrappedMacroGreen<'db>,
22328        fat_arrow: TerminalMatchArrowGreen<'db>,
22329        rhs: BracedMacroGreen<'db>,
22330        semicolon: TerminalSemicolonGreen<'db>,
22331    ) -> MacroRuleGreen<'db> {
22332        let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22333        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22334        MacroRuleGreen(
22335            GreenNode {
22336                kind: SyntaxKind::MacroRule,
22337                details: GreenNodeDetails::Node { children: children.into(), width },
22338            }
22339            .intern(db),
22340        )
22341    }
22342}
22343impl<'db> MacroRule<'db> {
22344    pub fn lhs(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
22345        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22346    }
22347    pub fn fat_arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
22348        TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22349    }
22350    pub fn rhs(&self, db: &'db dyn Database) -> BracedMacro<'db> {
22351        BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22352    }
22353    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22354        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22355    }
22356}
22357#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22358pub struct MacroRulePtr<'db>(pub SyntaxStablePtrId<'db>);
22359impl<'db> MacroRulePtr<'db> {}
22360impl<'db> TypedStablePtr<'db> for MacroRulePtr<'db> {
22361    type SyntaxNode = MacroRule<'db>;
22362    fn untyped(self) -> SyntaxStablePtrId<'db> {
22363        self.0
22364    }
22365    fn lookup(&self, db: &'db dyn Database) -> MacroRule<'db> {
22366        MacroRule::from_syntax_node(db, self.0.lookup(db))
22367    }
22368}
22369impl<'db> From<MacroRulePtr<'db>> for SyntaxStablePtrId<'db> {
22370    fn from(ptr: MacroRulePtr<'db>) -> Self {
22371        ptr.untyped()
22372    }
22373}
22374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22375pub struct MacroRuleGreen<'db>(pub GreenId<'db>);
22376impl<'db> TypedSyntaxNode<'db> for MacroRule<'db> {
22377    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22378    type StablePtr = MacroRulePtr<'db>;
22379    type Green = MacroRuleGreen<'db>;
22380    fn missing(db: &'db dyn Database) -> Self::Green {
22381        MacroRuleGreen(
22382            GreenNode {
22383                kind: SyntaxKind::MacroRule,
22384                details: GreenNodeDetails::Node {
22385                    children: [
22386                        WrappedMacro::missing(db).0,
22387                        TerminalMatchArrow::missing(db).0,
22388                        BracedMacro::missing(db).0,
22389                        TerminalSemicolon::missing(db).0,
22390                    ]
22391                    .into(),
22392                    width: TextWidth::default(),
22393                },
22394            }
22395            .intern(db),
22396        )
22397    }
22398    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22399        let kind = node.kind(db);
22400        assert_eq!(
22401            kind,
22402            SyntaxKind::MacroRule,
22403            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22404            kind,
22405            SyntaxKind::MacroRule
22406        );
22407        Self { node }
22408    }
22409    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22410        let kind = node.kind(db);
22411        if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22412    }
22413    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22414        self.node
22415    }
22416    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22417        MacroRulePtr(self.node.stable_ptr(db))
22418    }
22419}
22420#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22421pub struct ParamKind<'db> {
22422    node: SyntaxNode<'db>,
22423}
22424impl<'db> ParamKind<'db> {
22425    pub const INDEX_COLON: usize = 0;
22426    pub const INDEX_KIND: usize = 1;
22427    pub fn new_green(
22428        db: &'db dyn Database,
22429        colon: TerminalColonGreen<'db>,
22430        kind: MacroParamKindGreen<'db>,
22431    ) -> ParamKindGreen<'db> {
22432        let children = [colon.0, kind.0];
22433        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22434        ParamKindGreen(
22435            GreenNode {
22436                kind: SyntaxKind::ParamKind,
22437                details: GreenNodeDetails::Node { children: children.into(), width },
22438            }
22439            .intern(db),
22440        )
22441    }
22442}
22443impl<'db> ParamKind<'db> {
22444    pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
22445        TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22446    }
22447    pub fn kind(&self, db: &'db dyn Database) -> MacroParamKind<'db> {
22448        MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22449    }
22450}
22451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22452pub struct ParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22453impl<'db> ParamKindPtr<'db> {}
22454impl<'db> TypedStablePtr<'db> for ParamKindPtr<'db> {
22455    type SyntaxNode = ParamKind<'db>;
22456    fn untyped(self) -> SyntaxStablePtrId<'db> {
22457        self.0
22458    }
22459    fn lookup(&self, db: &'db dyn Database) -> ParamKind<'db> {
22460        ParamKind::from_syntax_node(db, self.0.lookup(db))
22461    }
22462}
22463impl<'db> From<ParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22464    fn from(ptr: ParamKindPtr<'db>) -> Self {
22465        ptr.untyped()
22466    }
22467}
22468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22469pub struct ParamKindGreen<'db>(pub GreenId<'db>);
22470impl<'db> TypedSyntaxNode<'db> for ParamKind<'db> {
22471    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22472    type StablePtr = ParamKindPtr<'db>;
22473    type Green = ParamKindGreen<'db>;
22474    fn missing(db: &'db dyn Database) -> Self::Green {
22475        ParamKindGreen(
22476            GreenNode {
22477                kind: SyntaxKind::ParamKind,
22478                details: GreenNodeDetails::Node {
22479                    children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22480                    width: TextWidth::default(),
22481                },
22482            }
22483            .intern(db),
22484        )
22485    }
22486    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22487        let kind = node.kind(db);
22488        assert_eq!(
22489            kind,
22490            SyntaxKind::ParamKind,
22491            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22492            kind,
22493            SyntaxKind::ParamKind
22494        );
22495        Self { node }
22496    }
22497    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22498        let kind = node.kind(db);
22499        if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22500    }
22501    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22502        self.node
22503    }
22504    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22505        ParamKindPtr(self.node.stable_ptr(db))
22506    }
22507}
22508#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22509pub enum OptionParamKind<'db> {
22510    Empty(OptionParamKindEmpty<'db>),
22511    ParamKind(ParamKind<'db>),
22512}
22513#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22514pub struct OptionParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22515impl<'db> TypedStablePtr<'db> for OptionParamKindPtr<'db> {
22516    type SyntaxNode = OptionParamKind<'db>;
22517    fn untyped(self) -> SyntaxStablePtrId<'db> {
22518        self.0
22519    }
22520    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22521        OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22522    }
22523}
22524impl<'db> From<OptionParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22525    fn from(ptr: OptionParamKindPtr<'db>) -> Self {
22526        ptr.untyped()
22527    }
22528}
22529impl<'db> From<OptionParamKindEmptyPtr<'db>> for OptionParamKindPtr<'db> {
22530    fn from(value: OptionParamKindEmptyPtr<'db>) -> Self {
22531        Self(value.0)
22532    }
22533}
22534impl<'db> From<ParamKindPtr<'db>> for OptionParamKindPtr<'db> {
22535    fn from(value: ParamKindPtr<'db>) -> Self {
22536        Self(value.0)
22537    }
22538}
22539impl<'db> From<OptionParamKindEmptyGreen<'db>> for OptionParamKindGreen<'db> {
22540    fn from(value: OptionParamKindEmptyGreen<'db>) -> Self {
22541        Self(value.0)
22542    }
22543}
22544impl<'db> From<ParamKindGreen<'db>> for OptionParamKindGreen<'db> {
22545    fn from(value: ParamKindGreen<'db>) -> Self {
22546        Self(value.0)
22547    }
22548}
22549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22550pub struct OptionParamKindGreen<'db>(pub GreenId<'db>);
22551impl<'db> TypedSyntaxNode<'db> for OptionParamKind<'db> {
22552    const OPTIONAL_KIND: Option<SyntaxKind> = None;
22553    type StablePtr = OptionParamKindPtr<'db>;
22554    type Green = OptionParamKindGreen<'db>;
22555    fn missing(db: &'db dyn Database) -> Self::Green {
22556        panic!("No missing variant.");
22557    }
22558    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22559        let kind = node.kind(db);
22560        match kind {
22561            SyntaxKind::OptionParamKindEmpty => {
22562                OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
22563            }
22564            SyntaxKind::ParamKind => {
22565                OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
22566            }
22567            _ => {
22568                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
22569            }
22570        }
22571    }
22572    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22573        let kind = node.kind(db);
22574        match kind {
22575            SyntaxKind::OptionParamKindEmpty => {
22576                Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
22577            }
22578            SyntaxKind::ParamKind => {
22579                Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
22580            }
22581            _ => None,
22582        }
22583    }
22584    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22585        match self {
22586            OptionParamKind::Empty(x) => x.as_syntax_node(),
22587            OptionParamKind::ParamKind(x) => x.as_syntax_node(),
22588        }
22589    }
22590    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22591        OptionParamKindPtr(self.as_syntax_node().stable_ptr(db))
22592    }
22593}
22594impl<'db> OptionParamKind<'db> {
22595    /// Checks if a kind of a variant of [OptionParamKind].
22596    pub fn is_variant(kind: SyntaxKind) -> bool {
22597        matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
22598    }
22599}
22600#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22601pub struct OptionParamKindEmpty<'db> {
22602    node: SyntaxNode<'db>,
22603}
22604impl<'db> OptionParamKindEmpty<'db> {
22605    pub fn new_green(db: &'db dyn Database) -> OptionParamKindEmptyGreen<'db> {
22606        let children = [];
22607        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22608        OptionParamKindEmptyGreen(
22609            GreenNode {
22610                kind: SyntaxKind::OptionParamKindEmpty,
22611                details: GreenNodeDetails::Node { children: children.into(), width },
22612            }
22613            .intern(db),
22614        )
22615    }
22616}
22617impl<'db> OptionParamKindEmpty<'db> {}
22618#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22619pub struct OptionParamKindEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
22620impl<'db> OptionParamKindEmptyPtr<'db> {}
22621impl<'db> TypedStablePtr<'db> for OptionParamKindEmptyPtr<'db> {
22622    type SyntaxNode = OptionParamKindEmpty<'db>;
22623    fn untyped(self) -> SyntaxStablePtrId<'db> {
22624        self.0
22625    }
22626    fn lookup(&self, db: &'db dyn Database) -> OptionParamKindEmpty<'db> {
22627        OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
22628    }
22629}
22630impl<'db> From<OptionParamKindEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
22631    fn from(ptr: OptionParamKindEmptyPtr<'db>) -> Self {
22632        ptr.untyped()
22633    }
22634}
22635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22636pub struct OptionParamKindEmptyGreen<'db>(pub GreenId<'db>);
22637impl<'db> TypedSyntaxNode<'db> for OptionParamKindEmpty<'db> {
22638    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
22639    type StablePtr = OptionParamKindEmptyPtr<'db>;
22640    type Green = OptionParamKindEmptyGreen<'db>;
22641    fn missing(db: &'db dyn Database) -> Self::Green {
22642        OptionParamKindEmptyGreen(
22643            GreenNode {
22644                kind: SyntaxKind::OptionParamKindEmpty,
22645                details: GreenNodeDetails::Node {
22646                    children: [].into(),
22647                    width: TextWidth::default(),
22648                },
22649            }
22650            .intern(db),
22651        )
22652    }
22653    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22654        let kind = node.kind(db);
22655        assert_eq!(
22656            kind,
22657            SyntaxKind::OptionParamKindEmpty,
22658            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22659            kind,
22660            SyntaxKind::OptionParamKindEmpty
22661        );
22662        Self { node }
22663    }
22664    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22665        let kind = node.kind(db);
22666        if kind == SyntaxKind::OptionParamKindEmpty {
22667            Some(Self::from_syntax_node(db, node))
22668        } else {
22669            None
22670        }
22671    }
22672    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22673        self.node
22674    }
22675    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22676        OptionParamKindEmptyPtr(self.node.stable_ptr(db))
22677    }
22678}
22679#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22680pub struct MacroParam<'db> {
22681    node: SyntaxNode<'db>,
22682}
22683impl<'db> MacroParam<'db> {
22684    pub const INDEX_DOLLAR: usize = 0;
22685    pub const INDEX_NAME: usize = 1;
22686    pub const INDEX_KIND: usize = 2;
22687    pub fn new_green(
22688        db: &'db dyn Database,
22689        dollar: TerminalDollarGreen<'db>,
22690        name: TerminalIdentifierGreen<'db>,
22691        kind: OptionParamKindGreen<'db>,
22692    ) -> MacroParamGreen<'db> {
22693        let children = [dollar.0, name.0, kind.0];
22694        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22695        MacroParamGreen(
22696            GreenNode {
22697                kind: SyntaxKind::MacroParam,
22698                details: GreenNodeDetails::Node { children: children.into(), width },
22699            }
22700            .intern(db),
22701        )
22702    }
22703}
22704impl<'db> MacroParam<'db> {
22705    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
22706        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
22707    }
22708    pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22709        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
22710    }
22711    pub fn kind(&self, db: &'db dyn Database) -> OptionParamKind<'db> {
22712        OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
22713    }
22714}
22715#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22716pub struct MacroParamPtr<'db>(pub SyntaxStablePtrId<'db>);
22717impl<'db> MacroParamPtr<'db> {}
22718impl<'db> TypedStablePtr<'db> for MacroParamPtr<'db> {
22719    type SyntaxNode = MacroParam<'db>;
22720    fn untyped(self) -> SyntaxStablePtrId<'db> {
22721        self.0
22722    }
22723    fn lookup(&self, db: &'db dyn Database) -> MacroParam<'db> {
22724        MacroParam::from_syntax_node(db, self.0.lookup(db))
22725    }
22726}
22727impl<'db> From<MacroParamPtr<'db>> for SyntaxStablePtrId<'db> {
22728    fn from(ptr: MacroParamPtr<'db>) -> Self {
22729        ptr.untyped()
22730    }
22731}
22732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22733pub struct MacroParamGreen<'db>(pub GreenId<'db>);
22734impl<'db> TypedSyntaxNode<'db> for MacroParam<'db> {
22735    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
22736    type StablePtr = MacroParamPtr<'db>;
22737    type Green = MacroParamGreen<'db>;
22738    fn missing(db: &'db dyn Database) -> Self::Green {
22739        MacroParamGreen(
22740            GreenNode {
22741                kind: SyntaxKind::MacroParam,
22742                details: GreenNodeDetails::Node {
22743                    children: [
22744                        TerminalDollar::missing(db).0,
22745                        TerminalIdentifier::missing(db).0,
22746                        OptionParamKind::missing(db).0,
22747                    ]
22748                    .into(),
22749                    width: TextWidth::default(),
22750                },
22751            }
22752            .intern(db),
22753        )
22754    }
22755    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22756        let kind = node.kind(db);
22757        assert_eq!(
22758            kind,
22759            SyntaxKind::MacroParam,
22760            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22761            kind,
22762            SyntaxKind::MacroParam
22763        );
22764        Self { node }
22765    }
22766    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22767        let kind = node.kind(db);
22768        if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
22769    }
22770    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22771        self.node
22772    }
22773    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22774        MacroParamPtr(self.node.stable_ptr(db))
22775    }
22776}
22777#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22778pub struct MacroRepetition<'db> {
22779    node: SyntaxNode<'db>,
22780}
22781impl<'db> MacroRepetition<'db> {
22782    pub const INDEX_DOLLAR: usize = 0;
22783    pub const INDEX_LPAREN: usize = 1;
22784    pub const INDEX_ELEMENTS: usize = 2;
22785    pub const INDEX_RPAREN: usize = 3;
22786    pub const INDEX_SEPARATOR: usize = 4;
22787    pub const INDEX_OPERATOR: usize = 5;
22788    pub fn new_green(
22789        db: &'db dyn Database,
22790        dollar: TerminalDollarGreen<'db>,
22791        lparen: TerminalLParenGreen<'db>,
22792        elements: MacroElementsGreen<'db>,
22793        rparen: TerminalRParenGreen<'db>,
22794        separator: OptionTerminalCommaGreen<'db>,
22795        operator: MacroRepetitionOperatorGreen<'db>,
22796    ) -> MacroRepetitionGreen<'db> {
22797        let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
22798        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22799        MacroRepetitionGreen(
22800            GreenNode {
22801                kind: SyntaxKind::MacroRepetition,
22802                details: GreenNodeDetails::Node { children: children.into(), width },
22803            }
22804            .intern(db),
22805        )
22806    }
22807}
22808impl<'db> MacroRepetition<'db> {
22809    pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
22810        TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
22811    }
22812    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
22813        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
22814    }
22815    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
22816        MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
22817    }
22818    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
22819        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
22820    }
22821    pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
22822        OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
22823    }
22824    pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
22825        MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
22826    }
22827}
22828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22829pub struct MacroRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
22830impl<'db> MacroRepetitionPtr<'db> {}
22831impl<'db> TypedStablePtr<'db> for MacroRepetitionPtr<'db> {
22832    type SyntaxNode = MacroRepetition<'db>;
22833    fn untyped(self) -> SyntaxStablePtrId<'db> {
22834        self.0
22835    }
22836    fn lookup(&self, db: &'db dyn Database) -> MacroRepetition<'db> {
22837        MacroRepetition::from_syntax_node(db, self.0.lookup(db))
22838    }
22839}
22840impl<'db> From<MacroRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
22841    fn from(ptr: MacroRepetitionPtr<'db>) -> Self {
22842        ptr.untyped()
22843    }
22844}
22845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22846pub struct MacroRepetitionGreen<'db>(pub GreenId<'db>);
22847impl<'db> TypedSyntaxNode<'db> for MacroRepetition<'db> {
22848    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
22849    type StablePtr = MacroRepetitionPtr<'db>;
22850    type Green = MacroRepetitionGreen<'db>;
22851    fn missing(db: &'db dyn Database) -> Self::Green {
22852        MacroRepetitionGreen(
22853            GreenNode {
22854                kind: SyntaxKind::MacroRepetition,
22855                details: GreenNodeDetails::Node {
22856                    children: [
22857                        TerminalDollar::missing(db).0,
22858                        TerminalLParen::missing(db).0,
22859                        MacroElements::missing(db).0,
22860                        TerminalRParen::missing(db).0,
22861                        OptionTerminalComma::missing(db).0,
22862                        MacroRepetitionOperator::missing(db).0,
22863                    ]
22864                    .into(),
22865                    width: TextWidth::default(),
22866                },
22867            }
22868            .intern(db),
22869        )
22870    }
22871    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22872        let kind = node.kind(db);
22873        assert_eq!(
22874            kind,
22875            SyntaxKind::MacroRepetition,
22876            "Unexpected SyntaxKind {:?}. Expected {:?}.",
22877            kind,
22878            SyntaxKind::MacroRepetition
22879        );
22880        Self { node }
22881    }
22882    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22883        let kind = node.kind(db);
22884        if kind == SyntaxKind::MacroRepetition {
22885            Some(Self::from_syntax_node(db, node))
22886        } else {
22887            None
22888        }
22889    }
22890    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22891        self.node
22892    }
22893    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22894        MacroRepetitionPtr(self.node.stable_ptr(db))
22895    }
22896}
22897#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22898pub enum OptionTerminalComma<'db> {
22899    Empty(OptionTerminalCommaEmpty<'db>),
22900    TerminalComma(TerminalComma<'db>),
22901}
22902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
22903pub struct OptionTerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
22904impl<'db> TypedStablePtr<'db> for OptionTerminalCommaPtr<'db> {
22905    type SyntaxNode = OptionTerminalComma<'db>;
22906    fn untyped(self) -> SyntaxStablePtrId<'db> {
22907        self.0
22908    }
22909    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22910        OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
22911    }
22912}
22913impl<'db> From<OptionTerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
22914    fn from(ptr: OptionTerminalCommaPtr<'db>) -> Self {
22915        ptr.untyped()
22916    }
22917}
22918impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for OptionTerminalCommaPtr<'db> {
22919    fn from(value: OptionTerminalCommaEmptyPtr<'db>) -> Self {
22920        Self(value.0)
22921    }
22922}
22923impl<'db> From<TerminalCommaPtr<'db>> for OptionTerminalCommaPtr<'db> {
22924    fn from(value: TerminalCommaPtr<'db>) -> Self {
22925        Self(value.0)
22926    }
22927}
22928impl<'db> From<OptionTerminalCommaEmptyGreen<'db>> for OptionTerminalCommaGreen<'db> {
22929    fn from(value: OptionTerminalCommaEmptyGreen<'db>) -> Self {
22930        Self(value.0)
22931    }
22932}
22933impl<'db> From<TerminalCommaGreen<'db>> for OptionTerminalCommaGreen<'db> {
22934    fn from(value: TerminalCommaGreen<'db>) -> Self {
22935        Self(value.0)
22936    }
22937}
22938#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22939pub struct OptionTerminalCommaGreen<'db>(pub GreenId<'db>);
22940impl<'db> TypedSyntaxNode<'db> for OptionTerminalComma<'db> {
22941    const OPTIONAL_KIND: Option<SyntaxKind> = None;
22942    type StablePtr = OptionTerminalCommaPtr<'db>;
22943    type Green = OptionTerminalCommaGreen<'db>;
22944    fn missing(db: &'db dyn Database) -> Self::Green {
22945        panic!("No missing variant.");
22946    }
22947    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22948        let kind = node.kind(db);
22949        match kind {
22950            SyntaxKind::OptionTerminalCommaEmpty => {
22951                OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
22952            }
22953            SyntaxKind::TerminalComma => {
22954                OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
22955            }
22956            _ => panic!(
22957                "Unexpected syntax kind {:?} when constructing {}.",
22958                kind, "OptionTerminalComma"
22959            ),
22960        }
22961    }
22962    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22963        let kind = node.kind(db);
22964        match kind {
22965            SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
22966                OptionTerminalCommaEmpty::from_syntax_node(db, node),
22967            )),
22968            SyntaxKind::TerminalComma => {
22969                Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
22970            }
22971            _ => None,
22972        }
22973    }
22974    fn as_syntax_node(&self) -> SyntaxNode<'db> {
22975        match self {
22976            OptionTerminalComma::Empty(x) => x.as_syntax_node(),
22977            OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
22978        }
22979    }
22980    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22981        OptionTerminalCommaPtr(self.as_syntax_node().stable_ptr(db))
22982    }
22983}
22984impl<'db> OptionTerminalComma<'db> {
22985    /// Checks if a kind of a variant of [OptionTerminalComma].
22986    pub fn is_variant(kind: SyntaxKind) -> bool {
22987        matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
22988    }
22989}
22990#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22991pub struct OptionTerminalCommaEmpty<'db> {
22992    node: SyntaxNode<'db>,
22993}
22994impl<'db> OptionTerminalCommaEmpty<'db> {
22995    pub fn new_green(db: &'db dyn Database) -> OptionTerminalCommaEmptyGreen<'db> {
22996        let children = [];
22997        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22998        OptionTerminalCommaEmptyGreen(
22999            GreenNode {
23000                kind: SyntaxKind::OptionTerminalCommaEmpty,
23001                details: GreenNodeDetails::Node { children: children.into(), width },
23002            }
23003            .intern(db),
23004        )
23005    }
23006}
23007impl<'db> OptionTerminalCommaEmpty<'db> {}
23008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23009pub struct OptionTerminalCommaEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23010impl<'db> OptionTerminalCommaEmptyPtr<'db> {}
23011impl<'db> TypedStablePtr<'db> for OptionTerminalCommaEmptyPtr<'db> {
23012    type SyntaxNode = OptionTerminalCommaEmpty<'db>;
23013    fn untyped(self) -> SyntaxStablePtrId<'db> {
23014        self.0
23015    }
23016    fn lookup(&self, db: &'db dyn Database) -> OptionTerminalCommaEmpty<'db> {
23017        OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23018    }
23019}
23020impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23021    fn from(ptr: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23022        ptr.untyped()
23023    }
23024}
23025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23026pub struct OptionTerminalCommaEmptyGreen<'db>(pub GreenId<'db>);
23027impl<'db> TypedSyntaxNode<'db> for OptionTerminalCommaEmpty<'db> {
23028    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23029    type StablePtr = OptionTerminalCommaEmptyPtr<'db>;
23030    type Green = OptionTerminalCommaEmptyGreen<'db>;
23031    fn missing(db: &'db dyn Database) -> Self::Green {
23032        OptionTerminalCommaEmptyGreen(
23033            GreenNode {
23034                kind: SyntaxKind::OptionTerminalCommaEmpty,
23035                details: GreenNodeDetails::Node {
23036                    children: [].into(),
23037                    width: TextWidth::default(),
23038                },
23039            }
23040            .intern(db),
23041        )
23042    }
23043    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23044        let kind = node.kind(db);
23045        assert_eq!(
23046            kind,
23047            SyntaxKind::OptionTerminalCommaEmpty,
23048            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23049            kind,
23050            SyntaxKind::OptionTerminalCommaEmpty
23051        );
23052        Self { node }
23053    }
23054    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23055        let kind = node.kind(db);
23056        if kind == SyntaxKind::OptionTerminalCommaEmpty {
23057            Some(Self::from_syntax_node(db, node))
23058        } else {
23059            None
23060        }
23061    }
23062    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23063        self.node
23064    }
23065    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23066        OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23067    }
23068}
23069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23070pub enum MacroRepetitionOperator<'db> {
23071    ZeroOrOne(TerminalQuestionMark<'db>),
23072    OneOrMore(TerminalPlus<'db>),
23073    ZeroOrMore(TerminalMul<'db>),
23074    Missing(MacroRepetitionOperatorMissing<'db>),
23075}
23076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23077pub struct MacroRepetitionOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
23078impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorPtr<'db> {
23079    type SyntaxNode = MacroRepetitionOperator<'db>;
23080    fn untyped(self) -> SyntaxStablePtrId<'db> {
23081        self.0
23082    }
23083    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23084        MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23085    }
23086}
23087impl<'db> From<MacroRepetitionOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
23088    fn from(ptr: MacroRepetitionOperatorPtr<'db>) -> Self {
23089        ptr.untyped()
23090    }
23091}
23092impl<'db> From<TerminalQuestionMarkPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23093    fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
23094        Self(value.0)
23095    }
23096}
23097impl<'db> From<TerminalPlusPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23098    fn from(value: TerminalPlusPtr<'db>) -> Self {
23099        Self(value.0)
23100    }
23101}
23102impl<'db> From<TerminalMulPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23103    fn from(value: TerminalMulPtr<'db>) -> Self {
23104        Self(value.0)
23105    }
23106}
23107impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23108    fn from(value: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23109        Self(value.0)
23110    }
23111}
23112impl<'db> From<TerminalQuestionMarkGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23113    fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
23114        Self(value.0)
23115    }
23116}
23117impl<'db> From<TerminalPlusGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23118    fn from(value: TerminalPlusGreen<'db>) -> Self {
23119        Self(value.0)
23120    }
23121}
23122impl<'db> From<TerminalMulGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23123    fn from(value: TerminalMulGreen<'db>) -> Self {
23124        Self(value.0)
23125    }
23126}
23127impl<'db> From<MacroRepetitionOperatorMissingGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23128    fn from(value: MacroRepetitionOperatorMissingGreen<'db>) -> Self {
23129        Self(value.0)
23130    }
23131}
23132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23133pub struct MacroRepetitionOperatorGreen<'db>(pub GreenId<'db>);
23134impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperator<'db> {
23135    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23136    type StablePtr = MacroRepetitionOperatorPtr<'db>;
23137    type Green = MacroRepetitionOperatorGreen<'db>;
23138    fn missing(db: &'db dyn Database) -> Self::Green {
23139        MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23140    }
23141    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23142        let kind = node.kind(db);
23143        match kind {
23144            SyntaxKind::TerminalQuestionMark => {
23145                MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23146            }
23147            SyntaxKind::TerminalPlus => {
23148                MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23149            }
23150            SyntaxKind::TerminalMul => {
23151                MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23152            }
23153            SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23154                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23155            ),
23156            _ => panic!(
23157                "Unexpected syntax kind {:?} when constructing {}.",
23158                kind, "MacroRepetitionOperator"
23159            ),
23160        }
23161    }
23162    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23163        let kind = node.kind(db);
23164        match kind {
23165            SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23166                TerminalQuestionMark::from_syntax_node(db, node),
23167            )),
23168            SyntaxKind::TerminalPlus => {
23169                Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23170            }
23171            SyntaxKind::TerminalMul => {
23172                Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23173            }
23174            SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23175                MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23176            )),
23177            _ => None,
23178        }
23179    }
23180    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23181        match self {
23182            MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23183            MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23184            MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23185            MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23186        }
23187    }
23188    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23189        MacroRepetitionOperatorPtr(self.as_syntax_node().stable_ptr(db))
23190    }
23191}
23192impl<'db> MacroRepetitionOperator<'db> {
23193    /// Checks if a kind of a variant of [MacroRepetitionOperator].
23194    pub fn is_variant(kind: SyntaxKind) -> bool {
23195        matches!(
23196            kind,
23197            SyntaxKind::TerminalQuestionMark
23198                | SyntaxKind::TerminalPlus
23199                | SyntaxKind::TerminalMul
23200                | SyntaxKind::MacroRepetitionOperatorMissing
23201        )
23202    }
23203}
23204#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23205pub struct MacroRepetitionOperatorMissing<'db> {
23206    node: SyntaxNode<'db>,
23207}
23208impl<'db> MacroRepetitionOperatorMissing<'db> {
23209    pub fn new_green(db: &'db dyn Database) -> MacroRepetitionOperatorMissingGreen<'db> {
23210        let children = [];
23211        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23212        MacroRepetitionOperatorMissingGreen(
23213            GreenNode {
23214                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23215                details: GreenNodeDetails::Node { children: children.into(), width },
23216            }
23217            .intern(db),
23218        )
23219    }
23220}
23221impl<'db> MacroRepetitionOperatorMissing<'db> {}
23222#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23223pub struct MacroRepetitionOperatorMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23224impl<'db> MacroRepetitionOperatorMissingPtr<'db> {}
23225impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorMissingPtr<'db> {
23226    type SyntaxNode = MacroRepetitionOperatorMissing<'db>;
23227    fn untyped(self) -> SyntaxStablePtrId<'db> {
23228        self.0
23229    }
23230    fn lookup(&self, db: &'db dyn Database) -> MacroRepetitionOperatorMissing<'db> {
23231        MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23232    }
23233}
23234impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23235    fn from(ptr: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23236        ptr.untyped()
23237    }
23238}
23239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23240pub struct MacroRepetitionOperatorMissingGreen<'db>(pub GreenId<'db>);
23241impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperatorMissing<'db> {
23242    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23243    type StablePtr = MacroRepetitionOperatorMissingPtr<'db>;
23244    type Green = MacroRepetitionOperatorMissingGreen<'db>;
23245    fn missing(db: &'db dyn Database) -> Self::Green {
23246        MacroRepetitionOperatorMissingGreen(
23247            GreenNode {
23248                kind: SyntaxKind::MacroRepetitionOperatorMissing,
23249                details: GreenNodeDetails::Node {
23250                    children: [].into(),
23251                    width: TextWidth::default(),
23252                },
23253            }
23254            .intern(db),
23255        )
23256    }
23257    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23258        let kind = node.kind(db);
23259        assert_eq!(
23260            kind,
23261            SyntaxKind::MacroRepetitionOperatorMissing,
23262            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23263            kind,
23264            SyntaxKind::MacroRepetitionOperatorMissing
23265        );
23266        Self { node }
23267    }
23268    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23269        let kind = node.kind(db);
23270        if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23271            Some(Self::from_syntax_node(db, node))
23272        } else {
23273            None
23274        }
23275    }
23276    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23277        self.node
23278    }
23279    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23280        MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23281    }
23282}
23283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23284pub struct ParamIdent<'db> {
23285    node: SyntaxNode<'db>,
23286}
23287impl<'db> ParamIdent<'db> {
23288    pub const INDEX_IDENT: usize = 0;
23289    pub fn new_green(
23290        db: &'db dyn Database,
23291        ident: TerminalIdentifierGreen<'db>,
23292    ) -> ParamIdentGreen<'db> {
23293        let children = [ident.0];
23294        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23295        ParamIdentGreen(
23296            GreenNode {
23297                kind: SyntaxKind::ParamIdent,
23298                details: GreenNodeDetails::Node { children: children.into(), width },
23299            }
23300            .intern(db),
23301        )
23302    }
23303}
23304impl<'db> ParamIdent<'db> {
23305    pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23306        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23307    }
23308}
23309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23310pub struct ParamIdentPtr<'db>(pub SyntaxStablePtrId<'db>);
23311impl<'db> ParamIdentPtr<'db> {}
23312impl<'db> TypedStablePtr<'db> for ParamIdentPtr<'db> {
23313    type SyntaxNode = ParamIdent<'db>;
23314    fn untyped(self) -> SyntaxStablePtrId<'db> {
23315        self.0
23316    }
23317    fn lookup(&self, db: &'db dyn Database) -> ParamIdent<'db> {
23318        ParamIdent::from_syntax_node(db, self.0.lookup(db))
23319    }
23320}
23321impl<'db> From<ParamIdentPtr<'db>> for SyntaxStablePtrId<'db> {
23322    fn from(ptr: ParamIdentPtr<'db>) -> Self {
23323        ptr.untyped()
23324    }
23325}
23326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23327pub struct ParamIdentGreen<'db>(pub GreenId<'db>);
23328impl<'db> TypedSyntaxNode<'db> for ParamIdent<'db> {
23329    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23330    type StablePtr = ParamIdentPtr<'db>;
23331    type Green = ParamIdentGreen<'db>;
23332    fn missing(db: &'db dyn Database) -> Self::Green {
23333        ParamIdentGreen(
23334            GreenNode {
23335                kind: SyntaxKind::ParamIdent,
23336                details: GreenNodeDetails::Node {
23337                    children: [TerminalIdentifier::missing(db).0].into(),
23338                    width: TextWidth::default(),
23339                },
23340            }
23341            .intern(db),
23342        )
23343    }
23344    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23345        let kind = node.kind(db);
23346        assert_eq!(
23347            kind,
23348            SyntaxKind::ParamIdent,
23349            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23350            kind,
23351            SyntaxKind::ParamIdent
23352        );
23353        Self { node }
23354    }
23355    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23356        let kind = node.kind(db);
23357        if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23358    }
23359    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23360        self.node
23361    }
23362    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23363        ParamIdentPtr(self.node.stable_ptr(db))
23364    }
23365}
23366#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23367pub struct ParamExpr<'db> {
23368    node: SyntaxNode<'db>,
23369}
23370impl<'db> ParamExpr<'db> {
23371    pub const INDEX_EXPR: usize = 0;
23372    pub fn new_green(
23373        db: &'db dyn Database,
23374        expr: TerminalIdentifierGreen<'db>,
23375    ) -> ParamExprGreen<'db> {
23376        let children = [expr.0];
23377        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23378        ParamExprGreen(
23379            GreenNode {
23380                kind: SyntaxKind::ParamExpr,
23381                details: GreenNodeDetails::Node { children: children.into(), width },
23382            }
23383            .intern(db),
23384        )
23385    }
23386}
23387impl<'db> ParamExpr<'db> {
23388    pub fn expr(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23389        TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23390    }
23391}
23392#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23393pub struct ParamExprPtr<'db>(pub SyntaxStablePtrId<'db>);
23394impl<'db> ParamExprPtr<'db> {}
23395impl<'db> TypedStablePtr<'db> for ParamExprPtr<'db> {
23396    type SyntaxNode = ParamExpr<'db>;
23397    fn untyped(self) -> SyntaxStablePtrId<'db> {
23398        self.0
23399    }
23400    fn lookup(&self, db: &'db dyn Database) -> ParamExpr<'db> {
23401        ParamExpr::from_syntax_node(db, self.0.lookup(db))
23402    }
23403}
23404impl<'db> From<ParamExprPtr<'db>> for SyntaxStablePtrId<'db> {
23405    fn from(ptr: ParamExprPtr<'db>) -> Self {
23406        ptr.untyped()
23407    }
23408}
23409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23410pub struct ParamExprGreen<'db>(pub GreenId<'db>);
23411impl<'db> TypedSyntaxNode<'db> for ParamExpr<'db> {
23412    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23413    type StablePtr = ParamExprPtr<'db>;
23414    type Green = ParamExprGreen<'db>;
23415    fn missing(db: &'db dyn Database) -> Self::Green {
23416        ParamExprGreen(
23417            GreenNode {
23418                kind: SyntaxKind::ParamExpr,
23419                details: GreenNodeDetails::Node {
23420                    children: [TerminalIdentifier::missing(db).0].into(),
23421                    width: TextWidth::default(),
23422                },
23423            }
23424            .intern(db),
23425        )
23426    }
23427    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23428        let kind = node.kind(db);
23429        assert_eq!(
23430            kind,
23431            SyntaxKind::ParamExpr,
23432            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23433            kind,
23434            SyntaxKind::ParamExpr
23435        );
23436        Self { node }
23437    }
23438    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23439        let kind = node.kind(db);
23440        if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23441    }
23442    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23443        self.node
23444    }
23445    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23446        ParamExprPtr(self.node.stable_ptr(db))
23447    }
23448}
23449#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23450pub enum MacroParamKind<'db> {
23451    Identifier(ParamIdent<'db>),
23452    Expr(ParamExpr<'db>),
23453    Missing(MacroParamKindMissing<'db>),
23454}
23455#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23456pub struct MacroParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
23457impl<'db> TypedStablePtr<'db> for MacroParamKindPtr<'db> {
23458    type SyntaxNode = MacroParamKind<'db>;
23459    fn untyped(self) -> SyntaxStablePtrId<'db> {
23460        self.0
23461    }
23462    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23463        MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23464    }
23465}
23466impl<'db> From<MacroParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
23467    fn from(ptr: MacroParamKindPtr<'db>) -> Self {
23468        ptr.untyped()
23469    }
23470}
23471impl<'db> From<ParamIdentPtr<'db>> for MacroParamKindPtr<'db> {
23472    fn from(value: ParamIdentPtr<'db>) -> Self {
23473        Self(value.0)
23474    }
23475}
23476impl<'db> From<ParamExprPtr<'db>> for MacroParamKindPtr<'db> {
23477    fn from(value: ParamExprPtr<'db>) -> Self {
23478        Self(value.0)
23479    }
23480}
23481impl<'db> From<MacroParamKindMissingPtr<'db>> for MacroParamKindPtr<'db> {
23482    fn from(value: MacroParamKindMissingPtr<'db>) -> Self {
23483        Self(value.0)
23484    }
23485}
23486impl<'db> From<ParamIdentGreen<'db>> for MacroParamKindGreen<'db> {
23487    fn from(value: ParamIdentGreen<'db>) -> Self {
23488        Self(value.0)
23489    }
23490}
23491impl<'db> From<ParamExprGreen<'db>> for MacroParamKindGreen<'db> {
23492    fn from(value: ParamExprGreen<'db>) -> Self {
23493        Self(value.0)
23494    }
23495}
23496impl<'db> From<MacroParamKindMissingGreen<'db>> for MacroParamKindGreen<'db> {
23497    fn from(value: MacroParamKindMissingGreen<'db>) -> Self {
23498        Self(value.0)
23499    }
23500}
23501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23502pub struct MacroParamKindGreen<'db>(pub GreenId<'db>);
23503impl<'db> TypedSyntaxNode<'db> for MacroParamKind<'db> {
23504    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23505    type StablePtr = MacroParamKindPtr<'db>;
23506    type Green = MacroParamKindGreen<'db>;
23507    fn missing(db: &'db dyn Database) -> Self::Green {
23508        MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23509    }
23510    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23511        let kind = node.kind(db);
23512        match kind {
23513            SyntaxKind::ParamIdent => {
23514                MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23515            }
23516            SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23517            SyntaxKind::MacroParamKindMissing => {
23518                MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23519            }
23520            _ => {
23521                panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23522            }
23523        }
23524    }
23525    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23526        let kind = node.kind(db);
23527        match kind {
23528            SyntaxKind::ParamIdent => {
23529                Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23530            }
23531            SyntaxKind::ParamExpr => {
23532                Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23533            }
23534            SyntaxKind::MacroParamKindMissing => {
23535                Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23536            }
23537            _ => None,
23538        }
23539    }
23540    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23541        match self {
23542            MacroParamKind::Identifier(x) => x.as_syntax_node(),
23543            MacroParamKind::Expr(x) => x.as_syntax_node(),
23544            MacroParamKind::Missing(x) => x.as_syntax_node(),
23545        }
23546    }
23547    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23548        MacroParamKindPtr(self.as_syntax_node().stable_ptr(db))
23549    }
23550}
23551impl<'db> MacroParamKind<'db> {
23552    /// Checks if a kind of a variant of [MacroParamKind].
23553    pub fn is_variant(kind: SyntaxKind) -> bool {
23554        matches!(
23555            kind,
23556            SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23557        )
23558    }
23559}
23560#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23561pub struct MacroParamKindMissing<'db> {
23562    node: SyntaxNode<'db>,
23563}
23564impl<'db> MacroParamKindMissing<'db> {
23565    pub fn new_green(db: &'db dyn Database) -> MacroParamKindMissingGreen<'db> {
23566        let children = [];
23567        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23568        MacroParamKindMissingGreen(
23569            GreenNode {
23570                kind: SyntaxKind::MacroParamKindMissing,
23571                details: GreenNodeDetails::Node { children: children.into(), width },
23572            }
23573            .intern(db),
23574        )
23575    }
23576}
23577impl<'db> MacroParamKindMissing<'db> {}
23578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23579pub struct MacroParamKindMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23580impl<'db> MacroParamKindMissingPtr<'db> {}
23581impl<'db> TypedStablePtr<'db> for MacroParamKindMissingPtr<'db> {
23582    type SyntaxNode = MacroParamKindMissing<'db>;
23583    fn untyped(self) -> SyntaxStablePtrId<'db> {
23584        self.0
23585    }
23586    fn lookup(&self, db: &'db dyn Database) -> MacroParamKindMissing<'db> {
23587        MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
23588    }
23589}
23590impl<'db> From<MacroParamKindMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23591    fn from(ptr: MacroParamKindMissingPtr<'db>) -> Self {
23592        ptr.untyped()
23593    }
23594}
23595#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23596pub struct MacroParamKindMissingGreen<'db>(pub GreenId<'db>);
23597impl<'db> TypedSyntaxNode<'db> for MacroParamKindMissing<'db> {
23598    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
23599    type StablePtr = MacroParamKindMissingPtr<'db>;
23600    type Green = MacroParamKindMissingGreen<'db>;
23601    fn missing(db: &'db dyn Database) -> Self::Green {
23602        MacroParamKindMissingGreen(
23603            GreenNode {
23604                kind: SyntaxKind::MacroParamKindMissing,
23605                details: GreenNodeDetails::Node {
23606                    children: [].into(),
23607                    width: TextWidth::default(),
23608                },
23609            }
23610            .intern(db),
23611        )
23612    }
23613    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23614        let kind = node.kind(db);
23615        assert_eq!(
23616            kind,
23617            SyntaxKind::MacroParamKindMissing,
23618            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23619            kind,
23620            SyntaxKind::MacroParamKindMissing
23621        );
23622        Self { node }
23623    }
23624    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23625        let kind = node.kind(db);
23626        if kind == SyntaxKind::MacroParamKindMissing {
23627            Some(Self::from_syntax_node(db, node))
23628        } else {
23629            None
23630        }
23631    }
23632    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23633        self.node
23634    }
23635    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23636        MacroParamKindMissingPtr(self.node.stable_ptr(db))
23637    }
23638}
23639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23640pub enum MacroElement<'db> {
23641    Token(TokenTreeLeaf<'db>),
23642    Param(MacroParam<'db>),
23643    Subtree(MacroWrapper<'db>),
23644    Repetition(MacroRepetition<'db>),
23645}
23646#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23647pub struct MacroElementPtr<'db>(pub SyntaxStablePtrId<'db>);
23648impl<'db> TypedStablePtr<'db> for MacroElementPtr<'db> {
23649    type SyntaxNode = MacroElement<'db>;
23650    fn untyped(self) -> SyntaxStablePtrId<'db> {
23651        self.0
23652    }
23653    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23654        MacroElement::from_syntax_node(db, self.0.lookup(db))
23655    }
23656}
23657impl<'db> From<MacroElementPtr<'db>> for SyntaxStablePtrId<'db> {
23658    fn from(ptr: MacroElementPtr<'db>) -> Self {
23659        ptr.untyped()
23660    }
23661}
23662impl<'db> From<TokenTreeLeafPtr<'db>> for MacroElementPtr<'db> {
23663    fn from(value: TokenTreeLeafPtr<'db>) -> Self {
23664        Self(value.0)
23665    }
23666}
23667impl<'db> From<MacroParamPtr<'db>> for MacroElementPtr<'db> {
23668    fn from(value: MacroParamPtr<'db>) -> Self {
23669        Self(value.0)
23670    }
23671}
23672impl<'db> From<MacroWrapperPtr<'db>> for MacroElementPtr<'db> {
23673    fn from(value: MacroWrapperPtr<'db>) -> Self {
23674        Self(value.0)
23675    }
23676}
23677impl<'db> From<MacroRepetitionPtr<'db>> for MacroElementPtr<'db> {
23678    fn from(value: MacroRepetitionPtr<'db>) -> Self {
23679        Self(value.0)
23680    }
23681}
23682impl<'db> From<TokenTreeLeafGreen<'db>> for MacroElementGreen<'db> {
23683    fn from(value: TokenTreeLeafGreen<'db>) -> Self {
23684        Self(value.0)
23685    }
23686}
23687impl<'db> From<MacroParamGreen<'db>> for MacroElementGreen<'db> {
23688    fn from(value: MacroParamGreen<'db>) -> Self {
23689        Self(value.0)
23690    }
23691}
23692impl<'db> From<MacroWrapperGreen<'db>> for MacroElementGreen<'db> {
23693    fn from(value: MacroWrapperGreen<'db>) -> Self {
23694        Self(value.0)
23695    }
23696}
23697impl<'db> From<MacroRepetitionGreen<'db>> for MacroElementGreen<'db> {
23698    fn from(value: MacroRepetitionGreen<'db>) -> Self {
23699        Self(value.0)
23700    }
23701}
23702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23703pub struct MacroElementGreen<'db>(pub GreenId<'db>);
23704impl<'db> TypedSyntaxNode<'db> for MacroElement<'db> {
23705    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23706    type StablePtr = MacroElementPtr<'db>;
23707    type Green = MacroElementGreen<'db>;
23708    fn missing(db: &'db dyn Database) -> Self::Green {
23709        panic!("No missing variant.");
23710    }
23711    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23712        let kind = node.kind(db);
23713        match kind {
23714            SyntaxKind::TokenTreeLeaf => {
23715                MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
23716            }
23717            SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
23718            SyntaxKind::MacroWrapper => {
23719                MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
23720            }
23721            SyntaxKind::MacroRepetition => {
23722                MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
23723            }
23724            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
23725        }
23726    }
23727    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23728        let kind = node.kind(db);
23729        match kind {
23730            SyntaxKind::TokenTreeLeaf => {
23731                Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
23732            }
23733            SyntaxKind::MacroParam => {
23734                Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
23735            }
23736            SyntaxKind::MacroWrapper => {
23737                Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
23738            }
23739            SyntaxKind::MacroRepetition => {
23740                Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
23741            }
23742            _ => None,
23743        }
23744    }
23745    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23746        match self {
23747            MacroElement::Token(x) => x.as_syntax_node(),
23748            MacroElement::Param(x) => x.as_syntax_node(),
23749            MacroElement::Subtree(x) => x.as_syntax_node(),
23750            MacroElement::Repetition(x) => x.as_syntax_node(),
23751        }
23752    }
23753    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23754        MacroElementPtr(self.as_syntax_node().stable_ptr(db))
23755    }
23756}
23757impl<'db> MacroElement<'db> {
23758    /// Checks if a kind of a variant of [MacroElement].
23759    pub fn is_variant(kind: SyntaxKind) -> bool {
23760        matches!(
23761            kind,
23762            SyntaxKind::TokenTreeLeaf
23763                | SyntaxKind::MacroParam
23764                | SyntaxKind::MacroWrapper
23765                | SyntaxKind::MacroRepetition
23766        )
23767    }
23768}
23769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23770pub struct MacroElements<'db>(ElementList<'db, MacroElement<'db>, 1>);
23771impl<'db> Deref for MacroElements<'db> {
23772    type Target = ElementList<'db, MacroElement<'db>, 1>;
23773    fn deref(&self) -> &Self::Target {
23774        &self.0
23775    }
23776}
23777impl<'db> MacroElements<'db> {
23778    pub fn new_green(
23779        db: &'db dyn Database,
23780        children: &[MacroElementGreen<'db>],
23781    ) -> MacroElementsGreen<'db> {
23782        let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
23783        MacroElementsGreen(
23784            GreenNode {
23785                kind: SyntaxKind::MacroElements,
23786                details: GreenNodeDetails::Node {
23787                    children: children.iter().map(|x| x.0).collect(),
23788                    width,
23789                },
23790            }
23791            .intern(db),
23792        )
23793    }
23794}
23795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23796pub struct MacroElementsPtr<'db>(pub SyntaxStablePtrId<'db>);
23797impl<'db> TypedStablePtr<'db> for MacroElementsPtr<'db> {
23798    type SyntaxNode = MacroElements<'db>;
23799    fn untyped(self) -> SyntaxStablePtrId<'db> {
23800        self.0
23801    }
23802    fn lookup(&self, db: &'db dyn Database) -> MacroElements<'db> {
23803        MacroElements::from_syntax_node(db, self.0.lookup(db))
23804    }
23805}
23806impl<'db> From<MacroElementsPtr<'db>> for SyntaxStablePtrId<'db> {
23807    fn from(ptr: MacroElementsPtr<'db>) -> Self {
23808        ptr.untyped()
23809    }
23810}
23811#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23812pub struct MacroElementsGreen<'db>(pub GreenId<'db>);
23813impl<'db> TypedSyntaxNode<'db> for MacroElements<'db> {
23814    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
23815    type StablePtr = MacroElementsPtr<'db>;
23816    type Green = MacroElementsGreen<'db>;
23817    fn missing(db: &'db dyn Database) -> Self::Green {
23818        MacroElementsGreen(
23819            GreenNode {
23820                kind: SyntaxKind::MacroElements,
23821                details: GreenNodeDetails::Node {
23822                    children: [].into(),
23823                    width: TextWidth::default(),
23824                },
23825            }
23826            .intern(db),
23827        )
23828    }
23829    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23830        Self(ElementList::new(node))
23831    }
23832    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23833        if node.kind(db) == SyntaxKind::MacroElements {
23834            Some(Self(ElementList::new(node)))
23835        } else {
23836            None
23837        }
23838    }
23839    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23840        self.node
23841    }
23842    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23843        MacroElementsPtr(self.node.stable_ptr(db))
23844    }
23845}
23846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23847pub struct MacroWrapper<'db> {
23848    node: SyntaxNode<'db>,
23849}
23850impl<'db> MacroWrapper<'db> {
23851    pub const INDEX_SUBTREE: usize = 0;
23852    pub fn new_green(
23853        db: &'db dyn Database,
23854        subtree: WrappedMacroGreen<'db>,
23855    ) -> MacroWrapperGreen<'db> {
23856        let children = [subtree.0];
23857        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23858        MacroWrapperGreen(
23859            GreenNode {
23860                kind: SyntaxKind::MacroWrapper,
23861                details: GreenNodeDetails::Node { children: children.into(), width },
23862            }
23863            .intern(db),
23864        )
23865    }
23866}
23867impl<'db> MacroWrapper<'db> {
23868    pub fn subtree(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
23869        WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
23870    }
23871}
23872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23873pub struct MacroWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
23874impl<'db> MacroWrapperPtr<'db> {}
23875impl<'db> TypedStablePtr<'db> for MacroWrapperPtr<'db> {
23876    type SyntaxNode = MacroWrapper<'db>;
23877    fn untyped(self) -> SyntaxStablePtrId<'db> {
23878        self.0
23879    }
23880    fn lookup(&self, db: &'db dyn Database) -> MacroWrapper<'db> {
23881        MacroWrapper::from_syntax_node(db, self.0.lookup(db))
23882    }
23883}
23884impl<'db> From<MacroWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
23885    fn from(ptr: MacroWrapperPtr<'db>) -> Self {
23886        ptr.untyped()
23887    }
23888}
23889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23890pub struct MacroWrapperGreen<'db>(pub GreenId<'db>);
23891impl<'db> TypedSyntaxNode<'db> for MacroWrapper<'db> {
23892    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
23893    type StablePtr = MacroWrapperPtr<'db>;
23894    type Green = MacroWrapperGreen<'db>;
23895    fn missing(db: &'db dyn Database) -> Self::Green {
23896        MacroWrapperGreen(
23897            GreenNode {
23898                kind: SyntaxKind::MacroWrapper,
23899                details: GreenNodeDetails::Node {
23900                    children: [WrappedMacro::missing(db).0].into(),
23901                    width: TextWidth::default(),
23902                },
23903            }
23904            .intern(db),
23905        )
23906    }
23907    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23908        let kind = node.kind(db);
23909        assert_eq!(
23910            kind,
23911            SyntaxKind::MacroWrapper,
23912            "Unexpected SyntaxKind {:?}. Expected {:?}.",
23913            kind,
23914            SyntaxKind::MacroWrapper
23915        );
23916        Self { node }
23917    }
23918    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23919        let kind = node.kind(db);
23920        if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
23921    }
23922    fn as_syntax_node(&self) -> SyntaxNode<'db> {
23923        self.node
23924    }
23925    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23926        MacroWrapperPtr(self.node.stable_ptr(db))
23927    }
23928}
23929#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23930pub enum WrappedMacro<'db> {
23931    Parenthesized(ParenthesizedMacro<'db>),
23932    Braced(BracedMacro<'db>),
23933    Bracketed(BracketedMacro<'db>),
23934}
23935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
23936pub struct WrappedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
23937impl<'db> TypedStablePtr<'db> for WrappedMacroPtr<'db> {
23938    type SyntaxNode = WrappedMacro<'db>;
23939    fn untyped(self) -> SyntaxStablePtrId<'db> {
23940        self.0
23941    }
23942    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23943        WrappedMacro::from_syntax_node(db, self.0.lookup(db))
23944    }
23945}
23946impl<'db> From<WrappedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
23947    fn from(ptr: WrappedMacroPtr<'db>) -> Self {
23948        ptr.untyped()
23949    }
23950}
23951impl<'db> From<ParenthesizedMacroPtr<'db>> for WrappedMacroPtr<'db> {
23952    fn from(value: ParenthesizedMacroPtr<'db>) -> Self {
23953        Self(value.0)
23954    }
23955}
23956impl<'db> From<BracedMacroPtr<'db>> for WrappedMacroPtr<'db> {
23957    fn from(value: BracedMacroPtr<'db>) -> Self {
23958        Self(value.0)
23959    }
23960}
23961impl<'db> From<BracketedMacroPtr<'db>> for WrappedMacroPtr<'db> {
23962    fn from(value: BracketedMacroPtr<'db>) -> Self {
23963        Self(value.0)
23964    }
23965}
23966impl<'db> From<ParenthesizedMacroGreen<'db>> for WrappedMacroGreen<'db> {
23967    fn from(value: ParenthesizedMacroGreen<'db>) -> Self {
23968        Self(value.0)
23969    }
23970}
23971impl<'db> From<BracedMacroGreen<'db>> for WrappedMacroGreen<'db> {
23972    fn from(value: BracedMacroGreen<'db>) -> Self {
23973        Self(value.0)
23974    }
23975}
23976impl<'db> From<BracketedMacroGreen<'db>> for WrappedMacroGreen<'db> {
23977    fn from(value: BracketedMacroGreen<'db>) -> Self {
23978        Self(value.0)
23979    }
23980}
23981#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23982pub struct WrappedMacroGreen<'db>(pub GreenId<'db>);
23983impl<'db> TypedSyntaxNode<'db> for WrappedMacro<'db> {
23984    const OPTIONAL_KIND: Option<SyntaxKind> = None;
23985    type StablePtr = WrappedMacroPtr<'db>;
23986    type Green = WrappedMacroGreen<'db>;
23987    fn missing(db: &'db dyn Database) -> Self::Green {
23988        panic!("No missing variant.");
23989    }
23990    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23991        let kind = node.kind(db);
23992        match kind {
23993            SyntaxKind::ParenthesizedMacro => {
23994                WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
23995            }
23996            SyntaxKind::BracedMacro => {
23997                WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
23998            }
23999            SyntaxKind::BracketedMacro => {
24000                WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24001            }
24002            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24003        }
24004    }
24005    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24006        let kind = node.kind(db);
24007        match kind {
24008            SyntaxKind::ParenthesizedMacro => {
24009                Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24010            }
24011            SyntaxKind::BracedMacro => {
24012                Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24013            }
24014            SyntaxKind::BracketedMacro => {
24015                Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24016            }
24017            _ => None,
24018        }
24019    }
24020    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24021        match self {
24022            WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24023            WrappedMacro::Braced(x) => x.as_syntax_node(),
24024            WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24025        }
24026    }
24027    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24028        WrappedMacroPtr(self.as_syntax_node().stable_ptr(db))
24029    }
24030}
24031impl<'db> WrappedMacro<'db> {
24032    /// Checks if a kind of a variant of [WrappedMacro].
24033    pub fn is_variant(kind: SyntaxKind) -> bool {
24034        matches!(
24035            kind,
24036            SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24037        )
24038    }
24039}
24040#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24041pub struct ParenthesizedMacro<'db> {
24042    node: SyntaxNode<'db>,
24043}
24044impl<'db> ParenthesizedMacro<'db> {
24045    pub const INDEX_LPAREN: usize = 0;
24046    pub const INDEX_ELEMENTS: usize = 1;
24047    pub const INDEX_RPAREN: usize = 2;
24048    pub fn new_green(
24049        db: &'db dyn Database,
24050        lparen: TerminalLParenGreen<'db>,
24051        elements: MacroElementsGreen<'db>,
24052        rparen: TerminalRParenGreen<'db>,
24053    ) -> ParenthesizedMacroGreen<'db> {
24054        let children = [lparen.0, elements.0, rparen.0];
24055        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24056        ParenthesizedMacroGreen(
24057            GreenNode {
24058                kind: SyntaxKind::ParenthesizedMacro,
24059                details: GreenNodeDetails::Node { children: children.into(), width },
24060            }
24061            .intern(db),
24062        )
24063    }
24064}
24065impl<'db> ParenthesizedMacro<'db> {
24066    pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
24067        TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24068    }
24069    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24070        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24071    }
24072    pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
24073        TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24074    }
24075}
24076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24077pub struct ParenthesizedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24078impl<'db> ParenthesizedMacroPtr<'db> {}
24079impl<'db> TypedStablePtr<'db> for ParenthesizedMacroPtr<'db> {
24080    type SyntaxNode = ParenthesizedMacro<'db>;
24081    fn untyped(self) -> SyntaxStablePtrId<'db> {
24082        self.0
24083    }
24084    fn lookup(&self, db: &'db dyn Database) -> ParenthesizedMacro<'db> {
24085        ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24086    }
24087}
24088impl<'db> From<ParenthesizedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24089    fn from(ptr: ParenthesizedMacroPtr<'db>) -> Self {
24090        ptr.untyped()
24091    }
24092}
24093#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24094pub struct ParenthesizedMacroGreen<'db>(pub GreenId<'db>);
24095impl<'db> TypedSyntaxNode<'db> for ParenthesizedMacro<'db> {
24096    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24097    type StablePtr = ParenthesizedMacroPtr<'db>;
24098    type Green = ParenthesizedMacroGreen<'db>;
24099    fn missing(db: &'db dyn Database) -> Self::Green {
24100        ParenthesizedMacroGreen(
24101            GreenNode {
24102                kind: SyntaxKind::ParenthesizedMacro,
24103                details: GreenNodeDetails::Node {
24104                    children: [
24105                        TerminalLParen::missing(db).0,
24106                        MacroElements::missing(db).0,
24107                        TerminalRParen::missing(db).0,
24108                    ]
24109                    .into(),
24110                    width: TextWidth::default(),
24111                },
24112            }
24113            .intern(db),
24114        )
24115    }
24116    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24117        let kind = node.kind(db);
24118        assert_eq!(
24119            kind,
24120            SyntaxKind::ParenthesizedMacro,
24121            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24122            kind,
24123            SyntaxKind::ParenthesizedMacro
24124        );
24125        Self { node }
24126    }
24127    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24128        let kind = node.kind(db);
24129        if kind == SyntaxKind::ParenthesizedMacro {
24130            Some(Self::from_syntax_node(db, node))
24131        } else {
24132            None
24133        }
24134    }
24135    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24136        self.node
24137    }
24138    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24139        ParenthesizedMacroPtr(self.node.stable_ptr(db))
24140    }
24141}
24142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24143pub struct BracedMacro<'db> {
24144    node: SyntaxNode<'db>,
24145}
24146impl<'db> BracedMacro<'db> {
24147    pub const INDEX_LBRACE: usize = 0;
24148    pub const INDEX_ELEMENTS: usize = 1;
24149    pub const INDEX_RBRACE: usize = 2;
24150    pub fn new_green(
24151        db: &'db dyn Database,
24152        lbrace: TerminalLBraceGreen<'db>,
24153        elements: MacroElementsGreen<'db>,
24154        rbrace: TerminalRBraceGreen<'db>,
24155    ) -> BracedMacroGreen<'db> {
24156        let children = [lbrace.0, elements.0, rbrace.0];
24157        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24158        BracedMacroGreen(
24159            GreenNode {
24160                kind: SyntaxKind::BracedMacro,
24161                details: GreenNodeDetails::Node { children: children.into(), width },
24162            }
24163            .intern(db),
24164        )
24165    }
24166}
24167impl<'db> BracedMacro<'db> {
24168    pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
24169        TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24170    }
24171    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24172        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24173    }
24174    pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
24175        TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24176    }
24177}
24178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24179pub struct BracedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24180impl<'db> BracedMacroPtr<'db> {}
24181impl<'db> TypedStablePtr<'db> for BracedMacroPtr<'db> {
24182    type SyntaxNode = BracedMacro<'db>;
24183    fn untyped(self) -> SyntaxStablePtrId<'db> {
24184        self.0
24185    }
24186    fn lookup(&self, db: &'db dyn Database) -> BracedMacro<'db> {
24187        BracedMacro::from_syntax_node(db, self.0.lookup(db))
24188    }
24189}
24190impl<'db> From<BracedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24191    fn from(ptr: BracedMacroPtr<'db>) -> Self {
24192        ptr.untyped()
24193    }
24194}
24195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24196pub struct BracedMacroGreen<'db>(pub GreenId<'db>);
24197impl<'db> TypedSyntaxNode<'db> for BracedMacro<'db> {
24198    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24199    type StablePtr = BracedMacroPtr<'db>;
24200    type Green = BracedMacroGreen<'db>;
24201    fn missing(db: &'db dyn Database) -> Self::Green {
24202        BracedMacroGreen(
24203            GreenNode {
24204                kind: SyntaxKind::BracedMacro,
24205                details: GreenNodeDetails::Node {
24206                    children: [
24207                        TerminalLBrace::missing(db).0,
24208                        MacroElements::missing(db).0,
24209                        TerminalRBrace::missing(db).0,
24210                    ]
24211                    .into(),
24212                    width: TextWidth::default(),
24213                },
24214            }
24215            .intern(db),
24216        )
24217    }
24218    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24219        let kind = node.kind(db);
24220        assert_eq!(
24221            kind,
24222            SyntaxKind::BracedMacro,
24223            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24224            kind,
24225            SyntaxKind::BracedMacro
24226        );
24227        Self { node }
24228    }
24229    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24230        let kind = node.kind(db);
24231        if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24232    }
24233    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24234        self.node
24235    }
24236    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24237        BracedMacroPtr(self.node.stable_ptr(db))
24238    }
24239}
24240#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24241pub struct BracketedMacro<'db> {
24242    node: SyntaxNode<'db>,
24243}
24244impl<'db> BracketedMacro<'db> {
24245    pub const INDEX_LBRACK: usize = 0;
24246    pub const INDEX_ELEMENTS: usize = 1;
24247    pub const INDEX_RBRACK: usize = 2;
24248    pub fn new_green(
24249        db: &'db dyn Database,
24250        lbrack: TerminalLBrackGreen<'db>,
24251        elements: MacroElementsGreen<'db>,
24252        rbrack: TerminalRBrackGreen<'db>,
24253    ) -> BracketedMacroGreen<'db> {
24254        let children = [lbrack.0, elements.0, rbrack.0];
24255        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24256        BracketedMacroGreen(
24257            GreenNode {
24258                kind: SyntaxKind::BracketedMacro,
24259                details: GreenNodeDetails::Node { children: children.into(), width },
24260            }
24261            .intern(db),
24262        )
24263    }
24264}
24265impl<'db> BracketedMacro<'db> {
24266    pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
24267        TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24268    }
24269    pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24270        MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24271    }
24272    pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
24273        TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24274    }
24275}
24276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24277pub struct BracketedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24278impl<'db> BracketedMacroPtr<'db> {}
24279impl<'db> TypedStablePtr<'db> for BracketedMacroPtr<'db> {
24280    type SyntaxNode = BracketedMacro<'db>;
24281    fn untyped(self) -> SyntaxStablePtrId<'db> {
24282        self.0
24283    }
24284    fn lookup(&self, db: &'db dyn Database) -> BracketedMacro<'db> {
24285        BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24286    }
24287}
24288impl<'db> From<BracketedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24289    fn from(ptr: BracketedMacroPtr<'db>) -> Self {
24290        ptr.untyped()
24291    }
24292}
24293#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24294pub struct BracketedMacroGreen<'db>(pub GreenId<'db>);
24295impl<'db> TypedSyntaxNode<'db> for BracketedMacro<'db> {
24296    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24297    type StablePtr = BracketedMacroPtr<'db>;
24298    type Green = BracketedMacroGreen<'db>;
24299    fn missing(db: &'db dyn Database) -> Self::Green {
24300        BracketedMacroGreen(
24301            GreenNode {
24302                kind: SyntaxKind::BracketedMacro,
24303                details: GreenNodeDetails::Node {
24304                    children: [
24305                        TerminalLBrack::missing(db).0,
24306                        MacroElements::missing(db).0,
24307                        TerminalRBrack::missing(db).0,
24308                    ]
24309                    .into(),
24310                    width: TextWidth::default(),
24311                },
24312            }
24313            .intern(db),
24314        )
24315    }
24316    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24317        let kind = node.kind(db);
24318        assert_eq!(
24319            kind,
24320            SyntaxKind::BracketedMacro,
24321            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24322            kind,
24323            SyntaxKind::BracketedMacro
24324        );
24325        Self { node }
24326    }
24327    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24328        let kind = node.kind(db);
24329        if kind == SyntaxKind::BracketedMacro {
24330            Some(Self::from_syntax_node(db, node))
24331        } else {
24332            None
24333        }
24334    }
24335    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24336        self.node
24337    }
24338    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24339        BracketedMacroPtr(self.node.stable_ptr(db))
24340    }
24341}
24342#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24343pub struct LegacyExprInlineMacro<'db> {
24344    node: SyntaxNode<'db>,
24345}
24346impl<'db> LegacyExprInlineMacro<'db> {
24347    pub const INDEX_PATH: usize = 0;
24348    pub const INDEX_BANG: usize = 1;
24349    pub const INDEX_ARGUMENTS: usize = 2;
24350    pub fn new_green(
24351        db: &'db dyn Database,
24352        path: ExprPathGreen<'db>,
24353        bang: TerminalNotGreen<'db>,
24354        arguments: WrappedArgListGreen<'db>,
24355    ) -> LegacyExprInlineMacroGreen<'db> {
24356        let children = [path.0, bang.0, arguments.0];
24357        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24358        LegacyExprInlineMacroGreen(
24359            GreenNode {
24360                kind: SyntaxKind::LegacyExprInlineMacro,
24361                details: GreenNodeDetails::Node { children: children.into(), width },
24362            }
24363            .intern(db),
24364        )
24365    }
24366}
24367impl<'db> LegacyExprInlineMacro<'db> {
24368    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24369        ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24370    }
24371    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24372        TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24373    }
24374    pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24375        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24376    }
24377}
24378#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24379pub struct LegacyExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24380impl<'db> LegacyExprInlineMacroPtr<'db> {}
24381impl<'db> TypedStablePtr<'db> for LegacyExprInlineMacroPtr<'db> {
24382    type SyntaxNode = LegacyExprInlineMacro<'db>;
24383    fn untyped(self) -> SyntaxStablePtrId<'db> {
24384        self.0
24385    }
24386    fn lookup(&self, db: &'db dyn Database) -> LegacyExprInlineMacro<'db> {
24387        LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24388    }
24389}
24390impl<'db> From<LegacyExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24391    fn from(ptr: LegacyExprInlineMacroPtr<'db>) -> Self {
24392        ptr.untyped()
24393    }
24394}
24395#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24396pub struct LegacyExprInlineMacroGreen<'db>(pub GreenId<'db>);
24397impl<'db> TypedSyntaxNode<'db> for LegacyExprInlineMacro<'db> {
24398    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24399    type StablePtr = LegacyExprInlineMacroPtr<'db>;
24400    type Green = LegacyExprInlineMacroGreen<'db>;
24401    fn missing(db: &'db dyn Database) -> Self::Green {
24402        LegacyExprInlineMacroGreen(
24403            GreenNode {
24404                kind: SyntaxKind::LegacyExprInlineMacro,
24405                details: GreenNodeDetails::Node {
24406                    children: [
24407                        ExprPath::missing(db).0,
24408                        TerminalNot::missing(db).0,
24409                        WrappedArgList::missing(db).0,
24410                    ]
24411                    .into(),
24412                    width: TextWidth::default(),
24413                },
24414            }
24415            .intern(db),
24416        )
24417    }
24418    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24419        let kind = node.kind(db);
24420        assert_eq!(
24421            kind,
24422            SyntaxKind::LegacyExprInlineMacro,
24423            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24424            kind,
24425            SyntaxKind::LegacyExprInlineMacro
24426        );
24427        Self { node }
24428    }
24429    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24430        let kind = node.kind(db);
24431        if kind == SyntaxKind::LegacyExprInlineMacro {
24432            Some(Self::from_syntax_node(db, node))
24433        } else {
24434            None
24435        }
24436    }
24437    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24438        self.node
24439    }
24440    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24441        LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24442    }
24443}
24444#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24445pub struct LegacyItemInlineMacro<'db> {
24446    node: SyntaxNode<'db>,
24447}
24448impl<'db> LegacyItemInlineMacro<'db> {
24449    pub const INDEX_ATTRIBUTES: usize = 0;
24450    pub const INDEX_PATH: usize = 1;
24451    pub const INDEX_BANG: usize = 2;
24452    pub const INDEX_ARGUMENTS: usize = 3;
24453    pub const INDEX_SEMICOLON: usize = 4;
24454    pub fn new_green(
24455        db: &'db dyn Database,
24456        attributes: AttributeListGreen<'db>,
24457        path: ExprPathGreen<'db>,
24458        bang: TerminalNotGreen<'db>,
24459        arguments: WrappedArgListGreen<'db>,
24460        semicolon: TerminalSemicolonGreen<'db>,
24461    ) -> LegacyItemInlineMacroGreen<'db> {
24462        let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24463        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24464        LegacyItemInlineMacroGreen(
24465            GreenNode {
24466                kind: SyntaxKind::LegacyItemInlineMacro,
24467                details: GreenNodeDetails::Node { children: children.into(), width },
24468            }
24469            .intern(db),
24470        )
24471    }
24472}
24473impl<'db> LegacyItemInlineMacro<'db> {
24474    pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
24475        AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24476    }
24477    pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24478        ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24479    }
24480    pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24481        TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24482    }
24483    pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24484        WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24485    }
24486    pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
24487        TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24488    }
24489}
24490#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24491pub struct LegacyItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24492impl<'db> LegacyItemInlineMacroPtr<'db> {}
24493impl<'db> TypedStablePtr<'db> for LegacyItemInlineMacroPtr<'db> {
24494    type SyntaxNode = LegacyItemInlineMacro<'db>;
24495    fn untyped(self) -> SyntaxStablePtrId<'db> {
24496        self.0
24497    }
24498    fn lookup(&self, db: &'db dyn Database) -> LegacyItemInlineMacro<'db> {
24499        LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24500    }
24501}
24502impl<'db> From<LegacyItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24503    fn from(ptr: LegacyItemInlineMacroPtr<'db>) -> Self {
24504        ptr.untyped()
24505    }
24506}
24507#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24508pub struct LegacyItemInlineMacroGreen<'db>(pub GreenId<'db>);
24509impl<'db> TypedSyntaxNode<'db> for LegacyItemInlineMacro<'db> {
24510    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24511    type StablePtr = LegacyItemInlineMacroPtr<'db>;
24512    type Green = LegacyItemInlineMacroGreen<'db>;
24513    fn missing(db: &'db dyn Database) -> Self::Green {
24514        LegacyItemInlineMacroGreen(
24515            GreenNode {
24516                kind: SyntaxKind::LegacyItemInlineMacro,
24517                details: GreenNodeDetails::Node {
24518                    children: [
24519                        AttributeList::missing(db).0,
24520                        ExprPath::missing(db).0,
24521                        TerminalNot::missing(db).0,
24522                        WrappedArgList::missing(db).0,
24523                        TerminalSemicolon::missing(db).0,
24524                    ]
24525                    .into(),
24526                    width: TextWidth::default(),
24527                },
24528            }
24529            .intern(db),
24530        )
24531    }
24532    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24533        let kind = node.kind(db);
24534        assert_eq!(
24535            kind,
24536            SyntaxKind::LegacyItemInlineMacro,
24537            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24538            kind,
24539            SyntaxKind::LegacyItemInlineMacro
24540        );
24541        Self { node }
24542    }
24543    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24544        let kind = node.kind(db);
24545        if kind == SyntaxKind::LegacyItemInlineMacro {
24546            Some(Self::from_syntax_node(db, node))
24547        } else {
24548            None
24549        }
24550    }
24551    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24552        self.node
24553    }
24554    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24555        LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24556    }
24557}
24558#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24559pub struct TriviumSkippedNode<'db> {
24560    node: SyntaxNode<'db>,
24561}
24562impl<'db> TriviumSkippedNode<'db> {
24563    pub const INDEX_NODE: usize = 0;
24564    pub fn new_green(
24565        db: &'db dyn Database,
24566        node: SkippedNodeGreen<'db>,
24567    ) -> TriviumSkippedNodeGreen<'db> {
24568        let children = [node.0];
24569        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24570        TriviumSkippedNodeGreen(
24571            GreenNode {
24572                kind: SyntaxKind::TriviumSkippedNode,
24573                details: GreenNodeDetails::Node { children: children.into(), width },
24574            }
24575            .intern(db),
24576        )
24577    }
24578}
24579impl<'db> TriviumSkippedNode<'db> {
24580    pub fn node(&self, db: &'db dyn Database) -> SkippedNode<'db> {
24581        SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
24582    }
24583}
24584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24585pub struct TriviumSkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24586impl<'db> TriviumSkippedNodePtr<'db> {}
24587impl<'db> TypedStablePtr<'db> for TriviumSkippedNodePtr<'db> {
24588    type SyntaxNode = TriviumSkippedNode<'db>;
24589    fn untyped(self) -> SyntaxStablePtrId<'db> {
24590        self.0
24591    }
24592    fn lookup(&self, db: &'db dyn Database) -> TriviumSkippedNode<'db> {
24593        TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
24594    }
24595}
24596impl<'db> From<TriviumSkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24597    fn from(ptr: TriviumSkippedNodePtr<'db>) -> Self {
24598        ptr.untyped()
24599    }
24600}
24601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24602pub struct TriviumSkippedNodeGreen<'db>(pub GreenId<'db>);
24603impl<'db> TypedSyntaxNode<'db> for TriviumSkippedNode<'db> {
24604    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
24605    type StablePtr = TriviumSkippedNodePtr<'db>;
24606    type Green = TriviumSkippedNodeGreen<'db>;
24607    fn missing(db: &'db dyn Database) -> Self::Green {
24608        TriviumSkippedNodeGreen(
24609            GreenNode {
24610                kind: SyntaxKind::TriviumSkippedNode,
24611                details: GreenNodeDetails::Node {
24612                    children: [SkippedNode::missing(db).0].into(),
24613                    width: TextWidth::default(),
24614                },
24615            }
24616            .intern(db),
24617        )
24618    }
24619    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24620        let kind = node.kind(db);
24621        assert_eq!(
24622            kind,
24623            SyntaxKind::TriviumSkippedNode,
24624            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24625            kind,
24626            SyntaxKind::TriviumSkippedNode
24627        );
24628        Self { node }
24629    }
24630    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24631        let kind = node.kind(db);
24632        if kind == SyntaxKind::TriviumSkippedNode {
24633            Some(Self::from_syntax_node(db, node))
24634        } else {
24635            None
24636        }
24637    }
24638    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24639        self.node
24640    }
24641    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24642        TriviumSkippedNodePtr(self.node.stable_ptr(db))
24643    }
24644}
24645#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24646pub enum SkippedNode<'db> {
24647    AttributeList(AttributeList<'db>),
24648    VisibilityPub(VisibilityPub<'db>),
24649    ExprPath(ExprPath<'db>),
24650}
24651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24652pub struct SkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24653impl<'db> TypedStablePtr<'db> for SkippedNodePtr<'db> {
24654    type SyntaxNode = SkippedNode<'db>;
24655    fn untyped(self) -> SyntaxStablePtrId<'db> {
24656        self.0
24657    }
24658    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24659        SkippedNode::from_syntax_node(db, self.0.lookup(db))
24660    }
24661}
24662impl<'db> From<SkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24663    fn from(ptr: SkippedNodePtr<'db>) -> Self {
24664        ptr.untyped()
24665    }
24666}
24667impl<'db> From<AttributeListPtr<'db>> for SkippedNodePtr<'db> {
24668    fn from(value: AttributeListPtr<'db>) -> Self {
24669        Self(value.0)
24670    }
24671}
24672impl<'db> From<VisibilityPubPtr<'db>> for SkippedNodePtr<'db> {
24673    fn from(value: VisibilityPubPtr<'db>) -> Self {
24674        Self(value.0)
24675    }
24676}
24677impl<'db> From<ExprPathPtr<'db>> for SkippedNodePtr<'db> {
24678    fn from(value: ExprPathPtr<'db>) -> Self {
24679        Self(value.0)
24680    }
24681}
24682impl<'db> From<AttributeListGreen<'db>> for SkippedNodeGreen<'db> {
24683    fn from(value: AttributeListGreen<'db>) -> Self {
24684        Self(value.0)
24685    }
24686}
24687impl<'db> From<VisibilityPubGreen<'db>> for SkippedNodeGreen<'db> {
24688    fn from(value: VisibilityPubGreen<'db>) -> Self {
24689        Self(value.0)
24690    }
24691}
24692impl<'db> From<ExprPathGreen<'db>> for SkippedNodeGreen<'db> {
24693    fn from(value: ExprPathGreen<'db>) -> Self {
24694        Self(value.0)
24695    }
24696}
24697#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24698pub struct SkippedNodeGreen<'db>(pub GreenId<'db>);
24699impl<'db> TypedSyntaxNode<'db> for SkippedNode<'db> {
24700    const OPTIONAL_KIND: Option<SyntaxKind> = None;
24701    type StablePtr = SkippedNodePtr<'db>;
24702    type Green = SkippedNodeGreen<'db>;
24703    fn missing(db: &'db dyn Database) -> Self::Green {
24704        panic!("No missing variant.");
24705    }
24706    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24707        let kind = node.kind(db);
24708        match kind {
24709            SyntaxKind::AttributeList => {
24710                SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
24711            }
24712            SyntaxKind::VisibilityPub => {
24713                SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
24714            }
24715            SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
24716            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
24717        }
24718    }
24719    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24720        let kind = node.kind(db);
24721        match kind {
24722            SyntaxKind::AttributeList => {
24723                Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
24724            }
24725            SyntaxKind::VisibilityPub => {
24726                Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
24727            }
24728            SyntaxKind::ExprPath => {
24729                Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
24730            }
24731            _ => None,
24732        }
24733    }
24734    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24735        match self {
24736            SkippedNode::AttributeList(x) => x.as_syntax_node(),
24737            SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
24738            SkippedNode::ExprPath(x) => x.as_syntax_node(),
24739        }
24740    }
24741    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24742        SkippedNodePtr(self.as_syntax_node().stable_ptr(db))
24743    }
24744}
24745impl<'db> SkippedNode<'db> {
24746    /// Checks if a kind of a variant of [SkippedNode].
24747    pub fn is_variant(kind: SyntaxKind) -> bool {
24748        matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
24749    }
24750}
24751#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24752pub struct TokenIdentifier<'db> {
24753    node: SyntaxNode<'db>,
24754}
24755impl<'db> Token<'db> for TokenIdentifier<'db> {
24756    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
24757        TokenIdentifierGreen(
24758            GreenNode { kind: SyntaxKind::TokenIdentifier, details: GreenNodeDetails::Token(text) }
24759                .intern(db),
24760        )
24761    }
24762    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24763        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
24764    }
24765}
24766#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24767pub struct TokenIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
24768impl<'db> TypedStablePtr<'db> for TokenIdentifierPtr<'db> {
24769    type SyntaxNode = TokenIdentifier<'db>;
24770    fn untyped(self) -> SyntaxStablePtrId<'db> {
24771        self.0
24772    }
24773    fn lookup(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
24774        TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
24775    }
24776}
24777impl<'db> From<TokenIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
24778    fn from(ptr: TokenIdentifierPtr<'db>) -> Self {
24779        ptr.untyped()
24780    }
24781}
24782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24783pub struct TokenIdentifierGreen<'db>(pub GreenId<'db>);
24784impl<'db> TokenIdentifierGreen<'db> {
24785    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24786        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
24787    }
24788}
24789impl<'db> TypedSyntaxNode<'db> for TokenIdentifier<'db> {
24790    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
24791    type StablePtr = TokenIdentifierPtr<'db>;
24792    type Green = TokenIdentifierGreen<'db>;
24793    fn missing(db: &'db dyn Database) -> Self::Green {
24794        TokenIdentifierGreen(
24795            GreenNode {
24796                kind: SyntaxKind::TokenMissing,
24797                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
24798            }
24799            .intern(db),
24800        )
24801    }
24802    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24803        match node.green_node(db).details {
24804            GreenNodeDetails::Token(_) => Self { node },
24805            GreenNodeDetails::Node { .. } => {
24806                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
24807            }
24808        }
24809    }
24810    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24811        match node.green_node(db).details {
24812            GreenNodeDetails::Token(_) => Some(Self { node }),
24813            GreenNodeDetails::Node { .. } => None,
24814        }
24815    }
24816    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24817        self.node
24818    }
24819    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24820        TokenIdentifierPtr(self.node.stable_ptr(db))
24821    }
24822}
24823#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24824pub struct TerminalIdentifier<'db> {
24825    node: SyntaxNode<'db>,
24826}
24827impl<'db> Terminal<'db> for TerminalIdentifier<'db> {
24828    const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
24829    type TokenType = TokenIdentifier<'db>;
24830    fn new_green(
24831        db: &'db dyn Database,
24832        leading_trivia: TriviaGreen<'db>,
24833        token: <<TerminalIdentifier<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
24834        trailing_trivia: TriviaGreen<'db>,
24835    ) -> Self::Green {
24836        let children = [leading_trivia.0, token.0, trailing_trivia.0];
24837        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24838        TerminalIdentifierGreen(
24839            GreenNode {
24840                kind: SyntaxKind::TerminalIdentifier,
24841                details: GreenNodeDetails::Node { children: children.into(), width },
24842            }
24843            .intern(db),
24844        )
24845    }
24846    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24847        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
24848            unreachable!("Expected a node, not a token");
24849        };
24850        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
24851    }
24852}
24853impl<'db> TerminalIdentifier<'db> {
24854    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
24855        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
24856    }
24857    pub fn token(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
24858        TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
24859    }
24860    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
24861        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
24862    }
24863}
24864#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24865pub struct TerminalIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
24866impl<'db> TerminalIdentifierPtr<'db> {}
24867impl<'db> TypedStablePtr<'db> for TerminalIdentifierPtr<'db> {
24868    type SyntaxNode = TerminalIdentifier<'db>;
24869    fn untyped(self) -> SyntaxStablePtrId<'db> {
24870        self.0
24871    }
24872    fn lookup(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
24873        TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
24874    }
24875}
24876impl<'db> From<TerminalIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
24877    fn from(ptr: TerminalIdentifierPtr<'db>) -> Self {
24878        ptr.untyped()
24879    }
24880}
24881#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24882pub struct TerminalIdentifierGreen<'db>(pub GreenId<'db>);
24883impl<'db> TypedSyntaxNode<'db> for TerminalIdentifier<'db> {
24884    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
24885    type StablePtr = TerminalIdentifierPtr<'db>;
24886    type Green = TerminalIdentifierGreen<'db>;
24887    fn missing(db: &'db dyn Database) -> Self::Green {
24888        TerminalIdentifierGreen(
24889            GreenNode {
24890                kind: SyntaxKind::TerminalIdentifier,
24891                details: GreenNodeDetails::Node {
24892                    children: [
24893                        Trivia::missing(db).0,
24894                        TokenIdentifier::missing(db).0,
24895                        Trivia::missing(db).0,
24896                    ]
24897                    .into(),
24898                    width: TextWidth::default(),
24899                },
24900            }
24901            .intern(db),
24902        )
24903    }
24904    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24905        let kind = node.kind(db);
24906        assert_eq!(
24907            kind,
24908            SyntaxKind::TerminalIdentifier,
24909            "Unexpected SyntaxKind {:?}. Expected {:?}.",
24910            kind,
24911            SyntaxKind::TerminalIdentifier
24912        );
24913        Self { node }
24914    }
24915    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24916        let kind = node.kind(db);
24917        if kind == SyntaxKind::TerminalIdentifier {
24918            Some(Self::from_syntax_node(db, node))
24919        } else {
24920            None
24921        }
24922    }
24923    fn as_syntax_node(&self) -> SyntaxNode<'db> {
24924        self.node
24925    }
24926    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24927        TerminalIdentifierPtr(self.node.stable_ptr(db))
24928    }
24929}
24930#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24931pub struct TokenLiteralNumber<'db> {
24932    node: SyntaxNode<'db>,
24933}
24934impl<'db> Token<'db> for TokenLiteralNumber<'db> {
24935    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
24936        TokenLiteralNumberGreen(
24937            GreenNode {
24938                kind: SyntaxKind::TokenLiteralNumber,
24939                details: GreenNodeDetails::Token(text),
24940            }
24941            .intern(db),
24942        )
24943    }
24944    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24945        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
24946    }
24947}
24948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
24949pub struct TokenLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
24950impl<'db> TypedStablePtr<'db> for TokenLiteralNumberPtr<'db> {
24951    type SyntaxNode = TokenLiteralNumber<'db>;
24952    fn untyped(self) -> SyntaxStablePtrId<'db> {
24953        self.0
24954    }
24955    fn lookup(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
24956        TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
24957    }
24958}
24959impl<'db> From<TokenLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
24960    fn from(ptr: TokenLiteralNumberPtr<'db>) -> Self {
24961        ptr.untyped()
24962    }
24963}
24964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24965pub struct TokenLiteralNumberGreen<'db>(pub GreenId<'db>);
24966impl<'db> TokenLiteralNumberGreen<'db> {
24967    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
24968        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
24969    }
24970}
24971impl<'db> TypedSyntaxNode<'db> for TokenLiteralNumber<'db> {
24972    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
24973    type StablePtr = TokenLiteralNumberPtr<'db>;
24974    type Green = TokenLiteralNumberGreen<'db>;
24975    fn missing(db: &'db dyn Database) -> Self::Green {
24976        TokenLiteralNumberGreen(
24977            GreenNode {
24978                kind: SyntaxKind::TokenMissing,
24979                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
24980            }
24981            .intern(db),
24982        )
24983    }
24984    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24985        match node.green_node(db).details {
24986            GreenNodeDetails::Token(_) => Self { node },
24987            GreenNodeDetails::Node { .. } => panic!(
24988                "Expected a token {:?}, not an internal node",
24989                SyntaxKind::TokenLiteralNumber
24990            ),
24991        }
24992    }
24993    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24994        match node.green_node(db).details {
24995            GreenNodeDetails::Token(_) => Some(Self { node }),
24996            GreenNodeDetails::Node { .. } => None,
24997        }
24998    }
24999    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25000        self.node
25001    }
25002    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25003        TokenLiteralNumberPtr(self.node.stable_ptr(db))
25004    }
25005}
25006#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25007pub struct TerminalLiteralNumber<'db> {
25008    node: SyntaxNode<'db>,
25009}
25010impl<'db> Terminal<'db> for TerminalLiteralNumber<'db> {
25011    const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25012    type TokenType = TokenLiteralNumber<'db>;
25013    fn new_green(
25014        db: &'db dyn Database,
25015        leading_trivia: TriviaGreen<'db>,
25016        token: <<TerminalLiteralNumber<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25017        trailing_trivia: TriviaGreen<'db>,
25018    ) -> Self::Green {
25019        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25020        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25021        TerminalLiteralNumberGreen(
25022            GreenNode {
25023                kind: SyntaxKind::TerminalLiteralNumber,
25024                details: GreenNodeDetails::Node { children: children.into(), width },
25025            }
25026            .intern(db),
25027        )
25028    }
25029    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25030        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25031            unreachable!("Expected a node, not a token");
25032        };
25033        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25034    }
25035}
25036impl<'db> TerminalLiteralNumber<'db> {
25037    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25038        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25039    }
25040    pub fn token(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25041        TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25042    }
25043    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25044        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25045    }
25046}
25047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25048pub struct TerminalLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25049impl<'db> TerminalLiteralNumberPtr<'db> {}
25050impl<'db> TypedStablePtr<'db> for TerminalLiteralNumberPtr<'db> {
25051    type SyntaxNode = TerminalLiteralNumber<'db>;
25052    fn untyped(self) -> SyntaxStablePtrId<'db> {
25053        self.0
25054    }
25055    fn lookup(&self, db: &'db dyn Database) -> TerminalLiteralNumber<'db> {
25056        TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25057    }
25058}
25059impl<'db> From<TerminalLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25060    fn from(ptr: TerminalLiteralNumberPtr<'db>) -> Self {
25061        ptr.untyped()
25062    }
25063}
25064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25065pub struct TerminalLiteralNumberGreen<'db>(pub GreenId<'db>);
25066impl<'db> TypedSyntaxNode<'db> for TerminalLiteralNumber<'db> {
25067    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25068    type StablePtr = TerminalLiteralNumberPtr<'db>;
25069    type Green = TerminalLiteralNumberGreen<'db>;
25070    fn missing(db: &'db dyn Database) -> Self::Green {
25071        TerminalLiteralNumberGreen(
25072            GreenNode {
25073                kind: SyntaxKind::TerminalLiteralNumber,
25074                details: GreenNodeDetails::Node {
25075                    children: [
25076                        Trivia::missing(db).0,
25077                        TokenLiteralNumber::missing(db).0,
25078                        Trivia::missing(db).0,
25079                    ]
25080                    .into(),
25081                    width: TextWidth::default(),
25082                },
25083            }
25084            .intern(db),
25085        )
25086    }
25087    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25088        let kind = node.kind(db);
25089        assert_eq!(
25090            kind,
25091            SyntaxKind::TerminalLiteralNumber,
25092            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25093            kind,
25094            SyntaxKind::TerminalLiteralNumber
25095        );
25096        Self { node }
25097    }
25098    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25099        let kind = node.kind(db);
25100        if kind == SyntaxKind::TerminalLiteralNumber {
25101            Some(Self::from_syntax_node(db, node))
25102        } else {
25103            None
25104        }
25105    }
25106    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25107        self.node
25108    }
25109    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25110        TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25111    }
25112}
25113#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25114pub struct TokenShortString<'db> {
25115    node: SyntaxNode<'db>,
25116}
25117impl<'db> Token<'db> for TokenShortString<'db> {
25118    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25119        TokenShortStringGreen(
25120            GreenNode {
25121                kind: SyntaxKind::TokenShortString,
25122                details: GreenNodeDetails::Token(text),
25123            }
25124            .intern(db),
25125        )
25126    }
25127    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25128        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25129    }
25130}
25131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25132pub struct TokenShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25133impl<'db> TypedStablePtr<'db> for TokenShortStringPtr<'db> {
25134    type SyntaxNode = TokenShortString<'db>;
25135    fn untyped(self) -> SyntaxStablePtrId<'db> {
25136        self.0
25137    }
25138    fn lookup(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25139        TokenShortString::from_syntax_node(db, self.0.lookup(db))
25140    }
25141}
25142impl<'db> From<TokenShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25143    fn from(ptr: TokenShortStringPtr<'db>) -> Self {
25144        ptr.untyped()
25145    }
25146}
25147#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25148pub struct TokenShortStringGreen<'db>(pub GreenId<'db>);
25149impl<'db> TokenShortStringGreen<'db> {
25150    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25151        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25152    }
25153}
25154impl<'db> TypedSyntaxNode<'db> for TokenShortString<'db> {
25155    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25156    type StablePtr = TokenShortStringPtr<'db>;
25157    type Green = TokenShortStringGreen<'db>;
25158    fn missing(db: &'db dyn Database) -> Self::Green {
25159        TokenShortStringGreen(
25160            GreenNode {
25161                kind: SyntaxKind::TokenMissing,
25162                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25163            }
25164            .intern(db),
25165        )
25166    }
25167    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25168        match node.green_node(db).details {
25169            GreenNodeDetails::Token(_) => Self { node },
25170            GreenNodeDetails::Node { .. } => {
25171                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25172            }
25173        }
25174    }
25175    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25176        match node.green_node(db).details {
25177            GreenNodeDetails::Token(_) => Some(Self { node }),
25178            GreenNodeDetails::Node { .. } => None,
25179        }
25180    }
25181    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25182        self.node
25183    }
25184    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25185        TokenShortStringPtr(self.node.stable_ptr(db))
25186    }
25187}
25188#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25189pub struct TerminalShortString<'db> {
25190    node: SyntaxNode<'db>,
25191}
25192impl<'db> Terminal<'db> for TerminalShortString<'db> {
25193    const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25194    type TokenType = TokenShortString<'db>;
25195    fn new_green(
25196        db: &'db dyn Database,
25197        leading_trivia: TriviaGreen<'db>,
25198        token: <<TerminalShortString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25199        trailing_trivia: TriviaGreen<'db>,
25200    ) -> Self::Green {
25201        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25202        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25203        TerminalShortStringGreen(
25204            GreenNode {
25205                kind: SyntaxKind::TerminalShortString,
25206                details: GreenNodeDetails::Node { children: children.into(), width },
25207            }
25208            .intern(db),
25209        )
25210    }
25211    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25212        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25213            unreachable!("Expected a node, not a token");
25214        };
25215        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25216    }
25217}
25218impl<'db> TerminalShortString<'db> {
25219    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25220        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25221    }
25222    pub fn token(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25223        TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25224    }
25225    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25226        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25227    }
25228}
25229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25230pub struct TerminalShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25231impl<'db> TerminalShortStringPtr<'db> {}
25232impl<'db> TypedStablePtr<'db> for TerminalShortStringPtr<'db> {
25233    type SyntaxNode = TerminalShortString<'db>;
25234    fn untyped(self) -> SyntaxStablePtrId<'db> {
25235        self.0
25236    }
25237    fn lookup(&self, db: &'db dyn Database) -> TerminalShortString<'db> {
25238        TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25239    }
25240}
25241impl<'db> From<TerminalShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25242    fn from(ptr: TerminalShortStringPtr<'db>) -> Self {
25243        ptr.untyped()
25244    }
25245}
25246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25247pub struct TerminalShortStringGreen<'db>(pub GreenId<'db>);
25248impl<'db> TypedSyntaxNode<'db> for TerminalShortString<'db> {
25249    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25250    type StablePtr = TerminalShortStringPtr<'db>;
25251    type Green = TerminalShortStringGreen<'db>;
25252    fn missing(db: &'db dyn Database) -> Self::Green {
25253        TerminalShortStringGreen(
25254            GreenNode {
25255                kind: SyntaxKind::TerminalShortString,
25256                details: GreenNodeDetails::Node {
25257                    children: [
25258                        Trivia::missing(db).0,
25259                        TokenShortString::missing(db).0,
25260                        Trivia::missing(db).0,
25261                    ]
25262                    .into(),
25263                    width: TextWidth::default(),
25264                },
25265            }
25266            .intern(db),
25267        )
25268    }
25269    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25270        let kind = node.kind(db);
25271        assert_eq!(
25272            kind,
25273            SyntaxKind::TerminalShortString,
25274            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25275            kind,
25276            SyntaxKind::TerminalShortString
25277        );
25278        Self { node }
25279    }
25280    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25281        let kind = node.kind(db);
25282        if kind == SyntaxKind::TerminalShortString {
25283            Some(Self::from_syntax_node(db, node))
25284        } else {
25285            None
25286        }
25287    }
25288    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25289        self.node
25290    }
25291    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25292        TerminalShortStringPtr(self.node.stable_ptr(db))
25293    }
25294}
25295#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25296pub struct TokenString<'db> {
25297    node: SyntaxNode<'db>,
25298}
25299impl<'db> Token<'db> for TokenString<'db> {
25300    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25301        TokenStringGreen(
25302            GreenNode { kind: SyntaxKind::TokenString, details: GreenNodeDetails::Token(text) }
25303                .intern(db),
25304        )
25305    }
25306    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25307        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25308    }
25309}
25310#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25311pub struct TokenStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25312impl<'db> TypedStablePtr<'db> for TokenStringPtr<'db> {
25313    type SyntaxNode = TokenString<'db>;
25314    fn untyped(self) -> SyntaxStablePtrId<'db> {
25315        self.0
25316    }
25317    fn lookup(&self, db: &'db dyn Database) -> TokenString<'db> {
25318        TokenString::from_syntax_node(db, self.0.lookup(db))
25319    }
25320}
25321impl<'db> From<TokenStringPtr<'db>> for SyntaxStablePtrId<'db> {
25322    fn from(ptr: TokenStringPtr<'db>) -> Self {
25323        ptr.untyped()
25324    }
25325}
25326#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25327pub struct TokenStringGreen<'db>(pub GreenId<'db>);
25328impl<'db> TokenStringGreen<'db> {
25329    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25330        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25331    }
25332}
25333impl<'db> TypedSyntaxNode<'db> for TokenString<'db> {
25334    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25335    type StablePtr = TokenStringPtr<'db>;
25336    type Green = TokenStringGreen<'db>;
25337    fn missing(db: &'db dyn Database) -> Self::Green {
25338        TokenStringGreen(
25339            GreenNode {
25340                kind: SyntaxKind::TokenMissing,
25341                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25342            }
25343            .intern(db),
25344        )
25345    }
25346    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25347        match node.green_node(db).details {
25348            GreenNodeDetails::Token(_) => Self { node },
25349            GreenNodeDetails::Node { .. } => {
25350                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25351            }
25352        }
25353    }
25354    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25355        match node.green_node(db).details {
25356            GreenNodeDetails::Token(_) => Some(Self { node }),
25357            GreenNodeDetails::Node { .. } => None,
25358        }
25359    }
25360    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25361        self.node
25362    }
25363    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25364        TokenStringPtr(self.node.stable_ptr(db))
25365    }
25366}
25367#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25368pub struct TerminalString<'db> {
25369    node: SyntaxNode<'db>,
25370}
25371impl<'db> Terminal<'db> for TerminalString<'db> {
25372    const KIND: SyntaxKind = SyntaxKind::TerminalString;
25373    type TokenType = TokenString<'db>;
25374    fn new_green(
25375        db: &'db dyn Database,
25376        leading_trivia: TriviaGreen<'db>,
25377        token: <<TerminalString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25378        trailing_trivia: TriviaGreen<'db>,
25379    ) -> Self::Green {
25380        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25381        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25382        TerminalStringGreen(
25383            GreenNode {
25384                kind: SyntaxKind::TerminalString,
25385                details: GreenNodeDetails::Node { children: children.into(), width },
25386            }
25387            .intern(db),
25388        )
25389    }
25390    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25391        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25392            unreachable!("Expected a node, not a token");
25393        };
25394        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25395    }
25396}
25397impl<'db> TerminalString<'db> {
25398    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25399        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25400    }
25401    pub fn token(&self, db: &'db dyn Database) -> TokenString<'db> {
25402        TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25403    }
25404    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25405        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25406    }
25407}
25408#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25409pub struct TerminalStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25410impl<'db> TerminalStringPtr<'db> {}
25411impl<'db> TypedStablePtr<'db> for TerminalStringPtr<'db> {
25412    type SyntaxNode = TerminalString<'db>;
25413    fn untyped(self) -> SyntaxStablePtrId<'db> {
25414        self.0
25415    }
25416    fn lookup(&self, db: &'db dyn Database) -> TerminalString<'db> {
25417        TerminalString::from_syntax_node(db, self.0.lookup(db))
25418    }
25419}
25420impl<'db> From<TerminalStringPtr<'db>> for SyntaxStablePtrId<'db> {
25421    fn from(ptr: TerminalStringPtr<'db>) -> Self {
25422        ptr.untyped()
25423    }
25424}
25425#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25426pub struct TerminalStringGreen<'db>(pub GreenId<'db>);
25427impl<'db> TypedSyntaxNode<'db> for TerminalString<'db> {
25428    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25429    type StablePtr = TerminalStringPtr<'db>;
25430    type Green = TerminalStringGreen<'db>;
25431    fn missing(db: &'db dyn Database) -> Self::Green {
25432        TerminalStringGreen(
25433            GreenNode {
25434                kind: SyntaxKind::TerminalString,
25435                details: GreenNodeDetails::Node {
25436                    children: [
25437                        Trivia::missing(db).0,
25438                        TokenString::missing(db).0,
25439                        Trivia::missing(db).0,
25440                    ]
25441                    .into(),
25442                    width: TextWidth::default(),
25443                },
25444            }
25445            .intern(db),
25446        )
25447    }
25448    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25449        let kind = node.kind(db);
25450        assert_eq!(
25451            kind,
25452            SyntaxKind::TerminalString,
25453            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25454            kind,
25455            SyntaxKind::TerminalString
25456        );
25457        Self { node }
25458    }
25459    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25460        let kind = node.kind(db);
25461        if kind == SyntaxKind::TerminalString {
25462            Some(Self::from_syntax_node(db, node))
25463        } else {
25464            None
25465        }
25466    }
25467    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25468        self.node
25469    }
25470    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25471        TerminalStringPtr(self.node.stable_ptr(db))
25472    }
25473}
25474#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25475pub struct TokenAs<'db> {
25476    node: SyntaxNode<'db>,
25477}
25478impl<'db> Token<'db> for TokenAs<'db> {
25479    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25480        TokenAsGreen(
25481            GreenNode { kind: SyntaxKind::TokenAs, details: GreenNodeDetails::Token(text) }
25482                .intern(db),
25483        )
25484    }
25485    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25486        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25487    }
25488}
25489#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25490pub struct TokenAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25491impl<'db> TypedStablePtr<'db> for TokenAsPtr<'db> {
25492    type SyntaxNode = TokenAs<'db>;
25493    fn untyped(self) -> SyntaxStablePtrId<'db> {
25494        self.0
25495    }
25496    fn lookup(&self, db: &'db dyn Database) -> TokenAs<'db> {
25497        TokenAs::from_syntax_node(db, self.0.lookup(db))
25498    }
25499}
25500impl<'db> From<TokenAsPtr<'db>> for SyntaxStablePtrId<'db> {
25501    fn from(ptr: TokenAsPtr<'db>) -> Self {
25502        ptr.untyped()
25503    }
25504}
25505#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25506pub struct TokenAsGreen<'db>(pub GreenId<'db>);
25507impl<'db> TokenAsGreen<'db> {
25508    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25509        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25510    }
25511}
25512impl<'db> TypedSyntaxNode<'db> for TokenAs<'db> {
25513    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25514    type StablePtr = TokenAsPtr<'db>;
25515    type Green = TokenAsGreen<'db>;
25516    fn missing(db: &'db dyn Database) -> Self::Green {
25517        TokenAsGreen(
25518            GreenNode {
25519                kind: SyntaxKind::TokenMissing,
25520                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25521            }
25522            .intern(db),
25523        )
25524    }
25525    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25526        match node.green_node(db).details {
25527            GreenNodeDetails::Token(_) => Self { node },
25528            GreenNodeDetails::Node { .. } => {
25529                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25530            }
25531        }
25532    }
25533    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25534        match node.green_node(db).details {
25535            GreenNodeDetails::Token(_) => Some(Self { node }),
25536            GreenNodeDetails::Node { .. } => None,
25537        }
25538    }
25539    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25540        self.node
25541    }
25542    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25543        TokenAsPtr(self.node.stable_ptr(db))
25544    }
25545}
25546#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25547pub struct TerminalAs<'db> {
25548    node: SyntaxNode<'db>,
25549}
25550impl<'db> Terminal<'db> for TerminalAs<'db> {
25551    const KIND: SyntaxKind = SyntaxKind::TerminalAs;
25552    type TokenType = TokenAs<'db>;
25553    fn new_green(
25554        db: &'db dyn Database,
25555        leading_trivia: TriviaGreen<'db>,
25556        token: <<TerminalAs<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25557        trailing_trivia: TriviaGreen<'db>,
25558    ) -> Self::Green {
25559        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25560        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25561        TerminalAsGreen(
25562            GreenNode {
25563                kind: SyntaxKind::TerminalAs,
25564                details: GreenNodeDetails::Node { children: children.into(), width },
25565            }
25566            .intern(db),
25567        )
25568    }
25569    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25570        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25571            unreachable!("Expected a node, not a token");
25572        };
25573        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25574    }
25575}
25576impl<'db> TerminalAs<'db> {
25577    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25578        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25579    }
25580    pub fn token(&self, db: &'db dyn Database) -> TokenAs<'db> {
25581        TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
25582    }
25583    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25584        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25585    }
25586}
25587#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25588pub struct TerminalAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25589impl<'db> TerminalAsPtr<'db> {}
25590impl<'db> TypedStablePtr<'db> for TerminalAsPtr<'db> {
25591    type SyntaxNode = TerminalAs<'db>;
25592    fn untyped(self) -> SyntaxStablePtrId<'db> {
25593        self.0
25594    }
25595    fn lookup(&self, db: &'db dyn Database) -> TerminalAs<'db> {
25596        TerminalAs::from_syntax_node(db, self.0.lookup(db))
25597    }
25598}
25599impl<'db> From<TerminalAsPtr<'db>> for SyntaxStablePtrId<'db> {
25600    fn from(ptr: TerminalAsPtr<'db>) -> Self {
25601        ptr.untyped()
25602    }
25603}
25604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25605pub struct TerminalAsGreen<'db>(pub GreenId<'db>);
25606impl<'db> TypedSyntaxNode<'db> for TerminalAs<'db> {
25607    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
25608    type StablePtr = TerminalAsPtr<'db>;
25609    type Green = TerminalAsGreen<'db>;
25610    fn missing(db: &'db dyn Database) -> Self::Green {
25611        TerminalAsGreen(
25612            GreenNode {
25613                kind: SyntaxKind::TerminalAs,
25614                details: GreenNodeDetails::Node {
25615                    children: [
25616                        Trivia::missing(db).0,
25617                        TokenAs::missing(db).0,
25618                        Trivia::missing(db).0,
25619                    ]
25620                    .into(),
25621                    width: TextWidth::default(),
25622                },
25623            }
25624            .intern(db),
25625        )
25626    }
25627    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25628        let kind = node.kind(db);
25629        assert_eq!(
25630            kind,
25631            SyntaxKind::TerminalAs,
25632            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25633            kind,
25634            SyntaxKind::TerminalAs
25635        );
25636        Self { node }
25637    }
25638    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25639        let kind = node.kind(db);
25640        if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
25641    }
25642    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25643        self.node
25644    }
25645    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25646        TerminalAsPtr(self.node.stable_ptr(db))
25647    }
25648}
25649#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25650pub struct TokenConst<'db> {
25651    node: SyntaxNode<'db>,
25652}
25653impl<'db> Token<'db> for TokenConst<'db> {
25654    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25655        TokenConstGreen(
25656            GreenNode { kind: SyntaxKind::TokenConst, details: GreenNodeDetails::Token(text) }
25657                .intern(db),
25658        )
25659    }
25660    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25661        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25662    }
25663}
25664#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25665pub struct TokenConstPtr<'db>(pub SyntaxStablePtrId<'db>);
25666impl<'db> TypedStablePtr<'db> for TokenConstPtr<'db> {
25667    type SyntaxNode = TokenConst<'db>;
25668    fn untyped(self) -> SyntaxStablePtrId<'db> {
25669        self.0
25670    }
25671    fn lookup(&self, db: &'db dyn Database) -> TokenConst<'db> {
25672        TokenConst::from_syntax_node(db, self.0.lookup(db))
25673    }
25674}
25675impl<'db> From<TokenConstPtr<'db>> for SyntaxStablePtrId<'db> {
25676    fn from(ptr: TokenConstPtr<'db>) -> Self {
25677        ptr.untyped()
25678    }
25679}
25680#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25681pub struct TokenConstGreen<'db>(pub GreenId<'db>);
25682impl<'db> TokenConstGreen<'db> {
25683    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25684        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25685    }
25686}
25687impl<'db> TypedSyntaxNode<'db> for TokenConst<'db> {
25688    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
25689    type StablePtr = TokenConstPtr<'db>;
25690    type Green = TokenConstGreen<'db>;
25691    fn missing(db: &'db dyn Database) -> Self::Green {
25692        TokenConstGreen(
25693            GreenNode {
25694                kind: SyntaxKind::TokenMissing,
25695                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25696            }
25697            .intern(db),
25698        )
25699    }
25700    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25701        match node.green_node(db).details {
25702            GreenNodeDetails::Token(_) => Self { node },
25703            GreenNodeDetails::Node { .. } => {
25704                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
25705            }
25706        }
25707    }
25708    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25709        match node.green_node(db).details {
25710            GreenNodeDetails::Token(_) => Some(Self { node }),
25711            GreenNodeDetails::Node { .. } => None,
25712        }
25713    }
25714    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25715        self.node
25716    }
25717    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25718        TokenConstPtr(self.node.stable_ptr(db))
25719    }
25720}
25721#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25722pub struct TerminalConst<'db> {
25723    node: SyntaxNode<'db>,
25724}
25725impl<'db> Terminal<'db> for TerminalConst<'db> {
25726    const KIND: SyntaxKind = SyntaxKind::TerminalConst;
25727    type TokenType = TokenConst<'db>;
25728    fn new_green(
25729        db: &'db dyn Database,
25730        leading_trivia: TriviaGreen<'db>,
25731        token: <<TerminalConst<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25732        trailing_trivia: TriviaGreen<'db>,
25733    ) -> Self::Green {
25734        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25735        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25736        TerminalConstGreen(
25737            GreenNode {
25738                kind: SyntaxKind::TerminalConst,
25739                details: GreenNodeDetails::Node { children: children.into(), width },
25740            }
25741            .intern(db),
25742        )
25743    }
25744    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25745        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25746            unreachable!("Expected a node, not a token");
25747        };
25748        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25749    }
25750}
25751impl<'db> TerminalConst<'db> {
25752    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25753        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25754    }
25755    pub fn token(&self, db: &'db dyn Database) -> TokenConst<'db> {
25756        TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
25757    }
25758    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25759        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25760    }
25761}
25762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25763pub struct TerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
25764impl<'db> TerminalConstPtr<'db> {}
25765impl<'db> TypedStablePtr<'db> for TerminalConstPtr<'db> {
25766    type SyntaxNode = TerminalConst<'db>;
25767    fn untyped(self) -> SyntaxStablePtrId<'db> {
25768        self.0
25769    }
25770    fn lookup(&self, db: &'db dyn Database) -> TerminalConst<'db> {
25771        TerminalConst::from_syntax_node(db, self.0.lookup(db))
25772    }
25773}
25774impl<'db> From<TerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
25775    fn from(ptr: TerminalConstPtr<'db>) -> Self {
25776        ptr.untyped()
25777    }
25778}
25779#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25780pub struct TerminalConstGreen<'db>(pub GreenId<'db>);
25781impl<'db> TypedSyntaxNode<'db> for TerminalConst<'db> {
25782    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
25783    type StablePtr = TerminalConstPtr<'db>;
25784    type Green = TerminalConstGreen<'db>;
25785    fn missing(db: &'db dyn Database) -> Self::Green {
25786        TerminalConstGreen(
25787            GreenNode {
25788                kind: SyntaxKind::TerminalConst,
25789                details: GreenNodeDetails::Node {
25790                    children: [
25791                        Trivia::missing(db).0,
25792                        TokenConst::missing(db).0,
25793                        Trivia::missing(db).0,
25794                    ]
25795                    .into(),
25796                    width: TextWidth::default(),
25797                },
25798            }
25799            .intern(db),
25800        )
25801    }
25802    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25803        let kind = node.kind(db);
25804        assert_eq!(
25805            kind,
25806            SyntaxKind::TerminalConst,
25807            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25808            kind,
25809            SyntaxKind::TerminalConst
25810        );
25811        Self { node }
25812    }
25813    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25814        let kind = node.kind(db);
25815        if kind == SyntaxKind::TerminalConst {
25816            Some(Self::from_syntax_node(db, node))
25817        } else {
25818            None
25819        }
25820    }
25821    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25822        self.node
25823    }
25824    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25825        TerminalConstPtr(self.node.stable_ptr(db))
25826    }
25827}
25828#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25829pub struct TokenElse<'db> {
25830    node: SyntaxNode<'db>,
25831}
25832impl<'db> Token<'db> for TokenElse<'db> {
25833    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25834        TokenElseGreen(
25835            GreenNode { kind: SyntaxKind::TokenElse, details: GreenNodeDetails::Token(text) }
25836                .intern(db),
25837        )
25838    }
25839    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25840        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25841    }
25842}
25843#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25844pub struct TokenElsePtr<'db>(pub SyntaxStablePtrId<'db>);
25845impl<'db> TypedStablePtr<'db> for TokenElsePtr<'db> {
25846    type SyntaxNode = TokenElse<'db>;
25847    fn untyped(self) -> SyntaxStablePtrId<'db> {
25848        self.0
25849    }
25850    fn lookup(&self, db: &'db dyn Database) -> TokenElse<'db> {
25851        TokenElse::from_syntax_node(db, self.0.lookup(db))
25852    }
25853}
25854impl<'db> From<TokenElsePtr<'db>> for SyntaxStablePtrId<'db> {
25855    fn from(ptr: TokenElsePtr<'db>) -> Self {
25856        ptr.untyped()
25857    }
25858}
25859#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25860pub struct TokenElseGreen<'db>(pub GreenId<'db>);
25861impl<'db> TokenElseGreen<'db> {
25862    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25863        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25864    }
25865}
25866impl<'db> TypedSyntaxNode<'db> for TokenElse<'db> {
25867    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
25868    type StablePtr = TokenElsePtr<'db>;
25869    type Green = TokenElseGreen<'db>;
25870    fn missing(db: &'db dyn Database) -> Self::Green {
25871        TokenElseGreen(
25872            GreenNode {
25873                kind: SyntaxKind::TokenMissing,
25874                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25875            }
25876            .intern(db),
25877        )
25878    }
25879    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25880        match node.green_node(db).details {
25881            GreenNodeDetails::Token(_) => Self { node },
25882            GreenNodeDetails::Node { .. } => {
25883                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
25884            }
25885        }
25886    }
25887    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25888        match node.green_node(db).details {
25889            GreenNodeDetails::Token(_) => Some(Self { node }),
25890            GreenNodeDetails::Node { .. } => None,
25891        }
25892    }
25893    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25894        self.node
25895    }
25896    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25897        TokenElsePtr(self.node.stable_ptr(db))
25898    }
25899}
25900#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25901pub struct TerminalElse<'db> {
25902    node: SyntaxNode<'db>,
25903}
25904impl<'db> Terminal<'db> for TerminalElse<'db> {
25905    const KIND: SyntaxKind = SyntaxKind::TerminalElse;
25906    type TokenType = TokenElse<'db>;
25907    fn new_green(
25908        db: &'db dyn Database,
25909        leading_trivia: TriviaGreen<'db>,
25910        token: <<TerminalElse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25911        trailing_trivia: TriviaGreen<'db>,
25912    ) -> Self::Green {
25913        let children = [leading_trivia.0, token.0, trailing_trivia.0];
25914        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25915        TerminalElseGreen(
25916            GreenNode {
25917                kind: SyntaxKind::TerminalElse,
25918                details: GreenNodeDetails::Node { children: children.into(), width },
25919            }
25920            .intern(db),
25921        )
25922    }
25923    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25924        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25925            unreachable!("Expected a node, not a token");
25926        };
25927        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25928    }
25929}
25930impl<'db> TerminalElse<'db> {
25931    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25932        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25933    }
25934    pub fn token(&self, db: &'db dyn Database) -> TokenElse<'db> {
25935        TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
25936    }
25937    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25938        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25939    }
25940}
25941#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
25942pub struct TerminalElsePtr<'db>(pub SyntaxStablePtrId<'db>);
25943impl<'db> TerminalElsePtr<'db> {}
25944impl<'db> TypedStablePtr<'db> for TerminalElsePtr<'db> {
25945    type SyntaxNode = TerminalElse<'db>;
25946    fn untyped(self) -> SyntaxStablePtrId<'db> {
25947        self.0
25948    }
25949    fn lookup(&self, db: &'db dyn Database) -> TerminalElse<'db> {
25950        TerminalElse::from_syntax_node(db, self.0.lookup(db))
25951    }
25952}
25953impl<'db> From<TerminalElsePtr<'db>> for SyntaxStablePtrId<'db> {
25954    fn from(ptr: TerminalElsePtr<'db>) -> Self {
25955        ptr.untyped()
25956    }
25957}
25958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25959pub struct TerminalElseGreen<'db>(pub GreenId<'db>);
25960impl<'db> TypedSyntaxNode<'db> for TerminalElse<'db> {
25961    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
25962    type StablePtr = TerminalElsePtr<'db>;
25963    type Green = TerminalElseGreen<'db>;
25964    fn missing(db: &'db dyn Database) -> Self::Green {
25965        TerminalElseGreen(
25966            GreenNode {
25967                kind: SyntaxKind::TerminalElse,
25968                details: GreenNodeDetails::Node {
25969                    children: [
25970                        Trivia::missing(db).0,
25971                        TokenElse::missing(db).0,
25972                        Trivia::missing(db).0,
25973                    ]
25974                    .into(),
25975                    width: TextWidth::default(),
25976                },
25977            }
25978            .intern(db),
25979        )
25980    }
25981    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25982        let kind = node.kind(db);
25983        assert_eq!(
25984            kind,
25985            SyntaxKind::TerminalElse,
25986            "Unexpected SyntaxKind {:?}. Expected {:?}.",
25987            kind,
25988            SyntaxKind::TerminalElse
25989        );
25990        Self { node }
25991    }
25992    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25993        let kind = node.kind(db);
25994        if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
25995    }
25996    fn as_syntax_node(&self) -> SyntaxNode<'db> {
25997        self.node
25998    }
25999    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26000        TerminalElsePtr(self.node.stable_ptr(db))
26001    }
26002}
26003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26004pub struct TokenEnum<'db> {
26005    node: SyntaxNode<'db>,
26006}
26007impl<'db> Token<'db> for TokenEnum<'db> {
26008    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26009        TokenEnumGreen(
26010            GreenNode { kind: SyntaxKind::TokenEnum, details: GreenNodeDetails::Token(text) }
26011                .intern(db),
26012        )
26013    }
26014    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26015        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26016    }
26017}
26018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26019pub struct TokenEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26020impl<'db> TypedStablePtr<'db> for TokenEnumPtr<'db> {
26021    type SyntaxNode = TokenEnum<'db>;
26022    fn untyped(self) -> SyntaxStablePtrId<'db> {
26023        self.0
26024    }
26025    fn lookup(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26026        TokenEnum::from_syntax_node(db, self.0.lookup(db))
26027    }
26028}
26029impl<'db> From<TokenEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26030    fn from(ptr: TokenEnumPtr<'db>) -> Self {
26031        ptr.untyped()
26032    }
26033}
26034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26035pub struct TokenEnumGreen<'db>(pub GreenId<'db>);
26036impl<'db> TokenEnumGreen<'db> {
26037    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26038        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26039    }
26040}
26041impl<'db> TypedSyntaxNode<'db> for TokenEnum<'db> {
26042    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26043    type StablePtr = TokenEnumPtr<'db>;
26044    type Green = TokenEnumGreen<'db>;
26045    fn missing(db: &'db dyn Database) -> Self::Green {
26046        TokenEnumGreen(
26047            GreenNode {
26048                kind: SyntaxKind::TokenMissing,
26049                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26050            }
26051            .intern(db),
26052        )
26053    }
26054    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26055        match node.green_node(db).details {
26056            GreenNodeDetails::Token(_) => Self { node },
26057            GreenNodeDetails::Node { .. } => {
26058                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26059            }
26060        }
26061    }
26062    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26063        match node.green_node(db).details {
26064            GreenNodeDetails::Token(_) => Some(Self { node }),
26065            GreenNodeDetails::Node { .. } => None,
26066        }
26067    }
26068    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26069        self.node
26070    }
26071    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26072        TokenEnumPtr(self.node.stable_ptr(db))
26073    }
26074}
26075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26076pub struct TerminalEnum<'db> {
26077    node: SyntaxNode<'db>,
26078}
26079impl<'db> Terminal<'db> for TerminalEnum<'db> {
26080    const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26081    type TokenType = TokenEnum<'db>;
26082    fn new_green(
26083        db: &'db dyn Database,
26084        leading_trivia: TriviaGreen<'db>,
26085        token: <<TerminalEnum<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26086        trailing_trivia: TriviaGreen<'db>,
26087    ) -> Self::Green {
26088        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26089        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26090        TerminalEnumGreen(
26091            GreenNode {
26092                kind: SyntaxKind::TerminalEnum,
26093                details: GreenNodeDetails::Node { children: children.into(), width },
26094            }
26095            .intern(db),
26096        )
26097    }
26098    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26099        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26100            unreachable!("Expected a node, not a token");
26101        };
26102        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26103    }
26104}
26105impl<'db> TerminalEnum<'db> {
26106    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26107        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26108    }
26109    pub fn token(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26110        TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26111    }
26112    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26113        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26114    }
26115}
26116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26117pub struct TerminalEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26118impl<'db> TerminalEnumPtr<'db> {}
26119impl<'db> TypedStablePtr<'db> for TerminalEnumPtr<'db> {
26120    type SyntaxNode = TerminalEnum<'db>;
26121    fn untyped(self) -> SyntaxStablePtrId<'db> {
26122        self.0
26123    }
26124    fn lookup(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
26125        TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26126    }
26127}
26128impl<'db> From<TerminalEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26129    fn from(ptr: TerminalEnumPtr<'db>) -> Self {
26130        ptr.untyped()
26131    }
26132}
26133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26134pub struct TerminalEnumGreen<'db>(pub GreenId<'db>);
26135impl<'db> TypedSyntaxNode<'db> for TerminalEnum<'db> {
26136    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26137    type StablePtr = TerminalEnumPtr<'db>;
26138    type Green = TerminalEnumGreen<'db>;
26139    fn missing(db: &'db dyn Database) -> Self::Green {
26140        TerminalEnumGreen(
26141            GreenNode {
26142                kind: SyntaxKind::TerminalEnum,
26143                details: GreenNodeDetails::Node {
26144                    children: [
26145                        Trivia::missing(db).0,
26146                        TokenEnum::missing(db).0,
26147                        Trivia::missing(db).0,
26148                    ]
26149                    .into(),
26150                    width: TextWidth::default(),
26151                },
26152            }
26153            .intern(db),
26154        )
26155    }
26156    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26157        let kind = node.kind(db);
26158        assert_eq!(
26159            kind,
26160            SyntaxKind::TerminalEnum,
26161            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26162            kind,
26163            SyntaxKind::TerminalEnum
26164        );
26165        Self { node }
26166    }
26167    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26168        let kind = node.kind(db);
26169        if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26170    }
26171    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26172        self.node
26173    }
26174    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26175        TerminalEnumPtr(self.node.stable_ptr(db))
26176    }
26177}
26178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26179pub struct TokenExtern<'db> {
26180    node: SyntaxNode<'db>,
26181}
26182impl<'db> Token<'db> for TokenExtern<'db> {
26183    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26184        TokenExternGreen(
26185            GreenNode { kind: SyntaxKind::TokenExtern, details: GreenNodeDetails::Token(text) }
26186                .intern(db),
26187        )
26188    }
26189    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26190        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26191    }
26192}
26193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26194pub struct TokenExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26195impl<'db> TypedStablePtr<'db> for TokenExternPtr<'db> {
26196    type SyntaxNode = TokenExtern<'db>;
26197    fn untyped(self) -> SyntaxStablePtrId<'db> {
26198        self.0
26199    }
26200    fn lookup(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26201        TokenExtern::from_syntax_node(db, self.0.lookup(db))
26202    }
26203}
26204impl<'db> From<TokenExternPtr<'db>> for SyntaxStablePtrId<'db> {
26205    fn from(ptr: TokenExternPtr<'db>) -> Self {
26206        ptr.untyped()
26207    }
26208}
26209#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26210pub struct TokenExternGreen<'db>(pub GreenId<'db>);
26211impl<'db> TokenExternGreen<'db> {
26212    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26213        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26214    }
26215}
26216impl<'db> TypedSyntaxNode<'db> for TokenExtern<'db> {
26217    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26218    type StablePtr = TokenExternPtr<'db>;
26219    type Green = TokenExternGreen<'db>;
26220    fn missing(db: &'db dyn Database) -> Self::Green {
26221        TokenExternGreen(
26222            GreenNode {
26223                kind: SyntaxKind::TokenMissing,
26224                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26225            }
26226            .intern(db),
26227        )
26228    }
26229    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26230        match node.green_node(db).details {
26231            GreenNodeDetails::Token(_) => Self { node },
26232            GreenNodeDetails::Node { .. } => {
26233                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26234            }
26235        }
26236    }
26237    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26238        match node.green_node(db).details {
26239            GreenNodeDetails::Token(_) => Some(Self { node }),
26240            GreenNodeDetails::Node { .. } => None,
26241        }
26242    }
26243    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26244        self.node
26245    }
26246    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26247        TokenExternPtr(self.node.stable_ptr(db))
26248    }
26249}
26250#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26251pub struct TerminalExtern<'db> {
26252    node: SyntaxNode<'db>,
26253}
26254impl<'db> Terminal<'db> for TerminalExtern<'db> {
26255    const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26256    type TokenType = TokenExtern<'db>;
26257    fn new_green(
26258        db: &'db dyn Database,
26259        leading_trivia: TriviaGreen<'db>,
26260        token: <<TerminalExtern<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26261        trailing_trivia: TriviaGreen<'db>,
26262    ) -> Self::Green {
26263        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26264        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26265        TerminalExternGreen(
26266            GreenNode {
26267                kind: SyntaxKind::TerminalExtern,
26268                details: GreenNodeDetails::Node { children: children.into(), width },
26269            }
26270            .intern(db),
26271        )
26272    }
26273    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26274        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26275            unreachable!("Expected a node, not a token");
26276        };
26277        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26278    }
26279}
26280impl<'db> TerminalExtern<'db> {
26281    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26282        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26283    }
26284    pub fn token(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26285        TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26286    }
26287    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26288        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26289    }
26290}
26291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26292pub struct TerminalExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26293impl<'db> TerminalExternPtr<'db> {}
26294impl<'db> TypedStablePtr<'db> for TerminalExternPtr<'db> {
26295    type SyntaxNode = TerminalExtern<'db>;
26296    fn untyped(self) -> SyntaxStablePtrId<'db> {
26297        self.0
26298    }
26299    fn lookup(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
26300        TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26301    }
26302}
26303impl<'db> From<TerminalExternPtr<'db>> for SyntaxStablePtrId<'db> {
26304    fn from(ptr: TerminalExternPtr<'db>) -> Self {
26305        ptr.untyped()
26306    }
26307}
26308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26309pub struct TerminalExternGreen<'db>(pub GreenId<'db>);
26310impl<'db> TypedSyntaxNode<'db> for TerminalExtern<'db> {
26311    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26312    type StablePtr = TerminalExternPtr<'db>;
26313    type Green = TerminalExternGreen<'db>;
26314    fn missing(db: &'db dyn Database) -> Self::Green {
26315        TerminalExternGreen(
26316            GreenNode {
26317                kind: SyntaxKind::TerminalExtern,
26318                details: GreenNodeDetails::Node {
26319                    children: [
26320                        Trivia::missing(db).0,
26321                        TokenExtern::missing(db).0,
26322                        Trivia::missing(db).0,
26323                    ]
26324                    .into(),
26325                    width: TextWidth::default(),
26326                },
26327            }
26328            .intern(db),
26329        )
26330    }
26331    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26332        let kind = node.kind(db);
26333        assert_eq!(
26334            kind,
26335            SyntaxKind::TerminalExtern,
26336            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26337            kind,
26338            SyntaxKind::TerminalExtern
26339        );
26340        Self { node }
26341    }
26342    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26343        let kind = node.kind(db);
26344        if kind == SyntaxKind::TerminalExtern {
26345            Some(Self::from_syntax_node(db, node))
26346        } else {
26347            None
26348        }
26349    }
26350    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26351        self.node
26352    }
26353    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26354        TerminalExternPtr(self.node.stable_ptr(db))
26355    }
26356}
26357#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26358pub struct TokenFalse<'db> {
26359    node: SyntaxNode<'db>,
26360}
26361impl<'db> Token<'db> for TokenFalse<'db> {
26362    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26363        TokenFalseGreen(
26364            GreenNode { kind: SyntaxKind::TokenFalse, details: GreenNodeDetails::Token(text) }
26365                .intern(db),
26366        )
26367    }
26368    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26369        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26370    }
26371}
26372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26373pub struct TokenFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26374impl<'db> TypedStablePtr<'db> for TokenFalsePtr<'db> {
26375    type SyntaxNode = TokenFalse<'db>;
26376    fn untyped(self) -> SyntaxStablePtrId<'db> {
26377        self.0
26378    }
26379    fn lookup(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26380        TokenFalse::from_syntax_node(db, self.0.lookup(db))
26381    }
26382}
26383impl<'db> From<TokenFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26384    fn from(ptr: TokenFalsePtr<'db>) -> Self {
26385        ptr.untyped()
26386    }
26387}
26388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26389pub struct TokenFalseGreen<'db>(pub GreenId<'db>);
26390impl<'db> TokenFalseGreen<'db> {
26391    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26392        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26393    }
26394}
26395impl<'db> TypedSyntaxNode<'db> for TokenFalse<'db> {
26396    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26397    type StablePtr = TokenFalsePtr<'db>;
26398    type Green = TokenFalseGreen<'db>;
26399    fn missing(db: &'db dyn Database) -> Self::Green {
26400        TokenFalseGreen(
26401            GreenNode {
26402                kind: SyntaxKind::TokenMissing,
26403                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26404            }
26405            .intern(db),
26406        )
26407    }
26408    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26409        match node.green_node(db).details {
26410            GreenNodeDetails::Token(_) => Self { node },
26411            GreenNodeDetails::Node { .. } => {
26412                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26413            }
26414        }
26415    }
26416    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26417        match node.green_node(db).details {
26418            GreenNodeDetails::Token(_) => Some(Self { node }),
26419            GreenNodeDetails::Node { .. } => None,
26420        }
26421    }
26422    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26423        self.node
26424    }
26425    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26426        TokenFalsePtr(self.node.stable_ptr(db))
26427    }
26428}
26429#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26430pub struct TerminalFalse<'db> {
26431    node: SyntaxNode<'db>,
26432}
26433impl<'db> Terminal<'db> for TerminalFalse<'db> {
26434    const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26435    type TokenType = TokenFalse<'db>;
26436    fn new_green(
26437        db: &'db dyn Database,
26438        leading_trivia: TriviaGreen<'db>,
26439        token: <<TerminalFalse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26440        trailing_trivia: TriviaGreen<'db>,
26441    ) -> Self::Green {
26442        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26443        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26444        TerminalFalseGreen(
26445            GreenNode {
26446                kind: SyntaxKind::TerminalFalse,
26447                details: GreenNodeDetails::Node { children: children.into(), width },
26448            }
26449            .intern(db),
26450        )
26451    }
26452    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26453        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26454            unreachable!("Expected a node, not a token");
26455        };
26456        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26457    }
26458}
26459impl<'db> TerminalFalse<'db> {
26460    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26461        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26462    }
26463    pub fn token(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26464        TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26465    }
26466    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26467        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26468    }
26469}
26470#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26471pub struct TerminalFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26472impl<'db> TerminalFalsePtr<'db> {}
26473impl<'db> TypedStablePtr<'db> for TerminalFalsePtr<'db> {
26474    type SyntaxNode = TerminalFalse<'db>;
26475    fn untyped(self) -> SyntaxStablePtrId<'db> {
26476        self.0
26477    }
26478    fn lookup(&self, db: &'db dyn Database) -> TerminalFalse<'db> {
26479        TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26480    }
26481}
26482impl<'db> From<TerminalFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26483    fn from(ptr: TerminalFalsePtr<'db>) -> Self {
26484        ptr.untyped()
26485    }
26486}
26487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26488pub struct TerminalFalseGreen<'db>(pub GreenId<'db>);
26489impl<'db> TypedSyntaxNode<'db> for TerminalFalse<'db> {
26490    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26491    type StablePtr = TerminalFalsePtr<'db>;
26492    type Green = TerminalFalseGreen<'db>;
26493    fn missing(db: &'db dyn Database) -> Self::Green {
26494        TerminalFalseGreen(
26495            GreenNode {
26496                kind: SyntaxKind::TerminalFalse,
26497                details: GreenNodeDetails::Node {
26498                    children: [
26499                        Trivia::missing(db).0,
26500                        TokenFalse::missing(db).0,
26501                        Trivia::missing(db).0,
26502                    ]
26503                    .into(),
26504                    width: TextWidth::default(),
26505                },
26506            }
26507            .intern(db),
26508        )
26509    }
26510    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26511        let kind = node.kind(db);
26512        assert_eq!(
26513            kind,
26514            SyntaxKind::TerminalFalse,
26515            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26516            kind,
26517            SyntaxKind::TerminalFalse
26518        );
26519        Self { node }
26520    }
26521    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26522        let kind = node.kind(db);
26523        if kind == SyntaxKind::TerminalFalse {
26524            Some(Self::from_syntax_node(db, node))
26525        } else {
26526            None
26527        }
26528    }
26529    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26530        self.node
26531    }
26532    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26533        TerminalFalsePtr(self.node.stable_ptr(db))
26534    }
26535}
26536#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26537pub struct TokenFunction<'db> {
26538    node: SyntaxNode<'db>,
26539}
26540impl<'db> Token<'db> for TokenFunction<'db> {
26541    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26542        TokenFunctionGreen(
26543            GreenNode { kind: SyntaxKind::TokenFunction, details: GreenNodeDetails::Token(text) }
26544                .intern(db),
26545        )
26546    }
26547    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26548        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26549    }
26550}
26551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26552pub struct TokenFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26553impl<'db> TypedStablePtr<'db> for TokenFunctionPtr<'db> {
26554    type SyntaxNode = TokenFunction<'db>;
26555    fn untyped(self) -> SyntaxStablePtrId<'db> {
26556        self.0
26557    }
26558    fn lookup(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26559        TokenFunction::from_syntax_node(db, self.0.lookup(db))
26560    }
26561}
26562impl<'db> From<TokenFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26563    fn from(ptr: TokenFunctionPtr<'db>) -> Self {
26564        ptr.untyped()
26565    }
26566}
26567#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26568pub struct TokenFunctionGreen<'db>(pub GreenId<'db>);
26569impl<'db> TokenFunctionGreen<'db> {
26570    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26571        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26572    }
26573}
26574impl<'db> TypedSyntaxNode<'db> for TokenFunction<'db> {
26575    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
26576    type StablePtr = TokenFunctionPtr<'db>;
26577    type Green = TokenFunctionGreen<'db>;
26578    fn missing(db: &'db dyn Database) -> Self::Green {
26579        TokenFunctionGreen(
26580            GreenNode {
26581                kind: SyntaxKind::TokenMissing,
26582                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26583            }
26584            .intern(db),
26585        )
26586    }
26587    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26588        match node.green_node(db).details {
26589            GreenNodeDetails::Token(_) => Self { node },
26590            GreenNodeDetails::Node { .. } => {
26591                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
26592            }
26593        }
26594    }
26595    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26596        match node.green_node(db).details {
26597            GreenNodeDetails::Token(_) => Some(Self { node }),
26598            GreenNodeDetails::Node { .. } => None,
26599        }
26600    }
26601    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26602        self.node
26603    }
26604    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26605        TokenFunctionPtr(self.node.stable_ptr(db))
26606    }
26607}
26608#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26609pub struct TerminalFunction<'db> {
26610    node: SyntaxNode<'db>,
26611}
26612impl<'db> Terminal<'db> for TerminalFunction<'db> {
26613    const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
26614    type TokenType = TokenFunction<'db>;
26615    fn new_green(
26616        db: &'db dyn Database,
26617        leading_trivia: TriviaGreen<'db>,
26618        token: <<TerminalFunction<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26619        trailing_trivia: TriviaGreen<'db>,
26620    ) -> Self::Green {
26621        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26622        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26623        TerminalFunctionGreen(
26624            GreenNode {
26625                kind: SyntaxKind::TerminalFunction,
26626                details: GreenNodeDetails::Node { children: children.into(), width },
26627            }
26628            .intern(db),
26629        )
26630    }
26631    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26632        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26633            unreachable!("Expected a node, not a token");
26634        };
26635        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26636    }
26637}
26638impl<'db> TerminalFunction<'db> {
26639    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26640        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26641    }
26642    pub fn token(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26643        TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
26644    }
26645    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26646        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26647    }
26648}
26649#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26650pub struct TerminalFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26651impl<'db> TerminalFunctionPtr<'db> {}
26652impl<'db> TypedStablePtr<'db> for TerminalFunctionPtr<'db> {
26653    type SyntaxNode = TerminalFunction<'db>;
26654    fn untyped(self) -> SyntaxStablePtrId<'db> {
26655        self.0
26656    }
26657    fn lookup(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
26658        TerminalFunction::from_syntax_node(db, self.0.lookup(db))
26659    }
26660}
26661impl<'db> From<TerminalFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26662    fn from(ptr: TerminalFunctionPtr<'db>) -> Self {
26663        ptr.untyped()
26664    }
26665}
26666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26667pub struct TerminalFunctionGreen<'db>(pub GreenId<'db>);
26668impl<'db> TypedSyntaxNode<'db> for TerminalFunction<'db> {
26669    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
26670    type StablePtr = TerminalFunctionPtr<'db>;
26671    type Green = TerminalFunctionGreen<'db>;
26672    fn missing(db: &'db dyn Database) -> Self::Green {
26673        TerminalFunctionGreen(
26674            GreenNode {
26675                kind: SyntaxKind::TerminalFunction,
26676                details: GreenNodeDetails::Node {
26677                    children: [
26678                        Trivia::missing(db).0,
26679                        TokenFunction::missing(db).0,
26680                        Trivia::missing(db).0,
26681                    ]
26682                    .into(),
26683                    width: TextWidth::default(),
26684                },
26685            }
26686            .intern(db),
26687        )
26688    }
26689    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26690        let kind = node.kind(db);
26691        assert_eq!(
26692            kind,
26693            SyntaxKind::TerminalFunction,
26694            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26695            kind,
26696            SyntaxKind::TerminalFunction
26697        );
26698        Self { node }
26699    }
26700    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26701        let kind = node.kind(db);
26702        if kind == SyntaxKind::TerminalFunction {
26703            Some(Self::from_syntax_node(db, node))
26704        } else {
26705            None
26706        }
26707    }
26708    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26709        self.node
26710    }
26711    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26712        TerminalFunctionPtr(self.node.stable_ptr(db))
26713    }
26714}
26715#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26716pub struct TokenIf<'db> {
26717    node: SyntaxNode<'db>,
26718}
26719impl<'db> Token<'db> for TokenIf<'db> {
26720    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26721        TokenIfGreen(
26722            GreenNode { kind: SyntaxKind::TokenIf, details: GreenNodeDetails::Token(text) }
26723                .intern(db),
26724        )
26725    }
26726    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26727        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26728    }
26729}
26730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26731pub struct TokenIfPtr<'db>(pub SyntaxStablePtrId<'db>);
26732impl<'db> TypedStablePtr<'db> for TokenIfPtr<'db> {
26733    type SyntaxNode = TokenIf<'db>;
26734    fn untyped(self) -> SyntaxStablePtrId<'db> {
26735        self.0
26736    }
26737    fn lookup(&self, db: &'db dyn Database) -> TokenIf<'db> {
26738        TokenIf::from_syntax_node(db, self.0.lookup(db))
26739    }
26740}
26741impl<'db> From<TokenIfPtr<'db>> for SyntaxStablePtrId<'db> {
26742    fn from(ptr: TokenIfPtr<'db>) -> Self {
26743        ptr.untyped()
26744    }
26745}
26746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26747pub struct TokenIfGreen<'db>(pub GreenId<'db>);
26748impl<'db> TokenIfGreen<'db> {
26749    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26750        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26751    }
26752}
26753impl<'db> TypedSyntaxNode<'db> for TokenIf<'db> {
26754    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
26755    type StablePtr = TokenIfPtr<'db>;
26756    type Green = TokenIfGreen<'db>;
26757    fn missing(db: &'db dyn Database) -> Self::Green {
26758        TokenIfGreen(
26759            GreenNode {
26760                kind: SyntaxKind::TokenMissing,
26761                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26762            }
26763            .intern(db),
26764        )
26765    }
26766    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26767        match node.green_node(db).details {
26768            GreenNodeDetails::Token(_) => Self { node },
26769            GreenNodeDetails::Node { .. } => {
26770                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
26771            }
26772        }
26773    }
26774    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26775        match node.green_node(db).details {
26776            GreenNodeDetails::Token(_) => Some(Self { node }),
26777            GreenNodeDetails::Node { .. } => None,
26778        }
26779    }
26780    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26781        self.node
26782    }
26783    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26784        TokenIfPtr(self.node.stable_ptr(db))
26785    }
26786}
26787#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26788pub struct TerminalIf<'db> {
26789    node: SyntaxNode<'db>,
26790}
26791impl<'db> Terminal<'db> for TerminalIf<'db> {
26792    const KIND: SyntaxKind = SyntaxKind::TerminalIf;
26793    type TokenType = TokenIf<'db>;
26794    fn new_green(
26795        db: &'db dyn Database,
26796        leading_trivia: TriviaGreen<'db>,
26797        token: <<TerminalIf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26798        trailing_trivia: TriviaGreen<'db>,
26799    ) -> Self::Green {
26800        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26801        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26802        TerminalIfGreen(
26803            GreenNode {
26804                kind: SyntaxKind::TerminalIf,
26805                details: GreenNodeDetails::Node { children: children.into(), width },
26806            }
26807            .intern(db),
26808        )
26809    }
26810    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26811        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26812            unreachable!("Expected a node, not a token");
26813        };
26814        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26815    }
26816}
26817impl<'db> TerminalIf<'db> {
26818    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26819        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26820    }
26821    pub fn token(&self, db: &'db dyn Database) -> TokenIf<'db> {
26822        TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
26823    }
26824    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26825        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26826    }
26827}
26828#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26829pub struct TerminalIfPtr<'db>(pub SyntaxStablePtrId<'db>);
26830impl<'db> TerminalIfPtr<'db> {}
26831impl<'db> TypedStablePtr<'db> for TerminalIfPtr<'db> {
26832    type SyntaxNode = TerminalIf<'db>;
26833    fn untyped(self) -> SyntaxStablePtrId<'db> {
26834        self.0
26835    }
26836    fn lookup(&self, db: &'db dyn Database) -> TerminalIf<'db> {
26837        TerminalIf::from_syntax_node(db, self.0.lookup(db))
26838    }
26839}
26840impl<'db> From<TerminalIfPtr<'db>> for SyntaxStablePtrId<'db> {
26841    fn from(ptr: TerminalIfPtr<'db>) -> Self {
26842        ptr.untyped()
26843    }
26844}
26845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26846pub struct TerminalIfGreen<'db>(pub GreenId<'db>);
26847impl<'db> TypedSyntaxNode<'db> for TerminalIf<'db> {
26848    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
26849    type StablePtr = TerminalIfPtr<'db>;
26850    type Green = TerminalIfGreen<'db>;
26851    fn missing(db: &'db dyn Database) -> Self::Green {
26852        TerminalIfGreen(
26853            GreenNode {
26854                kind: SyntaxKind::TerminalIf,
26855                details: GreenNodeDetails::Node {
26856                    children: [
26857                        Trivia::missing(db).0,
26858                        TokenIf::missing(db).0,
26859                        Trivia::missing(db).0,
26860                    ]
26861                    .into(),
26862                    width: TextWidth::default(),
26863                },
26864            }
26865            .intern(db),
26866        )
26867    }
26868    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26869        let kind = node.kind(db);
26870        assert_eq!(
26871            kind,
26872            SyntaxKind::TerminalIf,
26873            "Unexpected SyntaxKind {:?}. Expected {:?}.",
26874            kind,
26875            SyntaxKind::TerminalIf
26876        );
26877        Self { node }
26878    }
26879    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26880        let kind = node.kind(db);
26881        if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
26882    }
26883    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26884        self.node
26885    }
26886    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26887        TerminalIfPtr(self.node.stable_ptr(db))
26888    }
26889}
26890#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26891pub struct TokenWhile<'db> {
26892    node: SyntaxNode<'db>,
26893}
26894impl<'db> Token<'db> for TokenWhile<'db> {
26895    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26896        TokenWhileGreen(
26897            GreenNode { kind: SyntaxKind::TokenWhile, details: GreenNodeDetails::Token(text) }
26898                .intern(db),
26899        )
26900    }
26901    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26902        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26903    }
26904}
26905#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
26906pub struct TokenWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
26907impl<'db> TypedStablePtr<'db> for TokenWhilePtr<'db> {
26908    type SyntaxNode = TokenWhile<'db>;
26909    fn untyped(self) -> SyntaxStablePtrId<'db> {
26910        self.0
26911    }
26912    fn lookup(&self, db: &'db dyn Database) -> TokenWhile<'db> {
26913        TokenWhile::from_syntax_node(db, self.0.lookup(db))
26914    }
26915}
26916impl<'db> From<TokenWhilePtr<'db>> for SyntaxStablePtrId<'db> {
26917    fn from(ptr: TokenWhilePtr<'db>) -> Self {
26918        ptr.untyped()
26919    }
26920}
26921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26922pub struct TokenWhileGreen<'db>(pub GreenId<'db>);
26923impl<'db> TokenWhileGreen<'db> {
26924    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26925        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26926    }
26927}
26928impl<'db> TypedSyntaxNode<'db> for TokenWhile<'db> {
26929    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
26930    type StablePtr = TokenWhilePtr<'db>;
26931    type Green = TokenWhileGreen<'db>;
26932    fn missing(db: &'db dyn Database) -> Self::Green {
26933        TokenWhileGreen(
26934            GreenNode {
26935                kind: SyntaxKind::TokenMissing,
26936                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26937            }
26938            .intern(db),
26939        )
26940    }
26941    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26942        match node.green_node(db).details {
26943            GreenNodeDetails::Token(_) => Self { node },
26944            GreenNodeDetails::Node { .. } => {
26945                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
26946            }
26947        }
26948    }
26949    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26950        match node.green_node(db).details {
26951            GreenNodeDetails::Token(_) => Some(Self { node }),
26952            GreenNodeDetails::Node { .. } => None,
26953        }
26954    }
26955    fn as_syntax_node(&self) -> SyntaxNode<'db> {
26956        self.node
26957    }
26958    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26959        TokenWhilePtr(self.node.stable_ptr(db))
26960    }
26961}
26962#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26963pub struct TerminalWhile<'db> {
26964    node: SyntaxNode<'db>,
26965}
26966impl<'db> Terminal<'db> for TerminalWhile<'db> {
26967    const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
26968    type TokenType = TokenWhile<'db>;
26969    fn new_green(
26970        db: &'db dyn Database,
26971        leading_trivia: TriviaGreen<'db>,
26972        token: <<TerminalWhile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26973        trailing_trivia: TriviaGreen<'db>,
26974    ) -> Self::Green {
26975        let children = [leading_trivia.0, token.0, trailing_trivia.0];
26976        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26977        TerminalWhileGreen(
26978            GreenNode {
26979                kind: SyntaxKind::TerminalWhile,
26980                details: GreenNodeDetails::Node { children: children.into(), width },
26981            }
26982            .intern(db),
26983        )
26984    }
26985    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26986        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26987            unreachable!("Expected a node, not a token");
26988        };
26989        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26990    }
26991}
26992impl<'db> TerminalWhile<'db> {
26993    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26994        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26995    }
26996    pub fn token(&self, db: &'db dyn Database) -> TokenWhile<'db> {
26997        TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
26998    }
26999    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27000        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27001    }
27002}
27003#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27004pub struct TerminalWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27005impl<'db> TerminalWhilePtr<'db> {}
27006impl<'db> TypedStablePtr<'db> for TerminalWhilePtr<'db> {
27007    type SyntaxNode = TerminalWhile<'db>;
27008    fn untyped(self) -> SyntaxStablePtrId<'db> {
27009        self.0
27010    }
27011    fn lookup(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
27012        TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27013    }
27014}
27015impl<'db> From<TerminalWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27016    fn from(ptr: TerminalWhilePtr<'db>) -> Self {
27017        ptr.untyped()
27018    }
27019}
27020#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27021pub struct TerminalWhileGreen<'db>(pub GreenId<'db>);
27022impl<'db> TypedSyntaxNode<'db> for TerminalWhile<'db> {
27023    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27024    type StablePtr = TerminalWhilePtr<'db>;
27025    type Green = TerminalWhileGreen<'db>;
27026    fn missing(db: &'db dyn Database) -> Self::Green {
27027        TerminalWhileGreen(
27028            GreenNode {
27029                kind: SyntaxKind::TerminalWhile,
27030                details: GreenNodeDetails::Node {
27031                    children: [
27032                        Trivia::missing(db).0,
27033                        TokenWhile::missing(db).0,
27034                        Trivia::missing(db).0,
27035                    ]
27036                    .into(),
27037                    width: TextWidth::default(),
27038                },
27039            }
27040            .intern(db),
27041        )
27042    }
27043    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27044        let kind = node.kind(db);
27045        assert_eq!(
27046            kind,
27047            SyntaxKind::TerminalWhile,
27048            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27049            kind,
27050            SyntaxKind::TerminalWhile
27051        );
27052        Self { node }
27053    }
27054    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27055        let kind = node.kind(db);
27056        if kind == SyntaxKind::TerminalWhile {
27057            Some(Self::from_syntax_node(db, node))
27058        } else {
27059            None
27060        }
27061    }
27062    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27063        self.node
27064    }
27065    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27066        TerminalWhilePtr(self.node.stable_ptr(db))
27067    }
27068}
27069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27070pub struct TokenFor<'db> {
27071    node: SyntaxNode<'db>,
27072}
27073impl<'db> Token<'db> for TokenFor<'db> {
27074    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27075        TokenForGreen(
27076            GreenNode { kind: SyntaxKind::TokenFor, details: GreenNodeDetails::Token(text) }
27077                .intern(db),
27078        )
27079    }
27080    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27081        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27082    }
27083}
27084#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27085pub struct TokenForPtr<'db>(pub SyntaxStablePtrId<'db>);
27086impl<'db> TypedStablePtr<'db> for TokenForPtr<'db> {
27087    type SyntaxNode = TokenFor<'db>;
27088    fn untyped(self) -> SyntaxStablePtrId<'db> {
27089        self.0
27090    }
27091    fn lookup(&self, db: &'db dyn Database) -> TokenFor<'db> {
27092        TokenFor::from_syntax_node(db, self.0.lookup(db))
27093    }
27094}
27095impl<'db> From<TokenForPtr<'db>> for SyntaxStablePtrId<'db> {
27096    fn from(ptr: TokenForPtr<'db>) -> Self {
27097        ptr.untyped()
27098    }
27099}
27100#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27101pub struct TokenForGreen<'db>(pub GreenId<'db>);
27102impl<'db> TokenForGreen<'db> {
27103    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27104        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27105    }
27106}
27107impl<'db> TypedSyntaxNode<'db> for TokenFor<'db> {
27108    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27109    type StablePtr = TokenForPtr<'db>;
27110    type Green = TokenForGreen<'db>;
27111    fn missing(db: &'db dyn Database) -> Self::Green {
27112        TokenForGreen(
27113            GreenNode {
27114                kind: SyntaxKind::TokenMissing,
27115                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27116            }
27117            .intern(db),
27118        )
27119    }
27120    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27121        match node.green_node(db).details {
27122            GreenNodeDetails::Token(_) => Self { node },
27123            GreenNodeDetails::Node { .. } => {
27124                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27125            }
27126        }
27127    }
27128    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27129        match node.green_node(db).details {
27130            GreenNodeDetails::Token(_) => Some(Self { node }),
27131            GreenNodeDetails::Node { .. } => None,
27132        }
27133    }
27134    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27135        self.node
27136    }
27137    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27138        TokenForPtr(self.node.stable_ptr(db))
27139    }
27140}
27141#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27142pub struct TerminalFor<'db> {
27143    node: SyntaxNode<'db>,
27144}
27145impl<'db> Terminal<'db> for TerminalFor<'db> {
27146    const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27147    type TokenType = TokenFor<'db>;
27148    fn new_green(
27149        db: &'db dyn Database,
27150        leading_trivia: TriviaGreen<'db>,
27151        token: <<TerminalFor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27152        trailing_trivia: TriviaGreen<'db>,
27153    ) -> Self::Green {
27154        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27155        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27156        TerminalForGreen(
27157            GreenNode {
27158                kind: SyntaxKind::TerminalFor,
27159                details: GreenNodeDetails::Node { children: children.into(), width },
27160            }
27161            .intern(db),
27162        )
27163    }
27164    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27165        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27166            unreachable!("Expected a node, not a token");
27167        };
27168        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27169    }
27170}
27171impl<'db> TerminalFor<'db> {
27172    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27173        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27174    }
27175    pub fn token(&self, db: &'db dyn Database) -> TokenFor<'db> {
27176        TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27177    }
27178    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27179        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27180    }
27181}
27182#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27183pub struct TerminalForPtr<'db>(pub SyntaxStablePtrId<'db>);
27184impl<'db> TerminalForPtr<'db> {}
27185impl<'db> TypedStablePtr<'db> for TerminalForPtr<'db> {
27186    type SyntaxNode = TerminalFor<'db>;
27187    fn untyped(self) -> SyntaxStablePtrId<'db> {
27188        self.0
27189    }
27190    fn lookup(&self, db: &'db dyn Database) -> TerminalFor<'db> {
27191        TerminalFor::from_syntax_node(db, self.0.lookup(db))
27192    }
27193}
27194impl<'db> From<TerminalForPtr<'db>> for SyntaxStablePtrId<'db> {
27195    fn from(ptr: TerminalForPtr<'db>) -> Self {
27196        ptr.untyped()
27197    }
27198}
27199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27200pub struct TerminalForGreen<'db>(pub GreenId<'db>);
27201impl<'db> TypedSyntaxNode<'db> for TerminalFor<'db> {
27202    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27203    type StablePtr = TerminalForPtr<'db>;
27204    type Green = TerminalForGreen<'db>;
27205    fn missing(db: &'db dyn Database) -> Self::Green {
27206        TerminalForGreen(
27207            GreenNode {
27208                kind: SyntaxKind::TerminalFor,
27209                details: GreenNodeDetails::Node {
27210                    children: [
27211                        Trivia::missing(db).0,
27212                        TokenFor::missing(db).0,
27213                        Trivia::missing(db).0,
27214                    ]
27215                    .into(),
27216                    width: TextWidth::default(),
27217                },
27218            }
27219            .intern(db),
27220        )
27221    }
27222    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27223        let kind = node.kind(db);
27224        assert_eq!(
27225            kind,
27226            SyntaxKind::TerminalFor,
27227            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27228            kind,
27229            SyntaxKind::TerminalFor
27230        );
27231        Self { node }
27232    }
27233    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27234        let kind = node.kind(db);
27235        if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27236    }
27237    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27238        self.node
27239    }
27240    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27241        TerminalForPtr(self.node.stable_ptr(db))
27242    }
27243}
27244#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27245pub struct TokenLoop<'db> {
27246    node: SyntaxNode<'db>,
27247}
27248impl<'db> Token<'db> for TokenLoop<'db> {
27249    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27250        TokenLoopGreen(
27251            GreenNode { kind: SyntaxKind::TokenLoop, details: GreenNodeDetails::Token(text) }
27252                .intern(db),
27253        )
27254    }
27255    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27256        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27257    }
27258}
27259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27260pub struct TokenLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27261impl<'db> TypedStablePtr<'db> for TokenLoopPtr<'db> {
27262    type SyntaxNode = TokenLoop<'db>;
27263    fn untyped(self) -> SyntaxStablePtrId<'db> {
27264        self.0
27265    }
27266    fn lookup(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27267        TokenLoop::from_syntax_node(db, self.0.lookup(db))
27268    }
27269}
27270impl<'db> From<TokenLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27271    fn from(ptr: TokenLoopPtr<'db>) -> Self {
27272        ptr.untyped()
27273    }
27274}
27275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27276pub struct TokenLoopGreen<'db>(pub GreenId<'db>);
27277impl<'db> TokenLoopGreen<'db> {
27278    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27279        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27280    }
27281}
27282impl<'db> TypedSyntaxNode<'db> for TokenLoop<'db> {
27283    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27284    type StablePtr = TokenLoopPtr<'db>;
27285    type Green = TokenLoopGreen<'db>;
27286    fn missing(db: &'db dyn Database) -> Self::Green {
27287        TokenLoopGreen(
27288            GreenNode {
27289                kind: SyntaxKind::TokenMissing,
27290                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27291            }
27292            .intern(db),
27293        )
27294    }
27295    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27296        match node.green_node(db).details {
27297            GreenNodeDetails::Token(_) => Self { node },
27298            GreenNodeDetails::Node { .. } => {
27299                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27300            }
27301        }
27302    }
27303    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27304        match node.green_node(db).details {
27305            GreenNodeDetails::Token(_) => Some(Self { node }),
27306            GreenNodeDetails::Node { .. } => None,
27307        }
27308    }
27309    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27310        self.node
27311    }
27312    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27313        TokenLoopPtr(self.node.stable_ptr(db))
27314    }
27315}
27316#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27317pub struct TerminalLoop<'db> {
27318    node: SyntaxNode<'db>,
27319}
27320impl<'db> Terminal<'db> for TerminalLoop<'db> {
27321    const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27322    type TokenType = TokenLoop<'db>;
27323    fn new_green(
27324        db: &'db dyn Database,
27325        leading_trivia: TriviaGreen<'db>,
27326        token: <<TerminalLoop<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27327        trailing_trivia: TriviaGreen<'db>,
27328    ) -> Self::Green {
27329        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27330        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27331        TerminalLoopGreen(
27332            GreenNode {
27333                kind: SyntaxKind::TerminalLoop,
27334                details: GreenNodeDetails::Node { children: children.into(), width },
27335            }
27336            .intern(db),
27337        )
27338    }
27339    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27340        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27341            unreachable!("Expected a node, not a token");
27342        };
27343        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27344    }
27345}
27346impl<'db> TerminalLoop<'db> {
27347    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27348        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27349    }
27350    pub fn token(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27351        TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27352    }
27353    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27354        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27355    }
27356}
27357#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27358pub struct TerminalLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27359impl<'db> TerminalLoopPtr<'db> {}
27360impl<'db> TypedStablePtr<'db> for TerminalLoopPtr<'db> {
27361    type SyntaxNode = TerminalLoop<'db>;
27362    fn untyped(self) -> SyntaxStablePtrId<'db> {
27363        self.0
27364    }
27365    fn lookup(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
27366        TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27367    }
27368}
27369impl<'db> From<TerminalLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27370    fn from(ptr: TerminalLoopPtr<'db>) -> Self {
27371        ptr.untyped()
27372    }
27373}
27374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27375pub struct TerminalLoopGreen<'db>(pub GreenId<'db>);
27376impl<'db> TypedSyntaxNode<'db> for TerminalLoop<'db> {
27377    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27378    type StablePtr = TerminalLoopPtr<'db>;
27379    type Green = TerminalLoopGreen<'db>;
27380    fn missing(db: &'db dyn Database) -> Self::Green {
27381        TerminalLoopGreen(
27382            GreenNode {
27383                kind: SyntaxKind::TerminalLoop,
27384                details: GreenNodeDetails::Node {
27385                    children: [
27386                        Trivia::missing(db).0,
27387                        TokenLoop::missing(db).0,
27388                        Trivia::missing(db).0,
27389                    ]
27390                    .into(),
27391                    width: TextWidth::default(),
27392                },
27393            }
27394            .intern(db),
27395        )
27396    }
27397    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27398        let kind = node.kind(db);
27399        assert_eq!(
27400            kind,
27401            SyntaxKind::TerminalLoop,
27402            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27403            kind,
27404            SyntaxKind::TerminalLoop
27405        );
27406        Self { node }
27407    }
27408    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27409        let kind = node.kind(db);
27410        if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27411    }
27412    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27413        self.node
27414    }
27415    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27416        TerminalLoopPtr(self.node.stable_ptr(db))
27417    }
27418}
27419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27420pub struct TokenImpl<'db> {
27421    node: SyntaxNode<'db>,
27422}
27423impl<'db> Token<'db> for TokenImpl<'db> {
27424    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27425        TokenImplGreen(
27426            GreenNode { kind: SyntaxKind::TokenImpl, details: GreenNodeDetails::Token(text) }
27427                .intern(db),
27428        )
27429    }
27430    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27431        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27432    }
27433}
27434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27435pub struct TokenImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27436impl<'db> TypedStablePtr<'db> for TokenImplPtr<'db> {
27437    type SyntaxNode = TokenImpl<'db>;
27438    fn untyped(self) -> SyntaxStablePtrId<'db> {
27439        self.0
27440    }
27441    fn lookup(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27442        TokenImpl::from_syntax_node(db, self.0.lookup(db))
27443    }
27444}
27445impl<'db> From<TokenImplPtr<'db>> for SyntaxStablePtrId<'db> {
27446    fn from(ptr: TokenImplPtr<'db>) -> Self {
27447        ptr.untyped()
27448    }
27449}
27450#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27451pub struct TokenImplGreen<'db>(pub GreenId<'db>);
27452impl<'db> TokenImplGreen<'db> {
27453    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27454        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27455    }
27456}
27457impl<'db> TypedSyntaxNode<'db> for TokenImpl<'db> {
27458    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
27459    type StablePtr = TokenImplPtr<'db>;
27460    type Green = TokenImplGreen<'db>;
27461    fn missing(db: &'db dyn Database) -> Self::Green {
27462        TokenImplGreen(
27463            GreenNode {
27464                kind: SyntaxKind::TokenMissing,
27465                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27466            }
27467            .intern(db),
27468        )
27469    }
27470    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27471        match node.green_node(db).details {
27472            GreenNodeDetails::Token(_) => Self { node },
27473            GreenNodeDetails::Node { .. } => {
27474                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
27475            }
27476        }
27477    }
27478    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27479        match node.green_node(db).details {
27480            GreenNodeDetails::Token(_) => Some(Self { node }),
27481            GreenNodeDetails::Node { .. } => None,
27482        }
27483    }
27484    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27485        self.node
27486    }
27487    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27488        TokenImplPtr(self.node.stable_ptr(db))
27489    }
27490}
27491#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27492pub struct TerminalImpl<'db> {
27493    node: SyntaxNode<'db>,
27494}
27495impl<'db> Terminal<'db> for TerminalImpl<'db> {
27496    const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
27497    type TokenType = TokenImpl<'db>;
27498    fn new_green(
27499        db: &'db dyn Database,
27500        leading_trivia: TriviaGreen<'db>,
27501        token: <<TerminalImpl<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27502        trailing_trivia: TriviaGreen<'db>,
27503    ) -> Self::Green {
27504        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27505        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27506        TerminalImplGreen(
27507            GreenNode {
27508                kind: SyntaxKind::TerminalImpl,
27509                details: GreenNodeDetails::Node { children: children.into(), width },
27510            }
27511            .intern(db),
27512        )
27513    }
27514    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27515        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27516            unreachable!("Expected a node, not a token");
27517        };
27518        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27519    }
27520}
27521impl<'db> TerminalImpl<'db> {
27522    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27523        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27524    }
27525    pub fn token(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27526        TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
27527    }
27528    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27529        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27530    }
27531}
27532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27533pub struct TerminalImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27534impl<'db> TerminalImplPtr<'db> {}
27535impl<'db> TypedStablePtr<'db> for TerminalImplPtr<'db> {
27536    type SyntaxNode = TerminalImpl<'db>;
27537    fn untyped(self) -> SyntaxStablePtrId<'db> {
27538        self.0
27539    }
27540    fn lookup(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
27541        TerminalImpl::from_syntax_node(db, self.0.lookup(db))
27542    }
27543}
27544impl<'db> From<TerminalImplPtr<'db>> for SyntaxStablePtrId<'db> {
27545    fn from(ptr: TerminalImplPtr<'db>) -> Self {
27546        ptr.untyped()
27547    }
27548}
27549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27550pub struct TerminalImplGreen<'db>(pub GreenId<'db>);
27551impl<'db> TypedSyntaxNode<'db> for TerminalImpl<'db> {
27552    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
27553    type StablePtr = TerminalImplPtr<'db>;
27554    type Green = TerminalImplGreen<'db>;
27555    fn missing(db: &'db dyn Database) -> Self::Green {
27556        TerminalImplGreen(
27557            GreenNode {
27558                kind: SyntaxKind::TerminalImpl,
27559                details: GreenNodeDetails::Node {
27560                    children: [
27561                        Trivia::missing(db).0,
27562                        TokenImpl::missing(db).0,
27563                        Trivia::missing(db).0,
27564                    ]
27565                    .into(),
27566                    width: TextWidth::default(),
27567                },
27568            }
27569            .intern(db),
27570        )
27571    }
27572    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27573        let kind = node.kind(db);
27574        assert_eq!(
27575            kind,
27576            SyntaxKind::TerminalImpl,
27577            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27578            kind,
27579            SyntaxKind::TerminalImpl
27580        );
27581        Self { node }
27582    }
27583    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27584        let kind = node.kind(db);
27585        if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
27586    }
27587    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27588        self.node
27589    }
27590    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27591        TerminalImplPtr(self.node.stable_ptr(db))
27592    }
27593}
27594#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27595pub struct TokenImplicits<'db> {
27596    node: SyntaxNode<'db>,
27597}
27598impl<'db> Token<'db> for TokenImplicits<'db> {
27599    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27600        TokenImplicitsGreen(
27601            GreenNode { kind: SyntaxKind::TokenImplicits, details: GreenNodeDetails::Token(text) }
27602                .intern(db),
27603        )
27604    }
27605    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27606        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27607    }
27608}
27609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27610pub struct TokenImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27611impl<'db> TypedStablePtr<'db> for TokenImplicitsPtr<'db> {
27612    type SyntaxNode = TokenImplicits<'db>;
27613    fn untyped(self) -> SyntaxStablePtrId<'db> {
27614        self.0
27615    }
27616    fn lookup(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27617        TokenImplicits::from_syntax_node(db, self.0.lookup(db))
27618    }
27619}
27620impl<'db> From<TokenImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27621    fn from(ptr: TokenImplicitsPtr<'db>) -> Self {
27622        ptr.untyped()
27623    }
27624}
27625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27626pub struct TokenImplicitsGreen<'db>(pub GreenId<'db>);
27627impl<'db> TokenImplicitsGreen<'db> {
27628    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27629        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27630    }
27631}
27632impl<'db> TypedSyntaxNode<'db> for TokenImplicits<'db> {
27633    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
27634    type StablePtr = TokenImplicitsPtr<'db>;
27635    type Green = TokenImplicitsGreen<'db>;
27636    fn missing(db: &'db dyn Database) -> Self::Green {
27637        TokenImplicitsGreen(
27638            GreenNode {
27639                kind: SyntaxKind::TokenMissing,
27640                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27641            }
27642            .intern(db),
27643        )
27644    }
27645    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27646        match node.green_node(db).details {
27647            GreenNodeDetails::Token(_) => Self { node },
27648            GreenNodeDetails::Node { .. } => {
27649                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
27650            }
27651        }
27652    }
27653    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27654        match node.green_node(db).details {
27655            GreenNodeDetails::Token(_) => Some(Self { node }),
27656            GreenNodeDetails::Node { .. } => None,
27657        }
27658    }
27659    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27660        self.node
27661    }
27662    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27663        TokenImplicitsPtr(self.node.stable_ptr(db))
27664    }
27665}
27666#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27667pub struct TerminalImplicits<'db> {
27668    node: SyntaxNode<'db>,
27669}
27670impl<'db> Terminal<'db> for TerminalImplicits<'db> {
27671    const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
27672    type TokenType = TokenImplicits<'db>;
27673    fn new_green(
27674        db: &'db dyn Database,
27675        leading_trivia: TriviaGreen<'db>,
27676        token: <<TerminalImplicits<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27677        trailing_trivia: TriviaGreen<'db>,
27678    ) -> Self::Green {
27679        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27680        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27681        TerminalImplicitsGreen(
27682            GreenNode {
27683                kind: SyntaxKind::TerminalImplicits,
27684                details: GreenNodeDetails::Node { children: children.into(), width },
27685            }
27686            .intern(db),
27687        )
27688    }
27689    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27690        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27691            unreachable!("Expected a node, not a token");
27692        };
27693        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27694    }
27695}
27696impl<'db> TerminalImplicits<'db> {
27697    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27698        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27699    }
27700    pub fn token(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27701        TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
27702    }
27703    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27704        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27705    }
27706}
27707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27708pub struct TerminalImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27709impl<'db> TerminalImplicitsPtr<'db> {}
27710impl<'db> TypedStablePtr<'db> for TerminalImplicitsPtr<'db> {
27711    type SyntaxNode = TerminalImplicits<'db>;
27712    fn untyped(self) -> SyntaxStablePtrId<'db> {
27713        self.0
27714    }
27715    fn lookup(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
27716        TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
27717    }
27718}
27719impl<'db> From<TerminalImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27720    fn from(ptr: TerminalImplicitsPtr<'db>) -> Self {
27721        ptr.untyped()
27722    }
27723}
27724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27725pub struct TerminalImplicitsGreen<'db>(pub GreenId<'db>);
27726impl<'db> TypedSyntaxNode<'db> for TerminalImplicits<'db> {
27727    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
27728    type StablePtr = TerminalImplicitsPtr<'db>;
27729    type Green = TerminalImplicitsGreen<'db>;
27730    fn missing(db: &'db dyn Database) -> Self::Green {
27731        TerminalImplicitsGreen(
27732            GreenNode {
27733                kind: SyntaxKind::TerminalImplicits,
27734                details: GreenNodeDetails::Node {
27735                    children: [
27736                        Trivia::missing(db).0,
27737                        TokenImplicits::missing(db).0,
27738                        Trivia::missing(db).0,
27739                    ]
27740                    .into(),
27741                    width: TextWidth::default(),
27742                },
27743            }
27744            .intern(db),
27745        )
27746    }
27747    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27748        let kind = node.kind(db);
27749        assert_eq!(
27750            kind,
27751            SyntaxKind::TerminalImplicits,
27752            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27753            kind,
27754            SyntaxKind::TerminalImplicits
27755        );
27756        Self { node }
27757    }
27758    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27759        let kind = node.kind(db);
27760        if kind == SyntaxKind::TerminalImplicits {
27761            Some(Self::from_syntax_node(db, node))
27762        } else {
27763            None
27764        }
27765    }
27766    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27767        self.node
27768    }
27769    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27770        TerminalImplicitsPtr(self.node.stable_ptr(db))
27771    }
27772}
27773#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27774pub struct TokenLet<'db> {
27775    node: SyntaxNode<'db>,
27776}
27777impl<'db> Token<'db> for TokenLet<'db> {
27778    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27779        TokenLetGreen(
27780            GreenNode { kind: SyntaxKind::TokenLet, details: GreenNodeDetails::Token(text) }
27781                .intern(db),
27782        )
27783    }
27784    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27785        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27786    }
27787}
27788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27789pub struct TokenLetPtr<'db>(pub SyntaxStablePtrId<'db>);
27790impl<'db> TypedStablePtr<'db> for TokenLetPtr<'db> {
27791    type SyntaxNode = TokenLet<'db>;
27792    fn untyped(self) -> SyntaxStablePtrId<'db> {
27793        self.0
27794    }
27795    fn lookup(&self, db: &'db dyn Database) -> TokenLet<'db> {
27796        TokenLet::from_syntax_node(db, self.0.lookup(db))
27797    }
27798}
27799impl<'db> From<TokenLetPtr<'db>> for SyntaxStablePtrId<'db> {
27800    fn from(ptr: TokenLetPtr<'db>) -> Self {
27801        ptr.untyped()
27802    }
27803}
27804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27805pub struct TokenLetGreen<'db>(pub GreenId<'db>);
27806impl<'db> TokenLetGreen<'db> {
27807    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27808        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27809    }
27810}
27811impl<'db> TypedSyntaxNode<'db> for TokenLet<'db> {
27812    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
27813    type StablePtr = TokenLetPtr<'db>;
27814    type Green = TokenLetGreen<'db>;
27815    fn missing(db: &'db dyn Database) -> Self::Green {
27816        TokenLetGreen(
27817            GreenNode {
27818                kind: SyntaxKind::TokenMissing,
27819                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27820            }
27821            .intern(db),
27822        )
27823    }
27824    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27825        match node.green_node(db).details {
27826            GreenNodeDetails::Token(_) => Self { node },
27827            GreenNodeDetails::Node { .. } => {
27828                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
27829            }
27830        }
27831    }
27832    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27833        match node.green_node(db).details {
27834            GreenNodeDetails::Token(_) => Some(Self { node }),
27835            GreenNodeDetails::Node { .. } => None,
27836        }
27837    }
27838    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27839        self.node
27840    }
27841    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27842        TokenLetPtr(self.node.stable_ptr(db))
27843    }
27844}
27845#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27846pub struct TerminalLet<'db> {
27847    node: SyntaxNode<'db>,
27848}
27849impl<'db> Terminal<'db> for TerminalLet<'db> {
27850    const KIND: SyntaxKind = SyntaxKind::TerminalLet;
27851    type TokenType = TokenLet<'db>;
27852    fn new_green(
27853        db: &'db dyn Database,
27854        leading_trivia: TriviaGreen<'db>,
27855        token: <<TerminalLet<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27856        trailing_trivia: TriviaGreen<'db>,
27857    ) -> Self::Green {
27858        let children = [leading_trivia.0, token.0, trailing_trivia.0];
27859        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27860        TerminalLetGreen(
27861            GreenNode {
27862                kind: SyntaxKind::TerminalLet,
27863                details: GreenNodeDetails::Node { children: children.into(), width },
27864            }
27865            .intern(db),
27866        )
27867    }
27868    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27869        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27870            unreachable!("Expected a node, not a token");
27871        };
27872        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27873    }
27874}
27875impl<'db> TerminalLet<'db> {
27876    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27877        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27878    }
27879    pub fn token(&self, db: &'db dyn Database) -> TokenLet<'db> {
27880        TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
27881    }
27882    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27883        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27884    }
27885}
27886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27887pub struct TerminalLetPtr<'db>(pub SyntaxStablePtrId<'db>);
27888impl<'db> TerminalLetPtr<'db> {}
27889impl<'db> TypedStablePtr<'db> for TerminalLetPtr<'db> {
27890    type SyntaxNode = TerminalLet<'db>;
27891    fn untyped(self) -> SyntaxStablePtrId<'db> {
27892        self.0
27893    }
27894    fn lookup(&self, db: &'db dyn Database) -> TerminalLet<'db> {
27895        TerminalLet::from_syntax_node(db, self.0.lookup(db))
27896    }
27897}
27898impl<'db> From<TerminalLetPtr<'db>> for SyntaxStablePtrId<'db> {
27899    fn from(ptr: TerminalLetPtr<'db>) -> Self {
27900        ptr.untyped()
27901    }
27902}
27903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27904pub struct TerminalLetGreen<'db>(pub GreenId<'db>);
27905impl<'db> TypedSyntaxNode<'db> for TerminalLet<'db> {
27906    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
27907    type StablePtr = TerminalLetPtr<'db>;
27908    type Green = TerminalLetGreen<'db>;
27909    fn missing(db: &'db dyn Database) -> Self::Green {
27910        TerminalLetGreen(
27911            GreenNode {
27912                kind: SyntaxKind::TerminalLet,
27913                details: GreenNodeDetails::Node {
27914                    children: [
27915                        Trivia::missing(db).0,
27916                        TokenLet::missing(db).0,
27917                        Trivia::missing(db).0,
27918                    ]
27919                    .into(),
27920                    width: TextWidth::default(),
27921                },
27922            }
27923            .intern(db),
27924        )
27925    }
27926    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27927        let kind = node.kind(db);
27928        assert_eq!(
27929            kind,
27930            SyntaxKind::TerminalLet,
27931            "Unexpected SyntaxKind {:?}. Expected {:?}.",
27932            kind,
27933            SyntaxKind::TerminalLet
27934        );
27935        Self { node }
27936    }
27937    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27938        let kind = node.kind(db);
27939        if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
27940    }
27941    fn as_syntax_node(&self) -> SyntaxNode<'db> {
27942        self.node
27943    }
27944    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27945        TerminalLetPtr(self.node.stable_ptr(db))
27946    }
27947}
27948#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27949pub struct TokenMacro<'db> {
27950    node: SyntaxNode<'db>,
27951}
27952impl<'db> Token<'db> for TokenMacro<'db> {
27953    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27954        TokenMacroGreen(
27955            GreenNode { kind: SyntaxKind::TokenMacro, details: GreenNodeDetails::Token(text) }
27956                .intern(db),
27957        )
27958    }
27959    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27960        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27961    }
27962}
27963#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
27964pub struct TokenMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
27965impl<'db> TypedStablePtr<'db> for TokenMacroPtr<'db> {
27966    type SyntaxNode = TokenMacro<'db>;
27967    fn untyped(self) -> SyntaxStablePtrId<'db> {
27968        self.0
27969    }
27970    fn lookup(&self, db: &'db dyn Database) -> TokenMacro<'db> {
27971        TokenMacro::from_syntax_node(db, self.0.lookup(db))
27972    }
27973}
27974impl<'db> From<TokenMacroPtr<'db>> for SyntaxStablePtrId<'db> {
27975    fn from(ptr: TokenMacroPtr<'db>) -> Self {
27976        ptr.untyped()
27977    }
27978}
27979#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27980pub struct TokenMacroGreen<'db>(pub GreenId<'db>);
27981impl<'db> TokenMacroGreen<'db> {
27982    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27983        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27984    }
27985}
27986impl<'db> TypedSyntaxNode<'db> for TokenMacro<'db> {
27987    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
27988    type StablePtr = TokenMacroPtr<'db>;
27989    type Green = TokenMacroGreen<'db>;
27990    fn missing(db: &'db dyn Database) -> Self::Green {
27991        TokenMacroGreen(
27992            GreenNode {
27993                kind: SyntaxKind::TokenMissing,
27994                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27995            }
27996            .intern(db),
27997        )
27998    }
27999    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28000        match node.green_node(db).details {
28001            GreenNodeDetails::Token(_) => Self { node },
28002            GreenNodeDetails::Node { .. } => {
28003                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28004            }
28005        }
28006    }
28007    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28008        match node.green_node(db).details {
28009            GreenNodeDetails::Token(_) => Some(Self { node }),
28010            GreenNodeDetails::Node { .. } => None,
28011        }
28012    }
28013    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28014        self.node
28015    }
28016    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28017        TokenMacroPtr(self.node.stable_ptr(db))
28018    }
28019}
28020#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28021pub struct TerminalMacro<'db> {
28022    node: SyntaxNode<'db>,
28023}
28024impl<'db> Terminal<'db> for TerminalMacro<'db> {
28025    const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28026    type TokenType = TokenMacro<'db>;
28027    fn new_green(
28028        db: &'db dyn Database,
28029        leading_trivia: TriviaGreen<'db>,
28030        token: <<TerminalMacro<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28031        trailing_trivia: TriviaGreen<'db>,
28032    ) -> Self::Green {
28033        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28034        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28035        TerminalMacroGreen(
28036            GreenNode {
28037                kind: SyntaxKind::TerminalMacro,
28038                details: GreenNodeDetails::Node { children: children.into(), width },
28039            }
28040            .intern(db),
28041        )
28042    }
28043    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28044        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28045            unreachable!("Expected a node, not a token");
28046        };
28047        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28048    }
28049}
28050impl<'db> TerminalMacro<'db> {
28051    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28052        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28053    }
28054    pub fn token(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28055        TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28056    }
28057    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28058        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28059    }
28060}
28061#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28062pub struct TerminalMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28063impl<'db> TerminalMacroPtr<'db> {}
28064impl<'db> TypedStablePtr<'db> for TerminalMacroPtr<'db> {
28065    type SyntaxNode = TerminalMacro<'db>;
28066    fn untyped(self) -> SyntaxStablePtrId<'db> {
28067        self.0
28068    }
28069    fn lookup(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
28070        TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28071    }
28072}
28073impl<'db> From<TerminalMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28074    fn from(ptr: TerminalMacroPtr<'db>) -> Self {
28075        ptr.untyped()
28076    }
28077}
28078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28079pub struct TerminalMacroGreen<'db>(pub GreenId<'db>);
28080impl<'db> TypedSyntaxNode<'db> for TerminalMacro<'db> {
28081    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28082    type StablePtr = TerminalMacroPtr<'db>;
28083    type Green = TerminalMacroGreen<'db>;
28084    fn missing(db: &'db dyn Database) -> Self::Green {
28085        TerminalMacroGreen(
28086            GreenNode {
28087                kind: SyntaxKind::TerminalMacro,
28088                details: GreenNodeDetails::Node {
28089                    children: [
28090                        Trivia::missing(db).0,
28091                        TokenMacro::missing(db).0,
28092                        Trivia::missing(db).0,
28093                    ]
28094                    .into(),
28095                    width: TextWidth::default(),
28096                },
28097            }
28098            .intern(db),
28099        )
28100    }
28101    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28102        let kind = node.kind(db);
28103        assert_eq!(
28104            kind,
28105            SyntaxKind::TerminalMacro,
28106            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28107            kind,
28108            SyntaxKind::TerminalMacro
28109        );
28110        Self { node }
28111    }
28112    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28113        let kind = node.kind(db);
28114        if kind == SyntaxKind::TerminalMacro {
28115            Some(Self::from_syntax_node(db, node))
28116        } else {
28117            None
28118        }
28119    }
28120    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28121        self.node
28122    }
28123    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28124        TerminalMacroPtr(self.node.stable_ptr(db))
28125    }
28126}
28127#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28128pub struct TokenMatch<'db> {
28129    node: SyntaxNode<'db>,
28130}
28131impl<'db> Token<'db> for TokenMatch<'db> {
28132    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28133        TokenMatchGreen(
28134            GreenNode { kind: SyntaxKind::TokenMatch, details: GreenNodeDetails::Token(text) }
28135                .intern(db),
28136        )
28137    }
28138    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28139        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28140    }
28141}
28142#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28143pub struct TokenMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28144impl<'db> TypedStablePtr<'db> for TokenMatchPtr<'db> {
28145    type SyntaxNode = TokenMatch<'db>;
28146    fn untyped(self) -> SyntaxStablePtrId<'db> {
28147        self.0
28148    }
28149    fn lookup(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28150        TokenMatch::from_syntax_node(db, self.0.lookup(db))
28151    }
28152}
28153impl<'db> From<TokenMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28154    fn from(ptr: TokenMatchPtr<'db>) -> Self {
28155        ptr.untyped()
28156    }
28157}
28158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28159pub struct TokenMatchGreen<'db>(pub GreenId<'db>);
28160impl<'db> TokenMatchGreen<'db> {
28161    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28162        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28163    }
28164}
28165impl<'db> TypedSyntaxNode<'db> for TokenMatch<'db> {
28166    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28167    type StablePtr = TokenMatchPtr<'db>;
28168    type Green = TokenMatchGreen<'db>;
28169    fn missing(db: &'db dyn Database) -> Self::Green {
28170        TokenMatchGreen(
28171            GreenNode {
28172                kind: SyntaxKind::TokenMissing,
28173                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28174            }
28175            .intern(db),
28176        )
28177    }
28178    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28179        match node.green_node(db).details {
28180            GreenNodeDetails::Token(_) => Self { node },
28181            GreenNodeDetails::Node { .. } => {
28182                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28183            }
28184        }
28185    }
28186    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28187        match node.green_node(db).details {
28188            GreenNodeDetails::Token(_) => Some(Self { node }),
28189            GreenNodeDetails::Node { .. } => None,
28190        }
28191    }
28192    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28193        self.node
28194    }
28195    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28196        TokenMatchPtr(self.node.stable_ptr(db))
28197    }
28198}
28199#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28200pub struct TerminalMatch<'db> {
28201    node: SyntaxNode<'db>,
28202}
28203impl<'db> Terminal<'db> for TerminalMatch<'db> {
28204    const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28205    type TokenType = TokenMatch<'db>;
28206    fn new_green(
28207        db: &'db dyn Database,
28208        leading_trivia: TriviaGreen<'db>,
28209        token: <<TerminalMatch<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28210        trailing_trivia: TriviaGreen<'db>,
28211    ) -> Self::Green {
28212        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28213        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28214        TerminalMatchGreen(
28215            GreenNode {
28216                kind: SyntaxKind::TerminalMatch,
28217                details: GreenNodeDetails::Node { children: children.into(), width },
28218            }
28219            .intern(db),
28220        )
28221    }
28222    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28223        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28224            unreachable!("Expected a node, not a token");
28225        };
28226        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28227    }
28228}
28229impl<'db> TerminalMatch<'db> {
28230    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28231        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28232    }
28233    pub fn token(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28234        TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28235    }
28236    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28237        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28238    }
28239}
28240#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28241pub struct TerminalMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28242impl<'db> TerminalMatchPtr<'db> {}
28243impl<'db> TypedStablePtr<'db> for TerminalMatchPtr<'db> {
28244    type SyntaxNode = TerminalMatch<'db>;
28245    fn untyped(self) -> SyntaxStablePtrId<'db> {
28246        self.0
28247    }
28248    fn lookup(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
28249        TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28250    }
28251}
28252impl<'db> From<TerminalMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28253    fn from(ptr: TerminalMatchPtr<'db>) -> Self {
28254        ptr.untyped()
28255    }
28256}
28257#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28258pub struct TerminalMatchGreen<'db>(pub GreenId<'db>);
28259impl<'db> TypedSyntaxNode<'db> for TerminalMatch<'db> {
28260    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28261    type StablePtr = TerminalMatchPtr<'db>;
28262    type Green = TerminalMatchGreen<'db>;
28263    fn missing(db: &'db dyn Database) -> Self::Green {
28264        TerminalMatchGreen(
28265            GreenNode {
28266                kind: SyntaxKind::TerminalMatch,
28267                details: GreenNodeDetails::Node {
28268                    children: [
28269                        Trivia::missing(db).0,
28270                        TokenMatch::missing(db).0,
28271                        Trivia::missing(db).0,
28272                    ]
28273                    .into(),
28274                    width: TextWidth::default(),
28275                },
28276            }
28277            .intern(db),
28278        )
28279    }
28280    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28281        let kind = node.kind(db);
28282        assert_eq!(
28283            kind,
28284            SyntaxKind::TerminalMatch,
28285            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28286            kind,
28287            SyntaxKind::TerminalMatch
28288        );
28289        Self { node }
28290    }
28291    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28292        let kind = node.kind(db);
28293        if kind == SyntaxKind::TerminalMatch {
28294            Some(Self::from_syntax_node(db, node))
28295        } else {
28296            None
28297        }
28298    }
28299    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28300        self.node
28301    }
28302    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28303        TerminalMatchPtr(self.node.stable_ptr(db))
28304    }
28305}
28306#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28307pub struct TokenModule<'db> {
28308    node: SyntaxNode<'db>,
28309}
28310impl<'db> Token<'db> for TokenModule<'db> {
28311    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28312        TokenModuleGreen(
28313            GreenNode { kind: SyntaxKind::TokenModule, details: GreenNodeDetails::Token(text) }
28314                .intern(db),
28315        )
28316    }
28317    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28318        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28319    }
28320}
28321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28322pub struct TokenModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28323impl<'db> TypedStablePtr<'db> for TokenModulePtr<'db> {
28324    type SyntaxNode = TokenModule<'db>;
28325    fn untyped(self) -> SyntaxStablePtrId<'db> {
28326        self.0
28327    }
28328    fn lookup(&self, db: &'db dyn Database) -> TokenModule<'db> {
28329        TokenModule::from_syntax_node(db, self.0.lookup(db))
28330    }
28331}
28332impl<'db> From<TokenModulePtr<'db>> for SyntaxStablePtrId<'db> {
28333    fn from(ptr: TokenModulePtr<'db>) -> Self {
28334        ptr.untyped()
28335    }
28336}
28337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28338pub struct TokenModuleGreen<'db>(pub GreenId<'db>);
28339impl<'db> TokenModuleGreen<'db> {
28340    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28341        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28342    }
28343}
28344impl<'db> TypedSyntaxNode<'db> for TokenModule<'db> {
28345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28346    type StablePtr = TokenModulePtr<'db>;
28347    type Green = TokenModuleGreen<'db>;
28348    fn missing(db: &'db dyn Database) -> Self::Green {
28349        TokenModuleGreen(
28350            GreenNode {
28351                kind: SyntaxKind::TokenMissing,
28352                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28353            }
28354            .intern(db),
28355        )
28356    }
28357    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28358        match node.green_node(db).details {
28359            GreenNodeDetails::Token(_) => Self { node },
28360            GreenNodeDetails::Node { .. } => {
28361                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28362            }
28363        }
28364    }
28365    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28366        match node.green_node(db).details {
28367            GreenNodeDetails::Token(_) => Some(Self { node }),
28368            GreenNodeDetails::Node { .. } => None,
28369        }
28370    }
28371    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28372        self.node
28373    }
28374    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28375        TokenModulePtr(self.node.stable_ptr(db))
28376    }
28377}
28378#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28379pub struct TerminalModule<'db> {
28380    node: SyntaxNode<'db>,
28381}
28382impl<'db> Terminal<'db> for TerminalModule<'db> {
28383    const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28384    type TokenType = TokenModule<'db>;
28385    fn new_green(
28386        db: &'db dyn Database,
28387        leading_trivia: TriviaGreen<'db>,
28388        token: <<TerminalModule<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28389        trailing_trivia: TriviaGreen<'db>,
28390    ) -> Self::Green {
28391        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28392        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28393        TerminalModuleGreen(
28394            GreenNode {
28395                kind: SyntaxKind::TerminalModule,
28396                details: GreenNodeDetails::Node { children: children.into(), width },
28397            }
28398            .intern(db),
28399        )
28400    }
28401    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28402        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28403            unreachable!("Expected a node, not a token");
28404        };
28405        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28406    }
28407}
28408impl<'db> TerminalModule<'db> {
28409    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28410        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28411    }
28412    pub fn token(&self, db: &'db dyn Database) -> TokenModule<'db> {
28413        TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
28414    }
28415    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28416        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28417    }
28418}
28419#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28420pub struct TerminalModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28421impl<'db> TerminalModulePtr<'db> {}
28422impl<'db> TypedStablePtr<'db> for TerminalModulePtr<'db> {
28423    type SyntaxNode = TerminalModule<'db>;
28424    fn untyped(self) -> SyntaxStablePtrId<'db> {
28425        self.0
28426    }
28427    fn lookup(&self, db: &'db dyn Database) -> TerminalModule<'db> {
28428        TerminalModule::from_syntax_node(db, self.0.lookup(db))
28429    }
28430}
28431impl<'db> From<TerminalModulePtr<'db>> for SyntaxStablePtrId<'db> {
28432    fn from(ptr: TerminalModulePtr<'db>) -> Self {
28433        ptr.untyped()
28434    }
28435}
28436#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28437pub struct TerminalModuleGreen<'db>(pub GreenId<'db>);
28438impl<'db> TypedSyntaxNode<'db> for TerminalModule<'db> {
28439    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
28440    type StablePtr = TerminalModulePtr<'db>;
28441    type Green = TerminalModuleGreen<'db>;
28442    fn missing(db: &'db dyn Database) -> Self::Green {
28443        TerminalModuleGreen(
28444            GreenNode {
28445                kind: SyntaxKind::TerminalModule,
28446                details: GreenNodeDetails::Node {
28447                    children: [
28448                        Trivia::missing(db).0,
28449                        TokenModule::missing(db).0,
28450                        Trivia::missing(db).0,
28451                    ]
28452                    .into(),
28453                    width: TextWidth::default(),
28454                },
28455            }
28456            .intern(db),
28457        )
28458    }
28459    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28460        let kind = node.kind(db);
28461        assert_eq!(
28462            kind,
28463            SyntaxKind::TerminalModule,
28464            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28465            kind,
28466            SyntaxKind::TerminalModule
28467        );
28468        Self { node }
28469    }
28470    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28471        let kind = node.kind(db);
28472        if kind == SyntaxKind::TerminalModule {
28473            Some(Self::from_syntax_node(db, node))
28474        } else {
28475            None
28476        }
28477    }
28478    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28479        self.node
28480    }
28481    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28482        TerminalModulePtr(self.node.stable_ptr(db))
28483    }
28484}
28485#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28486pub struct TokenMut<'db> {
28487    node: SyntaxNode<'db>,
28488}
28489impl<'db> Token<'db> for TokenMut<'db> {
28490    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28491        TokenMutGreen(
28492            GreenNode { kind: SyntaxKind::TokenMut, details: GreenNodeDetails::Token(text) }
28493                .intern(db),
28494        )
28495    }
28496    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28497        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28498    }
28499}
28500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28501pub struct TokenMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28502impl<'db> TypedStablePtr<'db> for TokenMutPtr<'db> {
28503    type SyntaxNode = TokenMut<'db>;
28504    fn untyped(self) -> SyntaxStablePtrId<'db> {
28505        self.0
28506    }
28507    fn lookup(&self, db: &'db dyn Database) -> TokenMut<'db> {
28508        TokenMut::from_syntax_node(db, self.0.lookup(db))
28509    }
28510}
28511impl<'db> From<TokenMutPtr<'db>> for SyntaxStablePtrId<'db> {
28512    fn from(ptr: TokenMutPtr<'db>) -> Self {
28513        ptr.untyped()
28514    }
28515}
28516#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28517pub struct TokenMutGreen<'db>(pub GreenId<'db>);
28518impl<'db> TokenMutGreen<'db> {
28519    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28520        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28521    }
28522}
28523impl<'db> TypedSyntaxNode<'db> for TokenMut<'db> {
28524    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
28525    type StablePtr = TokenMutPtr<'db>;
28526    type Green = TokenMutGreen<'db>;
28527    fn missing(db: &'db dyn Database) -> Self::Green {
28528        TokenMutGreen(
28529            GreenNode {
28530                kind: SyntaxKind::TokenMissing,
28531                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28532            }
28533            .intern(db),
28534        )
28535    }
28536    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28537        match node.green_node(db).details {
28538            GreenNodeDetails::Token(_) => Self { node },
28539            GreenNodeDetails::Node { .. } => {
28540                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
28541            }
28542        }
28543    }
28544    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28545        match node.green_node(db).details {
28546            GreenNodeDetails::Token(_) => Some(Self { node }),
28547            GreenNodeDetails::Node { .. } => None,
28548        }
28549    }
28550    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28551        self.node
28552    }
28553    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28554        TokenMutPtr(self.node.stable_ptr(db))
28555    }
28556}
28557#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28558pub struct TerminalMut<'db> {
28559    node: SyntaxNode<'db>,
28560}
28561impl<'db> Terminal<'db> for TerminalMut<'db> {
28562    const KIND: SyntaxKind = SyntaxKind::TerminalMut;
28563    type TokenType = TokenMut<'db>;
28564    fn new_green(
28565        db: &'db dyn Database,
28566        leading_trivia: TriviaGreen<'db>,
28567        token: <<TerminalMut<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28568        trailing_trivia: TriviaGreen<'db>,
28569    ) -> Self::Green {
28570        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28571        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28572        TerminalMutGreen(
28573            GreenNode {
28574                kind: SyntaxKind::TerminalMut,
28575                details: GreenNodeDetails::Node { children: children.into(), width },
28576            }
28577            .intern(db),
28578        )
28579    }
28580    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28581        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28582            unreachable!("Expected a node, not a token");
28583        };
28584        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28585    }
28586}
28587impl<'db> TerminalMut<'db> {
28588    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28589        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28590    }
28591    pub fn token(&self, db: &'db dyn Database) -> TokenMut<'db> {
28592        TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
28593    }
28594    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28595        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28596    }
28597}
28598#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28599pub struct TerminalMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28600impl<'db> TerminalMutPtr<'db> {}
28601impl<'db> TypedStablePtr<'db> for TerminalMutPtr<'db> {
28602    type SyntaxNode = TerminalMut<'db>;
28603    fn untyped(self) -> SyntaxStablePtrId<'db> {
28604        self.0
28605    }
28606    fn lookup(&self, db: &'db dyn Database) -> TerminalMut<'db> {
28607        TerminalMut::from_syntax_node(db, self.0.lookup(db))
28608    }
28609}
28610impl<'db> From<TerminalMutPtr<'db>> for SyntaxStablePtrId<'db> {
28611    fn from(ptr: TerminalMutPtr<'db>) -> Self {
28612        ptr.untyped()
28613    }
28614}
28615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28616pub struct TerminalMutGreen<'db>(pub GreenId<'db>);
28617impl<'db> TypedSyntaxNode<'db> for TerminalMut<'db> {
28618    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
28619    type StablePtr = TerminalMutPtr<'db>;
28620    type Green = TerminalMutGreen<'db>;
28621    fn missing(db: &'db dyn Database) -> Self::Green {
28622        TerminalMutGreen(
28623            GreenNode {
28624                kind: SyntaxKind::TerminalMut,
28625                details: GreenNodeDetails::Node {
28626                    children: [
28627                        Trivia::missing(db).0,
28628                        TokenMut::missing(db).0,
28629                        Trivia::missing(db).0,
28630                    ]
28631                    .into(),
28632                    width: TextWidth::default(),
28633                },
28634            }
28635            .intern(db),
28636        )
28637    }
28638    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28639        let kind = node.kind(db);
28640        assert_eq!(
28641            kind,
28642            SyntaxKind::TerminalMut,
28643            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28644            kind,
28645            SyntaxKind::TerminalMut
28646        );
28647        Self { node }
28648    }
28649    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28650        let kind = node.kind(db);
28651        if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
28652    }
28653    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28654        self.node
28655    }
28656    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28657        TerminalMutPtr(self.node.stable_ptr(db))
28658    }
28659}
28660#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28661pub struct TokenNoPanic<'db> {
28662    node: SyntaxNode<'db>,
28663}
28664impl<'db> Token<'db> for TokenNoPanic<'db> {
28665    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28666        TokenNoPanicGreen(
28667            GreenNode { kind: SyntaxKind::TokenNoPanic, details: GreenNodeDetails::Token(text) }
28668                .intern(db),
28669        )
28670    }
28671    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28672        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28673    }
28674}
28675#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28676pub struct TokenNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
28677impl<'db> TypedStablePtr<'db> for TokenNoPanicPtr<'db> {
28678    type SyntaxNode = TokenNoPanic<'db>;
28679    fn untyped(self) -> SyntaxStablePtrId<'db> {
28680        self.0
28681    }
28682    fn lookup(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
28683        TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
28684    }
28685}
28686impl<'db> From<TokenNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
28687    fn from(ptr: TokenNoPanicPtr<'db>) -> Self {
28688        ptr.untyped()
28689    }
28690}
28691#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28692pub struct TokenNoPanicGreen<'db>(pub GreenId<'db>);
28693impl<'db> TokenNoPanicGreen<'db> {
28694    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28695        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28696    }
28697}
28698impl<'db> TypedSyntaxNode<'db> for TokenNoPanic<'db> {
28699    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
28700    type StablePtr = TokenNoPanicPtr<'db>;
28701    type Green = TokenNoPanicGreen<'db>;
28702    fn missing(db: &'db dyn Database) -> Self::Green {
28703        TokenNoPanicGreen(
28704            GreenNode {
28705                kind: SyntaxKind::TokenMissing,
28706                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28707            }
28708            .intern(db),
28709        )
28710    }
28711    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28712        match node.green_node(db).details {
28713            GreenNodeDetails::Token(_) => Self { node },
28714            GreenNodeDetails::Node { .. } => {
28715                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
28716            }
28717        }
28718    }
28719    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28720        match node.green_node(db).details {
28721            GreenNodeDetails::Token(_) => Some(Self { node }),
28722            GreenNodeDetails::Node { .. } => None,
28723        }
28724    }
28725    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28726        self.node
28727    }
28728    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28729        TokenNoPanicPtr(self.node.stable_ptr(db))
28730    }
28731}
28732#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28733pub struct TerminalNoPanic<'db> {
28734    node: SyntaxNode<'db>,
28735}
28736impl<'db> Terminal<'db> for TerminalNoPanic<'db> {
28737    const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
28738    type TokenType = TokenNoPanic<'db>;
28739    fn new_green(
28740        db: &'db dyn Database,
28741        leading_trivia: TriviaGreen<'db>,
28742        token: <<TerminalNoPanic<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28743        trailing_trivia: TriviaGreen<'db>,
28744    ) -> Self::Green {
28745        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28746        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28747        TerminalNoPanicGreen(
28748            GreenNode {
28749                kind: SyntaxKind::TerminalNoPanic,
28750                details: GreenNodeDetails::Node { children: children.into(), width },
28751            }
28752            .intern(db),
28753        )
28754    }
28755    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28756        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28757            unreachable!("Expected a node, not a token");
28758        };
28759        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28760    }
28761}
28762impl<'db> TerminalNoPanic<'db> {
28763    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28764        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28765    }
28766    pub fn token(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
28767        TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
28768    }
28769    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28770        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28771    }
28772}
28773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28774pub struct TerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
28775impl<'db> TerminalNoPanicPtr<'db> {}
28776impl<'db> TypedStablePtr<'db> for TerminalNoPanicPtr<'db> {
28777    type SyntaxNode = TerminalNoPanic<'db>;
28778    fn untyped(self) -> SyntaxStablePtrId<'db> {
28779        self.0
28780    }
28781    fn lookup(&self, db: &'db dyn Database) -> TerminalNoPanic<'db> {
28782        TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
28783    }
28784}
28785impl<'db> From<TerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
28786    fn from(ptr: TerminalNoPanicPtr<'db>) -> Self {
28787        ptr.untyped()
28788    }
28789}
28790#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28791pub struct TerminalNoPanicGreen<'db>(pub GreenId<'db>);
28792impl<'db> TypedSyntaxNode<'db> for TerminalNoPanic<'db> {
28793    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
28794    type StablePtr = TerminalNoPanicPtr<'db>;
28795    type Green = TerminalNoPanicGreen<'db>;
28796    fn missing(db: &'db dyn Database) -> Self::Green {
28797        TerminalNoPanicGreen(
28798            GreenNode {
28799                kind: SyntaxKind::TerminalNoPanic,
28800                details: GreenNodeDetails::Node {
28801                    children: [
28802                        Trivia::missing(db).0,
28803                        TokenNoPanic::missing(db).0,
28804                        Trivia::missing(db).0,
28805                    ]
28806                    .into(),
28807                    width: TextWidth::default(),
28808                },
28809            }
28810            .intern(db),
28811        )
28812    }
28813    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28814        let kind = node.kind(db);
28815        assert_eq!(
28816            kind,
28817            SyntaxKind::TerminalNoPanic,
28818            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28819            kind,
28820            SyntaxKind::TerminalNoPanic
28821        );
28822        Self { node }
28823    }
28824    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28825        let kind = node.kind(db);
28826        if kind == SyntaxKind::TerminalNoPanic {
28827            Some(Self::from_syntax_node(db, node))
28828        } else {
28829            None
28830        }
28831    }
28832    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28833        self.node
28834    }
28835    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28836        TerminalNoPanicPtr(self.node.stable_ptr(db))
28837    }
28838}
28839#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28840pub struct TokenOf<'db> {
28841    node: SyntaxNode<'db>,
28842}
28843impl<'db> Token<'db> for TokenOf<'db> {
28844    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28845        TokenOfGreen(
28846            GreenNode { kind: SyntaxKind::TokenOf, details: GreenNodeDetails::Token(text) }
28847                .intern(db),
28848        )
28849    }
28850    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28851        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28852    }
28853}
28854#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28855pub struct TokenOfPtr<'db>(pub SyntaxStablePtrId<'db>);
28856impl<'db> TypedStablePtr<'db> for TokenOfPtr<'db> {
28857    type SyntaxNode = TokenOf<'db>;
28858    fn untyped(self) -> SyntaxStablePtrId<'db> {
28859        self.0
28860    }
28861    fn lookup(&self, db: &'db dyn Database) -> TokenOf<'db> {
28862        TokenOf::from_syntax_node(db, self.0.lookup(db))
28863    }
28864}
28865impl<'db> From<TokenOfPtr<'db>> for SyntaxStablePtrId<'db> {
28866    fn from(ptr: TokenOfPtr<'db>) -> Self {
28867        ptr.untyped()
28868    }
28869}
28870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28871pub struct TokenOfGreen<'db>(pub GreenId<'db>);
28872impl<'db> TokenOfGreen<'db> {
28873    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28874        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28875    }
28876}
28877impl<'db> TypedSyntaxNode<'db> for TokenOf<'db> {
28878    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
28879    type StablePtr = TokenOfPtr<'db>;
28880    type Green = TokenOfGreen<'db>;
28881    fn missing(db: &'db dyn Database) -> Self::Green {
28882        TokenOfGreen(
28883            GreenNode {
28884                kind: SyntaxKind::TokenMissing,
28885                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28886            }
28887            .intern(db),
28888        )
28889    }
28890    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28891        match node.green_node(db).details {
28892            GreenNodeDetails::Token(_) => Self { node },
28893            GreenNodeDetails::Node { .. } => {
28894                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
28895            }
28896        }
28897    }
28898    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28899        match node.green_node(db).details {
28900            GreenNodeDetails::Token(_) => Some(Self { node }),
28901            GreenNodeDetails::Node { .. } => None,
28902        }
28903    }
28904    fn as_syntax_node(&self) -> SyntaxNode<'db> {
28905        self.node
28906    }
28907    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28908        TokenOfPtr(self.node.stable_ptr(db))
28909    }
28910}
28911#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28912pub struct TerminalOf<'db> {
28913    node: SyntaxNode<'db>,
28914}
28915impl<'db> Terminal<'db> for TerminalOf<'db> {
28916    const KIND: SyntaxKind = SyntaxKind::TerminalOf;
28917    type TokenType = TokenOf<'db>;
28918    fn new_green(
28919        db: &'db dyn Database,
28920        leading_trivia: TriviaGreen<'db>,
28921        token: <<TerminalOf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28922        trailing_trivia: TriviaGreen<'db>,
28923    ) -> Self::Green {
28924        let children = [leading_trivia.0, token.0, trailing_trivia.0];
28925        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28926        TerminalOfGreen(
28927            GreenNode {
28928                kind: SyntaxKind::TerminalOf,
28929                details: GreenNodeDetails::Node { children: children.into(), width },
28930            }
28931            .intern(db),
28932        )
28933    }
28934    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28935        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28936            unreachable!("Expected a node, not a token");
28937        };
28938        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28939    }
28940}
28941impl<'db> TerminalOf<'db> {
28942    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28943        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28944    }
28945    pub fn token(&self, db: &'db dyn Database) -> TokenOf<'db> {
28946        TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
28947    }
28948    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28949        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28950    }
28951}
28952#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
28953pub struct TerminalOfPtr<'db>(pub SyntaxStablePtrId<'db>);
28954impl<'db> TerminalOfPtr<'db> {}
28955impl<'db> TypedStablePtr<'db> for TerminalOfPtr<'db> {
28956    type SyntaxNode = TerminalOf<'db>;
28957    fn untyped(self) -> SyntaxStablePtrId<'db> {
28958        self.0
28959    }
28960    fn lookup(&self, db: &'db dyn Database) -> TerminalOf<'db> {
28961        TerminalOf::from_syntax_node(db, self.0.lookup(db))
28962    }
28963}
28964impl<'db> From<TerminalOfPtr<'db>> for SyntaxStablePtrId<'db> {
28965    fn from(ptr: TerminalOfPtr<'db>) -> Self {
28966        ptr.untyped()
28967    }
28968}
28969#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28970pub struct TerminalOfGreen<'db>(pub GreenId<'db>);
28971impl<'db> TypedSyntaxNode<'db> for TerminalOf<'db> {
28972    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
28973    type StablePtr = TerminalOfPtr<'db>;
28974    type Green = TerminalOfGreen<'db>;
28975    fn missing(db: &'db dyn Database) -> Self::Green {
28976        TerminalOfGreen(
28977            GreenNode {
28978                kind: SyntaxKind::TerminalOf,
28979                details: GreenNodeDetails::Node {
28980                    children: [
28981                        Trivia::missing(db).0,
28982                        TokenOf::missing(db).0,
28983                        Trivia::missing(db).0,
28984                    ]
28985                    .into(),
28986                    width: TextWidth::default(),
28987                },
28988            }
28989            .intern(db),
28990        )
28991    }
28992    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28993        let kind = node.kind(db);
28994        assert_eq!(
28995            kind,
28996            SyntaxKind::TerminalOf,
28997            "Unexpected SyntaxKind {:?}. Expected {:?}.",
28998            kind,
28999            SyntaxKind::TerminalOf
29000        );
29001        Self { node }
29002    }
29003    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29004        let kind = node.kind(db);
29005        if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29006    }
29007    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29008        self.node
29009    }
29010    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29011        TerminalOfPtr(self.node.stable_ptr(db))
29012    }
29013}
29014#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29015pub struct TokenRef<'db> {
29016    node: SyntaxNode<'db>,
29017}
29018impl<'db> Token<'db> for TokenRef<'db> {
29019    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29020        TokenRefGreen(
29021            GreenNode { kind: SyntaxKind::TokenRef, details: GreenNodeDetails::Token(text) }
29022                .intern(db),
29023        )
29024    }
29025    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29026        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29027    }
29028}
29029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29030pub struct TokenRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29031impl<'db> TypedStablePtr<'db> for TokenRefPtr<'db> {
29032    type SyntaxNode = TokenRef<'db>;
29033    fn untyped(self) -> SyntaxStablePtrId<'db> {
29034        self.0
29035    }
29036    fn lookup(&self, db: &'db dyn Database) -> TokenRef<'db> {
29037        TokenRef::from_syntax_node(db, self.0.lookup(db))
29038    }
29039}
29040impl<'db> From<TokenRefPtr<'db>> for SyntaxStablePtrId<'db> {
29041    fn from(ptr: TokenRefPtr<'db>) -> Self {
29042        ptr.untyped()
29043    }
29044}
29045#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29046pub struct TokenRefGreen<'db>(pub GreenId<'db>);
29047impl<'db> TokenRefGreen<'db> {
29048    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29049        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29050    }
29051}
29052impl<'db> TypedSyntaxNode<'db> for TokenRef<'db> {
29053    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29054    type StablePtr = TokenRefPtr<'db>;
29055    type Green = TokenRefGreen<'db>;
29056    fn missing(db: &'db dyn Database) -> Self::Green {
29057        TokenRefGreen(
29058            GreenNode {
29059                kind: SyntaxKind::TokenMissing,
29060                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29061            }
29062            .intern(db),
29063        )
29064    }
29065    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29066        match node.green_node(db).details {
29067            GreenNodeDetails::Token(_) => Self { node },
29068            GreenNodeDetails::Node { .. } => {
29069                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29070            }
29071        }
29072    }
29073    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29074        match node.green_node(db).details {
29075            GreenNodeDetails::Token(_) => Some(Self { node }),
29076            GreenNodeDetails::Node { .. } => None,
29077        }
29078    }
29079    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29080        self.node
29081    }
29082    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29083        TokenRefPtr(self.node.stable_ptr(db))
29084    }
29085}
29086#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29087pub struct TerminalRef<'db> {
29088    node: SyntaxNode<'db>,
29089}
29090impl<'db> Terminal<'db> for TerminalRef<'db> {
29091    const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29092    type TokenType = TokenRef<'db>;
29093    fn new_green(
29094        db: &'db dyn Database,
29095        leading_trivia: TriviaGreen<'db>,
29096        token: <<TerminalRef<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29097        trailing_trivia: TriviaGreen<'db>,
29098    ) -> Self::Green {
29099        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29100        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29101        TerminalRefGreen(
29102            GreenNode {
29103                kind: SyntaxKind::TerminalRef,
29104                details: GreenNodeDetails::Node { children: children.into(), width },
29105            }
29106            .intern(db),
29107        )
29108    }
29109    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29110        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29111            unreachable!("Expected a node, not a token");
29112        };
29113        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29114    }
29115}
29116impl<'db> TerminalRef<'db> {
29117    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29118        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29119    }
29120    pub fn token(&self, db: &'db dyn Database) -> TokenRef<'db> {
29121        TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29122    }
29123    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29124        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29125    }
29126}
29127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29128pub struct TerminalRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29129impl<'db> TerminalRefPtr<'db> {}
29130impl<'db> TypedStablePtr<'db> for TerminalRefPtr<'db> {
29131    type SyntaxNode = TerminalRef<'db>;
29132    fn untyped(self) -> SyntaxStablePtrId<'db> {
29133        self.0
29134    }
29135    fn lookup(&self, db: &'db dyn Database) -> TerminalRef<'db> {
29136        TerminalRef::from_syntax_node(db, self.0.lookup(db))
29137    }
29138}
29139impl<'db> From<TerminalRefPtr<'db>> for SyntaxStablePtrId<'db> {
29140    fn from(ptr: TerminalRefPtr<'db>) -> Self {
29141        ptr.untyped()
29142    }
29143}
29144#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29145pub struct TerminalRefGreen<'db>(pub GreenId<'db>);
29146impl<'db> TypedSyntaxNode<'db> for TerminalRef<'db> {
29147    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29148    type StablePtr = TerminalRefPtr<'db>;
29149    type Green = TerminalRefGreen<'db>;
29150    fn missing(db: &'db dyn Database) -> Self::Green {
29151        TerminalRefGreen(
29152            GreenNode {
29153                kind: SyntaxKind::TerminalRef,
29154                details: GreenNodeDetails::Node {
29155                    children: [
29156                        Trivia::missing(db).0,
29157                        TokenRef::missing(db).0,
29158                        Trivia::missing(db).0,
29159                    ]
29160                    .into(),
29161                    width: TextWidth::default(),
29162                },
29163            }
29164            .intern(db),
29165        )
29166    }
29167    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29168        let kind = node.kind(db);
29169        assert_eq!(
29170            kind,
29171            SyntaxKind::TerminalRef,
29172            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29173            kind,
29174            SyntaxKind::TerminalRef
29175        );
29176        Self { node }
29177    }
29178    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29179        let kind = node.kind(db);
29180        if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29181    }
29182    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29183        self.node
29184    }
29185    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29186        TerminalRefPtr(self.node.stable_ptr(db))
29187    }
29188}
29189#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29190pub struct TokenContinue<'db> {
29191    node: SyntaxNode<'db>,
29192}
29193impl<'db> Token<'db> for TokenContinue<'db> {
29194    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29195        TokenContinueGreen(
29196            GreenNode { kind: SyntaxKind::TokenContinue, details: GreenNodeDetails::Token(text) }
29197                .intern(db),
29198        )
29199    }
29200    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29201        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29202    }
29203}
29204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29205pub struct TokenContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29206impl<'db> TypedStablePtr<'db> for TokenContinuePtr<'db> {
29207    type SyntaxNode = TokenContinue<'db>;
29208    fn untyped(self) -> SyntaxStablePtrId<'db> {
29209        self.0
29210    }
29211    fn lookup(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29212        TokenContinue::from_syntax_node(db, self.0.lookup(db))
29213    }
29214}
29215impl<'db> From<TokenContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29216    fn from(ptr: TokenContinuePtr<'db>) -> Self {
29217        ptr.untyped()
29218    }
29219}
29220#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29221pub struct TokenContinueGreen<'db>(pub GreenId<'db>);
29222impl<'db> TokenContinueGreen<'db> {
29223    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29224        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29225    }
29226}
29227impl<'db> TypedSyntaxNode<'db> for TokenContinue<'db> {
29228    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29229    type StablePtr = TokenContinuePtr<'db>;
29230    type Green = TokenContinueGreen<'db>;
29231    fn missing(db: &'db dyn Database) -> Self::Green {
29232        TokenContinueGreen(
29233            GreenNode {
29234                kind: SyntaxKind::TokenMissing,
29235                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29236            }
29237            .intern(db),
29238        )
29239    }
29240    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29241        match node.green_node(db).details {
29242            GreenNodeDetails::Token(_) => Self { node },
29243            GreenNodeDetails::Node { .. } => {
29244                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29245            }
29246        }
29247    }
29248    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29249        match node.green_node(db).details {
29250            GreenNodeDetails::Token(_) => Some(Self { node }),
29251            GreenNodeDetails::Node { .. } => None,
29252        }
29253    }
29254    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29255        self.node
29256    }
29257    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29258        TokenContinuePtr(self.node.stable_ptr(db))
29259    }
29260}
29261#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29262pub struct TerminalContinue<'db> {
29263    node: SyntaxNode<'db>,
29264}
29265impl<'db> Terminal<'db> for TerminalContinue<'db> {
29266    const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29267    type TokenType = TokenContinue<'db>;
29268    fn new_green(
29269        db: &'db dyn Database,
29270        leading_trivia: TriviaGreen<'db>,
29271        token: <<TerminalContinue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29272        trailing_trivia: TriviaGreen<'db>,
29273    ) -> Self::Green {
29274        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29275        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29276        TerminalContinueGreen(
29277            GreenNode {
29278                kind: SyntaxKind::TerminalContinue,
29279                details: GreenNodeDetails::Node { children: children.into(), width },
29280            }
29281            .intern(db),
29282        )
29283    }
29284    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29285        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29286            unreachable!("Expected a node, not a token");
29287        };
29288        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29289    }
29290}
29291impl<'db> TerminalContinue<'db> {
29292    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29293        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29294    }
29295    pub fn token(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29296        TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29297    }
29298    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29299        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29300    }
29301}
29302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29303pub struct TerminalContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29304impl<'db> TerminalContinuePtr<'db> {}
29305impl<'db> TypedStablePtr<'db> for TerminalContinuePtr<'db> {
29306    type SyntaxNode = TerminalContinue<'db>;
29307    fn untyped(self) -> SyntaxStablePtrId<'db> {
29308        self.0
29309    }
29310    fn lookup(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
29311        TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29312    }
29313}
29314impl<'db> From<TerminalContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29315    fn from(ptr: TerminalContinuePtr<'db>) -> Self {
29316        ptr.untyped()
29317    }
29318}
29319#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29320pub struct TerminalContinueGreen<'db>(pub GreenId<'db>);
29321impl<'db> TypedSyntaxNode<'db> for TerminalContinue<'db> {
29322    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29323    type StablePtr = TerminalContinuePtr<'db>;
29324    type Green = TerminalContinueGreen<'db>;
29325    fn missing(db: &'db dyn Database) -> Self::Green {
29326        TerminalContinueGreen(
29327            GreenNode {
29328                kind: SyntaxKind::TerminalContinue,
29329                details: GreenNodeDetails::Node {
29330                    children: [
29331                        Trivia::missing(db).0,
29332                        TokenContinue::missing(db).0,
29333                        Trivia::missing(db).0,
29334                    ]
29335                    .into(),
29336                    width: TextWidth::default(),
29337                },
29338            }
29339            .intern(db),
29340        )
29341    }
29342    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29343        let kind = node.kind(db);
29344        assert_eq!(
29345            kind,
29346            SyntaxKind::TerminalContinue,
29347            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29348            kind,
29349            SyntaxKind::TerminalContinue
29350        );
29351        Self { node }
29352    }
29353    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29354        let kind = node.kind(db);
29355        if kind == SyntaxKind::TerminalContinue {
29356            Some(Self::from_syntax_node(db, node))
29357        } else {
29358            None
29359        }
29360    }
29361    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29362        self.node
29363    }
29364    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29365        TerminalContinuePtr(self.node.stable_ptr(db))
29366    }
29367}
29368#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29369pub struct TokenReturn<'db> {
29370    node: SyntaxNode<'db>,
29371}
29372impl<'db> Token<'db> for TokenReturn<'db> {
29373    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29374        TokenReturnGreen(
29375            GreenNode { kind: SyntaxKind::TokenReturn, details: GreenNodeDetails::Token(text) }
29376                .intern(db),
29377        )
29378    }
29379    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29380        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29381    }
29382}
29383#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29384pub struct TokenReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29385impl<'db> TypedStablePtr<'db> for TokenReturnPtr<'db> {
29386    type SyntaxNode = TokenReturn<'db>;
29387    fn untyped(self) -> SyntaxStablePtrId<'db> {
29388        self.0
29389    }
29390    fn lookup(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29391        TokenReturn::from_syntax_node(db, self.0.lookup(db))
29392    }
29393}
29394impl<'db> From<TokenReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29395    fn from(ptr: TokenReturnPtr<'db>) -> Self {
29396        ptr.untyped()
29397    }
29398}
29399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29400pub struct TokenReturnGreen<'db>(pub GreenId<'db>);
29401impl<'db> TokenReturnGreen<'db> {
29402    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29403        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29404    }
29405}
29406impl<'db> TypedSyntaxNode<'db> for TokenReturn<'db> {
29407    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
29408    type StablePtr = TokenReturnPtr<'db>;
29409    type Green = TokenReturnGreen<'db>;
29410    fn missing(db: &'db dyn Database) -> Self::Green {
29411        TokenReturnGreen(
29412            GreenNode {
29413                kind: SyntaxKind::TokenMissing,
29414                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29415            }
29416            .intern(db),
29417        )
29418    }
29419    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29420        match node.green_node(db).details {
29421            GreenNodeDetails::Token(_) => Self { node },
29422            GreenNodeDetails::Node { .. } => {
29423                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
29424            }
29425        }
29426    }
29427    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29428        match node.green_node(db).details {
29429            GreenNodeDetails::Token(_) => Some(Self { node }),
29430            GreenNodeDetails::Node { .. } => None,
29431        }
29432    }
29433    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29434        self.node
29435    }
29436    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29437        TokenReturnPtr(self.node.stable_ptr(db))
29438    }
29439}
29440#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29441pub struct TerminalReturn<'db> {
29442    node: SyntaxNode<'db>,
29443}
29444impl<'db> Terminal<'db> for TerminalReturn<'db> {
29445    const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
29446    type TokenType = TokenReturn<'db>;
29447    fn new_green(
29448        db: &'db dyn Database,
29449        leading_trivia: TriviaGreen<'db>,
29450        token: <<TerminalReturn<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29451        trailing_trivia: TriviaGreen<'db>,
29452    ) -> Self::Green {
29453        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29454        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29455        TerminalReturnGreen(
29456            GreenNode {
29457                kind: SyntaxKind::TerminalReturn,
29458                details: GreenNodeDetails::Node { children: children.into(), width },
29459            }
29460            .intern(db),
29461        )
29462    }
29463    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29464        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29465            unreachable!("Expected a node, not a token");
29466        };
29467        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29468    }
29469}
29470impl<'db> TerminalReturn<'db> {
29471    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29472        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29473    }
29474    pub fn token(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29475        TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
29476    }
29477    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29478        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29479    }
29480}
29481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29482pub struct TerminalReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29483impl<'db> TerminalReturnPtr<'db> {}
29484impl<'db> TypedStablePtr<'db> for TerminalReturnPtr<'db> {
29485    type SyntaxNode = TerminalReturn<'db>;
29486    fn untyped(self) -> SyntaxStablePtrId<'db> {
29487        self.0
29488    }
29489    fn lookup(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
29490        TerminalReturn::from_syntax_node(db, self.0.lookup(db))
29491    }
29492}
29493impl<'db> From<TerminalReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29494    fn from(ptr: TerminalReturnPtr<'db>) -> Self {
29495        ptr.untyped()
29496    }
29497}
29498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29499pub struct TerminalReturnGreen<'db>(pub GreenId<'db>);
29500impl<'db> TypedSyntaxNode<'db> for TerminalReturn<'db> {
29501    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
29502    type StablePtr = TerminalReturnPtr<'db>;
29503    type Green = TerminalReturnGreen<'db>;
29504    fn missing(db: &'db dyn Database) -> Self::Green {
29505        TerminalReturnGreen(
29506            GreenNode {
29507                kind: SyntaxKind::TerminalReturn,
29508                details: GreenNodeDetails::Node {
29509                    children: [
29510                        Trivia::missing(db).0,
29511                        TokenReturn::missing(db).0,
29512                        Trivia::missing(db).0,
29513                    ]
29514                    .into(),
29515                    width: TextWidth::default(),
29516                },
29517            }
29518            .intern(db),
29519        )
29520    }
29521    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29522        let kind = node.kind(db);
29523        assert_eq!(
29524            kind,
29525            SyntaxKind::TerminalReturn,
29526            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29527            kind,
29528            SyntaxKind::TerminalReturn
29529        );
29530        Self { node }
29531    }
29532    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29533        let kind = node.kind(db);
29534        if kind == SyntaxKind::TerminalReturn {
29535            Some(Self::from_syntax_node(db, node))
29536        } else {
29537            None
29538        }
29539    }
29540    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29541        self.node
29542    }
29543    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29544        TerminalReturnPtr(self.node.stable_ptr(db))
29545    }
29546}
29547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29548pub struct TokenBreak<'db> {
29549    node: SyntaxNode<'db>,
29550}
29551impl<'db> Token<'db> for TokenBreak<'db> {
29552    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29553        TokenBreakGreen(
29554            GreenNode { kind: SyntaxKind::TokenBreak, details: GreenNodeDetails::Token(text) }
29555                .intern(db),
29556        )
29557    }
29558    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29559        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29560    }
29561}
29562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29563pub struct TokenBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29564impl<'db> TypedStablePtr<'db> for TokenBreakPtr<'db> {
29565    type SyntaxNode = TokenBreak<'db>;
29566    fn untyped(self) -> SyntaxStablePtrId<'db> {
29567        self.0
29568    }
29569    fn lookup(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29570        TokenBreak::from_syntax_node(db, self.0.lookup(db))
29571    }
29572}
29573impl<'db> From<TokenBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29574    fn from(ptr: TokenBreakPtr<'db>) -> Self {
29575        ptr.untyped()
29576    }
29577}
29578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29579pub struct TokenBreakGreen<'db>(pub GreenId<'db>);
29580impl<'db> TokenBreakGreen<'db> {
29581    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29582        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29583    }
29584}
29585impl<'db> TypedSyntaxNode<'db> for TokenBreak<'db> {
29586    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
29587    type StablePtr = TokenBreakPtr<'db>;
29588    type Green = TokenBreakGreen<'db>;
29589    fn missing(db: &'db dyn Database) -> Self::Green {
29590        TokenBreakGreen(
29591            GreenNode {
29592                kind: SyntaxKind::TokenMissing,
29593                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29594            }
29595            .intern(db),
29596        )
29597    }
29598    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29599        match node.green_node(db).details {
29600            GreenNodeDetails::Token(_) => Self { node },
29601            GreenNodeDetails::Node { .. } => {
29602                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
29603            }
29604        }
29605    }
29606    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29607        match node.green_node(db).details {
29608            GreenNodeDetails::Token(_) => Some(Self { node }),
29609            GreenNodeDetails::Node { .. } => None,
29610        }
29611    }
29612    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29613        self.node
29614    }
29615    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29616        TokenBreakPtr(self.node.stable_ptr(db))
29617    }
29618}
29619#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29620pub struct TerminalBreak<'db> {
29621    node: SyntaxNode<'db>,
29622}
29623impl<'db> Terminal<'db> for TerminalBreak<'db> {
29624    const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
29625    type TokenType = TokenBreak<'db>;
29626    fn new_green(
29627        db: &'db dyn Database,
29628        leading_trivia: TriviaGreen<'db>,
29629        token: <<TerminalBreak<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29630        trailing_trivia: TriviaGreen<'db>,
29631    ) -> Self::Green {
29632        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29633        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29634        TerminalBreakGreen(
29635            GreenNode {
29636                kind: SyntaxKind::TerminalBreak,
29637                details: GreenNodeDetails::Node { children: children.into(), width },
29638            }
29639            .intern(db),
29640        )
29641    }
29642    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29643        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29644            unreachable!("Expected a node, not a token");
29645        };
29646        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29647    }
29648}
29649impl<'db> TerminalBreak<'db> {
29650    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29651        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29652    }
29653    pub fn token(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29654        TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
29655    }
29656    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29657        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29658    }
29659}
29660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29661pub struct TerminalBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29662impl<'db> TerminalBreakPtr<'db> {}
29663impl<'db> TypedStablePtr<'db> for TerminalBreakPtr<'db> {
29664    type SyntaxNode = TerminalBreak<'db>;
29665    fn untyped(self) -> SyntaxStablePtrId<'db> {
29666        self.0
29667    }
29668    fn lookup(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
29669        TerminalBreak::from_syntax_node(db, self.0.lookup(db))
29670    }
29671}
29672impl<'db> From<TerminalBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29673    fn from(ptr: TerminalBreakPtr<'db>) -> Self {
29674        ptr.untyped()
29675    }
29676}
29677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29678pub struct TerminalBreakGreen<'db>(pub GreenId<'db>);
29679impl<'db> TypedSyntaxNode<'db> for TerminalBreak<'db> {
29680    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
29681    type StablePtr = TerminalBreakPtr<'db>;
29682    type Green = TerminalBreakGreen<'db>;
29683    fn missing(db: &'db dyn Database) -> Self::Green {
29684        TerminalBreakGreen(
29685            GreenNode {
29686                kind: SyntaxKind::TerminalBreak,
29687                details: GreenNodeDetails::Node {
29688                    children: [
29689                        Trivia::missing(db).0,
29690                        TokenBreak::missing(db).0,
29691                        Trivia::missing(db).0,
29692                    ]
29693                    .into(),
29694                    width: TextWidth::default(),
29695                },
29696            }
29697            .intern(db),
29698        )
29699    }
29700    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29701        let kind = node.kind(db);
29702        assert_eq!(
29703            kind,
29704            SyntaxKind::TerminalBreak,
29705            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29706            kind,
29707            SyntaxKind::TerminalBreak
29708        );
29709        Self { node }
29710    }
29711    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29712        let kind = node.kind(db);
29713        if kind == SyntaxKind::TerminalBreak {
29714            Some(Self::from_syntax_node(db, node))
29715        } else {
29716            None
29717        }
29718    }
29719    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29720        self.node
29721    }
29722    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29723        TerminalBreakPtr(self.node.stable_ptr(db))
29724    }
29725}
29726#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29727pub struct TokenStruct<'db> {
29728    node: SyntaxNode<'db>,
29729}
29730impl<'db> Token<'db> for TokenStruct<'db> {
29731    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29732        TokenStructGreen(
29733            GreenNode { kind: SyntaxKind::TokenStruct, details: GreenNodeDetails::Token(text) }
29734                .intern(db),
29735        )
29736    }
29737    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29738        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29739    }
29740}
29741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29742pub struct TokenStructPtr<'db>(pub SyntaxStablePtrId<'db>);
29743impl<'db> TypedStablePtr<'db> for TokenStructPtr<'db> {
29744    type SyntaxNode = TokenStruct<'db>;
29745    fn untyped(self) -> SyntaxStablePtrId<'db> {
29746        self.0
29747    }
29748    fn lookup(&self, db: &'db dyn Database) -> TokenStruct<'db> {
29749        TokenStruct::from_syntax_node(db, self.0.lookup(db))
29750    }
29751}
29752impl<'db> From<TokenStructPtr<'db>> for SyntaxStablePtrId<'db> {
29753    fn from(ptr: TokenStructPtr<'db>) -> Self {
29754        ptr.untyped()
29755    }
29756}
29757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29758pub struct TokenStructGreen<'db>(pub GreenId<'db>);
29759impl<'db> TokenStructGreen<'db> {
29760    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29761        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29762    }
29763}
29764impl<'db> TypedSyntaxNode<'db> for TokenStruct<'db> {
29765    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
29766    type StablePtr = TokenStructPtr<'db>;
29767    type Green = TokenStructGreen<'db>;
29768    fn missing(db: &'db dyn Database) -> Self::Green {
29769        TokenStructGreen(
29770            GreenNode {
29771                kind: SyntaxKind::TokenMissing,
29772                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29773            }
29774            .intern(db),
29775        )
29776    }
29777    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29778        match node.green_node(db).details {
29779            GreenNodeDetails::Token(_) => Self { node },
29780            GreenNodeDetails::Node { .. } => {
29781                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
29782            }
29783        }
29784    }
29785    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29786        match node.green_node(db).details {
29787            GreenNodeDetails::Token(_) => Some(Self { node }),
29788            GreenNodeDetails::Node { .. } => None,
29789        }
29790    }
29791    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29792        self.node
29793    }
29794    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29795        TokenStructPtr(self.node.stable_ptr(db))
29796    }
29797}
29798#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29799pub struct TerminalStruct<'db> {
29800    node: SyntaxNode<'db>,
29801}
29802impl<'db> Terminal<'db> for TerminalStruct<'db> {
29803    const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
29804    type TokenType = TokenStruct<'db>;
29805    fn new_green(
29806        db: &'db dyn Database,
29807        leading_trivia: TriviaGreen<'db>,
29808        token: <<TerminalStruct<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29809        trailing_trivia: TriviaGreen<'db>,
29810    ) -> Self::Green {
29811        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29812        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29813        TerminalStructGreen(
29814            GreenNode {
29815                kind: SyntaxKind::TerminalStruct,
29816                details: GreenNodeDetails::Node { children: children.into(), width },
29817            }
29818            .intern(db),
29819        )
29820    }
29821    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29822        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29823            unreachable!("Expected a node, not a token");
29824        };
29825        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29826    }
29827}
29828impl<'db> TerminalStruct<'db> {
29829    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29830        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29831    }
29832    pub fn token(&self, db: &'db dyn Database) -> TokenStruct<'db> {
29833        TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
29834    }
29835    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29836        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29837    }
29838}
29839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29840pub struct TerminalStructPtr<'db>(pub SyntaxStablePtrId<'db>);
29841impl<'db> TerminalStructPtr<'db> {}
29842impl<'db> TypedStablePtr<'db> for TerminalStructPtr<'db> {
29843    type SyntaxNode = TerminalStruct<'db>;
29844    fn untyped(self) -> SyntaxStablePtrId<'db> {
29845        self.0
29846    }
29847    fn lookup(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
29848        TerminalStruct::from_syntax_node(db, self.0.lookup(db))
29849    }
29850}
29851impl<'db> From<TerminalStructPtr<'db>> for SyntaxStablePtrId<'db> {
29852    fn from(ptr: TerminalStructPtr<'db>) -> Self {
29853        ptr.untyped()
29854    }
29855}
29856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29857pub struct TerminalStructGreen<'db>(pub GreenId<'db>);
29858impl<'db> TypedSyntaxNode<'db> for TerminalStruct<'db> {
29859    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
29860    type StablePtr = TerminalStructPtr<'db>;
29861    type Green = TerminalStructGreen<'db>;
29862    fn missing(db: &'db dyn Database) -> Self::Green {
29863        TerminalStructGreen(
29864            GreenNode {
29865                kind: SyntaxKind::TerminalStruct,
29866                details: GreenNodeDetails::Node {
29867                    children: [
29868                        Trivia::missing(db).0,
29869                        TokenStruct::missing(db).0,
29870                        Trivia::missing(db).0,
29871                    ]
29872                    .into(),
29873                    width: TextWidth::default(),
29874                },
29875            }
29876            .intern(db),
29877        )
29878    }
29879    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29880        let kind = node.kind(db);
29881        assert_eq!(
29882            kind,
29883            SyntaxKind::TerminalStruct,
29884            "Unexpected SyntaxKind {:?}. Expected {:?}.",
29885            kind,
29886            SyntaxKind::TerminalStruct
29887        );
29888        Self { node }
29889    }
29890    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29891        let kind = node.kind(db);
29892        if kind == SyntaxKind::TerminalStruct {
29893            Some(Self::from_syntax_node(db, node))
29894        } else {
29895            None
29896        }
29897    }
29898    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29899        self.node
29900    }
29901    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29902        TerminalStructPtr(self.node.stable_ptr(db))
29903    }
29904}
29905#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29906pub struct TokenTrait<'db> {
29907    node: SyntaxNode<'db>,
29908}
29909impl<'db> Token<'db> for TokenTrait<'db> {
29910    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29911        TokenTraitGreen(
29912            GreenNode { kind: SyntaxKind::TokenTrait, details: GreenNodeDetails::Token(text) }
29913                .intern(db),
29914        )
29915    }
29916    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29917        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29918    }
29919}
29920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
29921pub struct TokenTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
29922impl<'db> TypedStablePtr<'db> for TokenTraitPtr<'db> {
29923    type SyntaxNode = TokenTrait<'db>;
29924    fn untyped(self) -> SyntaxStablePtrId<'db> {
29925        self.0
29926    }
29927    fn lookup(&self, db: &'db dyn Database) -> TokenTrait<'db> {
29928        TokenTrait::from_syntax_node(db, self.0.lookup(db))
29929    }
29930}
29931impl<'db> From<TokenTraitPtr<'db>> for SyntaxStablePtrId<'db> {
29932    fn from(ptr: TokenTraitPtr<'db>) -> Self {
29933        ptr.untyped()
29934    }
29935}
29936#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29937pub struct TokenTraitGreen<'db>(pub GreenId<'db>);
29938impl<'db> TokenTraitGreen<'db> {
29939    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29940        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29941    }
29942}
29943impl<'db> TypedSyntaxNode<'db> for TokenTrait<'db> {
29944    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
29945    type StablePtr = TokenTraitPtr<'db>;
29946    type Green = TokenTraitGreen<'db>;
29947    fn missing(db: &'db dyn Database) -> Self::Green {
29948        TokenTraitGreen(
29949            GreenNode {
29950                kind: SyntaxKind::TokenMissing,
29951                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29952            }
29953            .intern(db),
29954        )
29955    }
29956    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29957        match node.green_node(db).details {
29958            GreenNodeDetails::Token(_) => Self { node },
29959            GreenNodeDetails::Node { .. } => {
29960                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
29961            }
29962        }
29963    }
29964    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29965        match node.green_node(db).details {
29966            GreenNodeDetails::Token(_) => Some(Self { node }),
29967            GreenNodeDetails::Node { .. } => None,
29968        }
29969    }
29970    fn as_syntax_node(&self) -> SyntaxNode<'db> {
29971        self.node
29972    }
29973    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29974        TokenTraitPtr(self.node.stable_ptr(db))
29975    }
29976}
29977#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29978pub struct TerminalTrait<'db> {
29979    node: SyntaxNode<'db>,
29980}
29981impl<'db> Terminal<'db> for TerminalTrait<'db> {
29982    const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
29983    type TokenType = TokenTrait<'db>;
29984    fn new_green(
29985        db: &'db dyn Database,
29986        leading_trivia: TriviaGreen<'db>,
29987        token: <<TerminalTrait<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29988        trailing_trivia: TriviaGreen<'db>,
29989    ) -> Self::Green {
29990        let children = [leading_trivia.0, token.0, trailing_trivia.0];
29991        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29992        TerminalTraitGreen(
29993            GreenNode {
29994                kind: SyntaxKind::TerminalTrait,
29995                details: GreenNodeDetails::Node { children: children.into(), width },
29996            }
29997            .intern(db),
29998        )
29999    }
30000    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30001        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30002            unreachable!("Expected a node, not a token");
30003        };
30004        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30005    }
30006}
30007impl<'db> TerminalTrait<'db> {
30008    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30009        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30010    }
30011    pub fn token(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30012        TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30013    }
30014    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30015        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30016    }
30017}
30018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30019pub struct TerminalTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30020impl<'db> TerminalTraitPtr<'db> {}
30021impl<'db> TypedStablePtr<'db> for TerminalTraitPtr<'db> {
30022    type SyntaxNode = TerminalTrait<'db>;
30023    fn untyped(self) -> SyntaxStablePtrId<'db> {
30024        self.0
30025    }
30026    fn lookup(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
30027        TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30028    }
30029}
30030impl<'db> From<TerminalTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30031    fn from(ptr: TerminalTraitPtr<'db>) -> Self {
30032        ptr.untyped()
30033    }
30034}
30035#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30036pub struct TerminalTraitGreen<'db>(pub GreenId<'db>);
30037impl<'db> TypedSyntaxNode<'db> for TerminalTrait<'db> {
30038    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30039    type StablePtr = TerminalTraitPtr<'db>;
30040    type Green = TerminalTraitGreen<'db>;
30041    fn missing(db: &'db dyn Database) -> Self::Green {
30042        TerminalTraitGreen(
30043            GreenNode {
30044                kind: SyntaxKind::TerminalTrait,
30045                details: GreenNodeDetails::Node {
30046                    children: [
30047                        Trivia::missing(db).0,
30048                        TokenTrait::missing(db).0,
30049                        Trivia::missing(db).0,
30050                    ]
30051                    .into(),
30052                    width: TextWidth::default(),
30053                },
30054            }
30055            .intern(db),
30056        )
30057    }
30058    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30059        let kind = node.kind(db);
30060        assert_eq!(
30061            kind,
30062            SyntaxKind::TerminalTrait,
30063            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30064            kind,
30065            SyntaxKind::TerminalTrait
30066        );
30067        Self { node }
30068    }
30069    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30070        let kind = node.kind(db);
30071        if kind == SyntaxKind::TerminalTrait {
30072            Some(Self::from_syntax_node(db, node))
30073        } else {
30074            None
30075        }
30076    }
30077    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30078        self.node
30079    }
30080    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30081        TerminalTraitPtr(self.node.stable_ptr(db))
30082    }
30083}
30084#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30085pub struct TokenTrue<'db> {
30086    node: SyntaxNode<'db>,
30087}
30088impl<'db> Token<'db> for TokenTrue<'db> {
30089    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30090        TokenTrueGreen(
30091            GreenNode { kind: SyntaxKind::TokenTrue, details: GreenNodeDetails::Token(text) }
30092                .intern(db),
30093        )
30094    }
30095    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30096        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30097    }
30098}
30099#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30100pub struct TokenTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30101impl<'db> TypedStablePtr<'db> for TokenTruePtr<'db> {
30102    type SyntaxNode = TokenTrue<'db>;
30103    fn untyped(self) -> SyntaxStablePtrId<'db> {
30104        self.0
30105    }
30106    fn lookup(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30107        TokenTrue::from_syntax_node(db, self.0.lookup(db))
30108    }
30109}
30110impl<'db> From<TokenTruePtr<'db>> for SyntaxStablePtrId<'db> {
30111    fn from(ptr: TokenTruePtr<'db>) -> Self {
30112        ptr.untyped()
30113    }
30114}
30115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30116pub struct TokenTrueGreen<'db>(pub GreenId<'db>);
30117impl<'db> TokenTrueGreen<'db> {
30118    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30119        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30120    }
30121}
30122impl<'db> TypedSyntaxNode<'db> for TokenTrue<'db> {
30123    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30124    type StablePtr = TokenTruePtr<'db>;
30125    type Green = TokenTrueGreen<'db>;
30126    fn missing(db: &'db dyn Database) -> Self::Green {
30127        TokenTrueGreen(
30128            GreenNode {
30129                kind: SyntaxKind::TokenMissing,
30130                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30131            }
30132            .intern(db),
30133        )
30134    }
30135    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30136        match node.green_node(db).details {
30137            GreenNodeDetails::Token(_) => Self { node },
30138            GreenNodeDetails::Node { .. } => {
30139                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30140            }
30141        }
30142    }
30143    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30144        match node.green_node(db).details {
30145            GreenNodeDetails::Token(_) => Some(Self { node }),
30146            GreenNodeDetails::Node { .. } => None,
30147        }
30148    }
30149    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30150        self.node
30151    }
30152    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30153        TokenTruePtr(self.node.stable_ptr(db))
30154    }
30155}
30156#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30157pub struct TerminalTrue<'db> {
30158    node: SyntaxNode<'db>,
30159}
30160impl<'db> Terminal<'db> for TerminalTrue<'db> {
30161    const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30162    type TokenType = TokenTrue<'db>;
30163    fn new_green(
30164        db: &'db dyn Database,
30165        leading_trivia: TriviaGreen<'db>,
30166        token: <<TerminalTrue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30167        trailing_trivia: TriviaGreen<'db>,
30168    ) -> Self::Green {
30169        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30170        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30171        TerminalTrueGreen(
30172            GreenNode {
30173                kind: SyntaxKind::TerminalTrue,
30174                details: GreenNodeDetails::Node { children: children.into(), width },
30175            }
30176            .intern(db),
30177        )
30178    }
30179    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30180        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30181            unreachable!("Expected a node, not a token");
30182        };
30183        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30184    }
30185}
30186impl<'db> TerminalTrue<'db> {
30187    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30188        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30189    }
30190    pub fn token(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30191        TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30192    }
30193    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30194        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30195    }
30196}
30197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30198pub struct TerminalTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30199impl<'db> TerminalTruePtr<'db> {}
30200impl<'db> TypedStablePtr<'db> for TerminalTruePtr<'db> {
30201    type SyntaxNode = TerminalTrue<'db>;
30202    fn untyped(self) -> SyntaxStablePtrId<'db> {
30203        self.0
30204    }
30205    fn lookup(&self, db: &'db dyn Database) -> TerminalTrue<'db> {
30206        TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30207    }
30208}
30209impl<'db> From<TerminalTruePtr<'db>> for SyntaxStablePtrId<'db> {
30210    fn from(ptr: TerminalTruePtr<'db>) -> Self {
30211        ptr.untyped()
30212    }
30213}
30214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30215pub struct TerminalTrueGreen<'db>(pub GreenId<'db>);
30216impl<'db> TypedSyntaxNode<'db> for TerminalTrue<'db> {
30217    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30218    type StablePtr = TerminalTruePtr<'db>;
30219    type Green = TerminalTrueGreen<'db>;
30220    fn missing(db: &'db dyn Database) -> Self::Green {
30221        TerminalTrueGreen(
30222            GreenNode {
30223                kind: SyntaxKind::TerminalTrue,
30224                details: GreenNodeDetails::Node {
30225                    children: [
30226                        Trivia::missing(db).0,
30227                        TokenTrue::missing(db).0,
30228                        Trivia::missing(db).0,
30229                    ]
30230                    .into(),
30231                    width: TextWidth::default(),
30232                },
30233            }
30234            .intern(db),
30235        )
30236    }
30237    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30238        let kind = node.kind(db);
30239        assert_eq!(
30240            kind,
30241            SyntaxKind::TerminalTrue,
30242            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30243            kind,
30244            SyntaxKind::TerminalTrue
30245        );
30246        Self { node }
30247    }
30248    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30249        let kind = node.kind(db);
30250        if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30251    }
30252    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30253        self.node
30254    }
30255    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30256        TerminalTruePtr(self.node.stable_ptr(db))
30257    }
30258}
30259#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30260pub struct TokenType<'db> {
30261    node: SyntaxNode<'db>,
30262}
30263impl<'db> Token<'db> for TokenType<'db> {
30264    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30265        TokenTypeGreen(
30266            GreenNode { kind: SyntaxKind::TokenType, details: GreenNodeDetails::Token(text) }
30267                .intern(db),
30268        )
30269    }
30270    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30271        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30272    }
30273}
30274#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30275pub struct TokenTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30276impl<'db> TypedStablePtr<'db> for TokenTypePtr<'db> {
30277    type SyntaxNode = TokenType<'db>;
30278    fn untyped(self) -> SyntaxStablePtrId<'db> {
30279        self.0
30280    }
30281    fn lookup(&self, db: &'db dyn Database) -> TokenType<'db> {
30282        TokenType::from_syntax_node(db, self.0.lookup(db))
30283    }
30284}
30285impl<'db> From<TokenTypePtr<'db>> for SyntaxStablePtrId<'db> {
30286    fn from(ptr: TokenTypePtr<'db>) -> Self {
30287        ptr.untyped()
30288    }
30289}
30290#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30291pub struct TokenTypeGreen<'db>(pub GreenId<'db>);
30292impl<'db> TokenTypeGreen<'db> {
30293    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30294        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30295    }
30296}
30297impl<'db> TypedSyntaxNode<'db> for TokenType<'db> {
30298    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
30299    type StablePtr = TokenTypePtr<'db>;
30300    type Green = TokenTypeGreen<'db>;
30301    fn missing(db: &'db dyn Database) -> Self::Green {
30302        TokenTypeGreen(
30303            GreenNode {
30304                kind: SyntaxKind::TokenMissing,
30305                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30306            }
30307            .intern(db),
30308        )
30309    }
30310    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30311        match node.green_node(db).details {
30312            GreenNodeDetails::Token(_) => Self { node },
30313            GreenNodeDetails::Node { .. } => {
30314                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
30315            }
30316        }
30317    }
30318    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30319        match node.green_node(db).details {
30320            GreenNodeDetails::Token(_) => Some(Self { node }),
30321            GreenNodeDetails::Node { .. } => None,
30322        }
30323    }
30324    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30325        self.node
30326    }
30327    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30328        TokenTypePtr(self.node.stable_ptr(db))
30329    }
30330}
30331#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30332pub struct TerminalType<'db> {
30333    node: SyntaxNode<'db>,
30334}
30335impl<'db> Terminal<'db> for TerminalType<'db> {
30336    const KIND: SyntaxKind = SyntaxKind::TerminalType;
30337    type TokenType = TokenType<'db>;
30338    fn new_green(
30339        db: &'db dyn Database,
30340        leading_trivia: TriviaGreen<'db>,
30341        token: <<TerminalType<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30342        trailing_trivia: TriviaGreen<'db>,
30343    ) -> Self::Green {
30344        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30345        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30346        TerminalTypeGreen(
30347            GreenNode {
30348                kind: SyntaxKind::TerminalType,
30349                details: GreenNodeDetails::Node { children: children.into(), width },
30350            }
30351            .intern(db),
30352        )
30353    }
30354    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30355        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30356            unreachable!("Expected a node, not a token");
30357        };
30358        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30359    }
30360}
30361impl<'db> TerminalType<'db> {
30362    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30363        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30364    }
30365    pub fn token(&self, db: &'db dyn Database) -> TokenType<'db> {
30366        TokenType::from_syntax_node(db, self.node.get_children(db)[1])
30367    }
30368    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30369        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30370    }
30371}
30372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30373pub struct TerminalTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30374impl<'db> TerminalTypePtr<'db> {}
30375impl<'db> TypedStablePtr<'db> for TerminalTypePtr<'db> {
30376    type SyntaxNode = TerminalType<'db>;
30377    fn untyped(self) -> SyntaxStablePtrId<'db> {
30378        self.0
30379    }
30380    fn lookup(&self, db: &'db dyn Database) -> TerminalType<'db> {
30381        TerminalType::from_syntax_node(db, self.0.lookup(db))
30382    }
30383}
30384impl<'db> From<TerminalTypePtr<'db>> for SyntaxStablePtrId<'db> {
30385    fn from(ptr: TerminalTypePtr<'db>) -> Self {
30386        ptr.untyped()
30387    }
30388}
30389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30390pub struct TerminalTypeGreen<'db>(pub GreenId<'db>);
30391impl<'db> TypedSyntaxNode<'db> for TerminalType<'db> {
30392    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
30393    type StablePtr = TerminalTypePtr<'db>;
30394    type Green = TerminalTypeGreen<'db>;
30395    fn missing(db: &'db dyn Database) -> Self::Green {
30396        TerminalTypeGreen(
30397            GreenNode {
30398                kind: SyntaxKind::TerminalType,
30399                details: GreenNodeDetails::Node {
30400                    children: [
30401                        Trivia::missing(db).0,
30402                        TokenType::missing(db).0,
30403                        Trivia::missing(db).0,
30404                    ]
30405                    .into(),
30406                    width: TextWidth::default(),
30407                },
30408            }
30409            .intern(db),
30410        )
30411    }
30412    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30413        let kind = node.kind(db);
30414        assert_eq!(
30415            kind,
30416            SyntaxKind::TerminalType,
30417            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30418            kind,
30419            SyntaxKind::TerminalType
30420        );
30421        Self { node }
30422    }
30423    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30424        let kind = node.kind(db);
30425        if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
30426    }
30427    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30428        self.node
30429    }
30430    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30431        TerminalTypePtr(self.node.stable_ptr(db))
30432    }
30433}
30434#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30435pub struct TokenUse<'db> {
30436    node: SyntaxNode<'db>,
30437}
30438impl<'db> Token<'db> for TokenUse<'db> {
30439    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30440        TokenUseGreen(
30441            GreenNode { kind: SyntaxKind::TokenUse, details: GreenNodeDetails::Token(text) }
30442                .intern(db),
30443        )
30444    }
30445    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30446        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30447    }
30448}
30449#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30450pub struct TokenUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30451impl<'db> TypedStablePtr<'db> for TokenUsePtr<'db> {
30452    type SyntaxNode = TokenUse<'db>;
30453    fn untyped(self) -> SyntaxStablePtrId<'db> {
30454        self.0
30455    }
30456    fn lookup(&self, db: &'db dyn Database) -> TokenUse<'db> {
30457        TokenUse::from_syntax_node(db, self.0.lookup(db))
30458    }
30459}
30460impl<'db> From<TokenUsePtr<'db>> for SyntaxStablePtrId<'db> {
30461    fn from(ptr: TokenUsePtr<'db>) -> Self {
30462        ptr.untyped()
30463    }
30464}
30465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30466pub struct TokenUseGreen<'db>(pub GreenId<'db>);
30467impl<'db> TokenUseGreen<'db> {
30468    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30469        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30470    }
30471}
30472impl<'db> TypedSyntaxNode<'db> for TokenUse<'db> {
30473    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
30474    type StablePtr = TokenUsePtr<'db>;
30475    type Green = TokenUseGreen<'db>;
30476    fn missing(db: &'db dyn Database) -> Self::Green {
30477        TokenUseGreen(
30478            GreenNode {
30479                kind: SyntaxKind::TokenMissing,
30480                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30481            }
30482            .intern(db),
30483        )
30484    }
30485    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30486        match node.green_node(db).details {
30487            GreenNodeDetails::Token(_) => Self { node },
30488            GreenNodeDetails::Node { .. } => {
30489                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
30490            }
30491        }
30492    }
30493    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30494        match node.green_node(db).details {
30495            GreenNodeDetails::Token(_) => Some(Self { node }),
30496            GreenNodeDetails::Node { .. } => None,
30497        }
30498    }
30499    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30500        self.node
30501    }
30502    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30503        TokenUsePtr(self.node.stable_ptr(db))
30504    }
30505}
30506#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30507pub struct TerminalUse<'db> {
30508    node: SyntaxNode<'db>,
30509}
30510impl<'db> Terminal<'db> for TerminalUse<'db> {
30511    const KIND: SyntaxKind = SyntaxKind::TerminalUse;
30512    type TokenType = TokenUse<'db>;
30513    fn new_green(
30514        db: &'db dyn Database,
30515        leading_trivia: TriviaGreen<'db>,
30516        token: <<TerminalUse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30517        trailing_trivia: TriviaGreen<'db>,
30518    ) -> Self::Green {
30519        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30520        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30521        TerminalUseGreen(
30522            GreenNode {
30523                kind: SyntaxKind::TerminalUse,
30524                details: GreenNodeDetails::Node { children: children.into(), width },
30525            }
30526            .intern(db),
30527        )
30528    }
30529    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30530        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30531            unreachable!("Expected a node, not a token");
30532        };
30533        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30534    }
30535}
30536impl<'db> TerminalUse<'db> {
30537    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30538        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30539    }
30540    pub fn token(&self, db: &'db dyn Database) -> TokenUse<'db> {
30541        TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
30542    }
30543    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30544        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30545    }
30546}
30547#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30548pub struct TerminalUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30549impl<'db> TerminalUsePtr<'db> {}
30550impl<'db> TypedStablePtr<'db> for TerminalUsePtr<'db> {
30551    type SyntaxNode = TerminalUse<'db>;
30552    fn untyped(self) -> SyntaxStablePtrId<'db> {
30553        self.0
30554    }
30555    fn lookup(&self, db: &'db dyn Database) -> TerminalUse<'db> {
30556        TerminalUse::from_syntax_node(db, self.0.lookup(db))
30557    }
30558}
30559impl<'db> From<TerminalUsePtr<'db>> for SyntaxStablePtrId<'db> {
30560    fn from(ptr: TerminalUsePtr<'db>) -> Self {
30561        ptr.untyped()
30562    }
30563}
30564#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30565pub struct TerminalUseGreen<'db>(pub GreenId<'db>);
30566impl<'db> TypedSyntaxNode<'db> for TerminalUse<'db> {
30567    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
30568    type StablePtr = TerminalUsePtr<'db>;
30569    type Green = TerminalUseGreen<'db>;
30570    fn missing(db: &'db dyn Database) -> Self::Green {
30571        TerminalUseGreen(
30572            GreenNode {
30573                kind: SyntaxKind::TerminalUse,
30574                details: GreenNodeDetails::Node {
30575                    children: [
30576                        Trivia::missing(db).0,
30577                        TokenUse::missing(db).0,
30578                        Trivia::missing(db).0,
30579                    ]
30580                    .into(),
30581                    width: TextWidth::default(),
30582                },
30583            }
30584            .intern(db),
30585        )
30586    }
30587    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30588        let kind = node.kind(db);
30589        assert_eq!(
30590            kind,
30591            SyntaxKind::TerminalUse,
30592            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30593            kind,
30594            SyntaxKind::TerminalUse
30595        );
30596        Self { node }
30597    }
30598    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30599        let kind = node.kind(db);
30600        if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
30601    }
30602    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30603        self.node
30604    }
30605    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30606        TerminalUsePtr(self.node.stable_ptr(db))
30607    }
30608}
30609#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30610pub struct TokenPub<'db> {
30611    node: SyntaxNode<'db>,
30612}
30613impl<'db> Token<'db> for TokenPub<'db> {
30614    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30615        TokenPubGreen(
30616            GreenNode { kind: SyntaxKind::TokenPub, details: GreenNodeDetails::Token(text) }
30617                .intern(db),
30618        )
30619    }
30620    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30621        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30622    }
30623}
30624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30625pub struct TokenPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30626impl<'db> TypedStablePtr<'db> for TokenPubPtr<'db> {
30627    type SyntaxNode = TokenPub<'db>;
30628    fn untyped(self) -> SyntaxStablePtrId<'db> {
30629        self.0
30630    }
30631    fn lookup(&self, db: &'db dyn Database) -> TokenPub<'db> {
30632        TokenPub::from_syntax_node(db, self.0.lookup(db))
30633    }
30634}
30635impl<'db> From<TokenPubPtr<'db>> for SyntaxStablePtrId<'db> {
30636    fn from(ptr: TokenPubPtr<'db>) -> Self {
30637        ptr.untyped()
30638    }
30639}
30640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30641pub struct TokenPubGreen<'db>(pub GreenId<'db>);
30642impl<'db> TokenPubGreen<'db> {
30643    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30644        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30645    }
30646}
30647impl<'db> TypedSyntaxNode<'db> for TokenPub<'db> {
30648    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
30649    type StablePtr = TokenPubPtr<'db>;
30650    type Green = TokenPubGreen<'db>;
30651    fn missing(db: &'db dyn Database) -> Self::Green {
30652        TokenPubGreen(
30653            GreenNode {
30654                kind: SyntaxKind::TokenMissing,
30655                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30656            }
30657            .intern(db),
30658        )
30659    }
30660    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30661        match node.green_node(db).details {
30662            GreenNodeDetails::Token(_) => Self { node },
30663            GreenNodeDetails::Node { .. } => {
30664                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
30665            }
30666        }
30667    }
30668    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30669        match node.green_node(db).details {
30670            GreenNodeDetails::Token(_) => Some(Self { node }),
30671            GreenNodeDetails::Node { .. } => None,
30672        }
30673    }
30674    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30675        self.node
30676    }
30677    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30678        TokenPubPtr(self.node.stable_ptr(db))
30679    }
30680}
30681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30682pub struct TerminalPub<'db> {
30683    node: SyntaxNode<'db>,
30684}
30685impl<'db> Terminal<'db> for TerminalPub<'db> {
30686    const KIND: SyntaxKind = SyntaxKind::TerminalPub;
30687    type TokenType = TokenPub<'db>;
30688    fn new_green(
30689        db: &'db dyn Database,
30690        leading_trivia: TriviaGreen<'db>,
30691        token: <<TerminalPub<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30692        trailing_trivia: TriviaGreen<'db>,
30693    ) -> Self::Green {
30694        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30695        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30696        TerminalPubGreen(
30697            GreenNode {
30698                kind: SyntaxKind::TerminalPub,
30699                details: GreenNodeDetails::Node { children: children.into(), width },
30700            }
30701            .intern(db),
30702        )
30703    }
30704    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30705        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30706            unreachable!("Expected a node, not a token");
30707        };
30708        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30709    }
30710}
30711impl<'db> TerminalPub<'db> {
30712    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30713        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30714    }
30715    pub fn token(&self, db: &'db dyn Database) -> TokenPub<'db> {
30716        TokenPub::from_syntax_node(db, self.node.get_children(db)[1])
30717    }
30718    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30719        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30720    }
30721}
30722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30723pub struct TerminalPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30724impl<'db> TerminalPubPtr<'db> {}
30725impl<'db> TypedStablePtr<'db> for TerminalPubPtr<'db> {
30726    type SyntaxNode = TerminalPub<'db>;
30727    fn untyped(self) -> SyntaxStablePtrId<'db> {
30728        self.0
30729    }
30730    fn lookup(&self, db: &'db dyn Database) -> TerminalPub<'db> {
30731        TerminalPub::from_syntax_node(db, self.0.lookup(db))
30732    }
30733}
30734impl<'db> From<TerminalPubPtr<'db>> for SyntaxStablePtrId<'db> {
30735    fn from(ptr: TerminalPubPtr<'db>) -> Self {
30736        ptr.untyped()
30737    }
30738}
30739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30740pub struct TerminalPubGreen<'db>(pub GreenId<'db>);
30741impl<'db> TypedSyntaxNode<'db> for TerminalPub<'db> {
30742    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
30743    type StablePtr = TerminalPubPtr<'db>;
30744    type Green = TerminalPubGreen<'db>;
30745    fn missing(db: &'db dyn Database) -> Self::Green {
30746        TerminalPubGreen(
30747            GreenNode {
30748                kind: SyntaxKind::TerminalPub,
30749                details: GreenNodeDetails::Node {
30750                    children: [
30751                        Trivia::missing(db).0,
30752                        TokenPub::missing(db).0,
30753                        Trivia::missing(db).0,
30754                    ]
30755                    .into(),
30756                    width: TextWidth::default(),
30757                },
30758            }
30759            .intern(db),
30760        )
30761    }
30762    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30763        let kind = node.kind(db);
30764        assert_eq!(
30765            kind,
30766            SyntaxKind::TerminalPub,
30767            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30768            kind,
30769            SyntaxKind::TerminalPub
30770        );
30771        Self { node }
30772    }
30773    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30774        let kind = node.kind(db);
30775        if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
30776    }
30777    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30778        self.node
30779    }
30780    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30781        TerminalPubPtr(self.node.stable_ptr(db))
30782    }
30783}
30784#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30785pub struct TokenAnd<'db> {
30786    node: SyntaxNode<'db>,
30787}
30788impl<'db> Token<'db> for TokenAnd<'db> {
30789    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30790        TokenAndGreen(
30791            GreenNode { kind: SyntaxKind::TokenAnd, details: GreenNodeDetails::Token(text) }
30792                .intern(db),
30793        )
30794    }
30795    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30796        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30797    }
30798}
30799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30800pub struct TokenAndPtr<'db>(pub SyntaxStablePtrId<'db>);
30801impl<'db> TypedStablePtr<'db> for TokenAndPtr<'db> {
30802    type SyntaxNode = TokenAnd<'db>;
30803    fn untyped(self) -> SyntaxStablePtrId<'db> {
30804        self.0
30805    }
30806    fn lookup(&self, db: &'db dyn Database) -> TokenAnd<'db> {
30807        TokenAnd::from_syntax_node(db, self.0.lookup(db))
30808    }
30809}
30810impl<'db> From<TokenAndPtr<'db>> for SyntaxStablePtrId<'db> {
30811    fn from(ptr: TokenAndPtr<'db>) -> Self {
30812        ptr.untyped()
30813    }
30814}
30815#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30816pub struct TokenAndGreen<'db>(pub GreenId<'db>);
30817impl<'db> TokenAndGreen<'db> {
30818    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30819        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30820    }
30821}
30822impl<'db> TypedSyntaxNode<'db> for TokenAnd<'db> {
30823    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
30824    type StablePtr = TokenAndPtr<'db>;
30825    type Green = TokenAndGreen<'db>;
30826    fn missing(db: &'db dyn Database) -> Self::Green {
30827        TokenAndGreen(
30828            GreenNode {
30829                kind: SyntaxKind::TokenMissing,
30830                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30831            }
30832            .intern(db),
30833        )
30834    }
30835    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30836        match node.green_node(db).details {
30837            GreenNodeDetails::Token(_) => Self { node },
30838            GreenNodeDetails::Node { .. } => {
30839                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
30840            }
30841        }
30842    }
30843    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30844        match node.green_node(db).details {
30845            GreenNodeDetails::Token(_) => Some(Self { node }),
30846            GreenNodeDetails::Node { .. } => None,
30847        }
30848    }
30849    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30850        self.node
30851    }
30852    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30853        TokenAndPtr(self.node.stable_ptr(db))
30854    }
30855}
30856#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30857pub struct TerminalAnd<'db> {
30858    node: SyntaxNode<'db>,
30859}
30860impl<'db> Terminal<'db> for TerminalAnd<'db> {
30861    const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
30862    type TokenType = TokenAnd<'db>;
30863    fn new_green(
30864        db: &'db dyn Database,
30865        leading_trivia: TriviaGreen<'db>,
30866        token: <<TerminalAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30867        trailing_trivia: TriviaGreen<'db>,
30868    ) -> Self::Green {
30869        let children = [leading_trivia.0, token.0, trailing_trivia.0];
30870        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30871        TerminalAndGreen(
30872            GreenNode {
30873                kind: SyntaxKind::TerminalAnd,
30874                details: GreenNodeDetails::Node { children: children.into(), width },
30875            }
30876            .intern(db),
30877        )
30878    }
30879    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30880        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30881            unreachable!("Expected a node, not a token");
30882        };
30883        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30884    }
30885}
30886impl<'db> TerminalAnd<'db> {
30887    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30888        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30889    }
30890    pub fn token(&self, db: &'db dyn Database) -> TokenAnd<'db> {
30891        TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
30892    }
30893    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30894        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30895    }
30896}
30897#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30898pub struct TerminalAndPtr<'db>(pub SyntaxStablePtrId<'db>);
30899impl<'db> TerminalAndPtr<'db> {}
30900impl<'db> TypedStablePtr<'db> for TerminalAndPtr<'db> {
30901    type SyntaxNode = TerminalAnd<'db>;
30902    fn untyped(self) -> SyntaxStablePtrId<'db> {
30903        self.0
30904    }
30905    fn lookup(&self, db: &'db dyn Database) -> TerminalAnd<'db> {
30906        TerminalAnd::from_syntax_node(db, self.0.lookup(db))
30907    }
30908}
30909impl<'db> From<TerminalAndPtr<'db>> for SyntaxStablePtrId<'db> {
30910    fn from(ptr: TerminalAndPtr<'db>) -> Self {
30911        ptr.untyped()
30912    }
30913}
30914#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30915pub struct TerminalAndGreen<'db>(pub GreenId<'db>);
30916impl<'db> TypedSyntaxNode<'db> for TerminalAnd<'db> {
30917    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
30918    type StablePtr = TerminalAndPtr<'db>;
30919    type Green = TerminalAndGreen<'db>;
30920    fn missing(db: &'db dyn Database) -> Self::Green {
30921        TerminalAndGreen(
30922            GreenNode {
30923                kind: SyntaxKind::TerminalAnd,
30924                details: GreenNodeDetails::Node {
30925                    children: [
30926                        Trivia::missing(db).0,
30927                        TokenAnd::missing(db).0,
30928                        Trivia::missing(db).0,
30929                    ]
30930                    .into(),
30931                    width: TextWidth::default(),
30932                },
30933            }
30934            .intern(db),
30935        )
30936    }
30937    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30938        let kind = node.kind(db);
30939        assert_eq!(
30940            kind,
30941            SyntaxKind::TerminalAnd,
30942            "Unexpected SyntaxKind {:?}. Expected {:?}.",
30943            kind,
30944            SyntaxKind::TerminalAnd
30945        );
30946        Self { node }
30947    }
30948    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30949        let kind = node.kind(db);
30950        if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
30951    }
30952    fn as_syntax_node(&self) -> SyntaxNode<'db> {
30953        self.node
30954    }
30955    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30956        TerminalAndPtr(self.node.stable_ptr(db))
30957    }
30958}
30959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30960pub struct TokenAndAnd<'db> {
30961    node: SyntaxNode<'db>,
30962}
30963impl<'db> Token<'db> for TokenAndAnd<'db> {
30964    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30965        TokenAndAndGreen(
30966            GreenNode { kind: SyntaxKind::TokenAndAnd, details: GreenNodeDetails::Token(text) }
30967                .intern(db),
30968        )
30969    }
30970    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30971        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30972    }
30973}
30974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
30975pub struct TokenAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
30976impl<'db> TypedStablePtr<'db> for TokenAndAndPtr<'db> {
30977    type SyntaxNode = TokenAndAnd<'db>;
30978    fn untyped(self) -> SyntaxStablePtrId<'db> {
30979        self.0
30980    }
30981    fn lookup(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
30982        TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
30983    }
30984}
30985impl<'db> From<TokenAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
30986    fn from(ptr: TokenAndAndPtr<'db>) -> Self {
30987        ptr.untyped()
30988    }
30989}
30990#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30991pub struct TokenAndAndGreen<'db>(pub GreenId<'db>);
30992impl<'db> TokenAndAndGreen<'db> {
30993    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30994        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30995    }
30996}
30997impl<'db> TypedSyntaxNode<'db> for TokenAndAnd<'db> {
30998    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
30999    type StablePtr = TokenAndAndPtr<'db>;
31000    type Green = TokenAndAndGreen<'db>;
31001    fn missing(db: &'db dyn Database) -> Self::Green {
31002        TokenAndAndGreen(
31003            GreenNode {
31004                kind: SyntaxKind::TokenMissing,
31005                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31006            }
31007            .intern(db),
31008        )
31009    }
31010    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31011        match node.green_node(db).details {
31012            GreenNodeDetails::Token(_) => Self { node },
31013            GreenNodeDetails::Node { .. } => {
31014                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31015            }
31016        }
31017    }
31018    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31019        match node.green_node(db).details {
31020            GreenNodeDetails::Token(_) => Some(Self { node }),
31021            GreenNodeDetails::Node { .. } => None,
31022        }
31023    }
31024    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31025        self.node
31026    }
31027    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31028        TokenAndAndPtr(self.node.stable_ptr(db))
31029    }
31030}
31031#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31032pub struct TerminalAndAnd<'db> {
31033    node: SyntaxNode<'db>,
31034}
31035impl<'db> Terminal<'db> for TerminalAndAnd<'db> {
31036    const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31037    type TokenType = TokenAndAnd<'db>;
31038    fn new_green(
31039        db: &'db dyn Database,
31040        leading_trivia: TriviaGreen<'db>,
31041        token: <<TerminalAndAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31042        trailing_trivia: TriviaGreen<'db>,
31043    ) -> Self::Green {
31044        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31045        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31046        TerminalAndAndGreen(
31047            GreenNode {
31048                kind: SyntaxKind::TerminalAndAnd,
31049                details: GreenNodeDetails::Node { children: children.into(), width },
31050            }
31051            .intern(db),
31052        )
31053    }
31054    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31055        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31056            unreachable!("Expected a node, not a token");
31057        };
31058        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31059    }
31060}
31061impl<'db> TerminalAndAnd<'db> {
31062    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31063        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31064    }
31065    pub fn token(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31066        TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31067    }
31068    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31069        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31070    }
31071}
31072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31073pub struct TerminalAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31074impl<'db> TerminalAndAndPtr<'db> {}
31075impl<'db> TypedStablePtr<'db> for TerminalAndAndPtr<'db> {
31076    type SyntaxNode = TerminalAndAnd<'db>;
31077    fn untyped(self) -> SyntaxStablePtrId<'db> {
31078        self.0
31079    }
31080    fn lookup(&self, db: &'db dyn Database) -> TerminalAndAnd<'db> {
31081        TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31082    }
31083}
31084impl<'db> From<TerminalAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31085    fn from(ptr: TerminalAndAndPtr<'db>) -> Self {
31086        ptr.untyped()
31087    }
31088}
31089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31090pub struct TerminalAndAndGreen<'db>(pub GreenId<'db>);
31091impl<'db> TypedSyntaxNode<'db> for TerminalAndAnd<'db> {
31092    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31093    type StablePtr = TerminalAndAndPtr<'db>;
31094    type Green = TerminalAndAndGreen<'db>;
31095    fn missing(db: &'db dyn Database) -> Self::Green {
31096        TerminalAndAndGreen(
31097            GreenNode {
31098                kind: SyntaxKind::TerminalAndAnd,
31099                details: GreenNodeDetails::Node {
31100                    children: [
31101                        Trivia::missing(db).0,
31102                        TokenAndAnd::missing(db).0,
31103                        Trivia::missing(db).0,
31104                    ]
31105                    .into(),
31106                    width: TextWidth::default(),
31107                },
31108            }
31109            .intern(db),
31110        )
31111    }
31112    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31113        let kind = node.kind(db);
31114        assert_eq!(
31115            kind,
31116            SyntaxKind::TerminalAndAnd,
31117            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31118            kind,
31119            SyntaxKind::TerminalAndAnd
31120        );
31121        Self { node }
31122    }
31123    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31124        let kind = node.kind(db);
31125        if kind == SyntaxKind::TerminalAndAnd {
31126            Some(Self::from_syntax_node(db, node))
31127        } else {
31128            None
31129        }
31130    }
31131    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31132        self.node
31133    }
31134    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31135        TerminalAndAndPtr(self.node.stable_ptr(db))
31136    }
31137}
31138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31139pub struct TokenArrow<'db> {
31140    node: SyntaxNode<'db>,
31141}
31142impl<'db> Token<'db> for TokenArrow<'db> {
31143    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31144        TokenArrowGreen(
31145            GreenNode { kind: SyntaxKind::TokenArrow, details: GreenNodeDetails::Token(text) }
31146                .intern(db),
31147        )
31148    }
31149    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31150        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31151    }
31152}
31153#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31154pub struct TokenArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31155impl<'db> TypedStablePtr<'db> for TokenArrowPtr<'db> {
31156    type SyntaxNode = TokenArrow<'db>;
31157    fn untyped(self) -> SyntaxStablePtrId<'db> {
31158        self.0
31159    }
31160    fn lookup(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31161        TokenArrow::from_syntax_node(db, self.0.lookup(db))
31162    }
31163}
31164impl<'db> From<TokenArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31165    fn from(ptr: TokenArrowPtr<'db>) -> Self {
31166        ptr.untyped()
31167    }
31168}
31169#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31170pub struct TokenArrowGreen<'db>(pub GreenId<'db>);
31171impl<'db> TokenArrowGreen<'db> {
31172    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31173        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31174    }
31175}
31176impl<'db> TypedSyntaxNode<'db> for TokenArrow<'db> {
31177    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31178    type StablePtr = TokenArrowPtr<'db>;
31179    type Green = TokenArrowGreen<'db>;
31180    fn missing(db: &'db dyn Database) -> Self::Green {
31181        TokenArrowGreen(
31182            GreenNode {
31183                kind: SyntaxKind::TokenMissing,
31184                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31185            }
31186            .intern(db),
31187        )
31188    }
31189    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31190        match node.green_node(db).details {
31191            GreenNodeDetails::Token(_) => Self { node },
31192            GreenNodeDetails::Node { .. } => {
31193                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31194            }
31195        }
31196    }
31197    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31198        match node.green_node(db).details {
31199            GreenNodeDetails::Token(_) => Some(Self { node }),
31200            GreenNodeDetails::Node { .. } => None,
31201        }
31202    }
31203    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31204        self.node
31205    }
31206    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31207        TokenArrowPtr(self.node.stable_ptr(db))
31208    }
31209}
31210#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31211pub struct TerminalArrow<'db> {
31212    node: SyntaxNode<'db>,
31213}
31214impl<'db> Terminal<'db> for TerminalArrow<'db> {
31215    const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31216    type TokenType = TokenArrow<'db>;
31217    fn new_green(
31218        db: &'db dyn Database,
31219        leading_trivia: TriviaGreen<'db>,
31220        token: <<TerminalArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31221        trailing_trivia: TriviaGreen<'db>,
31222    ) -> Self::Green {
31223        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31224        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31225        TerminalArrowGreen(
31226            GreenNode {
31227                kind: SyntaxKind::TerminalArrow,
31228                details: GreenNodeDetails::Node { children: children.into(), width },
31229            }
31230            .intern(db),
31231        )
31232    }
31233    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31234        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31235            unreachable!("Expected a node, not a token");
31236        };
31237        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31238    }
31239}
31240impl<'db> TerminalArrow<'db> {
31241    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31242        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31243    }
31244    pub fn token(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31245        TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31246    }
31247    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31248        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31249    }
31250}
31251#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31252pub struct TerminalArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31253impl<'db> TerminalArrowPtr<'db> {}
31254impl<'db> TypedStablePtr<'db> for TerminalArrowPtr<'db> {
31255    type SyntaxNode = TerminalArrow<'db>;
31256    fn untyped(self) -> SyntaxStablePtrId<'db> {
31257        self.0
31258    }
31259    fn lookup(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
31260        TerminalArrow::from_syntax_node(db, self.0.lookup(db))
31261    }
31262}
31263impl<'db> From<TerminalArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31264    fn from(ptr: TerminalArrowPtr<'db>) -> Self {
31265        ptr.untyped()
31266    }
31267}
31268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31269pub struct TerminalArrowGreen<'db>(pub GreenId<'db>);
31270impl<'db> TypedSyntaxNode<'db> for TerminalArrow<'db> {
31271    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
31272    type StablePtr = TerminalArrowPtr<'db>;
31273    type Green = TerminalArrowGreen<'db>;
31274    fn missing(db: &'db dyn Database) -> Self::Green {
31275        TerminalArrowGreen(
31276            GreenNode {
31277                kind: SyntaxKind::TerminalArrow,
31278                details: GreenNodeDetails::Node {
31279                    children: [
31280                        Trivia::missing(db).0,
31281                        TokenArrow::missing(db).0,
31282                        Trivia::missing(db).0,
31283                    ]
31284                    .into(),
31285                    width: TextWidth::default(),
31286                },
31287            }
31288            .intern(db),
31289        )
31290    }
31291    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31292        let kind = node.kind(db);
31293        assert_eq!(
31294            kind,
31295            SyntaxKind::TerminalArrow,
31296            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31297            kind,
31298            SyntaxKind::TerminalArrow
31299        );
31300        Self { node }
31301    }
31302    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31303        let kind = node.kind(db);
31304        if kind == SyntaxKind::TerminalArrow {
31305            Some(Self::from_syntax_node(db, node))
31306        } else {
31307            None
31308        }
31309    }
31310    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31311        self.node
31312    }
31313    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31314        TerminalArrowPtr(self.node.stable_ptr(db))
31315    }
31316}
31317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31318pub struct TokenAt<'db> {
31319    node: SyntaxNode<'db>,
31320}
31321impl<'db> Token<'db> for TokenAt<'db> {
31322    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31323        TokenAtGreen(
31324            GreenNode { kind: SyntaxKind::TokenAt, details: GreenNodeDetails::Token(text) }
31325                .intern(db),
31326        )
31327    }
31328    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31329        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31330    }
31331}
31332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31333pub struct TokenAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31334impl<'db> TypedStablePtr<'db> for TokenAtPtr<'db> {
31335    type SyntaxNode = TokenAt<'db>;
31336    fn untyped(self) -> SyntaxStablePtrId<'db> {
31337        self.0
31338    }
31339    fn lookup(&self, db: &'db dyn Database) -> TokenAt<'db> {
31340        TokenAt::from_syntax_node(db, self.0.lookup(db))
31341    }
31342}
31343impl<'db> From<TokenAtPtr<'db>> for SyntaxStablePtrId<'db> {
31344    fn from(ptr: TokenAtPtr<'db>) -> Self {
31345        ptr.untyped()
31346    }
31347}
31348#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31349pub struct TokenAtGreen<'db>(pub GreenId<'db>);
31350impl<'db> TokenAtGreen<'db> {
31351    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31352        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31353    }
31354}
31355impl<'db> TypedSyntaxNode<'db> for TokenAt<'db> {
31356    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
31357    type StablePtr = TokenAtPtr<'db>;
31358    type Green = TokenAtGreen<'db>;
31359    fn missing(db: &'db dyn Database) -> Self::Green {
31360        TokenAtGreen(
31361            GreenNode {
31362                kind: SyntaxKind::TokenMissing,
31363                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31364            }
31365            .intern(db),
31366        )
31367    }
31368    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31369        match node.green_node(db).details {
31370            GreenNodeDetails::Token(_) => Self { node },
31371            GreenNodeDetails::Node { .. } => {
31372                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
31373            }
31374        }
31375    }
31376    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31377        match node.green_node(db).details {
31378            GreenNodeDetails::Token(_) => Some(Self { node }),
31379            GreenNodeDetails::Node { .. } => None,
31380        }
31381    }
31382    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31383        self.node
31384    }
31385    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31386        TokenAtPtr(self.node.stable_ptr(db))
31387    }
31388}
31389#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31390pub struct TerminalAt<'db> {
31391    node: SyntaxNode<'db>,
31392}
31393impl<'db> Terminal<'db> for TerminalAt<'db> {
31394    const KIND: SyntaxKind = SyntaxKind::TerminalAt;
31395    type TokenType = TokenAt<'db>;
31396    fn new_green(
31397        db: &'db dyn Database,
31398        leading_trivia: TriviaGreen<'db>,
31399        token: <<TerminalAt<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31400        trailing_trivia: TriviaGreen<'db>,
31401    ) -> Self::Green {
31402        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31403        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31404        TerminalAtGreen(
31405            GreenNode {
31406                kind: SyntaxKind::TerminalAt,
31407                details: GreenNodeDetails::Node { children: children.into(), width },
31408            }
31409            .intern(db),
31410        )
31411    }
31412    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31413        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31414            unreachable!("Expected a node, not a token");
31415        };
31416        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31417    }
31418}
31419impl<'db> TerminalAt<'db> {
31420    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31421        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31422    }
31423    pub fn token(&self, db: &'db dyn Database) -> TokenAt<'db> {
31424        TokenAt::from_syntax_node(db, self.node.get_children(db)[1])
31425    }
31426    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31427        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31428    }
31429}
31430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31431pub struct TerminalAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31432impl<'db> TerminalAtPtr<'db> {}
31433impl<'db> TypedStablePtr<'db> for TerminalAtPtr<'db> {
31434    type SyntaxNode = TerminalAt<'db>;
31435    fn untyped(self) -> SyntaxStablePtrId<'db> {
31436        self.0
31437    }
31438    fn lookup(&self, db: &'db dyn Database) -> TerminalAt<'db> {
31439        TerminalAt::from_syntax_node(db, self.0.lookup(db))
31440    }
31441}
31442impl<'db> From<TerminalAtPtr<'db>> for SyntaxStablePtrId<'db> {
31443    fn from(ptr: TerminalAtPtr<'db>) -> Self {
31444        ptr.untyped()
31445    }
31446}
31447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31448pub struct TerminalAtGreen<'db>(pub GreenId<'db>);
31449impl<'db> TypedSyntaxNode<'db> for TerminalAt<'db> {
31450    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
31451    type StablePtr = TerminalAtPtr<'db>;
31452    type Green = TerminalAtGreen<'db>;
31453    fn missing(db: &'db dyn Database) -> Self::Green {
31454        TerminalAtGreen(
31455            GreenNode {
31456                kind: SyntaxKind::TerminalAt,
31457                details: GreenNodeDetails::Node {
31458                    children: [
31459                        Trivia::missing(db).0,
31460                        TokenAt::missing(db).0,
31461                        Trivia::missing(db).0,
31462                    ]
31463                    .into(),
31464                    width: TextWidth::default(),
31465                },
31466            }
31467            .intern(db),
31468        )
31469    }
31470    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31471        let kind = node.kind(db);
31472        assert_eq!(
31473            kind,
31474            SyntaxKind::TerminalAt,
31475            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31476            kind,
31477            SyntaxKind::TerminalAt
31478        );
31479        Self { node }
31480    }
31481    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31482        let kind = node.kind(db);
31483        if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
31484    }
31485    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31486        self.node
31487    }
31488    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31489        TerminalAtPtr(self.node.stable_ptr(db))
31490    }
31491}
31492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31493pub struct TokenBadCharacters<'db> {
31494    node: SyntaxNode<'db>,
31495}
31496impl<'db> Token<'db> for TokenBadCharacters<'db> {
31497    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31498        TokenBadCharactersGreen(
31499            GreenNode {
31500                kind: SyntaxKind::TokenBadCharacters,
31501                details: GreenNodeDetails::Token(text),
31502            }
31503            .intern(db),
31504        )
31505    }
31506    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31507        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31508    }
31509}
31510#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31511pub struct TokenBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31512impl<'db> TypedStablePtr<'db> for TokenBadCharactersPtr<'db> {
31513    type SyntaxNode = TokenBadCharacters<'db>;
31514    fn untyped(self) -> SyntaxStablePtrId<'db> {
31515        self.0
31516    }
31517    fn lookup(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31518        TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
31519    }
31520}
31521impl<'db> From<TokenBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31522    fn from(ptr: TokenBadCharactersPtr<'db>) -> Self {
31523        ptr.untyped()
31524    }
31525}
31526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31527pub struct TokenBadCharactersGreen<'db>(pub GreenId<'db>);
31528impl<'db> TokenBadCharactersGreen<'db> {
31529    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31530        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31531    }
31532}
31533impl<'db> TypedSyntaxNode<'db> for TokenBadCharacters<'db> {
31534    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
31535    type StablePtr = TokenBadCharactersPtr<'db>;
31536    type Green = TokenBadCharactersGreen<'db>;
31537    fn missing(db: &'db dyn Database) -> Self::Green {
31538        TokenBadCharactersGreen(
31539            GreenNode {
31540                kind: SyntaxKind::TokenMissing,
31541                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31542            }
31543            .intern(db),
31544        )
31545    }
31546    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31547        match node.green_node(db).details {
31548            GreenNodeDetails::Token(_) => Self { node },
31549            GreenNodeDetails::Node { .. } => panic!(
31550                "Expected a token {:?}, not an internal node",
31551                SyntaxKind::TokenBadCharacters
31552            ),
31553        }
31554    }
31555    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31556        match node.green_node(db).details {
31557            GreenNodeDetails::Token(_) => Some(Self { node }),
31558            GreenNodeDetails::Node { .. } => None,
31559        }
31560    }
31561    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31562        self.node
31563    }
31564    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31565        TokenBadCharactersPtr(self.node.stable_ptr(db))
31566    }
31567}
31568#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31569pub struct TerminalBadCharacters<'db> {
31570    node: SyntaxNode<'db>,
31571}
31572impl<'db> Terminal<'db> for TerminalBadCharacters<'db> {
31573    const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
31574    type TokenType = TokenBadCharacters<'db>;
31575    fn new_green(
31576        db: &'db dyn Database,
31577        leading_trivia: TriviaGreen<'db>,
31578        token: <<TerminalBadCharacters<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31579        trailing_trivia: TriviaGreen<'db>,
31580    ) -> Self::Green {
31581        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31582        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31583        TerminalBadCharactersGreen(
31584            GreenNode {
31585                kind: SyntaxKind::TerminalBadCharacters,
31586                details: GreenNodeDetails::Node { children: children.into(), width },
31587            }
31588            .intern(db),
31589        )
31590    }
31591    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31592        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31593            unreachable!("Expected a node, not a token");
31594        };
31595        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31596    }
31597}
31598impl<'db> TerminalBadCharacters<'db> {
31599    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31600        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31601    }
31602    pub fn token(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31603        TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
31604    }
31605    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31606        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31607    }
31608}
31609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31610pub struct TerminalBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31611impl<'db> TerminalBadCharactersPtr<'db> {}
31612impl<'db> TypedStablePtr<'db> for TerminalBadCharactersPtr<'db> {
31613    type SyntaxNode = TerminalBadCharacters<'db>;
31614    fn untyped(self) -> SyntaxStablePtrId<'db> {
31615        self.0
31616    }
31617    fn lookup(&self, db: &'db dyn Database) -> TerminalBadCharacters<'db> {
31618        TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
31619    }
31620}
31621impl<'db> From<TerminalBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31622    fn from(ptr: TerminalBadCharactersPtr<'db>) -> Self {
31623        ptr.untyped()
31624    }
31625}
31626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31627pub struct TerminalBadCharactersGreen<'db>(pub GreenId<'db>);
31628impl<'db> TypedSyntaxNode<'db> for TerminalBadCharacters<'db> {
31629    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
31630    type StablePtr = TerminalBadCharactersPtr<'db>;
31631    type Green = TerminalBadCharactersGreen<'db>;
31632    fn missing(db: &'db dyn Database) -> Self::Green {
31633        TerminalBadCharactersGreen(
31634            GreenNode {
31635                kind: SyntaxKind::TerminalBadCharacters,
31636                details: GreenNodeDetails::Node {
31637                    children: [
31638                        Trivia::missing(db).0,
31639                        TokenBadCharacters::missing(db).0,
31640                        Trivia::missing(db).0,
31641                    ]
31642                    .into(),
31643                    width: TextWidth::default(),
31644                },
31645            }
31646            .intern(db),
31647        )
31648    }
31649    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31650        let kind = node.kind(db);
31651        assert_eq!(
31652            kind,
31653            SyntaxKind::TerminalBadCharacters,
31654            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31655            kind,
31656            SyntaxKind::TerminalBadCharacters
31657        );
31658        Self { node }
31659    }
31660    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31661        let kind = node.kind(db);
31662        if kind == SyntaxKind::TerminalBadCharacters {
31663            Some(Self::from_syntax_node(db, node))
31664        } else {
31665            None
31666        }
31667    }
31668    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31669        self.node
31670    }
31671    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31672        TerminalBadCharactersPtr(self.node.stable_ptr(db))
31673    }
31674}
31675#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31676pub struct TokenColon<'db> {
31677    node: SyntaxNode<'db>,
31678}
31679impl<'db> Token<'db> for TokenColon<'db> {
31680    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31681        TokenColonGreen(
31682            GreenNode { kind: SyntaxKind::TokenColon, details: GreenNodeDetails::Token(text) }
31683                .intern(db),
31684        )
31685    }
31686    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31687        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31688    }
31689}
31690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31691pub struct TokenColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31692impl<'db> TypedStablePtr<'db> for TokenColonPtr<'db> {
31693    type SyntaxNode = TokenColon<'db>;
31694    fn untyped(self) -> SyntaxStablePtrId<'db> {
31695        self.0
31696    }
31697    fn lookup(&self, db: &'db dyn Database) -> TokenColon<'db> {
31698        TokenColon::from_syntax_node(db, self.0.lookup(db))
31699    }
31700}
31701impl<'db> From<TokenColonPtr<'db>> for SyntaxStablePtrId<'db> {
31702    fn from(ptr: TokenColonPtr<'db>) -> Self {
31703        ptr.untyped()
31704    }
31705}
31706#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31707pub struct TokenColonGreen<'db>(pub GreenId<'db>);
31708impl<'db> TokenColonGreen<'db> {
31709    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31710        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31711    }
31712}
31713impl<'db> TypedSyntaxNode<'db> for TokenColon<'db> {
31714    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
31715    type StablePtr = TokenColonPtr<'db>;
31716    type Green = TokenColonGreen<'db>;
31717    fn missing(db: &'db dyn Database) -> Self::Green {
31718        TokenColonGreen(
31719            GreenNode {
31720                kind: SyntaxKind::TokenMissing,
31721                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31722            }
31723            .intern(db),
31724        )
31725    }
31726    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31727        match node.green_node(db).details {
31728            GreenNodeDetails::Token(_) => Self { node },
31729            GreenNodeDetails::Node { .. } => {
31730                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
31731            }
31732        }
31733    }
31734    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31735        match node.green_node(db).details {
31736            GreenNodeDetails::Token(_) => Some(Self { node }),
31737            GreenNodeDetails::Node { .. } => 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        TokenColonPtr(self.node.stable_ptr(db))
31745    }
31746}
31747#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31748pub struct TerminalColon<'db> {
31749    node: SyntaxNode<'db>,
31750}
31751impl<'db> Terminal<'db> for TerminalColon<'db> {
31752    const KIND: SyntaxKind = SyntaxKind::TerminalColon;
31753    type TokenType = TokenColon<'db>;
31754    fn new_green(
31755        db: &'db dyn Database,
31756        leading_trivia: TriviaGreen<'db>,
31757        token: <<TerminalColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31758        trailing_trivia: TriviaGreen<'db>,
31759    ) -> Self::Green {
31760        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31761        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31762        TerminalColonGreen(
31763            GreenNode {
31764                kind: SyntaxKind::TerminalColon,
31765                details: GreenNodeDetails::Node { children: children.into(), width },
31766            }
31767            .intern(db),
31768        )
31769    }
31770    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31771        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31772            unreachable!("Expected a node, not a token");
31773        };
31774        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31775    }
31776}
31777impl<'db> TerminalColon<'db> {
31778    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31779        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31780    }
31781    pub fn token(&self, db: &'db dyn Database) -> TokenColon<'db> {
31782        TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
31783    }
31784    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31785        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31786    }
31787}
31788#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31789pub struct TerminalColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31790impl<'db> TerminalColonPtr<'db> {}
31791impl<'db> TypedStablePtr<'db> for TerminalColonPtr<'db> {
31792    type SyntaxNode = TerminalColon<'db>;
31793    fn untyped(self) -> SyntaxStablePtrId<'db> {
31794        self.0
31795    }
31796    fn lookup(&self, db: &'db dyn Database) -> TerminalColon<'db> {
31797        TerminalColon::from_syntax_node(db, self.0.lookup(db))
31798    }
31799}
31800impl<'db> From<TerminalColonPtr<'db>> for SyntaxStablePtrId<'db> {
31801    fn from(ptr: TerminalColonPtr<'db>) -> Self {
31802        ptr.untyped()
31803    }
31804}
31805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31806pub struct TerminalColonGreen<'db>(pub GreenId<'db>);
31807impl<'db> TypedSyntaxNode<'db> for TerminalColon<'db> {
31808    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
31809    type StablePtr = TerminalColonPtr<'db>;
31810    type Green = TerminalColonGreen<'db>;
31811    fn missing(db: &'db dyn Database) -> Self::Green {
31812        TerminalColonGreen(
31813            GreenNode {
31814                kind: SyntaxKind::TerminalColon,
31815                details: GreenNodeDetails::Node {
31816                    children: [
31817                        Trivia::missing(db).0,
31818                        TokenColon::missing(db).0,
31819                        Trivia::missing(db).0,
31820                    ]
31821                    .into(),
31822                    width: TextWidth::default(),
31823                },
31824            }
31825            .intern(db),
31826        )
31827    }
31828    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31829        let kind = node.kind(db);
31830        assert_eq!(
31831            kind,
31832            SyntaxKind::TerminalColon,
31833            "Unexpected SyntaxKind {:?}. Expected {:?}.",
31834            kind,
31835            SyntaxKind::TerminalColon
31836        );
31837        Self { node }
31838    }
31839    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31840        let kind = node.kind(db);
31841        if kind == SyntaxKind::TerminalColon {
31842            Some(Self::from_syntax_node(db, node))
31843        } else {
31844            None
31845        }
31846    }
31847    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31848        self.node
31849    }
31850    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31851        TerminalColonPtr(self.node.stable_ptr(db))
31852    }
31853}
31854#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31855pub struct TokenColonColon<'db> {
31856    node: SyntaxNode<'db>,
31857}
31858impl<'db> Token<'db> for TokenColonColon<'db> {
31859    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31860        TokenColonColonGreen(
31861            GreenNode { kind: SyntaxKind::TokenColonColon, details: GreenNodeDetails::Token(text) }
31862                .intern(db),
31863        )
31864    }
31865    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31866        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31867    }
31868}
31869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31870pub struct TokenColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31871impl<'db> TypedStablePtr<'db> for TokenColonColonPtr<'db> {
31872    type SyntaxNode = TokenColonColon<'db>;
31873    fn untyped(self) -> SyntaxStablePtrId<'db> {
31874        self.0
31875    }
31876    fn lookup(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
31877        TokenColonColon::from_syntax_node(db, self.0.lookup(db))
31878    }
31879}
31880impl<'db> From<TokenColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
31881    fn from(ptr: TokenColonColonPtr<'db>) -> Self {
31882        ptr.untyped()
31883    }
31884}
31885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31886pub struct TokenColonColonGreen<'db>(pub GreenId<'db>);
31887impl<'db> TokenColonColonGreen<'db> {
31888    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31889        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31890    }
31891}
31892impl<'db> TypedSyntaxNode<'db> for TokenColonColon<'db> {
31893    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
31894    type StablePtr = TokenColonColonPtr<'db>;
31895    type Green = TokenColonColonGreen<'db>;
31896    fn missing(db: &'db dyn Database) -> Self::Green {
31897        TokenColonColonGreen(
31898            GreenNode {
31899                kind: SyntaxKind::TokenMissing,
31900                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31901            }
31902            .intern(db),
31903        )
31904    }
31905    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31906        match node.green_node(db).details {
31907            GreenNodeDetails::Token(_) => Self { node },
31908            GreenNodeDetails::Node { .. } => {
31909                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
31910            }
31911        }
31912    }
31913    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31914        match node.green_node(db).details {
31915            GreenNodeDetails::Token(_) => Some(Self { node }),
31916            GreenNodeDetails::Node { .. } => None,
31917        }
31918    }
31919    fn as_syntax_node(&self) -> SyntaxNode<'db> {
31920        self.node
31921    }
31922    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31923        TokenColonColonPtr(self.node.stable_ptr(db))
31924    }
31925}
31926#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31927pub struct TerminalColonColon<'db> {
31928    node: SyntaxNode<'db>,
31929}
31930impl<'db> Terminal<'db> for TerminalColonColon<'db> {
31931    const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
31932    type TokenType = TokenColonColon<'db>;
31933    fn new_green(
31934        db: &'db dyn Database,
31935        leading_trivia: TriviaGreen<'db>,
31936        token: <<TerminalColonColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31937        trailing_trivia: TriviaGreen<'db>,
31938    ) -> Self::Green {
31939        let children = [leading_trivia.0, token.0, trailing_trivia.0];
31940        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31941        TerminalColonColonGreen(
31942            GreenNode {
31943                kind: SyntaxKind::TerminalColonColon,
31944                details: GreenNodeDetails::Node { children: children.into(), width },
31945            }
31946            .intern(db),
31947        )
31948    }
31949    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31950        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31951            unreachable!("Expected a node, not a token");
31952        };
31953        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31954    }
31955}
31956impl<'db> TerminalColonColon<'db> {
31957    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31958        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31959    }
31960    pub fn token(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
31961        TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
31962    }
31963    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31964        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31965    }
31966}
31967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
31968pub struct TerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31969impl<'db> TerminalColonColonPtr<'db> {}
31970impl<'db> TypedStablePtr<'db> for TerminalColonColonPtr<'db> {
31971    type SyntaxNode = TerminalColonColon<'db>;
31972    fn untyped(self) -> SyntaxStablePtrId<'db> {
31973        self.0
31974    }
31975    fn lookup(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
31976        TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
31977    }
31978}
31979impl<'db> From<TerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
31980    fn from(ptr: TerminalColonColonPtr<'db>) -> Self {
31981        ptr.untyped()
31982    }
31983}
31984#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31985pub struct TerminalColonColonGreen<'db>(pub GreenId<'db>);
31986impl<'db> TypedSyntaxNode<'db> for TerminalColonColon<'db> {
31987    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
31988    type StablePtr = TerminalColonColonPtr<'db>;
31989    type Green = TerminalColonColonGreen<'db>;
31990    fn missing(db: &'db dyn Database) -> Self::Green {
31991        TerminalColonColonGreen(
31992            GreenNode {
31993                kind: SyntaxKind::TerminalColonColon,
31994                details: GreenNodeDetails::Node {
31995                    children: [
31996                        Trivia::missing(db).0,
31997                        TokenColonColon::missing(db).0,
31998                        Trivia::missing(db).0,
31999                    ]
32000                    .into(),
32001                    width: TextWidth::default(),
32002                },
32003            }
32004            .intern(db),
32005        )
32006    }
32007    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32008        let kind = node.kind(db);
32009        assert_eq!(
32010            kind,
32011            SyntaxKind::TerminalColonColon,
32012            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32013            kind,
32014            SyntaxKind::TerminalColonColon
32015        );
32016        Self { node }
32017    }
32018    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32019        let kind = node.kind(db);
32020        if kind == SyntaxKind::TerminalColonColon {
32021            Some(Self::from_syntax_node(db, node))
32022        } else {
32023            None
32024        }
32025    }
32026    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32027        self.node
32028    }
32029    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32030        TerminalColonColonPtr(self.node.stable_ptr(db))
32031    }
32032}
32033#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32034pub struct TokenComma<'db> {
32035    node: SyntaxNode<'db>,
32036}
32037impl<'db> Token<'db> for TokenComma<'db> {
32038    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32039        TokenCommaGreen(
32040            GreenNode { kind: SyntaxKind::TokenComma, details: GreenNodeDetails::Token(text) }
32041                .intern(db),
32042        )
32043    }
32044    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32045        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32046    }
32047}
32048#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32049pub struct TokenCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32050impl<'db> TypedStablePtr<'db> for TokenCommaPtr<'db> {
32051    type SyntaxNode = TokenComma<'db>;
32052    fn untyped(self) -> SyntaxStablePtrId<'db> {
32053        self.0
32054    }
32055    fn lookup(&self, db: &'db dyn Database) -> TokenComma<'db> {
32056        TokenComma::from_syntax_node(db, self.0.lookup(db))
32057    }
32058}
32059impl<'db> From<TokenCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32060    fn from(ptr: TokenCommaPtr<'db>) -> Self {
32061        ptr.untyped()
32062    }
32063}
32064#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32065pub struct TokenCommaGreen<'db>(pub GreenId<'db>);
32066impl<'db> TokenCommaGreen<'db> {
32067    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32068        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32069    }
32070}
32071impl<'db> TypedSyntaxNode<'db> for TokenComma<'db> {
32072    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32073    type StablePtr = TokenCommaPtr<'db>;
32074    type Green = TokenCommaGreen<'db>;
32075    fn missing(db: &'db dyn Database) -> Self::Green {
32076        TokenCommaGreen(
32077            GreenNode {
32078                kind: SyntaxKind::TokenMissing,
32079                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32080            }
32081            .intern(db),
32082        )
32083    }
32084    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32085        match node.green_node(db).details {
32086            GreenNodeDetails::Token(_) => Self { node },
32087            GreenNodeDetails::Node { .. } => {
32088                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32089            }
32090        }
32091    }
32092    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32093        match node.green_node(db).details {
32094            GreenNodeDetails::Token(_) => Some(Self { node }),
32095            GreenNodeDetails::Node { .. } => None,
32096        }
32097    }
32098    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32099        self.node
32100    }
32101    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32102        TokenCommaPtr(self.node.stable_ptr(db))
32103    }
32104}
32105#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32106pub struct TerminalComma<'db> {
32107    node: SyntaxNode<'db>,
32108}
32109impl<'db> Terminal<'db> for TerminalComma<'db> {
32110    const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32111    type TokenType = TokenComma<'db>;
32112    fn new_green(
32113        db: &'db dyn Database,
32114        leading_trivia: TriviaGreen<'db>,
32115        token: <<TerminalComma<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32116        trailing_trivia: TriviaGreen<'db>,
32117    ) -> Self::Green {
32118        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32119        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32120        TerminalCommaGreen(
32121            GreenNode {
32122                kind: SyntaxKind::TerminalComma,
32123                details: GreenNodeDetails::Node { children: children.into(), width },
32124            }
32125            .intern(db),
32126        )
32127    }
32128    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32129        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32130            unreachable!("Expected a node, not a token");
32131        };
32132        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32133    }
32134}
32135impl<'db> TerminalComma<'db> {
32136    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32137        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32138    }
32139    pub fn token(&self, db: &'db dyn Database) -> TokenComma<'db> {
32140        TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32141    }
32142    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32143        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32144    }
32145}
32146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32147pub struct TerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32148impl<'db> TerminalCommaPtr<'db> {}
32149impl<'db> TypedStablePtr<'db> for TerminalCommaPtr<'db> {
32150    type SyntaxNode = TerminalComma<'db>;
32151    fn untyped(self) -> SyntaxStablePtrId<'db> {
32152        self.0
32153    }
32154    fn lookup(&self, db: &'db dyn Database) -> TerminalComma<'db> {
32155        TerminalComma::from_syntax_node(db, self.0.lookup(db))
32156    }
32157}
32158impl<'db> From<TerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32159    fn from(ptr: TerminalCommaPtr<'db>) -> Self {
32160        ptr.untyped()
32161    }
32162}
32163#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32164pub struct TerminalCommaGreen<'db>(pub GreenId<'db>);
32165impl<'db> TypedSyntaxNode<'db> for TerminalComma<'db> {
32166    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32167    type StablePtr = TerminalCommaPtr<'db>;
32168    type Green = TerminalCommaGreen<'db>;
32169    fn missing(db: &'db dyn Database) -> Self::Green {
32170        TerminalCommaGreen(
32171            GreenNode {
32172                kind: SyntaxKind::TerminalComma,
32173                details: GreenNodeDetails::Node {
32174                    children: [
32175                        Trivia::missing(db).0,
32176                        TokenComma::missing(db).0,
32177                        Trivia::missing(db).0,
32178                    ]
32179                    .into(),
32180                    width: TextWidth::default(),
32181                },
32182            }
32183            .intern(db),
32184        )
32185    }
32186    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32187        let kind = node.kind(db);
32188        assert_eq!(
32189            kind,
32190            SyntaxKind::TerminalComma,
32191            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32192            kind,
32193            SyntaxKind::TerminalComma
32194        );
32195        Self { node }
32196    }
32197    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32198        let kind = node.kind(db);
32199        if kind == SyntaxKind::TerminalComma {
32200            Some(Self::from_syntax_node(db, node))
32201        } else {
32202            None
32203        }
32204    }
32205    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32206        self.node
32207    }
32208    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32209        TerminalCommaPtr(self.node.stable_ptr(db))
32210    }
32211}
32212#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32213pub struct TokenDiv<'db> {
32214    node: SyntaxNode<'db>,
32215}
32216impl<'db> Token<'db> for TokenDiv<'db> {
32217    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32218        TokenDivGreen(
32219            GreenNode { kind: SyntaxKind::TokenDiv, details: GreenNodeDetails::Token(text) }
32220                .intern(db),
32221        )
32222    }
32223    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32224        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32225    }
32226}
32227#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32228pub struct TokenDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32229impl<'db> TypedStablePtr<'db> for TokenDivPtr<'db> {
32230    type SyntaxNode = TokenDiv<'db>;
32231    fn untyped(self) -> SyntaxStablePtrId<'db> {
32232        self.0
32233    }
32234    fn lookup(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32235        TokenDiv::from_syntax_node(db, self.0.lookup(db))
32236    }
32237}
32238impl<'db> From<TokenDivPtr<'db>> for SyntaxStablePtrId<'db> {
32239    fn from(ptr: TokenDivPtr<'db>) -> Self {
32240        ptr.untyped()
32241    }
32242}
32243#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32244pub struct TokenDivGreen<'db>(pub GreenId<'db>);
32245impl<'db> TokenDivGreen<'db> {
32246    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32247        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32248    }
32249}
32250impl<'db> TypedSyntaxNode<'db> for TokenDiv<'db> {
32251    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
32252    type StablePtr = TokenDivPtr<'db>;
32253    type Green = TokenDivGreen<'db>;
32254    fn missing(db: &'db dyn Database) -> Self::Green {
32255        TokenDivGreen(
32256            GreenNode {
32257                kind: SyntaxKind::TokenMissing,
32258                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32259            }
32260            .intern(db),
32261        )
32262    }
32263    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32264        match node.green_node(db).details {
32265            GreenNodeDetails::Token(_) => Self { node },
32266            GreenNodeDetails::Node { .. } => {
32267                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
32268            }
32269        }
32270    }
32271    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32272        match node.green_node(db).details {
32273            GreenNodeDetails::Token(_) => Some(Self { node }),
32274            GreenNodeDetails::Node { .. } => None,
32275        }
32276    }
32277    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32278        self.node
32279    }
32280    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32281        TokenDivPtr(self.node.stable_ptr(db))
32282    }
32283}
32284#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32285pub struct TerminalDiv<'db> {
32286    node: SyntaxNode<'db>,
32287}
32288impl<'db> Terminal<'db> for TerminalDiv<'db> {
32289    const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
32290    type TokenType = TokenDiv<'db>;
32291    fn new_green(
32292        db: &'db dyn Database,
32293        leading_trivia: TriviaGreen<'db>,
32294        token: <<TerminalDiv<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32295        trailing_trivia: TriviaGreen<'db>,
32296    ) -> Self::Green {
32297        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32298        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32299        TerminalDivGreen(
32300            GreenNode {
32301                kind: SyntaxKind::TerminalDiv,
32302                details: GreenNodeDetails::Node { children: children.into(), width },
32303            }
32304            .intern(db),
32305        )
32306    }
32307    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32308        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32309            unreachable!("Expected a node, not a token");
32310        };
32311        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32312    }
32313}
32314impl<'db> TerminalDiv<'db> {
32315    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32316        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32317    }
32318    pub fn token(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32319        TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
32320    }
32321    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32322        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32323    }
32324}
32325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32326pub struct TerminalDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32327impl<'db> TerminalDivPtr<'db> {}
32328impl<'db> TypedStablePtr<'db> for TerminalDivPtr<'db> {
32329    type SyntaxNode = TerminalDiv<'db>;
32330    fn untyped(self) -> SyntaxStablePtrId<'db> {
32331        self.0
32332    }
32333    fn lookup(&self, db: &'db dyn Database) -> TerminalDiv<'db> {
32334        TerminalDiv::from_syntax_node(db, self.0.lookup(db))
32335    }
32336}
32337impl<'db> From<TerminalDivPtr<'db>> for SyntaxStablePtrId<'db> {
32338    fn from(ptr: TerminalDivPtr<'db>) -> Self {
32339        ptr.untyped()
32340    }
32341}
32342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32343pub struct TerminalDivGreen<'db>(pub GreenId<'db>);
32344impl<'db> TypedSyntaxNode<'db> for TerminalDiv<'db> {
32345    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
32346    type StablePtr = TerminalDivPtr<'db>;
32347    type Green = TerminalDivGreen<'db>;
32348    fn missing(db: &'db dyn Database) -> Self::Green {
32349        TerminalDivGreen(
32350            GreenNode {
32351                kind: SyntaxKind::TerminalDiv,
32352                details: GreenNodeDetails::Node {
32353                    children: [
32354                        Trivia::missing(db).0,
32355                        TokenDiv::missing(db).0,
32356                        Trivia::missing(db).0,
32357                    ]
32358                    .into(),
32359                    width: TextWidth::default(),
32360                },
32361            }
32362            .intern(db),
32363        )
32364    }
32365    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32366        let kind = node.kind(db);
32367        assert_eq!(
32368            kind,
32369            SyntaxKind::TerminalDiv,
32370            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32371            kind,
32372            SyntaxKind::TerminalDiv
32373        );
32374        Self { node }
32375    }
32376    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32377        let kind = node.kind(db);
32378        if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
32379    }
32380    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32381        self.node
32382    }
32383    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32384        TerminalDivPtr(self.node.stable_ptr(db))
32385    }
32386}
32387#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32388pub struct TokenDivEq<'db> {
32389    node: SyntaxNode<'db>,
32390}
32391impl<'db> Token<'db> for TokenDivEq<'db> {
32392    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32393        TokenDivEqGreen(
32394            GreenNode { kind: SyntaxKind::TokenDivEq, details: GreenNodeDetails::Token(text) }
32395                .intern(db),
32396        )
32397    }
32398    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32399        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32400    }
32401}
32402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32403pub struct TokenDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32404impl<'db> TypedStablePtr<'db> for TokenDivEqPtr<'db> {
32405    type SyntaxNode = TokenDivEq<'db>;
32406    fn untyped(self) -> SyntaxStablePtrId<'db> {
32407        self.0
32408    }
32409    fn lookup(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32410        TokenDivEq::from_syntax_node(db, self.0.lookup(db))
32411    }
32412}
32413impl<'db> From<TokenDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32414    fn from(ptr: TokenDivEqPtr<'db>) -> Self {
32415        ptr.untyped()
32416    }
32417}
32418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32419pub struct TokenDivEqGreen<'db>(pub GreenId<'db>);
32420impl<'db> TokenDivEqGreen<'db> {
32421    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32422        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32423    }
32424}
32425impl<'db> TypedSyntaxNode<'db> for TokenDivEq<'db> {
32426    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
32427    type StablePtr = TokenDivEqPtr<'db>;
32428    type Green = TokenDivEqGreen<'db>;
32429    fn missing(db: &'db dyn Database) -> Self::Green {
32430        TokenDivEqGreen(
32431            GreenNode {
32432                kind: SyntaxKind::TokenMissing,
32433                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32434            }
32435            .intern(db),
32436        )
32437    }
32438    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32439        match node.green_node(db).details {
32440            GreenNodeDetails::Token(_) => Self { node },
32441            GreenNodeDetails::Node { .. } => {
32442                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
32443            }
32444        }
32445    }
32446    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32447        match node.green_node(db).details {
32448            GreenNodeDetails::Token(_) => Some(Self { node }),
32449            GreenNodeDetails::Node { .. } => None,
32450        }
32451    }
32452    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32453        self.node
32454    }
32455    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32456        TokenDivEqPtr(self.node.stable_ptr(db))
32457    }
32458}
32459#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32460pub struct TerminalDivEq<'db> {
32461    node: SyntaxNode<'db>,
32462}
32463impl<'db> Terminal<'db> for TerminalDivEq<'db> {
32464    const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
32465    type TokenType = TokenDivEq<'db>;
32466    fn new_green(
32467        db: &'db dyn Database,
32468        leading_trivia: TriviaGreen<'db>,
32469        token: <<TerminalDivEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32470        trailing_trivia: TriviaGreen<'db>,
32471    ) -> Self::Green {
32472        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32473        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32474        TerminalDivEqGreen(
32475            GreenNode {
32476                kind: SyntaxKind::TerminalDivEq,
32477                details: GreenNodeDetails::Node { children: children.into(), width },
32478            }
32479            .intern(db),
32480        )
32481    }
32482    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32483        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32484            unreachable!("Expected a node, not a token");
32485        };
32486        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32487    }
32488}
32489impl<'db> TerminalDivEq<'db> {
32490    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32491        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32492    }
32493    pub fn token(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32494        TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
32495    }
32496    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32497        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32498    }
32499}
32500#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32501pub struct TerminalDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32502impl<'db> TerminalDivEqPtr<'db> {}
32503impl<'db> TypedStablePtr<'db> for TerminalDivEqPtr<'db> {
32504    type SyntaxNode = TerminalDivEq<'db>;
32505    fn untyped(self) -> SyntaxStablePtrId<'db> {
32506        self.0
32507    }
32508    fn lookup(&self, db: &'db dyn Database) -> TerminalDivEq<'db> {
32509        TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
32510    }
32511}
32512impl<'db> From<TerminalDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32513    fn from(ptr: TerminalDivEqPtr<'db>) -> Self {
32514        ptr.untyped()
32515    }
32516}
32517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32518pub struct TerminalDivEqGreen<'db>(pub GreenId<'db>);
32519impl<'db> TypedSyntaxNode<'db> for TerminalDivEq<'db> {
32520    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
32521    type StablePtr = TerminalDivEqPtr<'db>;
32522    type Green = TerminalDivEqGreen<'db>;
32523    fn missing(db: &'db dyn Database) -> Self::Green {
32524        TerminalDivEqGreen(
32525            GreenNode {
32526                kind: SyntaxKind::TerminalDivEq,
32527                details: GreenNodeDetails::Node {
32528                    children: [
32529                        Trivia::missing(db).0,
32530                        TokenDivEq::missing(db).0,
32531                        Trivia::missing(db).0,
32532                    ]
32533                    .into(),
32534                    width: TextWidth::default(),
32535                },
32536            }
32537            .intern(db),
32538        )
32539    }
32540    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32541        let kind = node.kind(db);
32542        assert_eq!(
32543            kind,
32544            SyntaxKind::TerminalDivEq,
32545            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32546            kind,
32547            SyntaxKind::TerminalDivEq
32548        );
32549        Self { node }
32550    }
32551    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32552        let kind = node.kind(db);
32553        if kind == SyntaxKind::TerminalDivEq {
32554            Some(Self::from_syntax_node(db, node))
32555        } else {
32556            None
32557        }
32558    }
32559    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32560        self.node
32561    }
32562    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32563        TerminalDivEqPtr(self.node.stable_ptr(db))
32564    }
32565}
32566#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32567pub struct TokenDollar<'db> {
32568    node: SyntaxNode<'db>,
32569}
32570impl<'db> Token<'db> for TokenDollar<'db> {
32571    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32572        TokenDollarGreen(
32573            GreenNode { kind: SyntaxKind::TokenDollar, details: GreenNodeDetails::Token(text) }
32574                .intern(db),
32575        )
32576    }
32577    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32578        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32579    }
32580}
32581#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32582pub struct TokenDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32583impl<'db> TypedStablePtr<'db> for TokenDollarPtr<'db> {
32584    type SyntaxNode = TokenDollar<'db>;
32585    fn untyped(self) -> SyntaxStablePtrId<'db> {
32586        self.0
32587    }
32588    fn lookup(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32589        TokenDollar::from_syntax_node(db, self.0.lookup(db))
32590    }
32591}
32592impl<'db> From<TokenDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32593    fn from(ptr: TokenDollarPtr<'db>) -> Self {
32594        ptr.untyped()
32595    }
32596}
32597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32598pub struct TokenDollarGreen<'db>(pub GreenId<'db>);
32599impl<'db> TokenDollarGreen<'db> {
32600    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32601        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32602    }
32603}
32604impl<'db> TypedSyntaxNode<'db> for TokenDollar<'db> {
32605    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
32606    type StablePtr = TokenDollarPtr<'db>;
32607    type Green = TokenDollarGreen<'db>;
32608    fn missing(db: &'db dyn Database) -> Self::Green {
32609        TokenDollarGreen(
32610            GreenNode {
32611                kind: SyntaxKind::TokenMissing,
32612                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32613            }
32614            .intern(db),
32615        )
32616    }
32617    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32618        match node.green_node(db).details {
32619            GreenNodeDetails::Token(_) => Self { node },
32620            GreenNodeDetails::Node { .. } => {
32621                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
32622            }
32623        }
32624    }
32625    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32626        match node.green_node(db).details {
32627            GreenNodeDetails::Token(_) => Some(Self { node }),
32628            GreenNodeDetails::Node { .. } => None,
32629        }
32630    }
32631    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32632        self.node
32633    }
32634    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32635        TokenDollarPtr(self.node.stable_ptr(db))
32636    }
32637}
32638#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32639pub struct TerminalDollar<'db> {
32640    node: SyntaxNode<'db>,
32641}
32642impl<'db> Terminal<'db> for TerminalDollar<'db> {
32643    const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
32644    type TokenType = TokenDollar<'db>;
32645    fn new_green(
32646        db: &'db dyn Database,
32647        leading_trivia: TriviaGreen<'db>,
32648        token: <<TerminalDollar<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32649        trailing_trivia: TriviaGreen<'db>,
32650    ) -> Self::Green {
32651        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32652        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32653        TerminalDollarGreen(
32654            GreenNode {
32655                kind: SyntaxKind::TerminalDollar,
32656                details: GreenNodeDetails::Node { children: children.into(), width },
32657            }
32658            .intern(db),
32659        )
32660    }
32661    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32662        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32663            unreachable!("Expected a node, not a token");
32664        };
32665        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32666    }
32667}
32668impl<'db> TerminalDollar<'db> {
32669    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32670        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32671    }
32672    pub fn token(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32673        TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
32674    }
32675    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32676        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32677    }
32678}
32679#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32680pub struct TerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32681impl<'db> TerminalDollarPtr<'db> {}
32682impl<'db> TypedStablePtr<'db> for TerminalDollarPtr<'db> {
32683    type SyntaxNode = TerminalDollar<'db>;
32684    fn untyped(self) -> SyntaxStablePtrId<'db> {
32685        self.0
32686    }
32687    fn lookup(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
32688        TerminalDollar::from_syntax_node(db, self.0.lookup(db))
32689    }
32690}
32691impl<'db> From<TerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32692    fn from(ptr: TerminalDollarPtr<'db>) -> Self {
32693        ptr.untyped()
32694    }
32695}
32696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32697pub struct TerminalDollarGreen<'db>(pub GreenId<'db>);
32698impl<'db> TypedSyntaxNode<'db> for TerminalDollar<'db> {
32699    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
32700    type StablePtr = TerminalDollarPtr<'db>;
32701    type Green = TerminalDollarGreen<'db>;
32702    fn missing(db: &'db dyn Database) -> Self::Green {
32703        TerminalDollarGreen(
32704            GreenNode {
32705                kind: SyntaxKind::TerminalDollar,
32706                details: GreenNodeDetails::Node {
32707                    children: [
32708                        Trivia::missing(db).0,
32709                        TokenDollar::missing(db).0,
32710                        Trivia::missing(db).0,
32711                    ]
32712                    .into(),
32713                    width: TextWidth::default(),
32714                },
32715            }
32716            .intern(db),
32717        )
32718    }
32719    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32720        let kind = node.kind(db);
32721        assert_eq!(
32722            kind,
32723            SyntaxKind::TerminalDollar,
32724            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32725            kind,
32726            SyntaxKind::TerminalDollar
32727        );
32728        Self { node }
32729    }
32730    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32731        let kind = node.kind(db);
32732        if kind == SyntaxKind::TerminalDollar {
32733            Some(Self::from_syntax_node(db, node))
32734        } else {
32735            None
32736        }
32737    }
32738    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32739        self.node
32740    }
32741    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32742        TerminalDollarPtr(self.node.stable_ptr(db))
32743    }
32744}
32745#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32746pub struct TokenDot<'db> {
32747    node: SyntaxNode<'db>,
32748}
32749impl<'db> Token<'db> for TokenDot<'db> {
32750    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32751        TokenDotGreen(
32752            GreenNode { kind: SyntaxKind::TokenDot, details: GreenNodeDetails::Token(text) }
32753                .intern(db),
32754        )
32755    }
32756    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32757        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32758    }
32759}
32760#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32761pub struct TokenDotPtr<'db>(pub SyntaxStablePtrId<'db>);
32762impl<'db> TypedStablePtr<'db> for TokenDotPtr<'db> {
32763    type SyntaxNode = TokenDot<'db>;
32764    fn untyped(self) -> SyntaxStablePtrId<'db> {
32765        self.0
32766    }
32767    fn lookup(&self, db: &'db dyn Database) -> TokenDot<'db> {
32768        TokenDot::from_syntax_node(db, self.0.lookup(db))
32769    }
32770}
32771impl<'db> From<TokenDotPtr<'db>> for SyntaxStablePtrId<'db> {
32772    fn from(ptr: TokenDotPtr<'db>) -> Self {
32773        ptr.untyped()
32774    }
32775}
32776#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32777pub struct TokenDotGreen<'db>(pub GreenId<'db>);
32778impl<'db> TokenDotGreen<'db> {
32779    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32780        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32781    }
32782}
32783impl<'db> TypedSyntaxNode<'db> for TokenDot<'db> {
32784    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
32785    type StablePtr = TokenDotPtr<'db>;
32786    type Green = TokenDotGreen<'db>;
32787    fn missing(db: &'db dyn Database) -> Self::Green {
32788        TokenDotGreen(
32789            GreenNode {
32790                kind: SyntaxKind::TokenMissing,
32791                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32792            }
32793            .intern(db),
32794        )
32795    }
32796    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32797        match node.green_node(db).details {
32798            GreenNodeDetails::Token(_) => Self { node },
32799            GreenNodeDetails::Node { .. } => {
32800                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
32801            }
32802        }
32803    }
32804    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32805        match node.green_node(db).details {
32806            GreenNodeDetails::Token(_) => Some(Self { node }),
32807            GreenNodeDetails::Node { .. } => None,
32808        }
32809    }
32810    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32811        self.node
32812    }
32813    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32814        TokenDotPtr(self.node.stable_ptr(db))
32815    }
32816}
32817#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32818pub struct TerminalDot<'db> {
32819    node: SyntaxNode<'db>,
32820}
32821impl<'db> Terminal<'db> for TerminalDot<'db> {
32822    const KIND: SyntaxKind = SyntaxKind::TerminalDot;
32823    type TokenType = TokenDot<'db>;
32824    fn new_green(
32825        db: &'db dyn Database,
32826        leading_trivia: TriviaGreen<'db>,
32827        token: <<TerminalDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32828        trailing_trivia: TriviaGreen<'db>,
32829    ) -> Self::Green {
32830        let children = [leading_trivia.0, token.0, trailing_trivia.0];
32831        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32832        TerminalDotGreen(
32833            GreenNode {
32834                kind: SyntaxKind::TerminalDot,
32835                details: GreenNodeDetails::Node { children: children.into(), width },
32836            }
32837            .intern(db),
32838        )
32839    }
32840    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32841        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32842            unreachable!("Expected a node, not a token");
32843        };
32844        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32845    }
32846}
32847impl<'db> TerminalDot<'db> {
32848    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32849        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32850    }
32851    pub fn token(&self, db: &'db dyn Database) -> TokenDot<'db> {
32852        TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
32853    }
32854    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32855        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32856    }
32857}
32858#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32859pub struct TerminalDotPtr<'db>(pub SyntaxStablePtrId<'db>);
32860impl<'db> TerminalDotPtr<'db> {}
32861impl<'db> TypedStablePtr<'db> for TerminalDotPtr<'db> {
32862    type SyntaxNode = TerminalDot<'db>;
32863    fn untyped(self) -> SyntaxStablePtrId<'db> {
32864        self.0
32865    }
32866    fn lookup(&self, db: &'db dyn Database) -> TerminalDot<'db> {
32867        TerminalDot::from_syntax_node(db, self.0.lookup(db))
32868    }
32869}
32870impl<'db> From<TerminalDotPtr<'db>> for SyntaxStablePtrId<'db> {
32871    fn from(ptr: TerminalDotPtr<'db>) -> Self {
32872        ptr.untyped()
32873    }
32874}
32875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32876pub struct TerminalDotGreen<'db>(pub GreenId<'db>);
32877impl<'db> TypedSyntaxNode<'db> for TerminalDot<'db> {
32878    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
32879    type StablePtr = TerminalDotPtr<'db>;
32880    type Green = TerminalDotGreen<'db>;
32881    fn missing(db: &'db dyn Database) -> Self::Green {
32882        TerminalDotGreen(
32883            GreenNode {
32884                kind: SyntaxKind::TerminalDot,
32885                details: GreenNodeDetails::Node {
32886                    children: [
32887                        Trivia::missing(db).0,
32888                        TokenDot::missing(db).0,
32889                        Trivia::missing(db).0,
32890                    ]
32891                    .into(),
32892                    width: TextWidth::default(),
32893                },
32894            }
32895            .intern(db),
32896        )
32897    }
32898    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32899        let kind = node.kind(db);
32900        assert_eq!(
32901            kind,
32902            SyntaxKind::TerminalDot,
32903            "Unexpected SyntaxKind {:?}. Expected {:?}.",
32904            kind,
32905            SyntaxKind::TerminalDot
32906        );
32907        Self { node }
32908    }
32909    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32910        let kind = node.kind(db);
32911        if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
32912    }
32913    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32914        self.node
32915    }
32916    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32917        TerminalDotPtr(self.node.stable_ptr(db))
32918    }
32919}
32920#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32921pub struct TokenDotDot<'db> {
32922    node: SyntaxNode<'db>,
32923}
32924impl<'db> Token<'db> for TokenDotDot<'db> {
32925    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32926        TokenDotDotGreen(
32927            GreenNode { kind: SyntaxKind::TokenDotDot, details: GreenNodeDetails::Token(text) }
32928                .intern(db),
32929        )
32930    }
32931    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32932        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32933    }
32934}
32935#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
32936pub struct TokenDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
32937impl<'db> TypedStablePtr<'db> for TokenDotDotPtr<'db> {
32938    type SyntaxNode = TokenDotDot<'db>;
32939    fn untyped(self) -> SyntaxStablePtrId<'db> {
32940        self.0
32941    }
32942    fn lookup(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
32943        TokenDotDot::from_syntax_node(db, self.0.lookup(db))
32944    }
32945}
32946impl<'db> From<TokenDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
32947    fn from(ptr: TokenDotDotPtr<'db>) -> Self {
32948        ptr.untyped()
32949    }
32950}
32951#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32952pub struct TokenDotDotGreen<'db>(pub GreenId<'db>);
32953impl<'db> TokenDotDotGreen<'db> {
32954    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32955        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32956    }
32957}
32958impl<'db> TypedSyntaxNode<'db> for TokenDotDot<'db> {
32959    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
32960    type StablePtr = TokenDotDotPtr<'db>;
32961    type Green = TokenDotDotGreen<'db>;
32962    fn missing(db: &'db dyn Database) -> Self::Green {
32963        TokenDotDotGreen(
32964            GreenNode {
32965                kind: SyntaxKind::TokenMissing,
32966                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32967            }
32968            .intern(db),
32969        )
32970    }
32971    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32972        match node.green_node(db).details {
32973            GreenNodeDetails::Token(_) => Self { node },
32974            GreenNodeDetails::Node { .. } => {
32975                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
32976            }
32977        }
32978    }
32979    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32980        match node.green_node(db).details {
32981            GreenNodeDetails::Token(_) => Some(Self { node }),
32982            GreenNodeDetails::Node { .. } => None,
32983        }
32984    }
32985    fn as_syntax_node(&self) -> SyntaxNode<'db> {
32986        self.node
32987    }
32988    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32989        TokenDotDotPtr(self.node.stable_ptr(db))
32990    }
32991}
32992#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32993pub struct TerminalDotDot<'db> {
32994    node: SyntaxNode<'db>,
32995}
32996impl<'db> Terminal<'db> for TerminalDotDot<'db> {
32997    const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
32998    type TokenType = TokenDotDot<'db>;
32999    fn new_green(
33000        db: &'db dyn Database,
33001        leading_trivia: TriviaGreen<'db>,
33002        token: <<TerminalDotDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33003        trailing_trivia: TriviaGreen<'db>,
33004    ) -> Self::Green {
33005        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33006        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33007        TerminalDotDotGreen(
33008            GreenNode {
33009                kind: SyntaxKind::TerminalDotDot,
33010                details: GreenNodeDetails::Node { children: children.into(), width },
33011            }
33012            .intern(db),
33013        )
33014    }
33015    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33016        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33017            unreachable!("Expected a node, not a token");
33018        };
33019        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33020    }
33021}
33022impl<'db> TerminalDotDot<'db> {
33023    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33024        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33025    }
33026    pub fn token(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33027        TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33028    }
33029    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33030        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33031    }
33032}
33033#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33034pub struct TerminalDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33035impl<'db> TerminalDotDotPtr<'db> {}
33036impl<'db> TypedStablePtr<'db> for TerminalDotDotPtr<'db> {
33037    type SyntaxNode = TerminalDotDot<'db>;
33038    fn untyped(self) -> SyntaxStablePtrId<'db> {
33039        self.0
33040    }
33041    fn lookup(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
33042        TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33043    }
33044}
33045impl<'db> From<TerminalDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33046    fn from(ptr: TerminalDotDotPtr<'db>) -> Self {
33047        ptr.untyped()
33048    }
33049}
33050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33051pub struct TerminalDotDotGreen<'db>(pub GreenId<'db>);
33052impl<'db> TypedSyntaxNode<'db> for TerminalDotDot<'db> {
33053    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33054    type StablePtr = TerminalDotDotPtr<'db>;
33055    type Green = TerminalDotDotGreen<'db>;
33056    fn missing(db: &'db dyn Database) -> Self::Green {
33057        TerminalDotDotGreen(
33058            GreenNode {
33059                kind: SyntaxKind::TerminalDotDot,
33060                details: GreenNodeDetails::Node {
33061                    children: [
33062                        Trivia::missing(db).0,
33063                        TokenDotDot::missing(db).0,
33064                        Trivia::missing(db).0,
33065                    ]
33066                    .into(),
33067                    width: TextWidth::default(),
33068                },
33069            }
33070            .intern(db),
33071        )
33072    }
33073    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33074        let kind = node.kind(db);
33075        assert_eq!(
33076            kind,
33077            SyntaxKind::TerminalDotDot,
33078            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33079            kind,
33080            SyntaxKind::TerminalDotDot
33081        );
33082        Self { node }
33083    }
33084    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33085        let kind = node.kind(db);
33086        if kind == SyntaxKind::TerminalDotDot {
33087            Some(Self::from_syntax_node(db, node))
33088        } else {
33089            None
33090        }
33091    }
33092    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33093        self.node
33094    }
33095    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33096        TerminalDotDotPtr(self.node.stable_ptr(db))
33097    }
33098}
33099#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33100pub struct TokenDotDotEq<'db> {
33101    node: SyntaxNode<'db>,
33102}
33103impl<'db> Token<'db> for TokenDotDotEq<'db> {
33104    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33105        TokenDotDotEqGreen(
33106            GreenNode { kind: SyntaxKind::TokenDotDotEq, details: GreenNodeDetails::Token(text) }
33107                .intern(db),
33108        )
33109    }
33110    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33111        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33112    }
33113}
33114#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33115pub struct TokenDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33116impl<'db> TypedStablePtr<'db> for TokenDotDotEqPtr<'db> {
33117    type SyntaxNode = TokenDotDotEq<'db>;
33118    fn untyped(self) -> SyntaxStablePtrId<'db> {
33119        self.0
33120    }
33121    fn lookup(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33122        TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33123    }
33124}
33125impl<'db> From<TokenDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33126    fn from(ptr: TokenDotDotEqPtr<'db>) -> Self {
33127        ptr.untyped()
33128    }
33129}
33130#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33131pub struct TokenDotDotEqGreen<'db>(pub GreenId<'db>);
33132impl<'db> TokenDotDotEqGreen<'db> {
33133    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33134        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33135    }
33136}
33137impl<'db> TypedSyntaxNode<'db> for TokenDotDotEq<'db> {
33138    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33139    type StablePtr = TokenDotDotEqPtr<'db>;
33140    type Green = TokenDotDotEqGreen<'db>;
33141    fn missing(db: &'db dyn Database) -> Self::Green {
33142        TokenDotDotEqGreen(
33143            GreenNode {
33144                kind: SyntaxKind::TokenMissing,
33145                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33146            }
33147            .intern(db),
33148        )
33149    }
33150    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33151        match node.green_node(db).details {
33152            GreenNodeDetails::Token(_) => Self { node },
33153            GreenNodeDetails::Node { .. } => {
33154                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33155            }
33156        }
33157    }
33158    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33159        match node.green_node(db).details {
33160            GreenNodeDetails::Token(_) => Some(Self { node }),
33161            GreenNodeDetails::Node { .. } => None,
33162        }
33163    }
33164    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33165        self.node
33166    }
33167    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33168        TokenDotDotEqPtr(self.node.stable_ptr(db))
33169    }
33170}
33171#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33172pub struct TerminalDotDotEq<'db> {
33173    node: SyntaxNode<'db>,
33174}
33175impl<'db> Terminal<'db> for TerminalDotDotEq<'db> {
33176    const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
33177    type TokenType = TokenDotDotEq<'db>;
33178    fn new_green(
33179        db: &'db dyn Database,
33180        leading_trivia: TriviaGreen<'db>,
33181        token: <<TerminalDotDotEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33182        trailing_trivia: TriviaGreen<'db>,
33183    ) -> Self::Green {
33184        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33185        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33186        TerminalDotDotEqGreen(
33187            GreenNode {
33188                kind: SyntaxKind::TerminalDotDotEq,
33189                details: GreenNodeDetails::Node { children: children.into(), width },
33190            }
33191            .intern(db),
33192        )
33193    }
33194    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33195        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33196            unreachable!("Expected a node, not a token");
33197        };
33198        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33199    }
33200}
33201impl<'db> TerminalDotDotEq<'db> {
33202    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33203        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33204    }
33205    pub fn token(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33206        TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
33207    }
33208    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33209        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33210    }
33211}
33212#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33213pub struct TerminalDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33214impl<'db> TerminalDotDotEqPtr<'db> {}
33215impl<'db> TypedStablePtr<'db> for TerminalDotDotEqPtr<'db> {
33216    type SyntaxNode = TerminalDotDotEq<'db>;
33217    fn untyped(self) -> SyntaxStablePtrId<'db> {
33218        self.0
33219    }
33220    fn lookup(&self, db: &'db dyn Database) -> TerminalDotDotEq<'db> {
33221        TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
33222    }
33223}
33224impl<'db> From<TerminalDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33225    fn from(ptr: TerminalDotDotEqPtr<'db>) -> Self {
33226        ptr.untyped()
33227    }
33228}
33229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33230pub struct TerminalDotDotEqGreen<'db>(pub GreenId<'db>);
33231impl<'db> TypedSyntaxNode<'db> for TerminalDotDotEq<'db> {
33232    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
33233    type StablePtr = TerminalDotDotEqPtr<'db>;
33234    type Green = TerminalDotDotEqGreen<'db>;
33235    fn missing(db: &'db dyn Database) -> Self::Green {
33236        TerminalDotDotEqGreen(
33237            GreenNode {
33238                kind: SyntaxKind::TerminalDotDotEq,
33239                details: GreenNodeDetails::Node {
33240                    children: [
33241                        Trivia::missing(db).0,
33242                        TokenDotDotEq::missing(db).0,
33243                        Trivia::missing(db).0,
33244                    ]
33245                    .into(),
33246                    width: TextWidth::default(),
33247                },
33248            }
33249            .intern(db),
33250        )
33251    }
33252    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33253        let kind = node.kind(db);
33254        assert_eq!(
33255            kind,
33256            SyntaxKind::TerminalDotDotEq,
33257            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33258            kind,
33259            SyntaxKind::TerminalDotDotEq
33260        );
33261        Self { node }
33262    }
33263    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33264        let kind = node.kind(db);
33265        if kind == SyntaxKind::TerminalDotDotEq {
33266            Some(Self::from_syntax_node(db, node))
33267        } else {
33268            None
33269        }
33270    }
33271    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33272        self.node
33273    }
33274    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33275        TerminalDotDotEqPtr(self.node.stable_ptr(db))
33276    }
33277}
33278#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33279pub struct TokenEndOfFile<'db> {
33280    node: SyntaxNode<'db>,
33281}
33282impl<'db> Token<'db> for TokenEndOfFile<'db> {
33283    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33284        TokenEndOfFileGreen(
33285            GreenNode { kind: SyntaxKind::TokenEndOfFile, details: GreenNodeDetails::Token(text) }
33286                .intern(db),
33287        )
33288    }
33289    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33290        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33291    }
33292}
33293#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33294pub struct TokenEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33295impl<'db> TypedStablePtr<'db> for TokenEndOfFilePtr<'db> {
33296    type SyntaxNode = TokenEndOfFile<'db>;
33297    fn untyped(self) -> SyntaxStablePtrId<'db> {
33298        self.0
33299    }
33300    fn lookup(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33301        TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
33302    }
33303}
33304impl<'db> From<TokenEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33305    fn from(ptr: TokenEndOfFilePtr<'db>) -> Self {
33306        ptr.untyped()
33307    }
33308}
33309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33310pub struct TokenEndOfFileGreen<'db>(pub GreenId<'db>);
33311impl<'db> TokenEndOfFileGreen<'db> {
33312    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33313        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33314    }
33315}
33316impl<'db> TypedSyntaxNode<'db> for TokenEndOfFile<'db> {
33317    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
33318    type StablePtr = TokenEndOfFilePtr<'db>;
33319    type Green = TokenEndOfFileGreen<'db>;
33320    fn missing(db: &'db dyn Database) -> Self::Green {
33321        TokenEndOfFileGreen(
33322            GreenNode {
33323                kind: SyntaxKind::TokenMissing,
33324                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33325            }
33326            .intern(db),
33327        )
33328    }
33329    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33330        match node.green_node(db).details {
33331            GreenNodeDetails::Token(_) => Self { node },
33332            GreenNodeDetails::Node { .. } => {
33333                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
33334            }
33335        }
33336    }
33337    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33338        match node.green_node(db).details {
33339            GreenNodeDetails::Token(_) => Some(Self { node }),
33340            GreenNodeDetails::Node { .. } => None,
33341        }
33342    }
33343    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33344        self.node
33345    }
33346    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33347        TokenEndOfFilePtr(self.node.stable_ptr(db))
33348    }
33349}
33350#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33351pub struct TerminalEndOfFile<'db> {
33352    node: SyntaxNode<'db>,
33353}
33354impl<'db> Terminal<'db> for TerminalEndOfFile<'db> {
33355    const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
33356    type TokenType = TokenEndOfFile<'db>;
33357    fn new_green(
33358        db: &'db dyn Database,
33359        leading_trivia: TriviaGreen<'db>,
33360        token: <<TerminalEndOfFile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33361        trailing_trivia: TriviaGreen<'db>,
33362    ) -> Self::Green {
33363        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33364        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33365        TerminalEndOfFileGreen(
33366            GreenNode {
33367                kind: SyntaxKind::TerminalEndOfFile,
33368                details: GreenNodeDetails::Node { children: children.into(), width },
33369            }
33370            .intern(db),
33371        )
33372    }
33373    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33374        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33375            unreachable!("Expected a node, not a token");
33376        };
33377        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33378    }
33379}
33380impl<'db> TerminalEndOfFile<'db> {
33381    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33382        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33383    }
33384    pub fn token(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33385        TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
33386    }
33387    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33388        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33389    }
33390}
33391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33392pub struct TerminalEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33393impl<'db> TerminalEndOfFilePtr<'db> {}
33394impl<'db> TypedStablePtr<'db> for TerminalEndOfFilePtr<'db> {
33395    type SyntaxNode = TerminalEndOfFile<'db>;
33396    fn untyped(self) -> SyntaxStablePtrId<'db> {
33397        self.0
33398    }
33399    fn lookup(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
33400        TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
33401    }
33402}
33403impl<'db> From<TerminalEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33404    fn from(ptr: TerminalEndOfFilePtr<'db>) -> Self {
33405        ptr.untyped()
33406    }
33407}
33408#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33409pub struct TerminalEndOfFileGreen<'db>(pub GreenId<'db>);
33410impl<'db> TypedSyntaxNode<'db> for TerminalEndOfFile<'db> {
33411    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
33412    type StablePtr = TerminalEndOfFilePtr<'db>;
33413    type Green = TerminalEndOfFileGreen<'db>;
33414    fn missing(db: &'db dyn Database) -> Self::Green {
33415        TerminalEndOfFileGreen(
33416            GreenNode {
33417                kind: SyntaxKind::TerminalEndOfFile,
33418                details: GreenNodeDetails::Node {
33419                    children: [
33420                        Trivia::missing(db).0,
33421                        TokenEndOfFile::missing(db).0,
33422                        Trivia::missing(db).0,
33423                    ]
33424                    .into(),
33425                    width: TextWidth::default(),
33426                },
33427            }
33428            .intern(db),
33429        )
33430    }
33431    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33432        let kind = node.kind(db);
33433        assert_eq!(
33434            kind,
33435            SyntaxKind::TerminalEndOfFile,
33436            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33437            kind,
33438            SyntaxKind::TerminalEndOfFile
33439        );
33440        Self { node }
33441    }
33442    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33443        let kind = node.kind(db);
33444        if kind == SyntaxKind::TerminalEndOfFile {
33445            Some(Self::from_syntax_node(db, node))
33446        } else {
33447            None
33448        }
33449    }
33450    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33451        self.node
33452    }
33453    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33454        TerminalEndOfFilePtr(self.node.stable_ptr(db))
33455    }
33456}
33457#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33458pub struct TokenEq<'db> {
33459    node: SyntaxNode<'db>,
33460}
33461impl<'db> Token<'db> for TokenEq<'db> {
33462    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33463        TokenEqGreen(
33464            GreenNode { kind: SyntaxKind::TokenEq, details: GreenNodeDetails::Token(text) }
33465                .intern(db),
33466        )
33467    }
33468    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33469        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33470    }
33471}
33472#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33473pub struct TokenEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33474impl<'db> TypedStablePtr<'db> for TokenEqPtr<'db> {
33475    type SyntaxNode = TokenEq<'db>;
33476    fn untyped(self) -> SyntaxStablePtrId<'db> {
33477        self.0
33478    }
33479    fn lookup(&self, db: &'db dyn Database) -> TokenEq<'db> {
33480        TokenEq::from_syntax_node(db, self.0.lookup(db))
33481    }
33482}
33483impl<'db> From<TokenEqPtr<'db>> for SyntaxStablePtrId<'db> {
33484    fn from(ptr: TokenEqPtr<'db>) -> Self {
33485        ptr.untyped()
33486    }
33487}
33488#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33489pub struct TokenEqGreen<'db>(pub GreenId<'db>);
33490impl<'db> TokenEqGreen<'db> {
33491    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33492        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33493    }
33494}
33495impl<'db> TypedSyntaxNode<'db> for TokenEq<'db> {
33496    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
33497    type StablePtr = TokenEqPtr<'db>;
33498    type Green = TokenEqGreen<'db>;
33499    fn missing(db: &'db dyn Database) -> Self::Green {
33500        TokenEqGreen(
33501            GreenNode {
33502                kind: SyntaxKind::TokenMissing,
33503                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33504            }
33505            .intern(db),
33506        )
33507    }
33508    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33509        match node.green_node(db).details {
33510            GreenNodeDetails::Token(_) => Self { node },
33511            GreenNodeDetails::Node { .. } => {
33512                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
33513            }
33514        }
33515    }
33516    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33517        match node.green_node(db).details {
33518            GreenNodeDetails::Token(_) => Some(Self { node }),
33519            GreenNodeDetails::Node { .. } => None,
33520        }
33521    }
33522    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33523        self.node
33524    }
33525    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33526        TokenEqPtr(self.node.stable_ptr(db))
33527    }
33528}
33529#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33530pub struct TerminalEq<'db> {
33531    node: SyntaxNode<'db>,
33532}
33533impl<'db> Terminal<'db> for TerminalEq<'db> {
33534    const KIND: SyntaxKind = SyntaxKind::TerminalEq;
33535    type TokenType = TokenEq<'db>;
33536    fn new_green(
33537        db: &'db dyn Database,
33538        leading_trivia: TriviaGreen<'db>,
33539        token: <<TerminalEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33540        trailing_trivia: TriviaGreen<'db>,
33541    ) -> Self::Green {
33542        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33543        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33544        TerminalEqGreen(
33545            GreenNode {
33546                kind: SyntaxKind::TerminalEq,
33547                details: GreenNodeDetails::Node { children: children.into(), width },
33548            }
33549            .intern(db),
33550        )
33551    }
33552    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33553        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33554            unreachable!("Expected a node, not a token");
33555        };
33556        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33557    }
33558}
33559impl<'db> TerminalEq<'db> {
33560    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33561        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33562    }
33563    pub fn token(&self, db: &'db dyn Database) -> TokenEq<'db> {
33564        TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
33565    }
33566    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33567        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33568    }
33569}
33570#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33571pub struct TerminalEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33572impl<'db> TerminalEqPtr<'db> {}
33573impl<'db> TypedStablePtr<'db> for TerminalEqPtr<'db> {
33574    type SyntaxNode = TerminalEq<'db>;
33575    fn untyped(self) -> SyntaxStablePtrId<'db> {
33576        self.0
33577    }
33578    fn lookup(&self, db: &'db dyn Database) -> TerminalEq<'db> {
33579        TerminalEq::from_syntax_node(db, self.0.lookup(db))
33580    }
33581}
33582impl<'db> From<TerminalEqPtr<'db>> for SyntaxStablePtrId<'db> {
33583    fn from(ptr: TerminalEqPtr<'db>) -> Self {
33584        ptr.untyped()
33585    }
33586}
33587#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33588pub struct TerminalEqGreen<'db>(pub GreenId<'db>);
33589impl<'db> TypedSyntaxNode<'db> for TerminalEq<'db> {
33590    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
33591    type StablePtr = TerminalEqPtr<'db>;
33592    type Green = TerminalEqGreen<'db>;
33593    fn missing(db: &'db dyn Database) -> Self::Green {
33594        TerminalEqGreen(
33595            GreenNode {
33596                kind: SyntaxKind::TerminalEq,
33597                details: GreenNodeDetails::Node {
33598                    children: [
33599                        Trivia::missing(db).0,
33600                        TokenEq::missing(db).0,
33601                        Trivia::missing(db).0,
33602                    ]
33603                    .into(),
33604                    width: TextWidth::default(),
33605                },
33606            }
33607            .intern(db),
33608        )
33609    }
33610    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33611        let kind = node.kind(db);
33612        assert_eq!(
33613            kind,
33614            SyntaxKind::TerminalEq,
33615            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33616            kind,
33617            SyntaxKind::TerminalEq
33618        );
33619        Self { node }
33620    }
33621    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33622        let kind = node.kind(db);
33623        if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
33624    }
33625    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33626        self.node
33627    }
33628    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33629        TerminalEqPtr(self.node.stable_ptr(db))
33630    }
33631}
33632#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33633pub struct TokenEqEq<'db> {
33634    node: SyntaxNode<'db>,
33635}
33636impl<'db> Token<'db> for TokenEqEq<'db> {
33637    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33638        TokenEqEqGreen(
33639            GreenNode { kind: SyntaxKind::TokenEqEq, details: GreenNodeDetails::Token(text) }
33640                .intern(db),
33641        )
33642    }
33643    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33644        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33645    }
33646}
33647#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33648pub struct TokenEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33649impl<'db> TypedStablePtr<'db> for TokenEqEqPtr<'db> {
33650    type SyntaxNode = TokenEqEq<'db>;
33651    fn untyped(self) -> SyntaxStablePtrId<'db> {
33652        self.0
33653    }
33654    fn lookup(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33655        TokenEqEq::from_syntax_node(db, self.0.lookup(db))
33656    }
33657}
33658impl<'db> From<TokenEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
33659    fn from(ptr: TokenEqEqPtr<'db>) -> Self {
33660        ptr.untyped()
33661    }
33662}
33663#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33664pub struct TokenEqEqGreen<'db>(pub GreenId<'db>);
33665impl<'db> TokenEqEqGreen<'db> {
33666    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33667        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33668    }
33669}
33670impl<'db> TypedSyntaxNode<'db> for TokenEqEq<'db> {
33671    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
33672    type StablePtr = TokenEqEqPtr<'db>;
33673    type Green = TokenEqEqGreen<'db>;
33674    fn missing(db: &'db dyn Database) -> Self::Green {
33675        TokenEqEqGreen(
33676            GreenNode {
33677                kind: SyntaxKind::TokenMissing,
33678                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33679            }
33680            .intern(db),
33681        )
33682    }
33683    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33684        match node.green_node(db).details {
33685            GreenNodeDetails::Token(_) => Self { node },
33686            GreenNodeDetails::Node { .. } => {
33687                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
33688            }
33689        }
33690    }
33691    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33692        match node.green_node(db).details {
33693            GreenNodeDetails::Token(_) => Some(Self { node }),
33694            GreenNodeDetails::Node { .. } => None,
33695        }
33696    }
33697    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33698        self.node
33699    }
33700    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33701        TokenEqEqPtr(self.node.stable_ptr(db))
33702    }
33703}
33704#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33705pub struct TerminalEqEq<'db> {
33706    node: SyntaxNode<'db>,
33707}
33708impl<'db> Terminal<'db> for TerminalEqEq<'db> {
33709    const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
33710    type TokenType = TokenEqEq<'db>;
33711    fn new_green(
33712        db: &'db dyn Database,
33713        leading_trivia: TriviaGreen<'db>,
33714        token: <<TerminalEqEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33715        trailing_trivia: TriviaGreen<'db>,
33716    ) -> Self::Green {
33717        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33718        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33719        TerminalEqEqGreen(
33720            GreenNode {
33721                kind: SyntaxKind::TerminalEqEq,
33722                details: GreenNodeDetails::Node { children: children.into(), width },
33723            }
33724            .intern(db),
33725        )
33726    }
33727    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33728        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33729            unreachable!("Expected a node, not a token");
33730        };
33731        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33732    }
33733}
33734impl<'db> TerminalEqEq<'db> {
33735    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33736        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33737    }
33738    pub fn token(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33739        TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
33740    }
33741    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33742        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33743    }
33744}
33745#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33746pub struct TerminalEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33747impl<'db> TerminalEqEqPtr<'db> {}
33748impl<'db> TypedStablePtr<'db> for TerminalEqEqPtr<'db> {
33749    type SyntaxNode = TerminalEqEq<'db>;
33750    fn untyped(self) -> SyntaxStablePtrId<'db> {
33751        self.0
33752    }
33753    fn lookup(&self, db: &'db dyn Database) -> TerminalEqEq<'db> {
33754        TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
33755    }
33756}
33757impl<'db> From<TerminalEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
33758    fn from(ptr: TerminalEqEqPtr<'db>) -> Self {
33759        ptr.untyped()
33760    }
33761}
33762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33763pub struct TerminalEqEqGreen<'db>(pub GreenId<'db>);
33764impl<'db> TypedSyntaxNode<'db> for TerminalEqEq<'db> {
33765    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
33766    type StablePtr = TerminalEqEqPtr<'db>;
33767    type Green = TerminalEqEqGreen<'db>;
33768    fn missing(db: &'db dyn Database) -> Self::Green {
33769        TerminalEqEqGreen(
33770            GreenNode {
33771                kind: SyntaxKind::TerminalEqEq,
33772                details: GreenNodeDetails::Node {
33773                    children: [
33774                        Trivia::missing(db).0,
33775                        TokenEqEq::missing(db).0,
33776                        Trivia::missing(db).0,
33777                    ]
33778                    .into(),
33779                    width: TextWidth::default(),
33780                },
33781            }
33782            .intern(db),
33783        )
33784    }
33785    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33786        let kind = node.kind(db);
33787        assert_eq!(
33788            kind,
33789            SyntaxKind::TerminalEqEq,
33790            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33791            kind,
33792            SyntaxKind::TerminalEqEq
33793        );
33794        Self { node }
33795    }
33796    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33797        let kind = node.kind(db);
33798        if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
33799    }
33800    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33801        self.node
33802    }
33803    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33804        TerminalEqEqPtr(self.node.stable_ptr(db))
33805    }
33806}
33807#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33808pub struct TokenGE<'db> {
33809    node: SyntaxNode<'db>,
33810}
33811impl<'db> Token<'db> for TokenGE<'db> {
33812    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33813        TokenGEGreen(
33814            GreenNode { kind: SyntaxKind::TokenGE, details: GreenNodeDetails::Token(text) }
33815                .intern(db),
33816        )
33817    }
33818    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33819        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33820    }
33821}
33822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33823pub struct TokenGEPtr<'db>(pub SyntaxStablePtrId<'db>);
33824impl<'db> TypedStablePtr<'db> for TokenGEPtr<'db> {
33825    type SyntaxNode = TokenGE<'db>;
33826    fn untyped(self) -> SyntaxStablePtrId<'db> {
33827        self.0
33828    }
33829    fn lookup(&self, db: &'db dyn Database) -> TokenGE<'db> {
33830        TokenGE::from_syntax_node(db, self.0.lookup(db))
33831    }
33832}
33833impl<'db> From<TokenGEPtr<'db>> for SyntaxStablePtrId<'db> {
33834    fn from(ptr: TokenGEPtr<'db>) -> Self {
33835        ptr.untyped()
33836    }
33837}
33838#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33839pub struct TokenGEGreen<'db>(pub GreenId<'db>);
33840impl<'db> TokenGEGreen<'db> {
33841    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33842        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33843    }
33844}
33845impl<'db> TypedSyntaxNode<'db> for TokenGE<'db> {
33846    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
33847    type StablePtr = TokenGEPtr<'db>;
33848    type Green = TokenGEGreen<'db>;
33849    fn missing(db: &'db dyn Database) -> Self::Green {
33850        TokenGEGreen(
33851            GreenNode {
33852                kind: SyntaxKind::TokenMissing,
33853                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33854            }
33855            .intern(db),
33856        )
33857    }
33858    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33859        match node.green_node(db).details {
33860            GreenNodeDetails::Token(_) => Self { node },
33861            GreenNodeDetails::Node { .. } => {
33862                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
33863            }
33864        }
33865    }
33866    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33867        match node.green_node(db).details {
33868            GreenNodeDetails::Token(_) => Some(Self { node }),
33869            GreenNodeDetails::Node { .. } => None,
33870        }
33871    }
33872    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33873        self.node
33874    }
33875    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33876        TokenGEPtr(self.node.stable_ptr(db))
33877    }
33878}
33879#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33880pub struct TerminalGE<'db> {
33881    node: SyntaxNode<'db>,
33882}
33883impl<'db> Terminal<'db> for TerminalGE<'db> {
33884    const KIND: SyntaxKind = SyntaxKind::TerminalGE;
33885    type TokenType = TokenGE<'db>;
33886    fn new_green(
33887        db: &'db dyn Database,
33888        leading_trivia: TriviaGreen<'db>,
33889        token: <<TerminalGE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33890        trailing_trivia: TriviaGreen<'db>,
33891    ) -> Self::Green {
33892        let children = [leading_trivia.0, token.0, trailing_trivia.0];
33893        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33894        TerminalGEGreen(
33895            GreenNode {
33896                kind: SyntaxKind::TerminalGE,
33897                details: GreenNodeDetails::Node { children: children.into(), width },
33898            }
33899            .intern(db),
33900        )
33901    }
33902    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33903        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33904            unreachable!("Expected a node, not a token");
33905        };
33906        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33907    }
33908}
33909impl<'db> TerminalGE<'db> {
33910    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33911        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33912    }
33913    pub fn token(&self, db: &'db dyn Database) -> TokenGE<'db> {
33914        TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
33915    }
33916    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33917        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33918    }
33919}
33920#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33921pub struct TerminalGEPtr<'db>(pub SyntaxStablePtrId<'db>);
33922impl<'db> TerminalGEPtr<'db> {}
33923impl<'db> TypedStablePtr<'db> for TerminalGEPtr<'db> {
33924    type SyntaxNode = TerminalGE<'db>;
33925    fn untyped(self) -> SyntaxStablePtrId<'db> {
33926        self.0
33927    }
33928    fn lookup(&self, db: &'db dyn Database) -> TerminalGE<'db> {
33929        TerminalGE::from_syntax_node(db, self.0.lookup(db))
33930    }
33931}
33932impl<'db> From<TerminalGEPtr<'db>> for SyntaxStablePtrId<'db> {
33933    fn from(ptr: TerminalGEPtr<'db>) -> Self {
33934        ptr.untyped()
33935    }
33936}
33937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33938pub struct TerminalGEGreen<'db>(pub GreenId<'db>);
33939impl<'db> TypedSyntaxNode<'db> for TerminalGE<'db> {
33940    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
33941    type StablePtr = TerminalGEPtr<'db>;
33942    type Green = TerminalGEGreen<'db>;
33943    fn missing(db: &'db dyn Database) -> Self::Green {
33944        TerminalGEGreen(
33945            GreenNode {
33946                kind: SyntaxKind::TerminalGE,
33947                details: GreenNodeDetails::Node {
33948                    children: [
33949                        Trivia::missing(db).0,
33950                        TokenGE::missing(db).0,
33951                        Trivia::missing(db).0,
33952                    ]
33953                    .into(),
33954                    width: TextWidth::default(),
33955                },
33956            }
33957            .intern(db),
33958        )
33959    }
33960    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33961        let kind = node.kind(db);
33962        assert_eq!(
33963            kind,
33964            SyntaxKind::TerminalGE,
33965            "Unexpected SyntaxKind {:?}. Expected {:?}.",
33966            kind,
33967            SyntaxKind::TerminalGE
33968        );
33969        Self { node }
33970    }
33971    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33972        let kind = node.kind(db);
33973        if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
33974    }
33975    fn as_syntax_node(&self) -> SyntaxNode<'db> {
33976        self.node
33977    }
33978    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33979        TerminalGEPtr(self.node.stable_ptr(db))
33980    }
33981}
33982#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33983pub struct TokenGT<'db> {
33984    node: SyntaxNode<'db>,
33985}
33986impl<'db> Token<'db> for TokenGT<'db> {
33987    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33988        TokenGTGreen(
33989            GreenNode { kind: SyntaxKind::TokenGT, details: GreenNodeDetails::Token(text) }
33990                .intern(db),
33991        )
33992    }
33993    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33994        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33995    }
33996}
33997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
33998pub struct TokenGTPtr<'db>(pub SyntaxStablePtrId<'db>);
33999impl<'db> TypedStablePtr<'db> for TokenGTPtr<'db> {
34000    type SyntaxNode = TokenGT<'db>;
34001    fn untyped(self) -> SyntaxStablePtrId<'db> {
34002        self.0
34003    }
34004    fn lookup(&self, db: &'db dyn Database) -> TokenGT<'db> {
34005        TokenGT::from_syntax_node(db, self.0.lookup(db))
34006    }
34007}
34008impl<'db> From<TokenGTPtr<'db>> for SyntaxStablePtrId<'db> {
34009    fn from(ptr: TokenGTPtr<'db>) -> Self {
34010        ptr.untyped()
34011    }
34012}
34013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34014pub struct TokenGTGreen<'db>(pub GreenId<'db>);
34015impl<'db> TokenGTGreen<'db> {
34016    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34017        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34018    }
34019}
34020impl<'db> TypedSyntaxNode<'db> for TokenGT<'db> {
34021    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34022    type StablePtr = TokenGTPtr<'db>;
34023    type Green = TokenGTGreen<'db>;
34024    fn missing(db: &'db dyn Database) -> Self::Green {
34025        TokenGTGreen(
34026            GreenNode {
34027                kind: SyntaxKind::TokenMissing,
34028                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34029            }
34030            .intern(db),
34031        )
34032    }
34033    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34034        match node.green_node(db).details {
34035            GreenNodeDetails::Token(_) => Self { node },
34036            GreenNodeDetails::Node { .. } => {
34037                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34038            }
34039        }
34040    }
34041    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34042        match node.green_node(db).details {
34043            GreenNodeDetails::Token(_) => Some(Self { node }),
34044            GreenNodeDetails::Node { .. } => None,
34045        }
34046    }
34047    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34048        self.node
34049    }
34050    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34051        TokenGTPtr(self.node.stable_ptr(db))
34052    }
34053}
34054#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34055pub struct TerminalGT<'db> {
34056    node: SyntaxNode<'db>,
34057}
34058impl<'db> Terminal<'db> for TerminalGT<'db> {
34059    const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34060    type TokenType = TokenGT<'db>;
34061    fn new_green(
34062        db: &'db dyn Database,
34063        leading_trivia: TriviaGreen<'db>,
34064        token: <<TerminalGT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34065        trailing_trivia: TriviaGreen<'db>,
34066    ) -> Self::Green {
34067        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34068        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34069        TerminalGTGreen(
34070            GreenNode {
34071                kind: SyntaxKind::TerminalGT,
34072                details: GreenNodeDetails::Node { children: children.into(), width },
34073            }
34074            .intern(db),
34075        )
34076    }
34077    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34078        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34079            unreachable!("Expected a node, not a token");
34080        };
34081        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34082    }
34083}
34084impl<'db> TerminalGT<'db> {
34085    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34086        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34087    }
34088    pub fn token(&self, db: &'db dyn Database) -> TokenGT<'db> {
34089        TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34090    }
34091    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34092        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34093    }
34094}
34095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34096pub struct TerminalGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34097impl<'db> TerminalGTPtr<'db> {}
34098impl<'db> TypedStablePtr<'db> for TerminalGTPtr<'db> {
34099    type SyntaxNode = TerminalGT<'db>;
34100    fn untyped(self) -> SyntaxStablePtrId<'db> {
34101        self.0
34102    }
34103    fn lookup(&self, db: &'db dyn Database) -> TerminalGT<'db> {
34104        TerminalGT::from_syntax_node(db, self.0.lookup(db))
34105    }
34106}
34107impl<'db> From<TerminalGTPtr<'db>> for SyntaxStablePtrId<'db> {
34108    fn from(ptr: TerminalGTPtr<'db>) -> Self {
34109        ptr.untyped()
34110    }
34111}
34112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34113pub struct TerminalGTGreen<'db>(pub GreenId<'db>);
34114impl<'db> TypedSyntaxNode<'db> for TerminalGT<'db> {
34115    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
34116    type StablePtr = TerminalGTPtr<'db>;
34117    type Green = TerminalGTGreen<'db>;
34118    fn missing(db: &'db dyn Database) -> Self::Green {
34119        TerminalGTGreen(
34120            GreenNode {
34121                kind: SyntaxKind::TerminalGT,
34122                details: GreenNodeDetails::Node {
34123                    children: [
34124                        Trivia::missing(db).0,
34125                        TokenGT::missing(db).0,
34126                        Trivia::missing(db).0,
34127                    ]
34128                    .into(),
34129                    width: TextWidth::default(),
34130                },
34131            }
34132            .intern(db),
34133        )
34134    }
34135    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34136        let kind = node.kind(db);
34137        assert_eq!(
34138            kind,
34139            SyntaxKind::TerminalGT,
34140            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34141            kind,
34142            SyntaxKind::TerminalGT
34143        );
34144        Self { node }
34145    }
34146    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34147        let kind = node.kind(db);
34148        if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
34149    }
34150    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34151        self.node
34152    }
34153    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34154        TerminalGTPtr(self.node.stable_ptr(db))
34155    }
34156}
34157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34158pub struct TokenHash<'db> {
34159    node: SyntaxNode<'db>,
34160}
34161impl<'db> Token<'db> for TokenHash<'db> {
34162    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34163        TokenHashGreen(
34164            GreenNode { kind: SyntaxKind::TokenHash, details: GreenNodeDetails::Token(text) }
34165                .intern(db),
34166        )
34167    }
34168    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34169        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34170    }
34171}
34172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34173pub struct TokenHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34174impl<'db> TypedStablePtr<'db> for TokenHashPtr<'db> {
34175    type SyntaxNode = TokenHash<'db>;
34176    fn untyped(self) -> SyntaxStablePtrId<'db> {
34177        self.0
34178    }
34179    fn lookup(&self, db: &'db dyn Database) -> TokenHash<'db> {
34180        TokenHash::from_syntax_node(db, self.0.lookup(db))
34181    }
34182}
34183impl<'db> From<TokenHashPtr<'db>> for SyntaxStablePtrId<'db> {
34184    fn from(ptr: TokenHashPtr<'db>) -> Self {
34185        ptr.untyped()
34186    }
34187}
34188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34189pub struct TokenHashGreen<'db>(pub GreenId<'db>);
34190impl<'db> TokenHashGreen<'db> {
34191    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34192        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34193    }
34194}
34195impl<'db> TypedSyntaxNode<'db> for TokenHash<'db> {
34196    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
34197    type StablePtr = TokenHashPtr<'db>;
34198    type Green = TokenHashGreen<'db>;
34199    fn missing(db: &'db dyn Database) -> Self::Green {
34200        TokenHashGreen(
34201            GreenNode {
34202                kind: SyntaxKind::TokenMissing,
34203                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34204            }
34205            .intern(db),
34206        )
34207    }
34208    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34209        match node.green_node(db).details {
34210            GreenNodeDetails::Token(_) => Self { node },
34211            GreenNodeDetails::Node { .. } => {
34212                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
34213            }
34214        }
34215    }
34216    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34217        match node.green_node(db).details {
34218            GreenNodeDetails::Token(_) => Some(Self { node }),
34219            GreenNodeDetails::Node { .. } => None,
34220        }
34221    }
34222    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34223        self.node
34224    }
34225    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34226        TokenHashPtr(self.node.stable_ptr(db))
34227    }
34228}
34229#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34230pub struct TerminalHash<'db> {
34231    node: SyntaxNode<'db>,
34232}
34233impl<'db> Terminal<'db> for TerminalHash<'db> {
34234    const KIND: SyntaxKind = SyntaxKind::TerminalHash;
34235    type TokenType = TokenHash<'db>;
34236    fn new_green(
34237        db: &'db dyn Database,
34238        leading_trivia: TriviaGreen<'db>,
34239        token: <<TerminalHash<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34240        trailing_trivia: TriviaGreen<'db>,
34241    ) -> Self::Green {
34242        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34243        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34244        TerminalHashGreen(
34245            GreenNode {
34246                kind: SyntaxKind::TerminalHash,
34247                details: GreenNodeDetails::Node { children: children.into(), width },
34248            }
34249            .intern(db),
34250        )
34251    }
34252    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34253        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34254            unreachable!("Expected a node, not a token");
34255        };
34256        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34257    }
34258}
34259impl<'db> TerminalHash<'db> {
34260    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34261        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34262    }
34263    pub fn token(&self, db: &'db dyn Database) -> TokenHash<'db> {
34264        TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
34265    }
34266    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34267        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34268    }
34269}
34270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34271pub struct TerminalHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34272impl<'db> TerminalHashPtr<'db> {}
34273impl<'db> TypedStablePtr<'db> for TerminalHashPtr<'db> {
34274    type SyntaxNode = TerminalHash<'db>;
34275    fn untyped(self) -> SyntaxStablePtrId<'db> {
34276        self.0
34277    }
34278    fn lookup(&self, db: &'db dyn Database) -> TerminalHash<'db> {
34279        TerminalHash::from_syntax_node(db, self.0.lookup(db))
34280    }
34281}
34282impl<'db> From<TerminalHashPtr<'db>> for SyntaxStablePtrId<'db> {
34283    fn from(ptr: TerminalHashPtr<'db>) -> Self {
34284        ptr.untyped()
34285    }
34286}
34287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34288pub struct TerminalHashGreen<'db>(pub GreenId<'db>);
34289impl<'db> TypedSyntaxNode<'db> for TerminalHash<'db> {
34290    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
34291    type StablePtr = TerminalHashPtr<'db>;
34292    type Green = TerminalHashGreen<'db>;
34293    fn missing(db: &'db dyn Database) -> Self::Green {
34294        TerminalHashGreen(
34295            GreenNode {
34296                kind: SyntaxKind::TerminalHash,
34297                details: GreenNodeDetails::Node {
34298                    children: [
34299                        Trivia::missing(db).0,
34300                        TokenHash::missing(db).0,
34301                        Trivia::missing(db).0,
34302                    ]
34303                    .into(),
34304                    width: TextWidth::default(),
34305                },
34306            }
34307            .intern(db),
34308        )
34309    }
34310    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34311        let kind = node.kind(db);
34312        assert_eq!(
34313            kind,
34314            SyntaxKind::TerminalHash,
34315            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34316            kind,
34317            SyntaxKind::TerminalHash
34318        );
34319        Self { node }
34320    }
34321    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34322        let kind = node.kind(db);
34323        if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
34324    }
34325    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34326        self.node
34327    }
34328    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34329        TerminalHashPtr(self.node.stable_ptr(db))
34330    }
34331}
34332#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34333pub struct TokenLBrace<'db> {
34334    node: SyntaxNode<'db>,
34335}
34336impl<'db> Token<'db> for TokenLBrace<'db> {
34337    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34338        TokenLBraceGreen(
34339            GreenNode { kind: SyntaxKind::TokenLBrace, details: GreenNodeDetails::Token(text) }
34340                .intern(db),
34341        )
34342    }
34343    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34344        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34345    }
34346}
34347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34348pub struct TokenLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34349impl<'db> TypedStablePtr<'db> for TokenLBracePtr<'db> {
34350    type SyntaxNode = TokenLBrace<'db>;
34351    fn untyped(self) -> SyntaxStablePtrId<'db> {
34352        self.0
34353    }
34354    fn lookup(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34355        TokenLBrace::from_syntax_node(db, self.0.lookup(db))
34356    }
34357}
34358impl<'db> From<TokenLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34359    fn from(ptr: TokenLBracePtr<'db>) -> Self {
34360        ptr.untyped()
34361    }
34362}
34363#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34364pub struct TokenLBraceGreen<'db>(pub GreenId<'db>);
34365impl<'db> TokenLBraceGreen<'db> {
34366    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34367        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34368    }
34369}
34370impl<'db> TypedSyntaxNode<'db> for TokenLBrace<'db> {
34371    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
34372    type StablePtr = TokenLBracePtr<'db>;
34373    type Green = TokenLBraceGreen<'db>;
34374    fn missing(db: &'db dyn Database) -> Self::Green {
34375        TokenLBraceGreen(
34376            GreenNode {
34377                kind: SyntaxKind::TokenMissing,
34378                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34379            }
34380            .intern(db),
34381        )
34382    }
34383    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34384        match node.green_node(db).details {
34385            GreenNodeDetails::Token(_) => Self { node },
34386            GreenNodeDetails::Node { .. } => {
34387                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
34388            }
34389        }
34390    }
34391    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34392        match node.green_node(db).details {
34393            GreenNodeDetails::Token(_) => Some(Self { node }),
34394            GreenNodeDetails::Node { .. } => None,
34395        }
34396    }
34397    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34398        self.node
34399    }
34400    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34401        TokenLBracePtr(self.node.stable_ptr(db))
34402    }
34403}
34404#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34405pub struct TerminalLBrace<'db> {
34406    node: SyntaxNode<'db>,
34407}
34408impl<'db> Terminal<'db> for TerminalLBrace<'db> {
34409    const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
34410    type TokenType = TokenLBrace<'db>;
34411    fn new_green(
34412        db: &'db dyn Database,
34413        leading_trivia: TriviaGreen<'db>,
34414        token: <<TerminalLBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34415        trailing_trivia: TriviaGreen<'db>,
34416    ) -> Self::Green {
34417        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34418        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34419        TerminalLBraceGreen(
34420            GreenNode {
34421                kind: SyntaxKind::TerminalLBrace,
34422                details: GreenNodeDetails::Node { children: children.into(), width },
34423            }
34424            .intern(db),
34425        )
34426    }
34427    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34428        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34429            unreachable!("Expected a node, not a token");
34430        };
34431        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34432    }
34433}
34434impl<'db> TerminalLBrace<'db> {
34435    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34436        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34437    }
34438    pub fn token(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34439        TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
34440    }
34441    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34442        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34443    }
34444}
34445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34446pub struct TerminalLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34447impl<'db> TerminalLBracePtr<'db> {}
34448impl<'db> TypedStablePtr<'db> for TerminalLBracePtr<'db> {
34449    type SyntaxNode = TerminalLBrace<'db>;
34450    fn untyped(self) -> SyntaxStablePtrId<'db> {
34451        self.0
34452    }
34453    fn lookup(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
34454        TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
34455    }
34456}
34457impl<'db> From<TerminalLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34458    fn from(ptr: TerminalLBracePtr<'db>) -> Self {
34459        ptr.untyped()
34460    }
34461}
34462#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34463pub struct TerminalLBraceGreen<'db>(pub GreenId<'db>);
34464impl<'db> TypedSyntaxNode<'db> for TerminalLBrace<'db> {
34465    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
34466    type StablePtr = TerminalLBracePtr<'db>;
34467    type Green = TerminalLBraceGreen<'db>;
34468    fn missing(db: &'db dyn Database) -> Self::Green {
34469        TerminalLBraceGreen(
34470            GreenNode {
34471                kind: SyntaxKind::TerminalLBrace,
34472                details: GreenNodeDetails::Node {
34473                    children: [
34474                        Trivia::missing(db).0,
34475                        TokenLBrace::missing(db).0,
34476                        Trivia::missing(db).0,
34477                    ]
34478                    .into(),
34479                    width: TextWidth::default(),
34480                },
34481            }
34482            .intern(db),
34483        )
34484    }
34485    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34486        let kind = node.kind(db);
34487        assert_eq!(
34488            kind,
34489            SyntaxKind::TerminalLBrace,
34490            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34491            kind,
34492            SyntaxKind::TerminalLBrace
34493        );
34494        Self { node }
34495    }
34496    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34497        let kind = node.kind(db);
34498        if kind == SyntaxKind::TerminalLBrace {
34499            Some(Self::from_syntax_node(db, node))
34500        } else {
34501            None
34502        }
34503    }
34504    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34505        self.node
34506    }
34507    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34508        TerminalLBracePtr(self.node.stable_ptr(db))
34509    }
34510}
34511#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34512pub struct TokenLBrack<'db> {
34513    node: SyntaxNode<'db>,
34514}
34515impl<'db> Token<'db> for TokenLBrack<'db> {
34516    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34517        TokenLBrackGreen(
34518            GreenNode { kind: SyntaxKind::TokenLBrack, details: GreenNodeDetails::Token(text) }
34519                .intern(db),
34520        )
34521    }
34522    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34523        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34524    }
34525}
34526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34527pub struct TokenLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34528impl<'db> TypedStablePtr<'db> for TokenLBrackPtr<'db> {
34529    type SyntaxNode = TokenLBrack<'db>;
34530    fn untyped(self) -> SyntaxStablePtrId<'db> {
34531        self.0
34532    }
34533    fn lookup(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34534        TokenLBrack::from_syntax_node(db, self.0.lookup(db))
34535    }
34536}
34537impl<'db> From<TokenLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34538    fn from(ptr: TokenLBrackPtr<'db>) -> Self {
34539        ptr.untyped()
34540    }
34541}
34542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34543pub struct TokenLBrackGreen<'db>(pub GreenId<'db>);
34544impl<'db> TokenLBrackGreen<'db> {
34545    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34546        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34547    }
34548}
34549impl<'db> TypedSyntaxNode<'db> for TokenLBrack<'db> {
34550    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
34551    type StablePtr = TokenLBrackPtr<'db>;
34552    type Green = TokenLBrackGreen<'db>;
34553    fn missing(db: &'db dyn Database) -> Self::Green {
34554        TokenLBrackGreen(
34555            GreenNode {
34556                kind: SyntaxKind::TokenMissing,
34557                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34558            }
34559            .intern(db),
34560        )
34561    }
34562    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34563        match node.green_node(db).details {
34564            GreenNodeDetails::Token(_) => Self { node },
34565            GreenNodeDetails::Node { .. } => {
34566                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
34567            }
34568        }
34569    }
34570    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34571        match node.green_node(db).details {
34572            GreenNodeDetails::Token(_) => Some(Self { node }),
34573            GreenNodeDetails::Node { .. } => None,
34574        }
34575    }
34576    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34577        self.node
34578    }
34579    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34580        TokenLBrackPtr(self.node.stable_ptr(db))
34581    }
34582}
34583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34584pub struct TerminalLBrack<'db> {
34585    node: SyntaxNode<'db>,
34586}
34587impl<'db> Terminal<'db> for TerminalLBrack<'db> {
34588    const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
34589    type TokenType = TokenLBrack<'db>;
34590    fn new_green(
34591        db: &'db dyn Database,
34592        leading_trivia: TriviaGreen<'db>,
34593        token: <<TerminalLBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34594        trailing_trivia: TriviaGreen<'db>,
34595    ) -> Self::Green {
34596        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34597        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34598        TerminalLBrackGreen(
34599            GreenNode {
34600                kind: SyntaxKind::TerminalLBrack,
34601                details: GreenNodeDetails::Node { children: children.into(), width },
34602            }
34603            .intern(db),
34604        )
34605    }
34606    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34607        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34608            unreachable!("Expected a node, not a token");
34609        };
34610        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34611    }
34612}
34613impl<'db> TerminalLBrack<'db> {
34614    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34615        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34616    }
34617    pub fn token(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34618        TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
34619    }
34620    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34621        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34622    }
34623}
34624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34625pub struct TerminalLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34626impl<'db> TerminalLBrackPtr<'db> {}
34627impl<'db> TypedStablePtr<'db> for TerminalLBrackPtr<'db> {
34628    type SyntaxNode = TerminalLBrack<'db>;
34629    fn untyped(self) -> SyntaxStablePtrId<'db> {
34630        self.0
34631    }
34632    fn lookup(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
34633        TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
34634    }
34635}
34636impl<'db> From<TerminalLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34637    fn from(ptr: TerminalLBrackPtr<'db>) -> Self {
34638        ptr.untyped()
34639    }
34640}
34641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34642pub struct TerminalLBrackGreen<'db>(pub GreenId<'db>);
34643impl<'db> TypedSyntaxNode<'db> for TerminalLBrack<'db> {
34644    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
34645    type StablePtr = TerminalLBrackPtr<'db>;
34646    type Green = TerminalLBrackGreen<'db>;
34647    fn missing(db: &'db dyn Database) -> Self::Green {
34648        TerminalLBrackGreen(
34649            GreenNode {
34650                kind: SyntaxKind::TerminalLBrack,
34651                details: GreenNodeDetails::Node {
34652                    children: [
34653                        Trivia::missing(db).0,
34654                        TokenLBrack::missing(db).0,
34655                        Trivia::missing(db).0,
34656                    ]
34657                    .into(),
34658                    width: TextWidth::default(),
34659                },
34660            }
34661            .intern(db),
34662        )
34663    }
34664    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34665        let kind = node.kind(db);
34666        assert_eq!(
34667            kind,
34668            SyntaxKind::TerminalLBrack,
34669            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34670            kind,
34671            SyntaxKind::TerminalLBrack
34672        );
34673        Self { node }
34674    }
34675    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34676        let kind = node.kind(db);
34677        if kind == SyntaxKind::TerminalLBrack {
34678            Some(Self::from_syntax_node(db, node))
34679        } else {
34680            None
34681        }
34682    }
34683    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34684        self.node
34685    }
34686    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34687        TerminalLBrackPtr(self.node.stable_ptr(db))
34688    }
34689}
34690#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34691pub struct TokenLE<'db> {
34692    node: SyntaxNode<'db>,
34693}
34694impl<'db> Token<'db> for TokenLE<'db> {
34695    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34696        TokenLEGreen(
34697            GreenNode { kind: SyntaxKind::TokenLE, details: GreenNodeDetails::Token(text) }
34698                .intern(db),
34699        )
34700    }
34701    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34702        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34703    }
34704}
34705#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34706pub struct TokenLEPtr<'db>(pub SyntaxStablePtrId<'db>);
34707impl<'db> TypedStablePtr<'db> for TokenLEPtr<'db> {
34708    type SyntaxNode = TokenLE<'db>;
34709    fn untyped(self) -> SyntaxStablePtrId<'db> {
34710        self.0
34711    }
34712    fn lookup(&self, db: &'db dyn Database) -> TokenLE<'db> {
34713        TokenLE::from_syntax_node(db, self.0.lookup(db))
34714    }
34715}
34716impl<'db> From<TokenLEPtr<'db>> for SyntaxStablePtrId<'db> {
34717    fn from(ptr: TokenLEPtr<'db>) -> Self {
34718        ptr.untyped()
34719    }
34720}
34721#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34722pub struct TokenLEGreen<'db>(pub GreenId<'db>);
34723impl<'db> TokenLEGreen<'db> {
34724    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34725        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34726    }
34727}
34728impl<'db> TypedSyntaxNode<'db> for TokenLE<'db> {
34729    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
34730    type StablePtr = TokenLEPtr<'db>;
34731    type Green = TokenLEGreen<'db>;
34732    fn missing(db: &'db dyn Database) -> Self::Green {
34733        TokenLEGreen(
34734            GreenNode {
34735                kind: SyntaxKind::TokenMissing,
34736                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34737            }
34738            .intern(db),
34739        )
34740    }
34741    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34742        match node.green_node(db).details {
34743            GreenNodeDetails::Token(_) => Self { node },
34744            GreenNodeDetails::Node { .. } => {
34745                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
34746            }
34747        }
34748    }
34749    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34750        match node.green_node(db).details {
34751            GreenNodeDetails::Token(_) => Some(Self { node }),
34752            GreenNodeDetails::Node { .. } => None,
34753        }
34754    }
34755    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34756        self.node
34757    }
34758    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34759        TokenLEPtr(self.node.stable_ptr(db))
34760    }
34761}
34762#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34763pub struct TerminalLE<'db> {
34764    node: SyntaxNode<'db>,
34765}
34766impl<'db> Terminal<'db> for TerminalLE<'db> {
34767    const KIND: SyntaxKind = SyntaxKind::TerminalLE;
34768    type TokenType = TokenLE<'db>;
34769    fn new_green(
34770        db: &'db dyn Database,
34771        leading_trivia: TriviaGreen<'db>,
34772        token: <<TerminalLE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34773        trailing_trivia: TriviaGreen<'db>,
34774    ) -> Self::Green {
34775        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34776        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34777        TerminalLEGreen(
34778            GreenNode {
34779                kind: SyntaxKind::TerminalLE,
34780                details: GreenNodeDetails::Node { children: children.into(), width },
34781            }
34782            .intern(db),
34783        )
34784    }
34785    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34786        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34787            unreachable!("Expected a node, not a token");
34788        };
34789        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34790    }
34791}
34792impl<'db> TerminalLE<'db> {
34793    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34794        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34795    }
34796    pub fn token(&self, db: &'db dyn Database) -> TokenLE<'db> {
34797        TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
34798    }
34799    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34800        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34801    }
34802}
34803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34804pub struct TerminalLEPtr<'db>(pub SyntaxStablePtrId<'db>);
34805impl<'db> TerminalLEPtr<'db> {}
34806impl<'db> TypedStablePtr<'db> for TerminalLEPtr<'db> {
34807    type SyntaxNode = TerminalLE<'db>;
34808    fn untyped(self) -> SyntaxStablePtrId<'db> {
34809        self.0
34810    }
34811    fn lookup(&self, db: &'db dyn Database) -> TerminalLE<'db> {
34812        TerminalLE::from_syntax_node(db, self.0.lookup(db))
34813    }
34814}
34815impl<'db> From<TerminalLEPtr<'db>> for SyntaxStablePtrId<'db> {
34816    fn from(ptr: TerminalLEPtr<'db>) -> Self {
34817        ptr.untyped()
34818    }
34819}
34820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34821pub struct TerminalLEGreen<'db>(pub GreenId<'db>);
34822impl<'db> TypedSyntaxNode<'db> for TerminalLE<'db> {
34823    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
34824    type StablePtr = TerminalLEPtr<'db>;
34825    type Green = TerminalLEGreen<'db>;
34826    fn missing(db: &'db dyn Database) -> Self::Green {
34827        TerminalLEGreen(
34828            GreenNode {
34829                kind: SyntaxKind::TerminalLE,
34830                details: GreenNodeDetails::Node {
34831                    children: [
34832                        Trivia::missing(db).0,
34833                        TokenLE::missing(db).0,
34834                        Trivia::missing(db).0,
34835                    ]
34836                    .into(),
34837                    width: TextWidth::default(),
34838                },
34839            }
34840            .intern(db),
34841        )
34842    }
34843    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34844        let kind = node.kind(db);
34845        assert_eq!(
34846            kind,
34847            SyntaxKind::TerminalLE,
34848            "Unexpected SyntaxKind {:?}. Expected {:?}.",
34849            kind,
34850            SyntaxKind::TerminalLE
34851        );
34852        Self { node }
34853    }
34854    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34855        let kind = node.kind(db);
34856        if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
34857    }
34858    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34859        self.node
34860    }
34861    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34862        TerminalLEPtr(self.node.stable_ptr(db))
34863    }
34864}
34865#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34866pub struct TokenLParen<'db> {
34867    node: SyntaxNode<'db>,
34868}
34869impl<'db> Token<'db> for TokenLParen<'db> {
34870    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34871        TokenLParenGreen(
34872            GreenNode { kind: SyntaxKind::TokenLParen, details: GreenNodeDetails::Token(text) }
34873                .intern(db),
34874        )
34875    }
34876    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34877        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34878    }
34879}
34880#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34881pub struct TokenLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
34882impl<'db> TypedStablePtr<'db> for TokenLParenPtr<'db> {
34883    type SyntaxNode = TokenLParen<'db>;
34884    fn untyped(self) -> SyntaxStablePtrId<'db> {
34885        self.0
34886    }
34887    fn lookup(&self, db: &'db dyn Database) -> TokenLParen<'db> {
34888        TokenLParen::from_syntax_node(db, self.0.lookup(db))
34889    }
34890}
34891impl<'db> From<TokenLParenPtr<'db>> for SyntaxStablePtrId<'db> {
34892    fn from(ptr: TokenLParenPtr<'db>) -> Self {
34893        ptr.untyped()
34894    }
34895}
34896#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34897pub struct TokenLParenGreen<'db>(pub GreenId<'db>);
34898impl<'db> TokenLParenGreen<'db> {
34899    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34900        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34901    }
34902}
34903impl<'db> TypedSyntaxNode<'db> for TokenLParen<'db> {
34904    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
34905    type StablePtr = TokenLParenPtr<'db>;
34906    type Green = TokenLParenGreen<'db>;
34907    fn missing(db: &'db dyn Database) -> Self::Green {
34908        TokenLParenGreen(
34909            GreenNode {
34910                kind: SyntaxKind::TokenMissing,
34911                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34912            }
34913            .intern(db),
34914        )
34915    }
34916    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34917        match node.green_node(db).details {
34918            GreenNodeDetails::Token(_) => Self { node },
34919            GreenNodeDetails::Node { .. } => {
34920                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
34921            }
34922        }
34923    }
34924    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34925        match node.green_node(db).details {
34926            GreenNodeDetails::Token(_) => Some(Self { node }),
34927            GreenNodeDetails::Node { .. } => None,
34928        }
34929    }
34930    fn as_syntax_node(&self) -> SyntaxNode<'db> {
34931        self.node
34932    }
34933    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34934        TokenLParenPtr(self.node.stable_ptr(db))
34935    }
34936}
34937#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34938pub struct TerminalLParen<'db> {
34939    node: SyntaxNode<'db>,
34940}
34941impl<'db> Terminal<'db> for TerminalLParen<'db> {
34942    const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
34943    type TokenType = TokenLParen<'db>;
34944    fn new_green(
34945        db: &'db dyn Database,
34946        leading_trivia: TriviaGreen<'db>,
34947        token: <<TerminalLParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34948        trailing_trivia: TriviaGreen<'db>,
34949    ) -> Self::Green {
34950        let children = [leading_trivia.0, token.0, trailing_trivia.0];
34951        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34952        TerminalLParenGreen(
34953            GreenNode {
34954                kind: SyntaxKind::TerminalLParen,
34955                details: GreenNodeDetails::Node { children: children.into(), width },
34956            }
34957            .intern(db),
34958        )
34959    }
34960    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34961        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34962            unreachable!("Expected a node, not a token");
34963        };
34964        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34965    }
34966}
34967impl<'db> TerminalLParen<'db> {
34968    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34969        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34970    }
34971    pub fn token(&self, db: &'db dyn Database) -> TokenLParen<'db> {
34972        TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
34973    }
34974    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34975        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34976    }
34977}
34978#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
34979pub struct TerminalLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
34980impl<'db> TerminalLParenPtr<'db> {}
34981impl<'db> TypedStablePtr<'db> for TerminalLParenPtr<'db> {
34982    type SyntaxNode = TerminalLParen<'db>;
34983    fn untyped(self) -> SyntaxStablePtrId<'db> {
34984        self.0
34985    }
34986    fn lookup(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
34987        TerminalLParen::from_syntax_node(db, self.0.lookup(db))
34988    }
34989}
34990impl<'db> From<TerminalLParenPtr<'db>> for SyntaxStablePtrId<'db> {
34991    fn from(ptr: TerminalLParenPtr<'db>) -> Self {
34992        ptr.untyped()
34993    }
34994}
34995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34996pub struct TerminalLParenGreen<'db>(pub GreenId<'db>);
34997impl<'db> TypedSyntaxNode<'db> for TerminalLParen<'db> {
34998    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
34999    type StablePtr = TerminalLParenPtr<'db>;
35000    type Green = TerminalLParenGreen<'db>;
35001    fn missing(db: &'db dyn Database) -> Self::Green {
35002        TerminalLParenGreen(
35003            GreenNode {
35004                kind: SyntaxKind::TerminalLParen,
35005                details: GreenNodeDetails::Node {
35006                    children: [
35007                        Trivia::missing(db).0,
35008                        TokenLParen::missing(db).0,
35009                        Trivia::missing(db).0,
35010                    ]
35011                    .into(),
35012                    width: TextWidth::default(),
35013                },
35014            }
35015            .intern(db),
35016        )
35017    }
35018    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35019        let kind = node.kind(db);
35020        assert_eq!(
35021            kind,
35022            SyntaxKind::TerminalLParen,
35023            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35024            kind,
35025            SyntaxKind::TerminalLParen
35026        );
35027        Self { node }
35028    }
35029    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35030        let kind = node.kind(db);
35031        if kind == SyntaxKind::TerminalLParen {
35032            Some(Self::from_syntax_node(db, node))
35033        } else {
35034            None
35035        }
35036    }
35037    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35038        self.node
35039    }
35040    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35041        TerminalLParenPtr(self.node.stable_ptr(db))
35042    }
35043}
35044#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35045pub struct TokenLT<'db> {
35046    node: SyntaxNode<'db>,
35047}
35048impl<'db> Token<'db> for TokenLT<'db> {
35049    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35050        TokenLTGreen(
35051            GreenNode { kind: SyntaxKind::TokenLT, details: GreenNodeDetails::Token(text) }
35052                .intern(db),
35053        )
35054    }
35055    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35056        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35057    }
35058}
35059#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35060pub struct TokenLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35061impl<'db> TypedStablePtr<'db> for TokenLTPtr<'db> {
35062    type SyntaxNode = TokenLT<'db>;
35063    fn untyped(self) -> SyntaxStablePtrId<'db> {
35064        self.0
35065    }
35066    fn lookup(&self, db: &'db dyn Database) -> TokenLT<'db> {
35067        TokenLT::from_syntax_node(db, self.0.lookup(db))
35068    }
35069}
35070impl<'db> From<TokenLTPtr<'db>> for SyntaxStablePtrId<'db> {
35071    fn from(ptr: TokenLTPtr<'db>) -> Self {
35072        ptr.untyped()
35073    }
35074}
35075#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35076pub struct TokenLTGreen<'db>(pub GreenId<'db>);
35077impl<'db> TokenLTGreen<'db> {
35078    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35079        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35080    }
35081}
35082impl<'db> TypedSyntaxNode<'db> for TokenLT<'db> {
35083    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
35084    type StablePtr = TokenLTPtr<'db>;
35085    type Green = TokenLTGreen<'db>;
35086    fn missing(db: &'db dyn Database) -> Self::Green {
35087        TokenLTGreen(
35088            GreenNode {
35089                kind: SyntaxKind::TokenMissing,
35090                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35091            }
35092            .intern(db),
35093        )
35094    }
35095    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35096        match node.green_node(db).details {
35097            GreenNodeDetails::Token(_) => Self { node },
35098            GreenNodeDetails::Node { .. } => {
35099                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
35100            }
35101        }
35102    }
35103    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35104        match node.green_node(db).details {
35105            GreenNodeDetails::Token(_) => Some(Self { node }),
35106            GreenNodeDetails::Node { .. } => None,
35107        }
35108    }
35109    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35110        self.node
35111    }
35112    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35113        TokenLTPtr(self.node.stable_ptr(db))
35114    }
35115}
35116#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35117pub struct TerminalLT<'db> {
35118    node: SyntaxNode<'db>,
35119}
35120impl<'db> Terminal<'db> for TerminalLT<'db> {
35121    const KIND: SyntaxKind = SyntaxKind::TerminalLT;
35122    type TokenType = TokenLT<'db>;
35123    fn new_green(
35124        db: &'db dyn Database,
35125        leading_trivia: TriviaGreen<'db>,
35126        token: <<TerminalLT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35127        trailing_trivia: TriviaGreen<'db>,
35128    ) -> Self::Green {
35129        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35130        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35131        TerminalLTGreen(
35132            GreenNode {
35133                kind: SyntaxKind::TerminalLT,
35134                details: GreenNodeDetails::Node { children: children.into(), width },
35135            }
35136            .intern(db),
35137        )
35138    }
35139    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35140        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35141            unreachable!("Expected a node, not a token");
35142        };
35143        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35144    }
35145}
35146impl<'db> TerminalLT<'db> {
35147    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35148        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35149    }
35150    pub fn token(&self, db: &'db dyn Database) -> TokenLT<'db> {
35151        TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
35152    }
35153    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35154        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35155    }
35156}
35157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35158pub struct TerminalLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35159impl<'db> TerminalLTPtr<'db> {}
35160impl<'db> TypedStablePtr<'db> for TerminalLTPtr<'db> {
35161    type SyntaxNode = TerminalLT<'db>;
35162    fn untyped(self) -> SyntaxStablePtrId<'db> {
35163        self.0
35164    }
35165    fn lookup(&self, db: &'db dyn Database) -> TerminalLT<'db> {
35166        TerminalLT::from_syntax_node(db, self.0.lookup(db))
35167    }
35168}
35169impl<'db> From<TerminalLTPtr<'db>> for SyntaxStablePtrId<'db> {
35170    fn from(ptr: TerminalLTPtr<'db>) -> Self {
35171        ptr.untyped()
35172    }
35173}
35174#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35175pub struct TerminalLTGreen<'db>(pub GreenId<'db>);
35176impl<'db> TypedSyntaxNode<'db> for TerminalLT<'db> {
35177    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
35178    type StablePtr = TerminalLTPtr<'db>;
35179    type Green = TerminalLTGreen<'db>;
35180    fn missing(db: &'db dyn Database) -> Self::Green {
35181        TerminalLTGreen(
35182            GreenNode {
35183                kind: SyntaxKind::TerminalLT,
35184                details: GreenNodeDetails::Node {
35185                    children: [
35186                        Trivia::missing(db).0,
35187                        TokenLT::missing(db).0,
35188                        Trivia::missing(db).0,
35189                    ]
35190                    .into(),
35191                    width: TextWidth::default(),
35192                },
35193            }
35194            .intern(db),
35195        )
35196    }
35197    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35198        let kind = node.kind(db);
35199        assert_eq!(
35200            kind,
35201            SyntaxKind::TerminalLT,
35202            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35203            kind,
35204            SyntaxKind::TerminalLT
35205        );
35206        Self { node }
35207    }
35208    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35209        let kind = node.kind(db);
35210        if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
35211    }
35212    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35213        self.node
35214    }
35215    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35216        TerminalLTPtr(self.node.stable_ptr(db))
35217    }
35218}
35219#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35220pub struct TokenMatchArrow<'db> {
35221    node: SyntaxNode<'db>,
35222}
35223impl<'db> Token<'db> for TokenMatchArrow<'db> {
35224    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35225        TokenMatchArrowGreen(
35226            GreenNode { kind: SyntaxKind::TokenMatchArrow, details: GreenNodeDetails::Token(text) }
35227                .intern(db),
35228        )
35229    }
35230    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35231        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35232    }
35233}
35234#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35235pub struct TokenMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35236impl<'db> TypedStablePtr<'db> for TokenMatchArrowPtr<'db> {
35237    type SyntaxNode = TokenMatchArrow<'db>;
35238    fn untyped(self) -> SyntaxStablePtrId<'db> {
35239        self.0
35240    }
35241    fn lookup(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35242        TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
35243    }
35244}
35245impl<'db> From<TokenMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35246    fn from(ptr: TokenMatchArrowPtr<'db>) -> Self {
35247        ptr.untyped()
35248    }
35249}
35250#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35251pub struct TokenMatchArrowGreen<'db>(pub GreenId<'db>);
35252impl<'db> TokenMatchArrowGreen<'db> {
35253    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35254        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35255    }
35256}
35257impl<'db> TypedSyntaxNode<'db> for TokenMatchArrow<'db> {
35258    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
35259    type StablePtr = TokenMatchArrowPtr<'db>;
35260    type Green = TokenMatchArrowGreen<'db>;
35261    fn missing(db: &'db dyn Database) -> Self::Green {
35262        TokenMatchArrowGreen(
35263            GreenNode {
35264                kind: SyntaxKind::TokenMissing,
35265                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35266            }
35267            .intern(db),
35268        )
35269    }
35270    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35271        match node.green_node(db).details {
35272            GreenNodeDetails::Token(_) => Self { node },
35273            GreenNodeDetails::Node { .. } => {
35274                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
35275            }
35276        }
35277    }
35278    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35279        match node.green_node(db).details {
35280            GreenNodeDetails::Token(_) => Some(Self { node }),
35281            GreenNodeDetails::Node { .. } => None,
35282        }
35283    }
35284    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35285        self.node
35286    }
35287    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35288        TokenMatchArrowPtr(self.node.stable_ptr(db))
35289    }
35290}
35291#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35292pub struct TerminalMatchArrow<'db> {
35293    node: SyntaxNode<'db>,
35294}
35295impl<'db> Terminal<'db> for TerminalMatchArrow<'db> {
35296    const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
35297    type TokenType = TokenMatchArrow<'db>;
35298    fn new_green(
35299        db: &'db dyn Database,
35300        leading_trivia: TriviaGreen<'db>,
35301        token: <<TerminalMatchArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35302        trailing_trivia: TriviaGreen<'db>,
35303    ) -> Self::Green {
35304        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35305        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35306        TerminalMatchArrowGreen(
35307            GreenNode {
35308                kind: SyntaxKind::TerminalMatchArrow,
35309                details: GreenNodeDetails::Node { children: children.into(), width },
35310            }
35311            .intern(db),
35312        )
35313    }
35314    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35315        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35316            unreachable!("Expected a node, not a token");
35317        };
35318        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35319    }
35320}
35321impl<'db> TerminalMatchArrow<'db> {
35322    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35323        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35324    }
35325    pub fn token(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35326        TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
35327    }
35328    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35329        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35330    }
35331}
35332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35333pub struct TerminalMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35334impl<'db> TerminalMatchArrowPtr<'db> {}
35335impl<'db> TypedStablePtr<'db> for TerminalMatchArrowPtr<'db> {
35336    type SyntaxNode = TerminalMatchArrow<'db>;
35337    fn untyped(self) -> SyntaxStablePtrId<'db> {
35338        self.0
35339    }
35340    fn lookup(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
35341        TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
35342    }
35343}
35344impl<'db> From<TerminalMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35345    fn from(ptr: TerminalMatchArrowPtr<'db>) -> Self {
35346        ptr.untyped()
35347    }
35348}
35349#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35350pub struct TerminalMatchArrowGreen<'db>(pub GreenId<'db>);
35351impl<'db> TypedSyntaxNode<'db> for TerminalMatchArrow<'db> {
35352    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
35353    type StablePtr = TerminalMatchArrowPtr<'db>;
35354    type Green = TerminalMatchArrowGreen<'db>;
35355    fn missing(db: &'db dyn Database) -> Self::Green {
35356        TerminalMatchArrowGreen(
35357            GreenNode {
35358                kind: SyntaxKind::TerminalMatchArrow,
35359                details: GreenNodeDetails::Node {
35360                    children: [
35361                        Trivia::missing(db).0,
35362                        TokenMatchArrow::missing(db).0,
35363                        Trivia::missing(db).0,
35364                    ]
35365                    .into(),
35366                    width: TextWidth::default(),
35367                },
35368            }
35369            .intern(db),
35370        )
35371    }
35372    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35373        let kind = node.kind(db);
35374        assert_eq!(
35375            kind,
35376            SyntaxKind::TerminalMatchArrow,
35377            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35378            kind,
35379            SyntaxKind::TerminalMatchArrow
35380        );
35381        Self { node }
35382    }
35383    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35384        let kind = node.kind(db);
35385        if kind == SyntaxKind::TerminalMatchArrow {
35386            Some(Self::from_syntax_node(db, node))
35387        } else {
35388            None
35389        }
35390    }
35391    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35392        self.node
35393    }
35394    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35395        TerminalMatchArrowPtr(self.node.stable_ptr(db))
35396    }
35397}
35398#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35399pub struct TokenMinus<'db> {
35400    node: SyntaxNode<'db>,
35401}
35402impl<'db> Token<'db> for TokenMinus<'db> {
35403    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35404        TokenMinusGreen(
35405            GreenNode { kind: SyntaxKind::TokenMinus, details: GreenNodeDetails::Token(text) }
35406                .intern(db),
35407        )
35408    }
35409    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35410        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35411    }
35412}
35413#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35414pub struct TokenMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35415impl<'db> TypedStablePtr<'db> for TokenMinusPtr<'db> {
35416    type SyntaxNode = TokenMinus<'db>;
35417    fn untyped(self) -> SyntaxStablePtrId<'db> {
35418        self.0
35419    }
35420    fn lookup(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35421        TokenMinus::from_syntax_node(db, self.0.lookup(db))
35422    }
35423}
35424impl<'db> From<TokenMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35425    fn from(ptr: TokenMinusPtr<'db>) -> Self {
35426        ptr.untyped()
35427    }
35428}
35429#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35430pub struct TokenMinusGreen<'db>(pub GreenId<'db>);
35431impl<'db> TokenMinusGreen<'db> {
35432    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35433        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35434    }
35435}
35436impl<'db> TypedSyntaxNode<'db> for TokenMinus<'db> {
35437    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
35438    type StablePtr = TokenMinusPtr<'db>;
35439    type Green = TokenMinusGreen<'db>;
35440    fn missing(db: &'db dyn Database) -> Self::Green {
35441        TokenMinusGreen(
35442            GreenNode {
35443                kind: SyntaxKind::TokenMissing,
35444                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35445            }
35446            .intern(db),
35447        )
35448    }
35449    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35450        match node.green_node(db).details {
35451            GreenNodeDetails::Token(_) => Self { node },
35452            GreenNodeDetails::Node { .. } => {
35453                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
35454            }
35455        }
35456    }
35457    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35458        match node.green_node(db).details {
35459            GreenNodeDetails::Token(_) => Some(Self { node }),
35460            GreenNodeDetails::Node { .. } => None,
35461        }
35462    }
35463    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35464        self.node
35465    }
35466    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35467        TokenMinusPtr(self.node.stable_ptr(db))
35468    }
35469}
35470#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35471pub struct TerminalMinus<'db> {
35472    node: SyntaxNode<'db>,
35473}
35474impl<'db> Terminal<'db> for TerminalMinus<'db> {
35475    const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
35476    type TokenType = TokenMinus<'db>;
35477    fn new_green(
35478        db: &'db dyn Database,
35479        leading_trivia: TriviaGreen<'db>,
35480        token: <<TerminalMinus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35481        trailing_trivia: TriviaGreen<'db>,
35482    ) -> Self::Green {
35483        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35484        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35485        TerminalMinusGreen(
35486            GreenNode {
35487                kind: SyntaxKind::TerminalMinus,
35488                details: GreenNodeDetails::Node { children: children.into(), width },
35489            }
35490            .intern(db),
35491        )
35492    }
35493    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35494        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35495            unreachable!("Expected a node, not a token");
35496        };
35497        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35498    }
35499}
35500impl<'db> TerminalMinus<'db> {
35501    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35502        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35503    }
35504    pub fn token(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35505        TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
35506    }
35507    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35508        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35509    }
35510}
35511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35512pub struct TerminalMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35513impl<'db> TerminalMinusPtr<'db> {}
35514impl<'db> TypedStablePtr<'db> for TerminalMinusPtr<'db> {
35515    type SyntaxNode = TerminalMinus<'db>;
35516    fn untyped(self) -> SyntaxStablePtrId<'db> {
35517        self.0
35518    }
35519    fn lookup(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
35520        TerminalMinus::from_syntax_node(db, self.0.lookup(db))
35521    }
35522}
35523impl<'db> From<TerminalMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35524    fn from(ptr: TerminalMinusPtr<'db>) -> Self {
35525        ptr.untyped()
35526    }
35527}
35528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35529pub struct TerminalMinusGreen<'db>(pub GreenId<'db>);
35530impl<'db> TypedSyntaxNode<'db> for TerminalMinus<'db> {
35531    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
35532    type StablePtr = TerminalMinusPtr<'db>;
35533    type Green = TerminalMinusGreen<'db>;
35534    fn missing(db: &'db dyn Database) -> Self::Green {
35535        TerminalMinusGreen(
35536            GreenNode {
35537                kind: SyntaxKind::TerminalMinus,
35538                details: GreenNodeDetails::Node {
35539                    children: [
35540                        Trivia::missing(db).0,
35541                        TokenMinus::missing(db).0,
35542                        Trivia::missing(db).0,
35543                    ]
35544                    .into(),
35545                    width: TextWidth::default(),
35546                },
35547            }
35548            .intern(db),
35549        )
35550    }
35551    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35552        let kind = node.kind(db);
35553        assert_eq!(
35554            kind,
35555            SyntaxKind::TerminalMinus,
35556            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35557            kind,
35558            SyntaxKind::TerminalMinus
35559        );
35560        Self { node }
35561    }
35562    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35563        let kind = node.kind(db);
35564        if kind == SyntaxKind::TerminalMinus {
35565            Some(Self::from_syntax_node(db, node))
35566        } else {
35567            None
35568        }
35569    }
35570    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35571        self.node
35572    }
35573    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35574        TerminalMinusPtr(self.node.stable_ptr(db))
35575    }
35576}
35577#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35578pub struct TokenMinusEq<'db> {
35579    node: SyntaxNode<'db>,
35580}
35581impl<'db> Token<'db> for TokenMinusEq<'db> {
35582    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35583        TokenMinusEqGreen(
35584            GreenNode { kind: SyntaxKind::TokenMinusEq, details: GreenNodeDetails::Token(text) }
35585                .intern(db),
35586        )
35587    }
35588    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35589        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35590    }
35591}
35592#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35593pub struct TokenMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35594impl<'db> TypedStablePtr<'db> for TokenMinusEqPtr<'db> {
35595    type SyntaxNode = TokenMinusEq<'db>;
35596    fn untyped(self) -> SyntaxStablePtrId<'db> {
35597        self.0
35598    }
35599    fn lookup(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35600        TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
35601    }
35602}
35603impl<'db> From<TokenMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35604    fn from(ptr: TokenMinusEqPtr<'db>) -> Self {
35605        ptr.untyped()
35606    }
35607}
35608#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35609pub struct TokenMinusEqGreen<'db>(pub GreenId<'db>);
35610impl<'db> TokenMinusEqGreen<'db> {
35611    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35612        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35613    }
35614}
35615impl<'db> TypedSyntaxNode<'db> for TokenMinusEq<'db> {
35616    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
35617    type StablePtr = TokenMinusEqPtr<'db>;
35618    type Green = TokenMinusEqGreen<'db>;
35619    fn missing(db: &'db dyn Database) -> Self::Green {
35620        TokenMinusEqGreen(
35621            GreenNode {
35622                kind: SyntaxKind::TokenMissing,
35623                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35624            }
35625            .intern(db),
35626        )
35627    }
35628    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35629        match node.green_node(db).details {
35630            GreenNodeDetails::Token(_) => Self { node },
35631            GreenNodeDetails::Node { .. } => {
35632                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
35633            }
35634        }
35635    }
35636    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35637        match node.green_node(db).details {
35638            GreenNodeDetails::Token(_) => Some(Self { node }),
35639            GreenNodeDetails::Node { .. } => None,
35640        }
35641    }
35642    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35643        self.node
35644    }
35645    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35646        TokenMinusEqPtr(self.node.stable_ptr(db))
35647    }
35648}
35649#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35650pub struct TerminalMinusEq<'db> {
35651    node: SyntaxNode<'db>,
35652}
35653impl<'db> Terminal<'db> for TerminalMinusEq<'db> {
35654    const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
35655    type TokenType = TokenMinusEq<'db>;
35656    fn new_green(
35657        db: &'db dyn Database,
35658        leading_trivia: TriviaGreen<'db>,
35659        token: <<TerminalMinusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35660        trailing_trivia: TriviaGreen<'db>,
35661    ) -> Self::Green {
35662        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35663        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35664        TerminalMinusEqGreen(
35665            GreenNode {
35666                kind: SyntaxKind::TerminalMinusEq,
35667                details: GreenNodeDetails::Node { children: children.into(), width },
35668            }
35669            .intern(db),
35670        )
35671    }
35672    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35673        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35674            unreachable!("Expected a node, not a token");
35675        };
35676        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35677    }
35678}
35679impl<'db> TerminalMinusEq<'db> {
35680    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35681        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35682    }
35683    pub fn token(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35684        TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
35685    }
35686    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35687        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35688    }
35689}
35690#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35691pub struct TerminalMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35692impl<'db> TerminalMinusEqPtr<'db> {}
35693impl<'db> TypedStablePtr<'db> for TerminalMinusEqPtr<'db> {
35694    type SyntaxNode = TerminalMinusEq<'db>;
35695    fn untyped(self) -> SyntaxStablePtrId<'db> {
35696        self.0
35697    }
35698    fn lookup(&self, db: &'db dyn Database) -> TerminalMinusEq<'db> {
35699        TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
35700    }
35701}
35702impl<'db> From<TerminalMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35703    fn from(ptr: TerminalMinusEqPtr<'db>) -> Self {
35704        ptr.untyped()
35705    }
35706}
35707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35708pub struct TerminalMinusEqGreen<'db>(pub GreenId<'db>);
35709impl<'db> TypedSyntaxNode<'db> for TerminalMinusEq<'db> {
35710    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
35711    type StablePtr = TerminalMinusEqPtr<'db>;
35712    type Green = TerminalMinusEqGreen<'db>;
35713    fn missing(db: &'db dyn Database) -> Self::Green {
35714        TerminalMinusEqGreen(
35715            GreenNode {
35716                kind: SyntaxKind::TerminalMinusEq,
35717                details: GreenNodeDetails::Node {
35718                    children: [
35719                        Trivia::missing(db).0,
35720                        TokenMinusEq::missing(db).0,
35721                        Trivia::missing(db).0,
35722                    ]
35723                    .into(),
35724                    width: TextWidth::default(),
35725                },
35726            }
35727            .intern(db),
35728        )
35729    }
35730    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35731        let kind = node.kind(db);
35732        assert_eq!(
35733            kind,
35734            SyntaxKind::TerminalMinusEq,
35735            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35736            kind,
35737            SyntaxKind::TerminalMinusEq
35738        );
35739        Self { node }
35740    }
35741    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35742        let kind = node.kind(db);
35743        if kind == SyntaxKind::TerminalMinusEq {
35744            Some(Self::from_syntax_node(db, node))
35745        } else {
35746            None
35747        }
35748    }
35749    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35750        self.node
35751    }
35752    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35753        TerminalMinusEqPtr(self.node.stable_ptr(db))
35754    }
35755}
35756#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35757pub struct TokenMod<'db> {
35758    node: SyntaxNode<'db>,
35759}
35760impl<'db> Token<'db> for TokenMod<'db> {
35761    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35762        TokenModGreen(
35763            GreenNode { kind: SyntaxKind::TokenMod, details: GreenNodeDetails::Token(text) }
35764                .intern(db),
35765        )
35766    }
35767    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35768        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35769    }
35770}
35771#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35772pub struct TokenModPtr<'db>(pub SyntaxStablePtrId<'db>);
35773impl<'db> TypedStablePtr<'db> for TokenModPtr<'db> {
35774    type SyntaxNode = TokenMod<'db>;
35775    fn untyped(self) -> SyntaxStablePtrId<'db> {
35776        self.0
35777    }
35778    fn lookup(&self, db: &'db dyn Database) -> TokenMod<'db> {
35779        TokenMod::from_syntax_node(db, self.0.lookup(db))
35780    }
35781}
35782impl<'db> From<TokenModPtr<'db>> for SyntaxStablePtrId<'db> {
35783    fn from(ptr: TokenModPtr<'db>) -> Self {
35784        ptr.untyped()
35785    }
35786}
35787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35788pub struct TokenModGreen<'db>(pub GreenId<'db>);
35789impl<'db> TokenModGreen<'db> {
35790    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35791        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35792    }
35793}
35794impl<'db> TypedSyntaxNode<'db> for TokenMod<'db> {
35795    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
35796    type StablePtr = TokenModPtr<'db>;
35797    type Green = TokenModGreen<'db>;
35798    fn missing(db: &'db dyn Database) -> Self::Green {
35799        TokenModGreen(
35800            GreenNode {
35801                kind: SyntaxKind::TokenMissing,
35802                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35803            }
35804            .intern(db),
35805        )
35806    }
35807    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35808        match node.green_node(db).details {
35809            GreenNodeDetails::Token(_) => Self { node },
35810            GreenNodeDetails::Node { .. } => {
35811                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
35812            }
35813        }
35814    }
35815    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35816        match node.green_node(db).details {
35817            GreenNodeDetails::Token(_) => Some(Self { node }),
35818            GreenNodeDetails::Node { .. } => None,
35819        }
35820    }
35821    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35822        self.node
35823    }
35824    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35825        TokenModPtr(self.node.stable_ptr(db))
35826    }
35827}
35828#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35829pub struct TerminalMod<'db> {
35830    node: SyntaxNode<'db>,
35831}
35832impl<'db> Terminal<'db> for TerminalMod<'db> {
35833    const KIND: SyntaxKind = SyntaxKind::TerminalMod;
35834    type TokenType = TokenMod<'db>;
35835    fn new_green(
35836        db: &'db dyn Database,
35837        leading_trivia: TriviaGreen<'db>,
35838        token: <<TerminalMod<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35839        trailing_trivia: TriviaGreen<'db>,
35840    ) -> Self::Green {
35841        let children = [leading_trivia.0, token.0, trailing_trivia.0];
35842        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35843        TerminalModGreen(
35844            GreenNode {
35845                kind: SyntaxKind::TerminalMod,
35846                details: GreenNodeDetails::Node { children: children.into(), width },
35847            }
35848            .intern(db),
35849        )
35850    }
35851    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35852        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35853            unreachable!("Expected a node, not a token");
35854        };
35855        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35856    }
35857}
35858impl<'db> TerminalMod<'db> {
35859    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35860        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35861    }
35862    pub fn token(&self, db: &'db dyn Database) -> TokenMod<'db> {
35863        TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
35864    }
35865    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35866        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35867    }
35868}
35869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35870pub struct TerminalModPtr<'db>(pub SyntaxStablePtrId<'db>);
35871impl<'db> TerminalModPtr<'db> {}
35872impl<'db> TypedStablePtr<'db> for TerminalModPtr<'db> {
35873    type SyntaxNode = TerminalMod<'db>;
35874    fn untyped(self) -> SyntaxStablePtrId<'db> {
35875        self.0
35876    }
35877    fn lookup(&self, db: &'db dyn Database) -> TerminalMod<'db> {
35878        TerminalMod::from_syntax_node(db, self.0.lookup(db))
35879    }
35880}
35881impl<'db> From<TerminalModPtr<'db>> for SyntaxStablePtrId<'db> {
35882    fn from(ptr: TerminalModPtr<'db>) -> Self {
35883        ptr.untyped()
35884    }
35885}
35886#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35887pub struct TerminalModGreen<'db>(pub GreenId<'db>);
35888impl<'db> TypedSyntaxNode<'db> for TerminalMod<'db> {
35889    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
35890    type StablePtr = TerminalModPtr<'db>;
35891    type Green = TerminalModGreen<'db>;
35892    fn missing(db: &'db dyn Database) -> Self::Green {
35893        TerminalModGreen(
35894            GreenNode {
35895                kind: SyntaxKind::TerminalMod,
35896                details: GreenNodeDetails::Node {
35897                    children: [
35898                        Trivia::missing(db).0,
35899                        TokenMod::missing(db).0,
35900                        Trivia::missing(db).0,
35901                    ]
35902                    .into(),
35903                    width: TextWidth::default(),
35904                },
35905            }
35906            .intern(db),
35907        )
35908    }
35909    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35910        let kind = node.kind(db);
35911        assert_eq!(
35912            kind,
35913            SyntaxKind::TerminalMod,
35914            "Unexpected SyntaxKind {:?}. Expected {:?}.",
35915            kind,
35916            SyntaxKind::TerminalMod
35917        );
35918        Self { node }
35919    }
35920    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35921        let kind = node.kind(db);
35922        if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
35923    }
35924    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35925        self.node
35926    }
35927    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35928        TerminalModPtr(self.node.stable_ptr(db))
35929    }
35930}
35931#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35932pub struct TokenModEq<'db> {
35933    node: SyntaxNode<'db>,
35934}
35935impl<'db> Token<'db> for TokenModEq<'db> {
35936    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35937        TokenModEqGreen(
35938            GreenNode { kind: SyntaxKind::TokenModEq, details: GreenNodeDetails::Token(text) }
35939                .intern(db),
35940        )
35941    }
35942    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35943        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35944    }
35945}
35946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
35947pub struct TokenModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35948impl<'db> TypedStablePtr<'db> for TokenModEqPtr<'db> {
35949    type SyntaxNode = TokenModEq<'db>;
35950    fn untyped(self) -> SyntaxStablePtrId<'db> {
35951        self.0
35952    }
35953    fn lookup(&self, db: &'db dyn Database) -> TokenModEq<'db> {
35954        TokenModEq::from_syntax_node(db, self.0.lookup(db))
35955    }
35956}
35957impl<'db> From<TokenModEqPtr<'db>> for SyntaxStablePtrId<'db> {
35958    fn from(ptr: TokenModEqPtr<'db>) -> Self {
35959        ptr.untyped()
35960    }
35961}
35962#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35963pub struct TokenModEqGreen<'db>(pub GreenId<'db>);
35964impl<'db> TokenModEqGreen<'db> {
35965    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35966        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35967    }
35968}
35969impl<'db> TypedSyntaxNode<'db> for TokenModEq<'db> {
35970    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
35971    type StablePtr = TokenModEqPtr<'db>;
35972    type Green = TokenModEqGreen<'db>;
35973    fn missing(db: &'db dyn Database) -> Self::Green {
35974        TokenModEqGreen(
35975            GreenNode {
35976                kind: SyntaxKind::TokenMissing,
35977                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35978            }
35979            .intern(db),
35980        )
35981    }
35982    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35983        match node.green_node(db).details {
35984            GreenNodeDetails::Token(_) => Self { node },
35985            GreenNodeDetails::Node { .. } => {
35986                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
35987            }
35988        }
35989    }
35990    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35991        match node.green_node(db).details {
35992            GreenNodeDetails::Token(_) => Some(Self { node }),
35993            GreenNodeDetails::Node { .. } => None,
35994        }
35995    }
35996    fn as_syntax_node(&self) -> SyntaxNode<'db> {
35997        self.node
35998    }
35999    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36000        TokenModEqPtr(self.node.stable_ptr(db))
36001    }
36002}
36003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36004pub struct TerminalModEq<'db> {
36005    node: SyntaxNode<'db>,
36006}
36007impl<'db> Terminal<'db> for TerminalModEq<'db> {
36008    const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36009    type TokenType = TokenModEq<'db>;
36010    fn new_green(
36011        db: &'db dyn Database,
36012        leading_trivia: TriviaGreen<'db>,
36013        token: <<TerminalModEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36014        trailing_trivia: TriviaGreen<'db>,
36015    ) -> Self::Green {
36016        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36017        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36018        TerminalModEqGreen(
36019            GreenNode {
36020                kind: SyntaxKind::TerminalModEq,
36021                details: GreenNodeDetails::Node { children: children.into(), width },
36022            }
36023            .intern(db),
36024        )
36025    }
36026    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36027        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36028            unreachable!("Expected a node, not a token");
36029        };
36030        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36031    }
36032}
36033impl<'db> TerminalModEq<'db> {
36034    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36035        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36036    }
36037    pub fn token(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36038        TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
36039    }
36040    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36041        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36042    }
36043}
36044#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36045pub struct TerminalModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36046impl<'db> TerminalModEqPtr<'db> {}
36047impl<'db> TypedStablePtr<'db> for TerminalModEqPtr<'db> {
36048    type SyntaxNode = TerminalModEq<'db>;
36049    fn untyped(self) -> SyntaxStablePtrId<'db> {
36050        self.0
36051    }
36052    fn lookup(&self, db: &'db dyn Database) -> TerminalModEq<'db> {
36053        TerminalModEq::from_syntax_node(db, self.0.lookup(db))
36054    }
36055}
36056impl<'db> From<TerminalModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36057    fn from(ptr: TerminalModEqPtr<'db>) -> Self {
36058        ptr.untyped()
36059    }
36060}
36061#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36062pub struct TerminalModEqGreen<'db>(pub GreenId<'db>);
36063impl<'db> TypedSyntaxNode<'db> for TerminalModEq<'db> {
36064    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
36065    type StablePtr = TerminalModEqPtr<'db>;
36066    type Green = TerminalModEqGreen<'db>;
36067    fn missing(db: &'db dyn Database) -> Self::Green {
36068        TerminalModEqGreen(
36069            GreenNode {
36070                kind: SyntaxKind::TerminalModEq,
36071                details: GreenNodeDetails::Node {
36072                    children: [
36073                        Trivia::missing(db).0,
36074                        TokenModEq::missing(db).0,
36075                        Trivia::missing(db).0,
36076                    ]
36077                    .into(),
36078                    width: TextWidth::default(),
36079                },
36080            }
36081            .intern(db),
36082        )
36083    }
36084    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36085        let kind = node.kind(db);
36086        assert_eq!(
36087            kind,
36088            SyntaxKind::TerminalModEq,
36089            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36090            kind,
36091            SyntaxKind::TerminalModEq
36092        );
36093        Self { node }
36094    }
36095    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36096        let kind = node.kind(db);
36097        if kind == SyntaxKind::TerminalModEq {
36098            Some(Self::from_syntax_node(db, node))
36099        } else {
36100            None
36101        }
36102    }
36103    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36104        self.node
36105    }
36106    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36107        TerminalModEqPtr(self.node.stable_ptr(db))
36108    }
36109}
36110#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36111pub struct TokenMul<'db> {
36112    node: SyntaxNode<'db>,
36113}
36114impl<'db> Token<'db> for TokenMul<'db> {
36115    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36116        TokenMulGreen(
36117            GreenNode { kind: SyntaxKind::TokenMul, details: GreenNodeDetails::Token(text) }
36118                .intern(db),
36119        )
36120    }
36121    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36122        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36123    }
36124}
36125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36126pub struct TokenMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36127impl<'db> TypedStablePtr<'db> for TokenMulPtr<'db> {
36128    type SyntaxNode = TokenMul<'db>;
36129    fn untyped(self) -> SyntaxStablePtrId<'db> {
36130        self.0
36131    }
36132    fn lookup(&self, db: &'db dyn Database) -> TokenMul<'db> {
36133        TokenMul::from_syntax_node(db, self.0.lookup(db))
36134    }
36135}
36136impl<'db> From<TokenMulPtr<'db>> for SyntaxStablePtrId<'db> {
36137    fn from(ptr: TokenMulPtr<'db>) -> Self {
36138        ptr.untyped()
36139    }
36140}
36141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36142pub struct TokenMulGreen<'db>(pub GreenId<'db>);
36143impl<'db> TokenMulGreen<'db> {
36144    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36145        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36146    }
36147}
36148impl<'db> TypedSyntaxNode<'db> for TokenMul<'db> {
36149    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
36150    type StablePtr = TokenMulPtr<'db>;
36151    type Green = TokenMulGreen<'db>;
36152    fn missing(db: &'db dyn Database) -> Self::Green {
36153        TokenMulGreen(
36154            GreenNode {
36155                kind: SyntaxKind::TokenMissing,
36156                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36157            }
36158            .intern(db),
36159        )
36160    }
36161    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36162        match node.green_node(db).details {
36163            GreenNodeDetails::Token(_) => Self { node },
36164            GreenNodeDetails::Node { .. } => {
36165                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
36166            }
36167        }
36168    }
36169    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36170        match node.green_node(db).details {
36171            GreenNodeDetails::Token(_) => Some(Self { node }),
36172            GreenNodeDetails::Node { .. } => None,
36173        }
36174    }
36175    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36176        self.node
36177    }
36178    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36179        TokenMulPtr(self.node.stable_ptr(db))
36180    }
36181}
36182#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36183pub struct TerminalMul<'db> {
36184    node: SyntaxNode<'db>,
36185}
36186impl<'db> Terminal<'db> for TerminalMul<'db> {
36187    const KIND: SyntaxKind = SyntaxKind::TerminalMul;
36188    type TokenType = TokenMul<'db>;
36189    fn new_green(
36190        db: &'db dyn Database,
36191        leading_trivia: TriviaGreen<'db>,
36192        token: <<TerminalMul<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36193        trailing_trivia: TriviaGreen<'db>,
36194    ) -> Self::Green {
36195        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36196        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36197        TerminalMulGreen(
36198            GreenNode {
36199                kind: SyntaxKind::TerminalMul,
36200                details: GreenNodeDetails::Node { children: children.into(), width },
36201            }
36202            .intern(db),
36203        )
36204    }
36205    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36206        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36207            unreachable!("Expected a node, not a token");
36208        };
36209        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36210    }
36211}
36212impl<'db> TerminalMul<'db> {
36213    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36214        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36215    }
36216    pub fn token(&self, db: &'db dyn Database) -> TokenMul<'db> {
36217        TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
36218    }
36219    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36220        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36221    }
36222}
36223#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36224pub struct TerminalMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36225impl<'db> TerminalMulPtr<'db> {}
36226impl<'db> TypedStablePtr<'db> for TerminalMulPtr<'db> {
36227    type SyntaxNode = TerminalMul<'db>;
36228    fn untyped(self) -> SyntaxStablePtrId<'db> {
36229        self.0
36230    }
36231    fn lookup(&self, db: &'db dyn Database) -> TerminalMul<'db> {
36232        TerminalMul::from_syntax_node(db, self.0.lookup(db))
36233    }
36234}
36235impl<'db> From<TerminalMulPtr<'db>> for SyntaxStablePtrId<'db> {
36236    fn from(ptr: TerminalMulPtr<'db>) -> Self {
36237        ptr.untyped()
36238    }
36239}
36240#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36241pub struct TerminalMulGreen<'db>(pub GreenId<'db>);
36242impl<'db> TypedSyntaxNode<'db> for TerminalMul<'db> {
36243    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
36244    type StablePtr = TerminalMulPtr<'db>;
36245    type Green = TerminalMulGreen<'db>;
36246    fn missing(db: &'db dyn Database) -> Self::Green {
36247        TerminalMulGreen(
36248            GreenNode {
36249                kind: SyntaxKind::TerminalMul,
36250                details: GreenNodeDetails::Node {
36251                    children: [
36252                        Trivia::missing(db).0,
36253                        TokenMul::missing(db).0,
36254                        Trivia::missing(db).0,
36255                    ]
36256                    .into(),
36257                    width: TextWidth::default(),
36258                },
36259            }
36260            .intern(db),
36261        )
36262    }
36263    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36264        let kind = node.kind(db);
36265        assert_eq!(
36266            kind,
36267            SyntaxKind::TerminalMul,
36268            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36269            kind,
36270            SyntaxKind::TerminalMul
36271        );
36272        Self { node }
36273    }
36274    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36275        let kind = node.kind(db);
36276        if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
36277    }
36278    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36279        self.node
36280    }
36281    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36282        TerminalMulPtr(self.node.stable_ptr(db))
36283    }
36284}
36285#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36286pub struct TokenMulEq<'db> {
36287    node: SyntaxNode<'db>,
36288}
36289impl<'db> Token<'db> for TokenMulEq<'db> {
36290    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36291        TokenMulEqGreen(
36292            GreenNode { kind: SyntaxKind::TokenMulEq, details: GreenNodeDetails::Token(text) }
36293                .intern(db),
36294        )
36295    }
36296    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36297        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36298    }
36299}
36300#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36301pub struct TokenMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36302impl<'db> TypedStablePtr<'db> for TokenMulEqPtr<'db> {
36303    type SyntaxNode = TokenMulEq<'db>;
36304    fn untyped(self) -> SyntaxStablePtrId<'db> {
36305        self.0
36306    }
36307    fn lookup(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36308        TokenMulEq::from_syntax_node(db, self.0.lookup(db))
36309    }
36310}
36311impl<'db> From<TokenMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36312    fn from(ptr: TokenMulEqPtr<'db>) -> Self {
36313        ptr.untyped()
36314    }
36315}
36316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36317pub struct TokenMulEqGreen<'db>(pub GreenId<'db>);
36318impl<'db> TokenMulEqGreen<'db> {
36319    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36320        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36321    }
36322}
36323impl<'db> TypedSyntaxNode<'db> for TokenMulEq<'db> {
36324    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
36325    type StablePtr = TokenMulEqPtr<'db>;
36326    type Green = TokenMulEqGreen<'db>;
36327    fn missing(db: &'db dyn Database) -> Self::Green {
36328        TokenMulEqGreen(
36329            GreenNode {
36330                kind: SyntaxKind::TokenMissing,
36331                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36332            }
36333            .intern(db),
36334        )
36335    }
36336    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36337        match node.green_node(db).details {
36338            GreenNodeDetails::Token(_) => Self { node },
36339            GreenNodeDetails::Node { .. } => {
36340                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
36341            }
36342        }
36343    }
36344    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36345        match node.green_node(db).details {
36346            GreenNodeDetails::Token(_) => Some(Self { node }),
36347            GreenNodeDetails::Node { .. } => None,
36348        }
36349    }
36350    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36351        self.node
36352    }
36353    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36354        TokenMulEqPtr(self.node.stable_ptr(db))
36355    }
36356}
36357#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36358pub struct TerminalMulEq<'db> {
36359    node: SyntaxNode<'db>,
36360}
36361impl<'db> Terminal<'db> for TerminalMulEq<'db> {
36362    const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
36363    type TokenType = TokenMulEq<'db>;
36364    fn new_green(
36365        db: &'db dyn Database,
36366        leading_trivia: TriviaGreen<'db>,
36367        token: <<TerminalMulEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36368        trailing_trivia: TriviaGreen<'db>,
36369    ) -> Self::Green {
36370        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36371        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36372        TerminalMulEqGreen(
36373            GreenNode {
36374                kind: SyntaxKind::TerminalMulEq,
36375                details: GreenNodeDetails::Node { children: children.into(), width },
36376            }
36377            .intern(db),
36378        )
36379    }
36380    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36381        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36382            unreachable!("Expected a node, not a token");
36383        };
36384        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36385    }
36386}
36387impl<'db> TerminalMulEq<'db> {
36388    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36389        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36390    }
36391    pub fn token(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36392        TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
36393    }
36394    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36395        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36396    }
36397}
36398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36399pub struct TerminalMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36400impl<'db> TerminalMulEqPtr<'db> {}
36401impl<'db> TypedStablePtr<'db> for TerminalMulEqPtr<'db> {
36402    type SyntaxNode = TerminalMulEq<'db>;
36403    fn untyped(self) -> SyntaxStablePtrId<'db> {
36404        self.0
36405    }
36406    fn lookup(&self, db: &'db dyn Database) -> TerminalMulEq<'db> {
36407        TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
36408    }
36409}
36410impl<'db> From<TerminalMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36411    fn from(ptr: TerminalMulEqPtr<'db>) -> Self {
36412        ptr.untyped()
36413    }
36414}
36415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36416pub struct TerminalMulEqGreen<'db>(pub GreenId<'db>);
36417impl<'db> TypedSyntaxNode<'db> for TerminalMulEq<'db> {
36418    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
36419    type StablePtr = TerminalMulEqPtr<'db>;
36420    type Green = TerminalMulEqGreen<'db>;
36421    fn missing(db: &'db dyn Database) -> Self::Green {
36422        TerminalMulEqGreen(
36423            GreenNode {
36424                kind: SyntaxKind::TerminalMulEq,
36425                details: GreenNodeDetails::Node {
36426                    children: [
36427                        Trivia::missing(db).0,
36428                        TokenMulEq::missing(db).0,
36429                        Trivia::missing(db).0,
36430                    ]
36431                    .into(),
36432                    width: TextWidth::default(),
36433                },
36434            }
36435            .intern(db),
36436        )
36437    }
36438    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36439        let kind = node.kind(db);
36440        assert_eq!(
36441            kind,
36442            SyntaxKind::TerminalMulEq,
36443            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36444            kind,
36445            SyntaxKind::TerminalMulEq
36446        );
36447        Self { node }
36448    }
36449    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36450        let kind = node.kind(db);
36451        if kind == SyntaxKind::TerminalMulEq {
36452            Some(Self::from_syntax_node(db, node))
36453        } else {
36454            None
36455        }
36456    }
36457    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36458        self.node
36459    }
36460    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36461        TerminalMulEqPtr(self.node.stable_ptr(db))
36462    }
36463}
36464#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36465pub struct TokenNeq<'db> {
36466    node: SyntaxNode<'db>,
36467}
36468impl<'db> Token<'db> for TokenNeq<'db> {
36469    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36470        TokenNeqGreen(
36471            GreenNode { kind: SyntaxKind::TokenNeq, details: GreenNodeDetails::Token(text) }
36472                .intern(db),
36473        )
36474    }
36475    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36476        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36477    }
36478}
36479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36480pub struct TokenNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36481impl<'db> TypedStablePtr<'db> for TokenNeqPtr<'db> {
36482    type SyntaxNode = TokenNeq<'db>;
36483    fn untyped(self) -> SyntaxStablePtrId<'db> {
36484        self.0
36485    }
36486    fn lookup(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36487        TokenNeq::from_syntax_node(db, self.0.lookup(db))
36488    }
36489}
36490impl<'db> From<TokenNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36491    fn from(ptr: TokenNeqPtr<'db>) -> Self {
36492        ptr.untyped()
36493    }
36494}
36495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36496pub struct TokenNeqGreen<'db>(pub GreenId<'db>);
36497impl<'db> TokenNeqGreen<'db> {
36498    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36499        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36500    }
36501}
36502impl<'db> TypedSyntaxNode<'db> for TokenNeq<'db> {
36503    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
36504    type StablePtr = TokenNeqPtr<'db>;
36505    type Green = TokenNeqGreen<'db>;
36506    fn missing(db: &'db dyn Database) -> Self::Green {
36507        TokenNeqGreen(
36508            GreenNode {
36509                kind: SyntaxKind::TokenMissing,
36510                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36511            }
36512            .intern(db),
36513        )
36514    }
36515    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36516        match node.green_node(db).details {
36517            GreenNodeDetails::Token(_) => Self { node },
36518            GreenNodeDetails::Node { .. } => {
36519                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
36520            }
36521        }
36522    }
36523    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36524        match node.green_node(db).details {
36525            GreenNodeDetails::Token(_) => Some(Self { node }),
36526            GreenNodeDetails::Node { .. } => None,
36527        }
36528    }
36529    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36530        self.node
36531    }
36532    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36533        TokenNeqPtr(self.node.stable_ptr(db))
36534    }
36535}
36536#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36537pub struct TerminalNeq<'db> {
36538    node: SyntaxNode<'db>,
36539}
36540impl<'db> Terminal<'db> for TerminalNeq<'db> {
36541    const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
36542    type TokenType = TokenNeq<'db>;
36543    fn new_green(
36544        db: &'db dyn Database,
36545        leading_trivia: TriviaGreen<'db>,
36546        token: <<TerminalNeq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36547        trailing_trivia: TriviaGreen<'db>,
36548    ) -> Self::Green {
36549        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36550        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36551        TerminalNeqGreen(
36552            GreenNode {
36553                kind: SyntaxKind::TerminalNeq,
36554                details: GreenNodeDetails::Node { children: children.into(), width },
36555            }
36556            .intern(db),
36557        )
36558    }
36559    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36560        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36561            unreachable!("Expected a node, not a token");
36562        };
36563        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36564    }
36565}
36566impl<'db> TerminalNeq<'db> {
36567    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36568        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36569    }
36570    pub fn token(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36571        TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
36572    }
36573    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36574        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36575    }
36576}
36577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36578pub struct TerminalNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36579impl<'db> TerminalNeqPtr<'db> {}
36580impl<'db> TypedStablePtr<'db> for TerminalNeqPtr<'db> {
36581    type SyntaxNode = TerminalNeq<'db>;
36582    fn untyped(self) -> SyntaxStablePtrId<'db> {
36583        self.0
36584    }
36585    fn lookup(&self, db: &'db dyn Database) -> TerminalNeq<'db> {
36586        TerminalNeq::from_syntax_node(db, self.0.lookup(db))
36587    }
36588}
36589impl<'db> From<TerminalNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36590    fn from(ptr: TerminalNeqPtr<'db>) -> Self {
36591        ptr.untyped()
36592    }
36593}
36594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36595pub struct TerminalNeqGreen<'db>(pub GreenId<'db>);
36596impl<'db> TypedSyntaxNode<'db> for TerminalNeq<'db> {
36597    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
36598    type StablePtr = TerminalNeqPtr<'db>;
36599    type Green = TerminalNeqGreen<'db>;
36600    fn missing(db: &'db dyn Database) -> Self::Green {
36601        TerminalNeqGreen(
36602            GreenNode {
36603                kind: SyntaxKind::TerminalNeq,
36604                details: GreenNodeDetails::Node {
36605                    children: [
36606                        Trivia::missing(db).0,
36607                        TokenNeq::missing(db).0,
36608                        Trivia::missing(db).0,
36609                    ]
36610                    .into(),
36611                    width: TextWidth::default(),
36612                },
36613            }
36614            .intern(db),
36615        )
36616    }
36617    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36618        let kind = node.kind(db);
36619        assert_eq!(
36620            kind,
36621            SyntaxKind::TerminalNeq,
36622            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36623            kind,
36624            SyntaxKind::TerminalNeq
36625        );
36626        Self { node }
36627    }
36628    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36629        let kind = node.kind(db);
36630        if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
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        TerminalNeqPtr(self.node.stable_ptr(db))
36637    }
36638}
36639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36640pub struct TokenNot<'db> {
36641    node: SyntaxNode<'db>,
36642}
36643impl<'db> Token<'db> for TokenNot<'db> {
36644    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36645        TokenNotGreen(
36646            GreenNode { kind: SyntaxKind::TokenNot, details: GreenNodeDetails::Token(text) }
36647                .intern(db),
36648        )
36649    }
36650    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36651        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36652    }
36653}
36654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36655pub struct TokenNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36656impl<'db> TypedStablePtr<'db> for TokenNotPtr<'db> {
36657    type SyntaxNode = TokenNot<'db>;
36658    fn untyped(self) -> SyntaxStablePtrId<'db> {
36659        self.0
36660    }
36661    fn lookup(&self, db: &'db dyn Database) -> TokenNot<'db> {
36662        TokenNot::from_syntax_node(db, self.0.lookup(db))
36663    }
36664}
36665impl<'db> From<TokenNotPtr<'db>> for SyntaxStablePtrId<'db> {
36666    fn from(ptr: TokenNotPtr<'db>) -> Self {
36667        ptr.untyped()
36668    }
36669}
36670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36671pub struct TokenNotGreen<'db>(pub GreenId<'db>);
36672impl<'db> TokenNotGreen<'db> {
36673    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36674        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36675    }
36676}
36677impl<'db> TypedSyntaxNode<'db> for TokenNot<'db> {
36678    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
36679    type StablePtr = TokenNotPtr<'db>;
36680    type Green = TokenNotGreen<'db>;
36681    fn missing(db: &'db dyn Database) -> Self::Green {
36682        TokenNotGreen(
36683            GreenNode {
36684                kind: SyntaxKind::TokenMissing,
36685                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36686            }
36687            .intern(db),
36688        )
36689    }
36690    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36691        match node.green_node(db).details {
36692            GreenNodeDetails::Token(_) => Self { node },
36693            GreenNodeDetails::Node { .. } => {
36694                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
36695            }
36696        }
36697    }
36698    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36699        match node.green_node(db).details {
36700            GreenNodeDetails::Token(_) => Some(Self { node }),
36701            GreenNodeDetails::Node { .. } => None,
36702        }
36703    }
36704    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36705        self.node
36706    }
36707    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36708        TokenNotPtr(self.node.stable_ptr(db))
36709    }
36710}
36711#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36712pub struct TerminalNot<'db> {
36713    node: SyntaxNode<'db>,
36714}
36715impl<'db> Terminal<'db> for TerminalNot<'db> {
36716    const KIND: SyntaxKind = SyntaxKind::TerminalNot;
36717    type TokenType = TokenNot<'db>;
36718    fn new_green(
36719        db: &'db dyn Database,
36720        leading_trivia: TriviaGreen<'db>,
36721        token: <<TerminalNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36722        trailing_trivia: TriviaGreen<'db>,
36723    ) -> Self::Green {
36724        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36725        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36726        TerminalNotGreen(
36727            GreenNode {
36728                kind: SyntaxKind::TerminalNot,
36729                details: GreenNodeDetails::Node { children: children.into(), width },
36730            }
36731            .intern(db),
36732        )
36733    }
36734    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36735        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36736            unreachable!("Expected a node, not a token");
36737        };
36738        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36739    }
36740}
36741impl<'db> TerminalNot<'db> {
36742    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36743        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36744    }
36745    pub fn token(&self, db: &'db dyn Database) -> TokenNot<'db> {
36746        TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
36747    }
36748    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36749        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36750    }
36751}
36752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36753pub struct TerminalNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36754impl<'db> TerminalNotPtr<'db> {}
36755impl<'db> TypedStablePtr<'db> for TerminalNotPtr<'db> {
36756    type SyntaxNode = TerminalNot<'db>;
36757    fn untyped(self) -> SyntaxStablePtrId<'db> {
36758        self.0
36759    }
36760    fn lookup(&self, db: &'db dyn Database) -> TerminalNot<'db> {
36761        TerminalNot::from_syntax_node(db, self.0.lookup(db))
36762    }
36763}
36764impl<'db> From<TerminalNotPtr<'db>> for SyntaxStablePtrId<'db> {
36765    fn from(ptr: TerminalNotPtr<'db>) -> Self {
36766        ptr.untyped()
36767    }
36768}
36769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36770pub struct TerminalNotGreen<'db>(pub GreenId<'db>);
36771impl<'db> TypedSyntaxNode<'db> for TerminalNot<'db> {
36772    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
36773    type StablePtr = TerminalNotPtr<'db>;
36774    type Green = TerminalNotGreen<'db>;
36775    fn missing(db: &'db dyn Database) -> Self::Green {
36776        TerminalNotGreen(
36777            GreenNode {
36778                kind: SyntaxKind::TerminalNot,
36779                details: GreenNodeDetails::Node {
36780                    children: [
36781                        Trivia::missing(db).0,
36782                        TokenNot::missing(db).0,
36783                        Trivia::missing(db).0,
36784                    ]
36785                    .into(),
36786                    width: TextWidth::default(),
36787                },
36788            }
36789            .intern(db),
36790        )
36791    }
36792    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36793        let kind = node.kind(db);
36794        assert_eq!(
36795            kind,
36796            SyntaxKind::TerminalNot,
36797            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36798            kind,
36799            SyntaxKind::TerminalNot
36800        );
36801        Self { node }
36802    }
36803    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36804        let kind = node.kind(db);
36805        if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
36806    }
36807    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36808        self.node
36809    }
36810    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36811        TerminalNotPtr(self.node.stable_ptr(db))
36812    }
36813}
36814#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36815pub struct TokenBitNot<'db> {
36816    node: SyntaxNode<'db>,
36817}
36818impl<'db> Token<'db> for TokenBitNot<'db> {
36819    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36820        TokenBitNotGreen(
36821            GreenNode { kind: SyntaxKind::TokenBitNot, details: GreenNodeDetails::Token(text) }
36822                .intern(db),
36823        )
36824    }
36825    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36826        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36827    }
36828}
36829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36830pub struct TokenBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36831impl<'db> TypedStablePtr<'db> for TokenBitNotPtr<'db> {
36832    type SyntaxNode = TokenBitNot<'db>;
36833    fn untyped(self) -> SyntaxStablePtrId<'db> {
36834        self.0
36835    }
36836    fn lookup(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
36837        TokenBitNot::from_syntax_node(db, self.0.lookup(db))
36838    }
36839}
36840impl<'db> From<TokenBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
36841    fn from(ptr: TokenBitNotPtr<'db>) -> Self {
36842        ptr.untyped()
36843    }
36844}
36845#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36846pub struct TokenBitNotGreen<'db>(pub GreenId<'db>);
36847impl<'db> TokenBitNotGreen<'db> {
36848    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36849        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36850    }
36851}
36852impl<'db> TypedSyntaxNode<'db> for TokenBitNot<'db> {
36853    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
36854    type StablePtr = TokenBitNotPtr<'db>;
36855    type Green = TokenBitNotGreen<'db>;
36856    fn missing(db: &'db dyn Database) -> Self::Green {
36857        TokenBitNotGreen(
36858            GreenNode {
36859                kind: SyntaxKind::TokenMissing,
36860                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36861            }
36862            .intern(db),
36863        )
36864    }
36865    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36866        match node.green_node(db).details {
36867            GreenNodeDetails::Token(_) => Self { node },
36868            GreenNodeDetails::Node { .. } => {
36869                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
36870            }
36871        }
36872    }
36873    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36874        match node.green_node(db).details {
36875            GreenNodeDetails::Token(_) => Some(Self { node }),
36876            GreenNodeDetails::Node { .. } => None,
36877        }
36878    }
36879    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36880        self.node
36881    }
36882    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36883        TokenBitNotPtr(self.node.stable_ptr(db))
36884    }
36885}
36886#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36887pub struct TerminalBitNot<'db> {
36888    node: SyntaxNode<'db>,
36889}
36890impl<'db> Terminal<'db> for TerminalBitNot<'db> {
36891    const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
36892    type TokenType = TokenBitNot<'db>;
36893    fn new_green(
36894        db: &'db dyn Database,
36895        leading_trivia: TriviaGreen<'db>,
36896        token: <<TerminalBitNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36897        trailing_trivia: TriviaGreen<'db>,
36898    ) -> Self::Green {
36899        let children = [leading_trivia.0, token.0, trailing_trivia.0];
36900        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36901        TerminalBitNotGreen(
36902            GreenNode {
36903                kind: SyntaxKind::TerminalBitNot,
36904                details: GreenNodeDetails::Node { children: children.into(), width },
36905            }
36906            .intern(db),
36907        )
36908    }
36909    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36910        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36911            unreachable!("Expected a node, not a token");
36912        };
36913        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36914    }
36915}
36916impl<'db> TerminalBitNot<'db> {
36917    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36918        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36919    }
36920    pub fn token(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
36921        TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
36922    }
36923    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36924        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36925    }
36926}
36927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
36928pub struct TerminalBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36929impl<'db> TerminalBitNotPtr<'db> {}
36930impl<'db> TypedStablePtr<'db> for TerminalBitNotPtr<'db> {
36931    type SyntaxNode = TerminalBitNot<'db>;
36932    fn untyped(self) -> SyntaxStablePtrId<'db> {
36933        self.0
36934    }
36935    fn lookup(&self, db: &'db dyn Database) -> TerminalBitNot<'db> {
36936        TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
36937    }
36938}
36939impl<'db> From<TerminalBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
36940    fn from(ptr: TerminalBitNotPtr<'db>) -> Self {
36941        ptr.untyped()
36942    }
36943}
36944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36945pub struct TerminalBitNotGreen<'db>(pub GreenId<'db>);
36946impl<'db> TypedSyntaxNode<'db> for TerminalBitNot<'db> {
36947    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
36948    type StablePtr = TerminalBitNotPtr<'db>;
36949    type Green = TerminalBitNotGreen<'db>;
36950    fn missing(db: &'db dyn Database) -> Self::Green {
36951        TerminalBitNotGreen(
36952            GreenNode {
36953                kind: SyntaxKind::TerminalBitNot,
36954                details: GreenNodeDetails::Node {
36955                    children: [
36956                        Trivia::missing(db).0,
36957                        TokenBitNot::missing(db).0,
36958                        Trivia::missing(db).0,
36959                    ]
36960                    .into(),
36961                    width: TextWidth::default(),
36962                },
36963            }
36964            .intern(db),
36965        )
36966    }
36967    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36968        let kind = node.kind(db);
36969        assert_eq!(
36970            kind,
36971            SyntaxKind::TerminalBitNot,
36972            "Unexpected SyntaxKind {:?}. Expected {:?}.",
36973            kind,
36974            SyntaxKind::TerminalBitNot
36975        );
36976        Self { node }
36977    }
36978    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36979        let kind = node.kind(db);
36980        if kind == SyntaxKind::TerminalBitNot {
36981            Some(Self::from_syntax_node(db, node))
36982        } else {
36983            None
36984        }
36985    }
36986    fn as_syntax_node(&self) -> SyntaxNode<'db> {
36987        self.node
36988    }
36989    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36990        TerminalBitNotPtr(self.node.stable_ptr(db))
36991    }
36992}
36993#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36994pub struct TokenOr<'db> {
36995    node: SyntaxNode<'db>,
36996}
36997impl<'db> Token<'db> for TokenOr<'db> {
36998    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36999        TokenOrGreen(
37000            GreenNode { kind: SyntaxKind::TokenOr, details: GreenNodeDetails::Token(text) }
37001                .intern(db),
37002        )
37003    }
37004    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37005        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37006    }
37007}
37008#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37009pub struct TokenOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37010impl<'db> TypedStablePtr<'db> for TokenOrPtr<'db> {
37011    type SyntaxNode = TokenOr<'db>;
37012    fn untyped(self) -> SyntaxStablePtrId<'db> {
37013        self.0
37014    }
37015    fn lookup(&self, db: &'db dyn Database) -> TokenOr<'db> {
37016        TokenOr::from_syntax_node(db, self.0.lookup(db))
37017    }
37018}
37019impl<'db> From<TokenOrPtr<'db>> for SyntaxStablePtrId<'db> {
37020    fn from(ptr: TokenOrPtr<'db>) -> Self {
37021        ptr.untyped()
37022    }
37023}
37024#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37025pub struct TokenOrGreen<'db>(pub GreenId<'db>);
37026impl<'db> TokenOrGreen<'db> {
37027    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37028        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37029    }
37030}
37031impl<'db> TypedSyntaxNode<'db> for TokenOr<'db> {
37032    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
37033    type StablePtr = TokenOrPtr<'db>;
37034    type Green = TokenOrGreen<'db>;
37035    fn missing(db: &'db dyn Database) -> Self::Green {
37036        TokenOrGreen(
37037            GreenNode {
37038                kind: SyntaxKind::TokenMissing,
37039                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37040            }
37041            .intern(db),
37042        )
37043    }
37044    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37045        match node.green_node(db).details {
37046            GreenNodeDetails::Token(_) => Self { node },
37047            GreenNodeDetails::Node { .. } => {
37048                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
37049            }
37050        }
37051    }
37052    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37053        match node.green_node(db).details {
37054            GreenNodeDetails::Token(_) => Some(Self { node }),
37055            GreenNodeDetails::Node { .. } => None,
37056        }
37057    }
37058    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37059        self.node
37060    }
37061    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37062        TokenOrPtr(self.node.stable_ptr(db))
37063    }
37064}
37065#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37066pub struct TerminalOr<'db> {
37067    node: SyntaxNode<'db>,
37068}
37069impl<'db> Terminal<'db> for TerminalOr<'db> {
37070    const KIND: SyntaxKind = SyntaxKind::TerminalOr;
37071    type TokenType = TokenOr<'db>;
37072    fn new_green(
37073        db: &'db dyn Database,
37074        leading_trivia: TriviaGreen<'db>,
37075        token: <<TerminalOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37076        trailing_trivia: TriviaGreen<'db>,
37077    ) -> Self::Green {
37078        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37079        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37080        TerminalOrGreen(
37081            GreenNode {
37082                kind: SyntaxKind::TerminalOr,
37083                details: GreenNodeDetails::Node { children: children.into(), width },
37084            }
37085            .intern(db),
37086        )
37087    }
37088    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37089        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37090            unreachable!("Expected a node, not a token");
37091        };
37092        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37093    }
37094}
37095impl<'db> TerminalOr<'db> {
37096    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37097        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37098    }
37099    pub fn token(&self, db: &'db dyn Database) -> TokenOr<'db> {
37100        TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
37101    }
37102    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37103        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37104    }
37105}
37106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37107pub struct TerminalOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37108impl<'db> TerminalOrPtr<'db> {}
37109impl<'db> TypedStablePtr<'db> for TerminalOrPtr<'db> {
37110    type SyntaxNode = TerminalOr<'db>;
37111    fn untyped(self) -> SyntaxStablePtrId<'db> {
37112        self.0
37113    }
37114    fn lookup(&self, db: &'db dyn Database) -> TerminalOr<'db> {
37115        TerminalOr::from_syntax_node(db, self.0.lookup(db))
37116    }
37117}
37118impl<'db> From<TerminalOrPtr<'db>> for SyntaxStablePtrId<'db> {
37119    fn from(ptr: TerminalOrPtr<'db>) -> Self {
37120        ptr.untyped()
37121    }
37122}
37123#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37124pub struct TerminalOrGreen<'db>(pub GreenId<'db>);
37125impl<'db> TypedSyntaxNode<'db> for TerminalOr<'db> {
37126    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
37127    type StablePtr = TerminalOrPtr<'db>;
37128    type Green = TerminalOrGreen<'db>;
37129    fn missing(db: &'db dyn Database) -> Self::Green {
37130        TerminalOrGreen(
37131            GreenNode {
37132                kind: SyntaxKind::TerminalOr,
37133                details: GreenNodeDetails::Node {
37134                    children: [
37135                        Trivia::missing(db).0,
37136                        TokenOr::missing(db).0,
37137                        Trivia::missing(db).0,
37138                    ]
37139                    .into(),
37140                    width: TextWidth::default(),
37141                },
37142            }
37143            .intern(db),
37144        )
37145    }
37146    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37147        let kind = node.kind(db);
37148        assert_eq!(
37149            kind,
37150            SyntaxKind::TerminalOr,
37151            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37152            kind,
37153            SyntaxKind::TerminalOr
37154        );
37155        Self { node }
37156    }
37157    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37158        let kind = node.kind(db);
37159        if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
37160    }
37161    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37162        self.node
37163    }
37164    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37165        TerminalOrPtr(self.node.stable_ptr(db))
37166    }
37167}
37168#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37169pub struct TokenOrOr<'db> {
37170    node: SyntaxNode<'db>,
37171}
37172impl<'db> Token<'db> for TokenOrOr<'db> {
37173    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37174        TokenOrOrGreen(
37175            GreenNode { kind: SyntaxKind::TokenOrOr, details: GreenNodeDetails::Token(text) }
37176                .intern(db),
37177        )
37178    }
37179    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37180        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37181    }
37182}
37183#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37184pub struct TokenOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37185impl<'db> TypedStablePtr<'db> for TokenOrOrPtr<'db> {
37186    type SyntaxNode = TokenOrOr<'db>;
37187    fn untyped(self) -> SyntaxStablePtrId<'db> {
37188        self.0
37189    }
37190    fn lookup(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37191        TokenOrOr::from_syntax_node(db, self.0.lookup(db))
37192    }
37193}
37194impl<'db> From<TokenOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37195    fn from(ptr: TokenOrOrPtr<'db>) -> Self {
37196        ptr.untyped()
37197    }
37198}
37199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37200pub struct TokenOrOrGreen<'db>(pub GreenId<'db>);
37201impl<'db> TokenOrOrGreen<'db> {
37202    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37203        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37204    }
37205}
37206impl<'db> TypedSyntaxNode<'db> for TokenOrOr<'db> {
37207    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
37208    type StablePtr = TokenOrOrPtr<'db>;
37209    type Green = TokenOrOrGreen<'db>;
37210    fn missing(db: &'db dyn Database) -> Self::Green {
37211        TokenOrOrGreen(
37212            GreenNode {
37213                kind: SyntaxKind::TokenMissing,
37214                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37215            }
37216            .intern(db),
37217        )
37218    }
37219    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37220        match node.green_node(db).details {
37221            GreenNodeDetails::Token(_) => Self { node },
37222            GreenNodeDetails::Node { .. } => {
37223                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
37224            }
37225        }
37226    }
37227    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37228        match node.green_node(db).details {
37229            GreenNodeDetails::Token(_) => Some(Self { node }),
37230            GreenNodeDetails::Node { .. } => None,
37231        }
37232    }
37233    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37234        self.node
37235    }
37236    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37237        TokenOrOrPtr(self.node.stable_ptr(db))
37238    }
37239}
37240#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37241pub struct TerminalOrOr<'db> {
37242    node: SyntaxNode<'db>,
37243}
37244impl<'db> Terminal<'db> for TerminalOrOr<'db> {
37245    const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
37246    type TokenType = TokenOrOr<'db>;
37247    fn new_green(
37248        db: &'db dyn Database,
37249        leading_trivia: TriviaGreen<'db>,
37250        token: <<TerminalOrOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37251        trailing_trivia: TriviaGreen<'db>,
37252    ) -> Self::Green {
37253        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37254        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37255        TerminalOrOrGreen(
37256            GreenNode {
37257                kind: SyntaxKind::TerminalOrOr,
37258                details: GreenNodeDetails::Node { children: children.into(), width },
37259            }
37260            .intern(db),
37261        )
37262    }
37263    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37264        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37265            unreachable!("Expected a node, not a token");
37266        };
37267        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37268    }
37269}
37270impl<'db> TerminalOrOr<'db> {
37271    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37272        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37273    }
37274    pub fn token(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37275        TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
37276    }
37277    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37278        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37279    }
37280}
37281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37282pub struct TerminalOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37283impl<'db> TerminalOrOrPtr<'db> {}
37284impl<'db> TypedStablePtr<'db> for TerminalOrOrPtr<'db> {
37285    type SyntaxNode = TerminalOrOr<'db>;
37286    fn untyped(self) -> SyntaxStablePtrId<'db> {
37287        self.0
37288    }
37289    fn lookup(&self, db: &'db dyn Database) -> TerminalOrOr<'db> {
37290        TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
37291    }
37292}
37293impl<'db> From<TerminalOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37294    fn from(ptr: TerminalOrOrPtr<'db>) -> Self {
37295        ptr.untyped()
37296    }
37297}
37298#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37299pub struct TerminalOrOrGreen<'db>(pub GreenId<'db>);
37300impl<'db> TypedSyntaxNode<'db> for TerminalOrOr<'db> {
37301    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
37302    type StablePtr = TerminalOrOrPtr<'db>;
37303    type Green = TerminalOrOrGreen<'db>;
37304    fn missing(db: &'db dyn Database) -> Self::Green {
37305        TerminalOrOrGreen(
37306            GreenNode {
37307                kind: SyntaxKind::TerminalOrOr,
37308                details: GreenNodeDetails::Node {
37309                    children: [
37310                        Trivia::missing(db).0,
37311                        TokenOrOr::missing(db).0,
37312                        Trivia::missing(db).0,
37313                    ]
37314                    .into(),
37315                    width: TextWidth::default(),
37316                },
37317            }
37318            .intern(db),
37319        )
37320    }
37321    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37322        let kind = node.kind(db);
37323        assert_eq!(
37324            kind,
37325            SyntaxKind::TerminalOrOr,
37326            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37327            kind,
37328            SyntaxKind::TerminalOrOr
37329        );
37330        Self { node }
37331    }
37332    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37333        let kind = node.kind(db);
37334        if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
37335    }
37336    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37337        self.node
37338    }
37339    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37340        TerminalOrOrPtr(self.node.stable_ptr(db))
37341    }
37342}
37343#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37344pub struct TokenPlus<'db> {
37345    node: SyntaxNode<'db>,
37346}
37347impl<'db> Token<'db> for TokenPlus<'db> {
37348    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37349        TokenPlusGreen(
37350            GreenNode { kind: SyntaxKind::TokenPlus, details: GreenNodeDetails::Token(text) }
37351                .intern(db),
37352        )
37353    }
37354    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37355        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37356    }
37357}
37358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37359pub struct TokenPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37360impl<'db> TypedStablePtr<'db> for TokenPlusPtr<'db> {
37361    type SyntaxNode = TokenPlus<'db>;
37362    fn untyped(self) -> SyntaxStablePtrId<'db> {
37363        self.0
37364    }
37365    fn lookup(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37366        TokenPlus::from_syntax_node(db, self.0.lookup(db))
37367    }
37368}
37369impl<'db> From<TokenPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37370    fn from(ptr: TokenPlusPtr<'db>) -> Self {
37371        ptr.untyped()
37372    }
37373}
37374#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37375pub struct TokenPlusGreen<'db>(pub GreenId<'db>);
37376impl<'db> TokenPlusGreen<'db> {
37377    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37378        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37379    }
37380}
37381impl<'db> TypedSyntaxNode<'db> for TokenPlus<'db> {
37382    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
37383    type StablePtr = TokenPlusPtr<'db>;
37384    type Green = TokenPlusGreen<'db>;
37385    fn missing(db: &'db dyn Database) -> Self::Green {
37386        TokenPlusGreen(
37387            GreenNode {
37388                kind: SyntaxKind::TokenMissing,
37389                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37390            }
37391            .intern(db),
37392        )
37393    }
37394    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37395        match node.green_node(db).details {
37396            GreenNodeDetails::Token(_) => Self { node },
37397            GreenNodeDetails::Node { .. } => {
37398                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
37399            }
37400        }
37401    }
37402    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37403        match node.green_node(db).details {
37404            GreenNodeDetails::Token(_) => Some(Self { node }),
37405            GreenNodeDetails::Node { .. } => None,
37406        }
37407    }
37408    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37409        self.node
37410    }
37411    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37412        TokenPlusPtr(self.node.stable_ptr(db))
37413    }
37414}
37415#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37416pub struct TerminalPlus<'db> {
37417    node: SyntaxNode<'db>,
37418}
37419impl<'db> Terminal<'db> for TerminalPlus<'db> {
37420    const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
37421    type TokenType = TokenPlus<'db>;
37422    fn new_green(
37423        db: &'db dyn Database,
37424        leading_trivia: TriviaGreen<'db>,
37425        token: <<TerminalPlus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37426        trailing_trivia: TriviaGreen<'db>,
37427    ) -> Self::Green {
37428        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37429        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37430        TerminalPlusGreen(
37431            GreenNode {
37432                kind: SyntaxKind::TerminalPlus,
37433                details: GreenNodeDetails::Node { children: children.into(), width },
37434            }
37435            .intern(db),
37436        )
37437    }
37438    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37439        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37440            unreachable!("Expected a node, not a token");
37441        };
37442        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37443    }
37444}
37445impl<'db> TerminalPlus<'db> {
37446    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37447        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37448    }
37449    pub fn token(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37450        TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
37451    }
37452    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37453        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37454    }
37455}
37456#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37457pub struct TerminalPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37458impl<'db> TerminalPlusPtr<'db> {}
37459impl<'db> TypedStablePtr<'db> for TerminalPlusPtr<'db> {
37460    type SyntaxNode = TerminalPlus<'db>;
37461    fn untyped(self) -> SyntaxStablePtrId<'db> {
37462        self.0
37463    }
37464    fn lookup(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
37465        TerminalPlus::from_syntax_node(db, self.0.lookup(db))
37466    }
37467}
37468impl<'db> From<TerminalPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37469    fn from(ptr: TerminalPlusPtr<'db>) -> Self {
37470        ptr.untyped()
37471    }
37472}
37473#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37474pub struct TerminalPlusGreen<'db>(pub GreenId<'db>);
37475impl<'db> TypedSyntaxNode<'db> for TerminalPlus<'db> {
37476    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
37477    type StablePtr = TerminalPlusPtr<'db>;
37478    type Green = TerminalPlusGreen<'db>;
37479    fn missing(db: &'db dyn Database) -> Self::Green {
37480        TerminalPlusGreen(
37481            GreenNode {
37482                kind: SyntaxKind::TerminalPlus,
37483                details: GreenNodeDetails::Node {
37484                    children: [
37485                        Trivia::missing(db).0,
37486                        TokenPlus::missing(db).0,
37487                        Trivia::missing(db).0,
37488                    ]
37489                    .into(),
37490                    width: TextWidth::default(),
37491                },
37492            }
37493            .intern(db),
37494        )
37495    }
37496    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37497        let kind = node.kind(db);
37498        assert_eq!(
37499            kind,
37500            SyntaxKind::TerminalPlus,
37501            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37502            kind,
37503            SyntaxKind::TerminalPlus
37504        );
37505        Self { node }
37506    }
37507    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37508        let kind = node.kind(db);
37509        if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
37510    }
37511    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37512        self.node
37513    }
37514    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37515        TerminalPlusPtr(self.node.stable_ptr(db))
37516    }
37517}
37518#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37519pub struct TokenPlusEq<'db> {
37520    node: SyntaxNode<'db>,
37521}
37522impl<'db> Token<'db> for TokenPlusEq<'db> {
37523    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37524        TokenPlusEqGreen(
37525            GreenNode { kind: SyntaxKind::TokenPlusEq, details: GreenNodeDetails::Token(text) }
37526                .intern(db),
37527        )
37528    }
37529    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37530        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37531    }
37532}
37533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37534pub struct TokenPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37535impl<'db> TypedStablePtr<'db> for TokenPlusEqPtr<'db> {
37536    type SyntaxNode = TokenPlusEq<'db>;
37537    fn untyped(self) -> SyntaxStablePtrId<'db> {
37538        self.0
37539    }
37540    fn lookup(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37541        TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
37542    }
37543}
37544impl<'db> From<TokenPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37545    fn from(ptr: TokenPlusEqPtr<'db>) -> Self {
37546        ptr.untyped()
37547    }
37548}
37549#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37550pub struct TokenPlusEqGreen<'db>(pub GreenId<'db>);
37551impl<'db> TokenPlusEqGreen<'db> {
37552    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37553        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37554    }
37555}
37556impl<'db> TypedSyntaxNode<'db> for TokenPlusEq<'db> {
37557    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
37558    type StablePtr = TokenPlusEqPtr<'db>;
37559    type Green = TokenPlusEqGreen<'db>;
37560    fn missing(db: &'db dyn Database) -> Self::Green {
37561        TokenPlusEqGreen(
37562            GreenNode {
37563                kind: SyntaxKind::TokenMissing,
37564                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37565            }
37566            .intern(db),
37567        )
37568    }
37569    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37570        match node.green_node(db).details {
37571            GreenNodeDetails::Token(_) => Self { node },
37572            GreenNodeDetails::Node { .. } => {
37573                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
37574            }
37575        }
37576    }
37577    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37578        match node.green_node(db).details {
37579            GreenNodeDetails::Token(_) => Some(Self { node }),
37580            GreenNodeDetails::Node { .. } => None,
37581        }
37582    }
37583    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37584        self.node
37585    }
37586    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37587        TokenPlusEqPtr(self.node.stable_ptr(db))
37588    }
37589}
37590#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37591pub struct TerminalPlusEq<'db> {
37592    node: SyntaxNode<'db>,
37593}
37594impl<'db> Terminal<'db> for TerminalPlusEq<'db> {
37595    const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
37596    type TokenType = TokenPlusEq<'db>;
37597    fn new_green(
37598        db: &'db dyn Database,
37599        leading_trivia: TriviaGreen<'db>,
37600        token: <<TerminalPlusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37601        trailing_trivia: TriviaGreen<'db>,
37602    ) -> Self::Green {
37603        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37604        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37605        TerminalPlusEqGreen(
37606            GreenNode {
37607                kind: SyntaxKind::TerminalPlusEq,
37608                details: GreenNodeDetails::Node { children: children.into(), width },
37609            }
37610            .intern(db),
37611        )
37612    }
37613    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37614        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37615            unreachable!("Expected a node, not a token");
37616        };
37617        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37618    }
37619}
37620impl<'db> TerminalPlusEq<'db> {
37621    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37622        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37623    }
37624    pub fn token(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37625        TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
37626    }
37627    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37628        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37629    }
37630}
37631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37632pub struct TerminalPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37633impl<'db> TerminalPlusEqPtr<'db> {}
37634impl<'db> TypedStablePtr<'db> for TerminalPlusEqPtr<'db> {
37635    type SyntaxNode = TerminalPlusEq<'db>;
37636    fn untyped(self) -> SyntaxStablePtrId<'db> {
37637        self.0
37638    }
37639    fn lookup(&self, db: &'db dyn Database) -> TerminalPlusEq<'db> {
37640        TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
37641    }
37642}
37643impl<'db> From<TerminalPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37644    fn from(ptr: TerminalPlusEqPtr<'db>) -> Self {
37645        ptr.untyped()
37646    }
37647}
37648#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37649pub struct TerminalPlusEqGreen<'db>(pub GreenId<'db>);
37650impl<'db> TypedSyntaxNode<'db> for TerminalPlusEq<'db> {
37651    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
37652    type StablePtr = TerminalPlusEqPtr<'db>;
37653    type Green = TerminalPlusEqGreen<'db>;
37654    fn missing(db: &'db dyn Database) -> Self::Green {
37655        TerminalPlusEqGreen(
37656            GreenNode {
37657                kind: SyntaxKind::TerminalPlusEq,
37658                details: GreenNodeDetails::Node {
37659                    children: [
37660                        Trivia::missing(db).0,
37661                        TokenPlusEq::missing(db).0,
37662                        Trivia::missing(db).0,
37663                    ]
37664                    .into(),
37665                    width: TextWidth::default(),
37666                },
37667            }
37668            .intern(db),
37669        )
37670    }
37671    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37672        let kind = node.kind(db);
37673        assert_eq!(
37674            kind,
37675            SyntaxKind::TerminalPlusEq,
37676            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37677            kind,
37678            SyntaxKind::TerminalPlusEq
37679        );
37680        Self { node }
37681    }
37682    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37683        let kind = node.kind(db);
37684        if kind == SyntaxKind::TerminalPlusEq {
37685            Some(Self::from_syntax_node(db, node))
37686        } else {
37687            None
37688        }
37689    }
37690    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37691        self.node
37692    }
37693    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37694        TerminalPlusEqPtr(self.node.stable_ptr(db))
37695    }
37696}
37697#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37698pub struct TokenQuestionMark<'db> {
37699    node: SyntaxNode<'db>,
37700}
37701impl<'db> Token<'db> for TokenQuestionMark<'db> {
37702    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37703        TokenQuestionMarkGreen(
37704            GreenNode {
37705                kind: SyntaxKind::TokenQuestionMark,
37706                details: GreenNodeDetails::Token(text),
37707            }
37708            .intern(db),
37709        )
37710    }
37711    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37712        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37713    }
37714}
37715#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37716pub struct TokenQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
37717impl<'db> TypedStablePtr<'db> for TokenQuestionMarkPtr<'db> {
37718    type SyntaxNode = TokenQuestionMark<'db>;
37719    fn untyped(self) -> SyntaxStablePtrId<'db> {
37720        self.0
37721    }
37722    fn lookup(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
37723        TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
37724    }
37725}
37726impl<'db> From<TokenQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
37727    fn from(ptr: TokenQuestionMarkPtr<'db>) -> Self {
37728        ptr.untyped()
37729    }
37730}
37731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37732pub struct TokenQuestionMarkGreen<'db>(pub GreenId<'db>);
37733impl<'db> TokenQuestionMarkGreen<'db> {
37734    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37735        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37736    }
37737}
37738impl<'db> TypedSyntaxNode<'db> for TokenQuestionMark<'db> {
37739    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
37740    type StablePtr = TokenQuestionMarkPtr<'db>;
37741    type Green = TokenQuestionMarkGreen<'db>;
37742    fn missing(db: &'db dyn Database) -> Self::Green {
37743        TokenQuestionMarkGreen(
37744            GreenNode {
37745                kind: SyntaxKind::TokenMissing,
37746                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37747            }
37748            .intern(db),
37749        )
37750    }
37751    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37752        match node.green_node(db).details {
37753            GreenNodeDetails::Token(_) => Self { node },
37754            GreenNodeDetails::Node { .. } => {
37755                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
37756            }
37757        }
37758    }
37759    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37760        match node.green_node(db).details {
37761            GreenNodeDetails::Token(_) => Some(Self { node }),
37762            GreenNodeDetails::Node { .. } => None,
37763        }
37764    }
37765    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37766        self.node
37767    }
37768    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37769        TokenQuestionMarkPtr(self.node.stable_ptr(db))
37770    }
37771}
37772#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37773pub struct TerminalQuestionMark<'db> {
37774    node: SyntaxNode<'db>,
37775}
37776impl<'db> Terminal<'db> for TerminalQuestionMark<'db> {
37777    const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
37778    type TokenType = TokenQuestionMark<'db>;
37779    fn new_green(
37780        db: &'db dyn Database,
37781        leading_trivia: TriviaGreen<'db>,
37782        token: <<TerminalQuestionMark<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37783        trailing_trivia: TriviaGreen<'db>,
37784    ) -> Self::Green {
37785        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37786        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37787        TerminalQuestionMarkGreen(
37788            GreenNode {
37789                kind: SyntaxKind::TerminalQuestionMark,
37790                details: GreenNodeDetails::Node { children: children.into(), width },
37791            }
37792            .intern(db),
37793        )
37794    }
37795    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37796        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37797            unreachable!("Expected a node, not a token");
37798        };
37799        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37800    }
37801}
37802impl<'db> TerminalQuestionMark<'db> {
37803    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37804        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37805    }
37806    pub fn token(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
37807        TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
37808    }
37809    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37810        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37811    }
37812}
37813#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37814pub struct TerminalQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
37815impl<'db> TerminalQuestionMarkPtr<'db> {}
37816impl<'db> TypedStablePtr<'db> for TerminalQuestionMarkPtr<'db> {
37817    type SyntaxNode = TerminalQuestionMark<'db>;
37818    fn untyped(self) -> SyntaxStablePtrId<'db> {
37819        self.0
37820    }
37821    fn lookup(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
37822        TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
37823    }
37824}
37825impl<'db> From<TerminalQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
37826    fn from(ptr: TerminalQuestionMarkPtr<'db>) -> Self {
37827        ptr.untyped()
37828    }
37829}
37830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37831pub struct TerminalQuestionMarkGreen<'db>(pub GreenId<'db>);
37832impl<'db> TypedSyntaxNode<'db> for TerminalQuestionMark<'db> {
37833    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
37834    type StablePtr = TerminalQuestionMarkPtr<'db>;
37835    type Green = TerminalQuestionMarkGreen<'db>;
37836    fn missing(db: &'db dyn Database) -> Self::Green {
37837        TerminalQuestionMarkGreen(
37838            GreenNode {
37839                kind: SyntaxKind::TerminalQuestionMark,
37840                details: GreenNodeDetails::Node {
37841                    children: [
37842                        Trivia::missing(db).0,
37843                        TokenQuestionMark::missing(db).0,
37844                        Trivia::missing(db).0,
37845                    ]
37846                    .into(),
37847                    width: TextWidth::default(),
37848                },
37849            }
37850            .intern(db),
37851        )
37852    }
37853    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37854        let kind = node.kind(db);
37855        assert_eq!(
37856            kind,
37857            SyntaxKind::TerminalQuestionMark,
37858            "Unexpected SyntaxKind {:?}. Expected {:?}.",
37859            kind,
37860            SyntaxKind::TerminalQuestionMark
37861        );
37862        Self { node }
37863    }
37864    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37865        let kind = node.kind(db);
37866        if kind == SyntaxKind::TerminalQuestionMark {
37867            Some(Self::from_syntax_node(db, node))
37868        } else {
37869            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        TerminalQuestionMarkPtr(self.node.stable_ptr(db))
37877    }
37878}
37879#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37880pub struct TokenRBrace<'db> {
37881    node: SyntaxNode<'db>,
37882}
37883impl<'db> Token<'db> for TokenRBrace<'db> {
37884    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37885        TokenRBraceGreen(
37886            GreenNode { kind: SyntaxKind::TokenRBrace, details: GreenNodeDetails::Token(text) }
37887                .intern(db),
37888        )
37889    }
37890    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37891        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37892    }
37893}
37894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37895pub struct TokenRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
37896impl<'db> TypedStablePtr<'db> for TokenRBracePtr<'db> {
37897    type SyntaxNode = TokenRBrace<'db>;
37898    fn untyped(self) -> SyntaxStablePtrId<'db> {
37899        self.0
37900    }
37901    fn lookup(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
37902        TokenRBrace::from_syntax_node(db, self.0.lookup(db))
37903    }
37904}
37905impl<'db> From<TokenRBracePtr<'db>> for SyntaxStablePtrId<'db> {
37906    fn from(ptr: TokenRBracePtr<'db>) -> Self {
37907        ptr.untyped()
37908    }
37909}
37910#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37911pub struct TokenRBraceGreen<'db>(pub GreenId<'db>);
37912impl<'db> TokenRBraceGreen<'db> {
37913    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37914        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37915    }
37916}
37917impl<'db> TypedSyntaxNode<'db> for TokenRBrace<'db> {
37918    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
37919    type StablePtr = TokenRBracePtr<'db>;
37920    type Green = TokenRBraceGreen<'db>;
37921    fn missing(db: &'db dyn Database) -> Self::Green {
37922        TokenRBraceGreen(
37923            GreenNode {
37924                kind: SyntaxKind::TokenMissing,
37925                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37926            }
37927            .intern(db),
37928        )
37929    }
37930    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37931        match node.green_node(db).details {
37932            GreenNodeDetails::Token(_) => Self { node },
37933            GreenNodeDetails::Node { .. } => {
37934                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
37935            }
37936        }
37937    }
37938    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37939        match node.green_node(db).details {
37940            GreenNodeDetails::Token(_) => Some(Self { node }),
37941            GreenNodeDetails::Node { .. } => None,
37942        }
37943    }
37944    fn as_syntax_node(&self) -> SyntaxNode<'db> {
37945        self.node
37946    }
37947    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37948        TokenRBracePtr(self.node.stable_ptr(db))
37949    }
37950}
37951#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37952pub struct TerminalRBrace<'db> {
37953    node: SyntaxNode<'db>,
37954}
37955impl<'db> Terminal<'db> for TerminalRBrace<'db> {
37956    const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
37957    type TokenType = TokenRBrace<'db>;
37958    fn new_green(
37959        db: &'db dyn Database,
37960        leading_trivia: TriviaGreen<'db>,
37961        token: <<TerminalRBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37962        trailing_trivia: TriviaGreen<'db>,
37963    ) -> Self::Green {
37964        let children = [leading_trivia.0, token.0, trailing_trivia.0];
37965        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37966        TerminalRBraceGreen(
37967            GreenNode {
37968                kind: SyntaxKind::TerminalRBrace,
37969                details: GreenNodeDetails::Node { children: children.into(), width },
37970            }
37971            .intern(db),
37972        )
37973    }
37974    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37975        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37976            unreachable!("Expected a node, not a token");
37977        };
37978        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37979    }
37980}
37981impl<'db> TerminalRBrace<'db> {
37982    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37983        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37984    }
37985    pub fn token(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
37986        TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
37987    }
37988    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37989        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37990    }
37991}
37992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
37993pub struct TerminalRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
37994impl<'db> TerminalRBracePtr<'db> {}
37995impl<'db> TypedStablePtr<'db> for TerminalRBracePtr<'db> {
37996    type SyntaxNode = TerminalRBrace<'db>;
37997    fn untyped(self) -> SyntaxStablePtrId<'db> {
37998        self.0
37999    }
38000    fn lookup(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
38001        TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
38002    }
38003}
38004impl<'db> From<TerminalRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38005    fn from(ptr: TerminalRBracePtr<'db>) -> Self {
38006        ptr.untyped()
38007    }
38008}
38009#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38010pub struct TerminalRBraceGreen<'db>(pub GreenId<'db>);
38011impl<'db> TypedSyntaxNode<'db> for TerminalRBrace<'db> {
38012    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
38013    type StablePtr = TerminalRBracePtr<'db>;
38014    type Green = TerminalRBraceGreen<'db>;
38015    fn missing(db: &'db dyn Database) -> Self::Green {
38016        TerminalRBraceGreen(
38017            GreenNode {
38018                kind: SyntaxKind::TerminalRBrace,
38019                details: GreenNodeDetails::Node {
38020                    children: [
38021                        Trivia::missing(db).0,
38022                        TokenRBrace::missing(db).0,
38023                        Trivia::missing(db).0,
38024                    ]
38025                    .into(),
38026                    width: TextWidth::default(),
38027                },
38028            }
38029            .intern(db),
38030        )
38031    }
38032    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38033        let kind = node.kind(db);
38034        assert_eq!(
38035            kind,
38036            SyntaxKind::TerminalRBrace,
38037            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38038            kind,
38039            SyntaxKind::TerminalRBrace
38040        );
38041        Self { node }
38042    }
38043    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38044        let kind = node.kind(db);
38045        if kind == SyntaxKind::TerminalRBrace {
38046            Some(Self::from_syntax_node(db, node))
38047        } else {
38048            None
38049        }
38050    }
38051    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38052        self.node
38053    }
38054    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38055        TerminalRBracePtr(self.node.stable_ptr(db))
38056    }
38057}
38058#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38059pub struct TokenRBrack<'db> {
38060    node: SyntaxNode<'db>,
38061}
38062impl<'db> Token<'db> for TokenRBrack<'db> {
38063    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38064        TokenRBrackGreen(
38065            GreenNode { kind: SyntaxKind::TokenRBrack, details: GreenNodeDetails::Token(text) }
38066                .intern(db),
38067        )
38068    }
38069    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38070        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38071    }
38072}
38073#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38074pub struct TokenRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38075impl<'db> TypedStablePtr<'db> for TokenRBrackPtr<'db> {
38076    type SyntaxNode = TokenRBrack<'db>;
38077    fn untyped(self) -> SyntaxStablePtrId<'db> {
38078        self.0
38079    }
38080    fn lookup(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38081        TokenRBrack::from_syntax_node(db, self.0.lookup(db))
38082    }
38083}
38084impl<'db> From<TokenRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38085    fn from(ptr: TokenRBrackPtr<'db>) -> Self {
38086        ptr.untyped()
38087    }
38088}
38089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38090pub struct TokenRBrackGreen<'db>(pub GreenId<'db>);
38091impl<'db> TokenRBrackGreen<'db> {
38092    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38093        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38094    }
38095}
38096impl<'db> TypedSyntaxNode<'db> for TokenRBrack<'db> {
38097    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
38098    type StablePtr = TokenRBrackPtr<'db>;
38099    type Green = TokenRBrackGreen<'db>;
38100    fn missing(db: &'db dyn Database) -> Self::Green {
38101        TokenRBrackGreen(
38102            GreenNode {
38103                kind: SyntaxKind::TokenMissing,
38104                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38105            }
38106            .intern(db),
38107        )
38108    }
38109    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38110        match node.green_node(db).details {
38111            GreenNodeDetails::Token(_) => Self { node },
38112            GreenNodeDetails::Node { .. } => {
38113                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
38114            }
38115        }
38116    }
38117    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38118        match node.green_node(db).details {
38119            GreenNodeDetails::Token(_) => Some(Self { node }),
38120            GreenNodeDetails::Node { .. } => None,
38121        }
38122    }
38123    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38124        self.node
38125    }
38126    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38127        TokenRBrackPtr(self.node.stable_ptr(db))
38128    }
38129}
38130#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38131pub struct TerminalRBrack<'db> {
38132    node: SyntaxNode<'db>,
38133}
38134impl<'db> Terminal<'db> for TerminalRBrack<'db> {
38135    const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
38136    type TokenType = TokenRBrack<'db>;
38137    fn new_green(
38138        db: &'db dyn Database,
38139        leading_trivia: TriviaGreen<'db>,
38140        token: <<TerminalRBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38141        trailing_trivia: TriviaGreen<'db>,
38142    ) -> Self::Green {
38143        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38144        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38145        TerminalRBrackGreen(
38146            GreenNode {
38147                kind: SyntaxKind::TerminalRBrack,
38148                details: GreenNodeDetails::Node { children: children.into(), width },
38149            }
38150            .intern(db),
38151        )
38152    }
38153    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38154        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38155            unreachable!("Expected a node, not a token");
38156        };
38157        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38158    }
38159}
38160impl<'db> TerminalRBrack<'db> {
38161    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38162        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38163    }
38164    pub fn token(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38165        TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
38166    }
38167    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38168        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38169    }
38170}
38171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38172pub struct TerminalRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38173impl<'db> TerminalRBrackPtr<'db> {}
38174impl<'db> TypedStablePtr<'db> for TerminalRBrackPtr<'db> {
38175    type SyntaxNode = TerminalRBrack<'db>;
38176    fn untyped(self) -> SyntaxStablePtrId<'db> {
38177        self.0
38178    }
38179    fn lookup(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
38180        TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
38181    }
38182}
38183impl<'db> From<TerminalRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38184    fn from(ptr: TerminalRBrackPtr<'db>) -> Self {
38185        ptr.untyped()
38186    }
38187}
38188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38189pub struct TerminalRBrackGreen<'db>(pub GreenId<'db>);
38190impl<'db> TypedSyntaxNode<'db> for TerminalRBrack<'db> {
38191    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
38192    type StablePtr = TerminalRBrackPtr<'db>;
38193    type Green = TerminalRBrackGreen<'db>;
38194    fn missing(db: &'db dyn Database) -> Self::Green {
38195        TerminalRBrackGreen(
38196            GreenNode {
38197                kind: SyntaxKind::TerminalRBrack,
38198                details: GreenNodeDetails::Node {
38199                    children: [
38200                        Trivia::missing(db).0,
38201                        TokenRBrack::missing(db).0,
38202                        Trivia::missing(db).0,
38203                    ]
38204                    .into(),
38205                    width: TextWidth::default(),
38206                },
38207            }
38208            .intern(db),
38209        )
38210    }
38211    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38212        let kind = node.kind(db);
38213        assert_eq!(
38214            kind,
38215            SyntaxKind::TerminalRBrack,
38216            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38217            kind,
38218            SyntaxKind::TerminalRBrack
38219        );
38220        Self { node }
38221    }
38222    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38223        let kind = node.kind(db);
38224        if kind == SyntaxKind::TerminalRBrack {
38225            Some(Self::from_syntax_node(db, node))
38226        } else {
38227            None
38228        }
38229    }
38230    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38231        self.node
38232    }
38233    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38234        TerminalRBrackPtr(self.node.stable_ptr(db))
38235    }
38236}
38237#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38238pub struct TokenRParen<'db> {
38239    node: SyntaxNode<'db>,
38240}
38241impl<'db> Token<'db> for TokenRParen<'db> {
38242    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38243        TokenRParenGreen(
38244            GreenNode { kind: SyntaxKind::TokenRParen, details: GreenNodeDetails::Token(text) }
38245                .intern(db),
38246        )
38247    }
38248    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38249        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38250    }
38251}
38252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38253pub struct TokenRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38254impl<'db> TypedStablePtr<'db> for TokenRParenPtr<'db> {
38255    type SyntaxNode = TokenRParen<'db>;
38256    fn untyped(self) -> SyntaxStablePtrId<'db> {
38257        self.0
38258    }
38259    fn lookup(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38260        TokenRParen::from_syntax_node(db, self.0.lookup(db))
38261    }
38262}
38263impl<'db> From<TokenRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38264    fn from(ptr: TokenRParenPtr<'db>) -> Self {
38265        ptr.untyped()
38266    }
38267}
38268#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38269pub struct TokenRParenGreen<'db>(pub GreenId<'db>);
38270impl<'db> TokenRParenGreen<'db> {
38271    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38272        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38273    }
38274}
38275impl<'db> TypedSyntaxNode<'db> for TokenRParen<'db> {
38276    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
38277    type StablePtr = TokenRParenPtr<'db>;
38278    type Green = TokenRParenGreen<'db>;
38279    fn missing(db: &'db dyn Database) -> Self::Green {
38280        TokenRParenGreen(
38281            GreenNode {
38282                kind: SyntaxKind::TokenMissing,
38283                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38284            }
38285            .intern(db),
38286        )
38287    }
38288    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38289        match node.green_node(db).details {
38290            GreenNodeDetails::Token(_) => Self { node },
38291            GreenNodeDetails::Node { .. } => {
38292                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
38293            }
38294        }
38295    }
38296    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38297        match node.green_node(db).details {
38298            GreenNodeDetails::Token(_) => Some(Self { node }),
38299            GreenNodeDetails::Node { .. } => None,
38300        }
38301    }
38302    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38303        self.node
38304    }
38305    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38306        TokenRParenPtr(self.node.stable_ptr(db))
38307    }
38308}
38309#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38310pub struct TerminalRParen<'db> {
38311    node: SyntaxNode<'db>,
38312}
38313impl<'db> Terminal<'db> for TerminalRParen<'db> {
38314    const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
38315    type TokenType = TokenRParen<'db>;
38316    fn new_green(
38317        db: &'db dyn Database,
38318        leading_trivia: TriviaGreen<'db>,
38319        token: <<TerminalRParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38320        trailing_trivia: TriviaGreen<'db>,
38321    ) -> Self::Green {
38322        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38323        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38324        TerminalRParenGreen(
38325            GreenNode {
38326                kind: SyntaxKind::TerminalRParen,
38327                details: GreenNodeDetails::Node { children: children.into(), width },
38328            }
38329            .intern(db),
38330        )
38331    }
38332    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38333        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38334            unreachable!("Expected a node, not a token");
38335        };
38336        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38337    }
38338}
38339impl<'db> TerminalRParen<'db> {
38340    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38341        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38342    }
38343    pub fn token(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38344        TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
38345    }
38346    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38347        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38348    }
38349}
38350#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38351pub struct TerminalRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38352impl<'db> TerminalRParenPtr<'db> {}
38353impl<'db> TypedStablePtr<'db> for TerminalRParenPtr<'db> {
38354    type SyntaxNode = TerminalRParen<'db>;
38355    fn untyped(self) -> SyntaxStablePtrId<'db> {
38356        self.0
38357    }
38358    fn lookup(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
38359        TerminalRParen::from_syntax_node(db, self.0.lookup(db))
38360    }
38361}
38362impl<'db> From<TerminalRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38363    fn from(ptr: TerminalRParenPtr<'db>) -> Self {
38364        ptr.untyped()
38365    }
38366}
38367#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38368pub struct TerminalRParenGreen<'db>(pub GreenId<'db>);
38369impl<'db> TypedSyntaxNode<'db> for TerminalRParen<'db> {
38370    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
38371    type StablePtr = TerminalRParenPtr<'db>;
38372    type Green = TerminalRParenGreen<'db>;
38373    fn missing(db: &'db dyn Database) -> Self::Green {
38374        TerminalRParenGreen(
38375            GreenNode {
38376                kind: SyntaxKind::TerminalRParen,
38377                details: GreenNodeDetails::Node {
38378                    children: [
38379                        Trivia::missing(db).0,
38380                        TokenRParen::missing(db).0,
38381                        Trivia::missing(db).0,
38382                    ]
38383                    .into(),
38384                    width: TextWidth::default(),
38385                },
38386            }
38387            .intern(db),
38388        )
38389    }
38390    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38391        let kind = node.kind(db);
38392        assert_eq!(
38393            kind,
38394            SyntaxKind::TerminalRParen,
38395            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38396            kind,
38397            SyntaxKind::TerminalRParen
38398        );
38399        Self { node }
38400    }
38401    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38402        let kind = node.kind(db);
38403        if kind == SyntaxKind::TerminalRParen {
38404            Some(Self::from_syntax_node(db, node))
38405        } else {
38406            None
38407        }
38408    }
38409    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38410        self.node
38411    }
38412    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38413        TerminalRParenPtr(self.node.stable_ptr(db))
38414    }
38415}
38416#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38417pub struct TokenSemicolon<'db> {
38418    node: SyntaxNode<'db>,
38419}
38420impl<'db> Token<'db> for TokenSemicolon<'db> {
38421    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38422        TokenSemicolonGreen(
38423            GreenNode { kind: SyntaxKind::TokenSemicolon, details: GreenNodeDetails::Token(text) }
38424                .intern(db),
38425        )
38426    }
38427    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38428        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38429    }
38430}
38431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38432pub struct TokenSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38433impl<'db> TypedStablePtr<'db> for TokenSemicolonPtr<'db> {
38434    type SyntaxNode = TokenSemicolon<'db>;
38435    fn untyped(self) -> SyntaxStablePtrId<'db> {
38436        self.0
38437    }
38438    fn lookup(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38439        TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
38440    }
38441}
38442impl<'db> From<TokenSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38443    fn from(ptr: TokenSemicolonPtr<'db>) -> Self {
38444        ptr.untyped()
38445    }
38446}
38447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38448pub struct TokenSemicolonGreen<'db>(pub GreenId<'db>);
38449impl<'db> TokenSemicolonGreen<'db> {
38450    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38451        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38452    }
38453}
38454impl<'db> TypedSyntaxNode<'db> for TokenSemicolon<'db> {
38455    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
38456    type StablePtr = TokenSemicolonPtr<'db>;
38457    type Green = TokenSemicolonGreen<'db>;
38458    fn missing(db: &'db dyn Database) -> Self::Green {
38459        TokenSemicolonGreen(
38460            GreenNode {
38461                kind: SyntaxKind::TokenMissing,
38462                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38463            }
38464            .intern(db),
38465        )
38466    }
38467    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38468        match node.green_node(db).details {
38469            GreenNodeDetails::Token(_) => Self { node },
38470            GreenNodeDetails::Node { .. } => {
38471                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
38472            }
38473        }
38474    }
38475    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38476        match node.green_node(db).details {
38477            GreenNodeDetails::Token(_) => Some(Self { node }),
38478            GreenNodeDetails::Node { .. } => None,
38479        }
38480    }
38481    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38482        self.node
38483    }
38484    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38485        TokenSemicolonPtr(self.node.stable_ptr(db))
38486    }
38487}
38488#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38489pub struct TerminalSemicolon<'db> {
38490    node: SyntaxNode<'db>,
38491}
38492impl<'db> Terminal<'db> for TerminalSemicolon<'db> {
38493    const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
38494    type TokenType = TokenSemicolon<'db>;
38495    fn new_green(
38496        db: &'db dyn Database,
38497        leading_trivia: TriviaGreen<'db>,
38498        token: <<TerminalSemicolon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38499        trailing_trivia: TriviaGreen<'db>,
38500    ) -> Self::Green {
38501        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38502        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38503        TerminalSemicolonGreen(
38504            GreenNode {
38505                kind: SyntaxKind::TerminalSemicolon,
38506                details: GreenNodeDetails::Node { children: children.into(), width },
38507            }
38508            .intern(db),
38509        )
38510    }
38511    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38512        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38513            unreachable!("Expected a node, not a token");
38514        };
38515        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38516    }
38517}
38518impl<'db> TerminalSemicolon<'db> {
38519    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38520        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38521    }
38522    pub fn token(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38523        TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
38524    }
38525    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38526        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38527    }
38528}
38529#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38530pub struct TerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38531impl<'db> TerminalSemicolonPtr<'db> {}
38532impl<'db> TypedStablePtr<'db> for TerminalSemicolonPtr<'db> {
38533    type SyntaxNode = TerminalSemicolon<'db>;
38534    fn untyped(self) -> SyntaxStablePtrId<'db> {
38535        self.0
38536    }
38537    fn lookup(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
38538        TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
38539    }
38540}
38541impl<'db> From<TerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38542    fn from(ptr: TerminalSemicolonPtr<'db>) -> Self {
38543        ptr.untyped()
38544    }
38545}
38546#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38547pub struct TerminalSemicolonGreen<'db>(pub GreenId<'db>);
38548impl<'db> TypedSyntaxNode<'db> for TerminalSemicolon<'db> {
38549    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
38550    type StablePtr = TerminalSemicolonPtr<'db>;
38551    type Green = TerminalSemicolonGreen<'db>;
38552    fn missing(db: &'db dyn Database) -> Self::Green {
38553        TerminalSemicolonGreen(
38554            GreenNode {
38555                kind: SyntaxKind::TerminalSemicolon,
38556                details: GreenNodeDetails::Node {
38557                    children: [
38558                        Trivia::missing(db).0,
38559                        TokenSemicolon::missing(db).0,
38560                        Trivia::missing(db).0,
38561                    ]
38562                    .into(),
38563                    width: TextWidth::default(),
38564                },
38565            }
38566            .intern(db),
38567        )
38568    }
38569    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38570        let kind = node.kind(db);
38571        assert_eq!(
38572            kind,
38573            SyntaxKind::TerminalSemicolon,
38574            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38575            kind,
38576            SyntaxKind::TerminalSemicolon
38577        );
38578        Self { node }
38579    }
38580    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38581        let kind = node.kind(db);
38582        if kind == SyntaxKind::TerminalSemicolon {
38583            Some(Self::from_syntax_node(db, node))
38584        } else {
38585            None
38586        }
38587    }
38588    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38589        self.node
38590    }
38591    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38592        TerminalSemicolonPtr(self.node.stable_ptr(db))
38593    }
38594}
38595#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38596pub struct TokenUnderscore<'db> {
38597    node: SyntaxNode<'db>,
38598}
38599impl<'db> Token<'db> for TokenUnderscore<'db> {
38600    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38601        TokenUnderscoreGreen(
38602            GreenNode { kind: SyntaxKind::TokenUnderscore, details: GreenNodeDetails::Token(text) }
38603                .intern(db),
38604        )
38605    }
38606    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38607        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38608    }
38609}
38610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38611pub struct TokenUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38612impl<'db> TypedStablePtr<'db> for TokenUnderscorePtr<'db> {
38613    type SyntaxNode = TokenUnderscore<'db>;
38614    fn untyped(self) -> SyntaxStablePtrId<'db> {
38615        self.0
38616    }
38617    fn lookup(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38618        TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
38619    }
38620}
38621impl<'db> From<TokenUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38622    fn from(ptr: TokenUnderscorePtr<'db>) -> Self {
38623        ptr.untyped()
38624    }
38625}
38626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38627pub struct TokenUnderscoreGreen<'db>(pub GreenId<'db>);
38628impl<'db> TokenUnderscoreGreen<'db> {
38629    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38630        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38631    }
38632}
38633impl<'db> TypedSyntaxNode<'db> for TokenUnderscore<'db> {
38634    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
38635    type StablePtr = TokenUnderscorePtr<'db>;
38636    type Green = TokenUnderscoreGreen<'db>;
38637    fn missing(db: &'db dyn Database) -> Self::Green {
38638        TokenUnderscoreGreen(
38639            GreenNode {
38640                kind: SyntaxKind::TokenMissing,
38641                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38642            }
38643            .intern(db),
38644        )
38645    }
38646    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38647        match node.green_node(db).details {
38648            GreenNodeDetails::Token(_) => Self { node },
38649            GreenNodeDetails::Node { .. } => {
38650                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
38651            }
38652        }
38653    }
38654    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38655        match node.green_node(db).details {
38656            GreenNodeDetails::Token(_) => Some(Self { node }),
38657            GreenNodeDetails::Node { .. } => None,
38658        }
38659    }
38660    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38661        self.node
38662    }
38663    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38664        TokenUnderscorePtr(self.node.stable_ptr(db))
38665    }
38666}
38667#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38668pub struct TerminalUnderscore<'db> {
38669    node: SyntaxNode<'db>,
38670}
38671impl<'db> Terminal<'db> for TerminalUnderscore<'db> {
38672    const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
38673    type TokenType = TokenUnderscore<'db>;
38674    fn new_green(
38675        db: &'db dyn Database,
38676        leading_trivia: TriviaGreen<'db>,
38677        token: <<TerminalUnderscore<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38678        trailing_trivia: TriviaGreen<'db>,
38679    ) -> Self::Green {
38680        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38681        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38682        TerminalUnderscoreGreen(
38683            GreenNode {
38684                kind: SyntaxKind::TerminalUnderscore,
38685                details: GreenNodeDetails::Node { children: children.into(), width },
38686            }
38687            .intern(db),
38688        )
38689    }
38690    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38691        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38692            unreachable!("Expected a node, not a token");
38693        };
38694        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38695    }
38696}
38697impl<'db> TerminalUnderscore<'db> {
38698    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38699        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38700    }
38701    pub fn token(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38702        TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
38703    }
38704    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38705        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38706    }
38707}
38708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38709pub struct TerminalUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38710impl<'db> TerminalUnderscorePtr<'db> {}
38711impl<'db> TypedStablePtr<'db> for TerminalUnderscorePtr<'db> {
38712    type SyntaxNode = TerminalUnderscore<'db>;
38713    fn untyped(self) -> SyntaxStablePtrId<'db> {
38714        self.0
38715    }
38716    fn lookup(&self, db: &'db dyn Database) -> TerminalUnderscore<'db> {
38717        TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
38718    }
38719}
38720impl<'db> From<TerminalUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38721    fn from(ptr: TerminalUnderscorePtr<'db>) -> Self {
38722        ptr.untyped()
38723    }
38724}
38725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38726pub struct TerminalUnderscoreGreen<'db>(pub GreenId<'db>);
38727impl<'db> TypedSyntaxNode<'db> for TerminalUnderscore<'db> {
38728    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
38729    type StablePtr = TerminalUnderscorePtr<'db>;
38730    type Green = TerminalUnderscoreGreen<'db>;
38731    fn missing(db: &'db dyn Database) -> Self::Green {
38732        TerminalUnderscoreGreen(
38733            GreenNode {
38734                kind: SyntaxKind::TerminalUnderscore,
38735                details: GreenNodeDetails::Node {
38736                    children: [
38737                        Trivia::missing(db).0,
38738                        TokenUnderscore::missing(db).0,
38739                        Trivia::missing(db).0,
38740                    ]
38741                    .into(),
38742                    width: TextWidth::default(),
38743                },
38744            }
38745            .intern(db),
38746        )
38747    }
38748    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38749        let kind = node.kind(db);
38750        assert_eq!(
38751            kind,
38752            SyntaxKind::TerminalUnderscore,
38753            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38754            kind,
38755            SyntaxKind::TerminalUnderscore
38756        );
38757        Self { node }
38758    }
38759    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38760        let kind = node.kind(db);
38761        if kind == SyntaxKind::TerminalUnderscore {
38762            Some(Self::from_syntax_node(db, node))
38763        } else {
38764            None
38765        }
38766    }
38767    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38768        self.node
38769    }
38770    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38771        TerminalUnderscorePtr(self.node.stable_ptr(db))
38772    }
38773}
38774#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38775pub struct TokenXor<'db> {
38776    node: SyntaxNode<'db>,
38777}
38778impl<'db> Token<'db> for TokenXor<'db> {
38779    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38780        TokenXorGreen(
38781            GreenNode { kind: SyntaxKind::TokenXor, details: GreenNodeDetails::Token(text) }
38782                .intern(db),
38783        )
38784    }
38785    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38786        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38787    }
38788}
38789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38790pub struct TokenXorPtr<'db>(pub SyntaxStablePtrId<'db>);
38791impl<'db> TypedStablePtr<'db> for TokenXorPtr<'db> {
38792    type SyntaxNode = TokenXor<'db>;
38793    fn untyped(self) -> SyntaxStablePtrId<'db> {
38794        self.0
38795    }
38796    fn lookup(&self, db: &'db dyn Database) -> TokenXor<'db> {
38797        TokenXor::from_syntax_node(db, self.0.lookup(db))
38798    }
38799}
38800impl<'db> From<TokenXorPtr<'db>> for SyntaxStablePtrId<'db> {
38801    fn from(ptr: TokenXorPtr<'db>) -> Self {
38802        ptr.untyped()
38803    }
38804}
38805#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38806pub struct TokenXorGreen<'db>(pub GreenId<'db>);
38807impl<'db> TokenXorGreen<'db> {
38808    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38809        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38810    }
38811}
38812impl<'db> TypedSyntaxNode<'db> for TokenXor<'db> {
38813    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
38814    type StablePtr = TokenXorPtr<'db>;
38815    type Green = TokenXorGreen<'db>;
38816    fn missing(db: &'db dyn Database) -> Self::Green {
38817        TokenXorGreen(
38818            GreenNode {
38819                kind: SyntaxKind::TokenMissing,
38820                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38821            }
38822            .intern(db),
38823        )
38824    }
38825    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38826        match node.green_node(db).details {
38827            GreenNodeDetails::Token(_) => Self { node },
38828            GreenNodeDetails::Node { .. } => {
38829                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
38830            }
38831        }
38832    }
38833    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38834        match node.green_node(db).details {
38835            GreenNodeDetails::Token(_) => Some(Self { node }),
38836            GreenNodeDetails::Node { .. } => None,
38837        }
38838    }
38839    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38840        self.node
38841    }
38842    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38843        TokenXorPtr(self.node.stable_ptr(db))
38844    }
38845}
38846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38847pub struct TerminalXor<'db> {
38848    node: SyntaxNode<'db>,
38849}
38850impl<'db> Terminal<'db> for TerminalXor<'db> {
38851    const KIND: SyntaxKind = SyntaxKind::TerminalXor;
38852    type TokenType = TokenXor<'db>;
38853    fn new_green(
38854        db: &'db dyn Database,
38855        leading_trivia: TriviaGreen<'db>,
38856        token: <<TerminalXor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38857        trailing_trivia: TriviaGreen<'db>,
38858    ) -> Self::Green {
38859        let children = [leading_trivia.0, token.0, trailing_trivia.0];
38860        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38861        TerminalXorGreen(
38862            GreenNode {
38863                kind: SyntaxKind::TerminalXor,
38864                details: GreenNodeDetails::Node { children: children.into(), width },
38865            }
38866            .intern(db),
38867        )
38868    }
38869    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38870        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38871            unreachable!("Expected a node, not a token");
38872        };
38873        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38874    }
38875}
38876impl<'db> TerminalXor<'db> {
38877    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38878        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38879    }
38880    pub fn token(&self, db: &'db dyn Database) -> TokenXor<'db> {
38881        TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
38882    }
38883    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38884        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38885    }
38886}
38887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38888pub struct TerminalXorPtr<'db>(pub SyntaxStablePtrId<'db>);
38889impl<'db> TerminalXorPtr<'db> {}
38890impl<'db> TypedStablePtr<'db> for TerminalXorPtr<'db> {
38891    type SyntaxNode = TerminalXor<'db>;
38892    fn untyped(self) -> SyntaxStablePtrId<'db> {
38893        self.0
38894    }
38895    fn lookup(&self, db: &'db dyn Database) -> TerminalXor<'db> {
38896        TerminalXor::from_syntax_node(db, self.0.lookup(db))
38897    }
38898}
38899impl<'db> From<TerminalXorPtr<'db>> for SyntaxStablePtrId<'db> {
38900    fn from(ptr: TerminalXorPtr<'db>) -> Self {
38901        ptr.untyped()
38902    }
38903}
38904#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38905pub struct TerminalXorGreen<'db>(pub GreenId<'db>);
38906impl<'db> TypedSyntaxNode<'db> for TerminalXor<'db> {
38907    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
38908    type StablePtr = TerminalXorPtr<'db>;
38909    type Green = TerminalXorGreen<'db>;
38910    fn missing(db: &'db dyn Database) -> Self::Green {
38911        TerminalXorGreen(
38912            GreenNode {
38913                kind: SyntaxKind::TerminalXor,
38914                details: GreenNodeDetails::Node {
38915                    children: [
38916                        Trivia::missing(db).0,
38917                        TokenXor::missing(db).0,
38918                        Trivia::missing(db).0,
38919                    ]
38920                    .into(),
38921                    width: TextWidth::default(),
38922                },
38923            }
38924            .intern(db),
38925        )
38926    }
38927    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38928        let kind = node.kind(db);
38929        assert_eq!(
38930            kind,
38931            SyntaxKind::TerminalXor,
38932            "Unexpected SyntaxKind {:?}. Expected {:?}.",
38933            kind,
38934            SyntaxKind::TerminalXor
38935        );
38936        Self { node }
38937    }
38938    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38939        let kind = node.kind(db);
38940        if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
38941    }
38942    fn as_syntax_node(&self) -> SyntaxNode<'db> {
38943        self.node
38944    }
38945    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38946        TerminalXorPtr(self.node.stable_ptr(db))
38947    }
38948}
38949#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38950pub struct SyntaxFile<'db> {
38951    node: SyntaxNode<'db>,
38952}
38953impl<'db> SyntaxFile<'db> {
38954    pub const INDEX_ITEMS: usize = 0;
38955    pub const INDEX_EOF: usize = 1;
38956    pub fn new_green(
38957        db: &'db dyn Database,
38958        items: ModuleItemListGreen<'db>,
38959        eof: TerminalEndOfFileGreen<'db>,
38960    ) -> SyntaxFileGreen<'db> {
38961        let children = [items.0, eof.0];
38962        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38963        SyntaxFileGreen(
38964            GreenNode {
38965                kind: SyntaxKind::SyntaxFile,
38966                details: GreenNodeDetails::Node { children: children.into(), width },
38967            }
38968            .intern(db),
38969        )
38970    }
38971}
38972impl<'db> SyntaxFile<'db> {
38973    pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
38974        ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
38975    }
38976    pub fn eof(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
38977        TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
38978    }
38979}
38980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
38981pub struct SyntaxFilePtr<'db>(pub SyntaxStablePtrId<'db>);
38982impl<'db> SyntaxFilePtr<'db> {}
38983impl<'db> TypedStablePtr<'db> for SyntaxFilePtr<'db> {
38984    type SyntaxNode = SyntaxFile<'db>;
38985    fn untyped(self) -> SyntaxStablePtrId<'db> {
38986        self.0
38987    }
38988    fn lookup(&self, db: &'db dyn Database) -> SyntaxFile<'db> {
38989        SyntaxFile::from_syntax_node(db, self.0.lookup(db))
38990    }
38991}
38992impl<'db> From<SyntaxFilePtr<'db>> for SyntaxStablePtrId<'db> {
38993    fn from(ptr: SyntaxFilePtr<'db>) -> Self {
38994        ptr.untyped()
38995    }
38996}
38997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38998pub struct SyntaxFileGreen<'db>(pub GreenId<'db>);
38999impl<'db> TypedSyntaxNode<'db> for SyntaxFile<'db> {
39000    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
39001    type StablePtr = SyntaxFilePtr<'db>;
39002    type Green = SyntaxFileGreen<'db>;
39003    fn missing(db: &'db dyn Database) -> Self::Green {
39004        SyntaxFileGreen(
39005            GreenNode {
39006                kind: SyntaxKind::SyntaxFile,
39007                details: GreenNodeDetails::Node {
39008                    children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
39009                        .into(),
39010                    width: TextWidth::default(),
39011                },
39012            }
39013            .intern(db),
39014        )
39015    }
39016    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39017        let kind = node.kind(db);
39018        assert_eq!(
39019            kind,
39020            SyntaxKind::SyntaxFile,
39021            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39022            kind,
39023            SyntaxKind::SyntaxFile
39024        );
39025        Self { node }
39026    }
39027    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39028        let kind = node.kind(db);
39029        if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
39030    }
39031    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39032        self.node
39033    }
39034    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39035        SyntaxFilePtr(self.node.stable_ptr(db))
39036    }
39037}
39038#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39039pub struct TokenEmpty<'db> {
39040    node: SyntaxNode<'db>,
39041}
39042impl<'db> Token<'db> for TokenEmpty<'db> {
39043    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39044        TokenEmptyGreen(
39045            GreenNode { kind: SyntaxKind::TokenEmpty, details: GreenNodeDetails::Token(text) }
39046                .intern(db),
39047        )
39048    }
39049    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39050        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39051    }
39052}
39053#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39054pub struct TokenEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39055impl<'db> TypedStablePtr<'db> for TokenEmptyPtr<'db> {
39056    type SyntaxNode = TokenEmpty<'db>;
39057    fn untyped(self) -> SyntaxStablePtrId<'db> {
39058        self.0
39059    }
39060    fn lookup(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39061        TokenEmpty::from_syntax_node(db, self.0.lookup(db))
39062    }
39063}
39064impl<'db> From<TokenEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39065    fn from(ptr: TokenEmptyPtr<'db>) -> Self {
39066        ptr.untyped()
39067    }
39068}
39069#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39070pub struct TokenEmptyGreen<'db>(pub GreenId<'db>);
39071impl<'db> TokenEmptyGreen<'db> {
39072    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39073        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39074    }
39075}
39076impl<'db> TypedSyntaxNode<'db> for TokenEmpty<'db> {
39077    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
39078    type StablePtr = TokenEmptyPtr<'db>;
39079    type Green = TokenEmptyGreen<'db>;
39080    fn missing(db: &'db dyn Database) -> Self::Green {
39081        TokenEmptyGreen(
39082            GreenNode {
39083                kind: SyntaxKind::TokenMissing,
39084                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39085            }
39086            .intern(db),
39087        )
39088    }
39089    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39090        match node.green_node(db).details {
39091            GreenNodeDetails::Token(_) => Self { node },
39092            GreenNodeDetails::Node { .. } => {
39093                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
39094            }
39095        }
39096    }
39097    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39098        match node.green_node(db).details {
39099            GreenNodeDetails::Token(_) => Some(Self { node }),
39100            GreenNodeDetails::Node { .. } => None,
39101        }
39102    }
39103    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39104        self.node
39105    }
39106    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39107        TokenEmptyPtr(self.node.stable_ptr(db))
39108    }
39109}
39110#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39111pub struct TerminalEmpty<'db> {
39112    node: SyntaxNode<'db>,
39113}
39114impl<'db> Terminal<'db> for TerminalEmpty<'db> {
39115    const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
39116    type TokenType = TokenEmpty<'db>;
39117    fn new_green(
39118        db: &'db dyn Database,
39119        leading_trivia: TriviaGreen<'db>,
39120        token: <<TerminalEmpty<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39121        trailing_trivia: TriviaGreen<'db>,
39122    ) -> Self::Green {
39123        let children = [leading_trivia.0, token.0, trailing_trivia.0];
39124        let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39125        TerminalEmptyGreen(
39126            GreenNode {
39127                kind: SyntaxKind::TerminalEmpty,
39128                details: GreenNodeDetails::Node { children: children.into(), width },
39129            }
39130            .intern(db),
39131        )
39132    }
39133    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39134        let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
39135            unreachable!("Expected a node, not a token");
39136        };
39137        *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39138    }
39139}
39140impl<'db> TerminalEmpty<'db> {
39141    pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39142        Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39143    }
39144    pub fn token(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39145        TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
39146    }
39147    pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39148        Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39149    }
39150}
39151#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39152pub struct TerminalEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39153impl<'db> TerminalEmptyPtr<'db> {}
39154impl<'db> TypedStablePtr<'db> for TerminalEmptyPtr<'db> {
39155    type SyntaxNode = TerminalEmpty<'db>;
39156    fn untyped(self) -> SyntaxStablePtrId<'db> {
39157        self.0
39158    }
39159    fn lookup(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
39160        TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
39161    }
39162}
39163impl<'db> From<TerminalEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39164    fn from(ptr: TerminalEmptyPtr<'db>) -> Self {
39165        ptr.untyped()
39166    }
39167}
39168#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39169pub struct TerminalEmptyGreen<'db>(pub GreenId<'db>);
39170impl<'db> TypedSyntaxNode<'db> for TerminalEmpty<'db> {
39171    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
39172    type StablePtr = TerminalEmptyPtr<'db>;
39173    type Green = TerminalEmptyGreen<'db>;
39174    fn missing(db: &'db dyn Database) -> Self::Green {
39175        TerminalEmptyGreen(
39176            GreenNode {
39177                kind: SyntaxKind::TerminalEmpty,
39178                details: GreenNodeDetails::Node {
39179                    children: [
39180                        Trivia::missing(db).0,
39181                        TokenEmpty::missing(db).0,
39182                        Trivia::missing(db).0,
39183                    ]
39184                    .into(),
39185                    width: TextWidth::default(),
39186                },
39187            }
39188            .intern(db),
39189        )
39190    }
39191    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39192        let kind = node.kind(db);
39193        assert_eq!(
39194            kind,
39195            SyntaxKind::TerminalEmpty,
39196            "Unexpected SyntaxKind {:?}. Expected {:?}.",
39197            kind,
39198            SyntaxKind::TerminalEmpty
39199        );
39200        Self { node }
39201    }
39202    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39203        let kind = node.kind(db);
39204        if kind == SyntaxKind::TerminalEmpty {
39205            Some(Self::from_syntax_node(db, node))
39206        } else {
39207            None
39208        }
39209    }
39210    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39211        self.node
39212    }
39213    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39214        TerminalEmptyPtr(self.node.stable_ptr(db))
39215    }
39216}
39217#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39218pub struct TokenSingleLineComment<'db> {
39219    node: SyntaxNode<'db>,
39220}
39221impl<'db> Token<'db> for TokenSingleLineComment<'db> {
39222    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39223        TokenSingleLineCommentGreen(
39224            GreenNode {
39225                kind: SyntaxKind::TokenSingleLineComment,
39226                details: GreenNodeDetails::Token(text),
39227            }
39228            .intern(db),
39229        )
39230    }
39231    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39232        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39233    }
39234}
39235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39236pub struct TokenSingleLineCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39237impl<'db> TypedStablePtr<'db> for TokenSingleLineCommentPtr<'db> {
39238    type SyntaxNode = TokenSingleLineComment<'db>;
39239    fn untyped(self) -> SyntaxStablePtrId<'db> {
39240        self.0
39241    }
39242    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineComment<'db> {
39243        TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
39244    }
39245}
39246impl<'db> From<TokenSingleLineCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39247    fn from(ptr: TokenSingleLineCommentPtr<'db>) -> Self {
39248        ptr.untyped()
39249    }
39250}
39251#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39252pub struct TokenSingleLineCommentGreen<'db>(pub GreenId<'db>);
39253impl<'db> TokenSingleLineCommentGreen<'db> {
39254    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39255        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39256    }
39257}
39258impl<'db> TypedSyntaxNode<'db> for TokenSingleLineComment<'db> {
39259    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
39260    type StablePtr = TokenSingleLineCommentPtr<'db>;
39261    type Green = TokenSingleLineCommentGreen<'db>;
39262    fn missing(db: &'db dyn Database) -> Self::Green {
39263        TokenSingleLineCommentGreen(
39264            GreenNode {
39265                kind: SyntaxKind::TokenMissing,
39266                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39267            }
39268            .intern(db),
39269        )
39270    }
39271    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39272        match node.green_node(db).details {
39273            GreenNodeDetails::Token(_) => Self { node },
39274            GreenNodeDetails::Node { .. } => panic!(
39275                "Expected a token {:?}, not an internal node",
39276                SyntaxKind::TokenSingleLineComment
39277            ),
39278        }
39279    }
39280    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39281        match node.green_node(db).details {
39282            GreenNodeDetails::Token(_) => Some(Self { node }),
39283            GreenNodeDetails::Node { .. } => None,
39284        }
39285    }
39286    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39287        self.node
39288    }
39289    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39290        TokenSingleLineCommentPtr(self.node.stable_ptr(db))
39291    }
39292}
39293#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39294pub struct TokenSingleLineInnerComment<'db> {
39295    node: SyntaxNode<'db>,
39296}
39297impl<'db> Token<'db> for TokenSingleLineInnerComment<'db> {
39298    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39299        TokenSingleLineInnerCommentGreen(
39300            GreenNode {
39301                kind: SyntaxKind::TokenSingleLineInnerComment,
39302                details: GreenNodeDetails::Token(text),
39303            }
39304            .intern(db),
39305        )
39306    }
39307    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39308        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39309    }
39310}
39311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39312pub struct TokenSingleLineInnerCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39313impl<'db> TypedStablePtr<'db> for TokenSingleLineInnerCommentPtr<'db> {
39314    type SyntaxNode = TokenSingleLineInnerComment<'db>;
39315    fn untyped(self) -> SyntaxStablePtrId<'db> {
39316        self.0
39317    }
39318    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineInnerComment<'db> {
39319        TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
39320    }
39321}
39322impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39323    fn from(ptr: TokenSingleLineInnerCommentPtr<'db>) -> Self {
39324        ptr.untyped()
39325    }
39326}
39327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39328pub struct TokenSingleLineInnerCommentGreen<'db>(pub GreenId<'db>);
39329impl<'db> TokenSingleLineInnerCommentGreen<'db> {
39330    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39331        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39332    }
39333}
39334impl<'db> TypedSyntaxNode<'db> for TokenSingleLineInnerComment<'db> {
39335    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
39336    type StablePtr = TokenSingleLineInnerCommentPtr<'db>;
39337    type Green = TokenSingleLineInnerCommentGreen<'db>;
39338    fn missing(db: &'db dyn Database) -> Self::Green {
39339        TokenSingleLineInnerCommentGreen(
39340            GreenNode {
39341                kind: SyntaxKind::TokenMissing,
39342                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39343            }
39344            .intern(db),
39345        )
39346    }
39347    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39348        match node.green_node(db).details {
39349            GreenNodeDetails::Token(_) => Self { node },
39350            GreenNodeDetails::Node { .. } => panic!(
39351                "Expected a token {:?}, not an internal node",
39352                SyntaxKind::TokenSingleLineInnerComment
39353            ),
39354        }
39355    }
39356    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39357        match node.green_node(db).details {
39358            GreenNodeDetails::Token(_) => Some(Self { node }),
39359            GreenNodeDetails::Node { .. } => None,
39360        }
39361    }
39362    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39363        self.node
39364    }
39365    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39366        TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
39367    }
39368}
39369#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39370pub struct TokenSingleLineDocComment<'db> {
39371    node: SyntaxNode<'db>,
39372}
39373impl<'db> Token<'db> for TokenSingleLineDocComment<'db> {
39374    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39375        TokenSingleLineDocCommentGreen(
39376            GreenNode {
39377                kind: SyntaxKind::TokenSingleLineDocComment,
39378                details: GreenNodeDetails::Token(text),
39379            }
39380            .intern(db),
39381        )
39382    }
39383    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39384        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39385    }
39386}
39387#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39388pub struct TokenSingleLineDocCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39389impl<'db> TypedStablePtr<'db> for TokenSingleLineDocCommentPtr<'db> {
39390    type SyntaxNode = TokenSingleLineDocComment<'db>;
39391    fn untyped(self) -> SyntaxStablePtrId<'db> {
39392        self.0
39393    }
39394    fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineDocComment<'db> {
39395        TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
39396    }
39397}
39398impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39399    fn from(ptr: TokenSingleLineDocCommentPtr<'db>) -> Self {
39400        ptr.untyped()
39401    }
39402}
39403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39404pub struct TokenSingleLineDocCommentGreen<'db>(pub GreenId<'db>);
39405impl<'db> TokenSingleLineDocCommentGreen<'db> {
39406    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39407        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39408    }
39409}
39410impl<'db> TypedSyntaxNode<'db> for TokenSingleLineDocComment<'db> {
39411    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
39412    type StablePtr = TokenSingleLineDocCommentPtr<'db>;
39413    type Green = TokenSingleLineDocCommentGreen<'db>;
39414    fn missing(db: &'db dyn Database) -> Self::Green {
39415        TokenSingleLineDocCommentGreen(
39416            GreenNode {
39417                kind: SyntaxKind::TokenMissing,
39418                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39419            }
39420            .intern(db),
39421        )
39422    }
39423    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39424        match node.green_node(db).details {
39425            GreenNodeDetails::Token(_) => Self { node },
39426            GreenNodeDetails::Node { .. } => panic!(
39427                "Expected a token {:?}, not an internal node",
39428                SyntaxKind::TokenSingleLineDocComment
39429            ),
39430        }
39431    }
39432    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39433        match node.green_node(db).details {
39434            GreenNodeDetails::Token(_) => Some(Self { node }),
39435            GreenNodeDetails::Node { .. } => None,
39436        }
39437    }
39438    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39439        self.node
39440    }
39441    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39442        TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
39443    }
39444}
39445#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39446pub struct TokenWhitespace<'db> {
39447    node: SyntaxNode<'db>,
39448}
39449impl<'db> Token<'db> for TokenWhitespace<'db> {
39450    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39451        TokenWhitespaceGreen(
39452            GreenNode { kind: SyntaxKind::TokenWhitespace, details: GreenNodeDetails::Token(text) }
39453                .intern(db),
39454        )
39455    }
39456    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39457        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39458    }
39459}
39460#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39461pub struct TokenWhitespacePtr<'db>(pub SyntaxStablePtrId<'db>);
39462impl<'db> TypedStablePtr<'db> for TokenWhitespacePtr<'db> {
39463    type SyntaxNode = TokenWhitespace<'db>;
39464    fn untyped(self) -> SyntaxStablePtrId<'db> {
39465        self.0
39466    }
39467    fn lookup(&self, db: &'db dyn Database) -> TokenWhitespace<'db> {
39468        TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
39469    }
39470}
39471impl<'db> From<TokenWhitespacePtr<'db>> for SyntaxStablePtrId<'db> {
39472    fn from(ptr: TokenWhitespacePtr<'db>) -> Self {
39473        ptr.untyped()
39474    }
39475}
39476#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39477pub struct TokenWhitespaceGreen<'db>(pub GreenId<'db>);
39478impl<'db> TokenWhitespaceGreen<'db> {
39479    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39480        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39481    }
39482}
39483impl<'db> TypedSyntaxNode<'db> for TokenWhitespace<'db> {
39484    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
39485    type StablePtr = TokenWhitespacePtr<'db>;
39486    type Green = TokenWhitespaceGreen<'db>;
39487    fn missing(db: &'db dyn Database) -> Self::Green {
39488        TokenWhitespaceGreen(
39489            GreenNode {
39490                kind: SyntaxKind::TokenMissing,
39491                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39492            }
39493            .intern(db),
39494        )
39495    }
39496    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39497        match node.green_node(db).details {
39498            GreenNodeDetails::Token(_) => Self { node },
39499            GreenNodeDetails::Node { .. } => {
39500                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
39501            }
39502        }
39503    }
39504    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39505        match node.green_node(db).details {
39506            GreenNodeDetails::Token(_) => Some(Self { node }),
39507            GreenNodeDetails::Node { .. } => None,
39508        }
39509    }
39510    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39511        self.node
39512    }
39513    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39514        TokenWhitespacePtr(self.node.stable_ptr(db))
39515    }
39516}
39517#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39518pub struct TokenNewline<'db> {
39519    node: SyntaxNode<'db>,
39520}
39521impl<'db> Token<'db> for TokenNewline<'db> {
39522    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39523        TokenNewlineGreen(
39524            GreenNode { kind: SyntaxKind::TokenNewline, details: GreenNodeDetails::Token(text) }
39525                .intern(db),
39526        )
39527    }
39528    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39529        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39530    }
39531}
39532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39533pub struct TokenNewlinePtr<'db>(pub SyntaxStablePtrId<'db>);
39534impl<'db> TypedStablePtr<'db> for TokenNewlinePtr<'db> {
39535    type SyntaxNode = TokenNewline<'db>;
39536    fn untyped(self) -> SyntaxStablePtrId<'db> {
39537        self.0
39538    }
39539    fn lookup(&self, db: &'db dyn Database) -> TokenNewline<'db> {
39540        TokenNewline::from_syntax_node(db, self.0.lookup(db))
39541    }
39542}
39543impl<'db> From<TokenNewlinePtr<'db>> for SyntaxStablePtrId<'db> {
39544    fn from(ptr: TokenNewlinePtr<'db>) -> Self {
39545        ptr.untyped()
39546    }
39547}
39548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39549pub struct TokenNewlineGreen<'db>(pub GreenId<'db>);
39550impl<'db> TokenNewlineGreen<'db> {
39551    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39552        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39553    }
39554}
39555impl<'db> TypedSyntaxNode<'db> for TokenNewline<'db> {
39556    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
39557    type StablePtr = TokenNewlinePtr<'db>;
39558    type Green = TokenNewlineGreen<'db>;
39559    fn missing(db: &'db dyn Database) -> Self::Green {
39560        TokenNewlineGreen(
39561            GreenNode {
39562                kind: SyntaxKind::TokenMissing,
39563                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39564            }
39565            .intern(db),
39566        )
39567    }
39568    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39569        match node.green_node(db).details {
39570            GreenNodeDetails::Token(_) => Self { node },
39571            GreenNodeDetails::Node { .. } => {
39572                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
39573            }
39574        }
39575    }
39576    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39577        match node.green_node(db).details {
39578            GreenNodeDetails::Token(_) => Some(Self { node }),
39579            GreenNodeDetails::Node { .. } => None,
39580        }
39581    }
39582    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39583        self.node
39584    }
39585    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39586        TokenNewlinePtr(self.node.stable_ptr(db))
39587    }
39588}
39589#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39590pub struct TokenMissing<'db> {
39591    node: SyntaxNode<'db>,
39592}
39593impl<'db> Token<'db> for TokenMissing<'db> {
39594    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39595        TokenMissingGreen(
39596            GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token(text) }
39597                .intern(db),
39598        )
39599    }
39600    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39601        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39602    }
39603}
39604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39605pub struct TokenMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
39606impl<'db> TypedStablePtr<'db> for TokenMissingPtr<'db> {
39607    type SyntaxNode = TokenMissing<'db>;
39608    fn untyped(self) -> SyntaxStablePtrId<'db> {
39609        self.0
39610    }
39611    fn lookup(&self, db: &'db dyn Database) -> TokenMissing<'db> {
39612        TokenMissing::from_syntax_node(db, self.0.lookup(db))
39613    }
39614}
39615impl<'db> From<TokenMissingPtr<'db>> for SyntaxStablePtrId<'db> {
39616    fn from(ptr: TokenMissingPtr<'db>) -> Self {
39617        ptr.untyped()
39618    }
39619}
39620#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39621pub struct TokenMissingGreen<'db>(pub GreenId<'db>);
39622impl<'db> TokenMissingGreen<'db> {
39623    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39624        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39625    }
39626}
39627impl<'db> TypedSyntaxNode<'db> for TokenMissing<'db> {
39628    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
39629    type StablePtr = TokenMissingPtr<'db>;
39630    type Green = TokenMissingGreen<'db>;
39631    fn missing(db: &'db dyn Database) -> Self::Green {
39632        TokenMissingGreen(
39633            GreenNode {
39634                kind: SyntaxKind::TokenMissing,
39635                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39636            }
39637            .intern(db),
39638        )
39639    }
39640    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39641        match node.green_node(db).details {
39642            GreenNodeDetails::Token(_) => Self { node },
39643            GreenNodeDetails::Node { .. } => {
39644                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
39645            }
39646        }
39647    }
39648    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39649        match node.green_node(db).details {
39650            GreenNodeDetails::Token(_) => Some(Self { node }),
39651            GreenNodeDetails::Node { .. } => None,
39652        }
39653    }
39654    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39655        self.node
39656    }
39657    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39658        TokenMissingPtr(self.node.stable_ptr(db))
39659    }
39660}
39661#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39662pub struct TokenSkipped<'db> {
39663    node: SyntaxNode<'db>,
39664}
39665impl<'db> Token<'db> for TokenSkipped<'db> {
39666    fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39667        TokenSkippedGreen(
39668            GreenNode { kind: SyntaxKind::TokenSkipped, details: GreenNodeDetails::Token(text) }
39669                .intern(db),
39670        )
39671    }
39672    fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39673        *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39674    }
39675}
39676#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39677pub struct TokenSkippedPtr<'db>(pub SyntaxStablePtrId<'db>);
39678impl<'db> TypedStablePtr<'db> for TokenSkippedPtr<'db> {
39679    type SyntaxNode = TokenSkipped<'db>;
39680    fn untyped(self) -> SyntaxStablePtrId<'db> {
39681        self.0
39682    }
39683    fn lookup(&self, db: &'db dyn Database) -> TokenSkipped<'db> {
39684        TokenSkipped::from_syntax_node(db, self.0.lookup(db))
39685    }
39686}
39687impl<'db> From<TokenSkippedPtr<'db>> for SyntaxStablePtrId<'db> {
39688    fn from(ptr: TokenSkippedPtr<'db>) -> Self {
39689        ptr.untyped()
39690    }
39691}
39692#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39693pub struct TokenSkippedGreen<'db>(pub GreenId<'db>);
39694impl<'db> TokenSkippedGreen<'db> {
39695    pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39696        *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39697    }
39698}
39699impl<'db> TypedSyntaxNode<'db> for TokenSkipped<'db> {
39700    const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
39701    type StablePtr = TokenSkippedPtr<'db>;
39702    type Green = TokenSkippedGreen<'db>;
39703    fn missing(db: &'db dyn Database) -> Self::Green {
39704        TokenSkippedGreen(
39705            GreenNode {
39706                kind: SyntaxKind::TokenMissing,
39707                details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39708            }
39709            .intern(db),
39710        )
39711    }
39712    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39713        match node.green_node(db).details {
39714            GreenNodeDetails::Token(_) => Self { node },
39715            GreenNodeDetails::Node { .. } => {
39716                panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
39717            }
39718        }
39719    }
39720    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39721        match node.green_node(db).details {
39722            GreenNodeDetails::Token(_) => Some(Self { node }),
39723            GreenNodeDetails::Node { .. } => None,
39724        }
39725    }
39726    fn as_syntax_node(&self) -> SyntaxNode<'db> {
39727        self.node
39728    }
39729    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39730        TokenSkippedPtr(self.node.stable_ptr(db))
39731    }
39732}
39733#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39734pub enum TokenNode<'db> {
39735    TerminalIdentifier(TerminalIdentifier<'db>),
39736    TerminalLiteralNumber(TerminalLiteralNumber<'db>),
39737    TerminalShortString(TerminalShortString<'db>),
39738    TerminalString(TerminalString<'db>),
39739    TerminalAs(TerminalAs<'db>),
39740    TerminalConst(TerminalConst<'db>),
39741    TerminalElse(TerminalElse<'db>),
39742    TerminalEnum(TerminalEnum<'db>),
39743    TerminalExtern(TerminalExtern<'db>),
39744    TerminalFalse(TerminalFalse<'db>),
39745    TerminalFunction(TerminalFunction<'db>),
39746    TerminalIf(TerminalIf<'db>),
39747    TerminalWhile(TerminalWhile<'db>),
39748    TerminalFor(TerminalFor<'db>),
39749    TerminalLoop(TerminalLoop<'db>),
39750    TerminalImpl(TerminalImpl<'db>),
39751    TerminalImplicits(TerminalImplicits<'db>),
39752    TerminalLet(TerminalLet<'db>),
39753    TerminalMacro(TerminalMacro<'db>),
39754    TerminalMatch(TerminalMatch<'db>),
39755    TerminalModule(TerminalModule<'db>),
39756    TerminalMut(TerminalMut<'db>),
39757    TerminalNoPanic(TerminalNoPanic<'db>),
39758    TerminalOf(TerminalOf<'db>),
39759    TerminalRef(TerminalRef<'db>),
39760    TerminalContinue(TerminalContinue<'db>),
39761    TerminalReturn(TerminalReturn<'db>),
39762    TerminalBreak(TerminalBreak<'db>),
39763    TerminalStruct(TerminalStruct<'db>),
39764    TerminalTrait(TerminalTrait<'db>),
39765    TerminalTrue(TerminalTrue<'db>),
39766    TerminalType(TerminalType<'db>),
39767    TerminalUse(TerminalUse<'db>),
39768    TerminalPub(TerminalPub<'db>),
39769    TerminalAnd(TerminalAnd<'db>),
39770    TerminalAndAnd(TerminalAndAnd<'db>),
39771    TerminalArrow(TerminalArrow<'db>),
39772    TerminalAt(TerminalAt<'db>),
39773    TerminalBadCharacters(TerminalBadCharacters<'db>),
39774    TerminalColon(TerminalColon<'db>),
39775    TerminalColonColon(TerminalColonColon<'db>),
39776    TerminalComma(TerminalComma<'db>),
39777    TerminalDiv(TerminalDiv<'db>),
39778    TerminalDivEq(TerminalDivEq<'db>),
39779    TerminalDollar(TerminalDollar<'db>),
39780    TerminalDot(TerminalDot<'db>),
39781    TerminalDotDot(TerminalDotDot<'db>),
39782    TerminalDotDotEq(TerminalDotDotEq<'db>),
39783    TerminalEndOfFile(TerminalEndOfFile<'db>),
39784    TerminalEq(TerminalEq<'db>),
39785    TerminalEqEq(TerminalEqEq<'db>),
39786    TerminalGE(TerminalGE<'db>),
39787    TerminalGT(TerminalGT<'db>),
39788    TerminalHash(TerminalHash<'db>),
39789    TerminalLBrace(TerminalLBrace<'db>),
39790    TerminalLBrack(TerminalLBrack<'db>),
39791    TerminalLE(TerminalLE<'db>),
39792    TerminalLParen(TerminalLParen<'db>),
39793    TerminalLT(TerminalLT<'db>),
39794    TerminalMatchArrow(TerminalMatchArrow<'db>),
39795    TerminalMinus(TerminalMinus<'db>),
39796    TerminalMinusEq(TerminalMinusEq<'db>),
39797    TerminalMod(TerminalMod<'db>),
39798    TerminalModEq(TerminalModEq<'db>),
39799    TerminalMul(TerminalMul<'db>),
39800    TerminalMulEq(TerminalMulEq<'db>),
39801    TerminalNeq(TerminalNeq<'db>),
39802    TerminalNot(TerminalNot<'db>),
39803    TerminalBitNot(TerminalBitNot<'db>),
39804    TerminalOr(TerminalOr<'db>),
39805    TerminalOrOr(TerminalOrOr<'db>),
39806    TerminalPlus(TerminalPlus<'db>),
39807    TerminalPlusEq(TerminalPlusEq<'db>),
39808    TerminalQuestionMark(TerminalQuestionMark<'db>),
39809    TerminalRBrace(TerminalRBrace<'db>),
39810    TerminalRBrack(TerminalRBrack<'db>),
39811    TerminalRParen(TerminalRParen<'db>),
39812    TerminalSemicolon(TerminalSemicolon<'db>),
39813    TerminalUnderscore(TerminalUnderscore<'db>),
39814    TerminalXor(TerminalXor<'db>),
39815    TerminalEmpty(TerminalEmpty<'db>),
39816}
39817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update, HeapSize)]
39818pub struct TokenNodePtr<'db>(pub SyntaxStablePtrId<'db>);
39819impl<'db> TypedStablePtr<'db> for TokenNodePtr<'db> {
39820    type SyntaxNode = TokenNode<'db>;
39821    fn untyped(self) -> SyntaxStablePtrId<'db> {
39822        self.0
39823    }
39824    fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
39825        TokenNode::from_syntax_node(db, self.0.lookup(db))
39826    }
39827}
39828impl<'db> From<TokenNodePtr<'db>> for SyntaxStablePtrId<'db> {
39829    fn from(ptr: TokenNodePtr<'db>) -> Self {
39830        ptr.untyped()
39831    }
39832}
39833impl<'db> From<TerminalIdentifierPtr<'db>> for TokenNodePtr<'db> {
39834    fn from(value: TerminalIdentifierPtr<'db>) -> Self {
39835        Self(value.0)
39836    }
39837}
39838impl<'db> From<TerminalLiteralNumberPtr<'db>> for TokenNodePtr<'db> {
39839    fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
39840        Self(value.0)
39841    }
39842}
39843impl<'db> From<TerminalShortStringPtr<'db>> for TokenNodePtr<'db> {
39844    fn from(value: TerminalShortStringPtr<'db>) -> Self {
39845        Self(value.0)
39846    }
39847}
39848impl<'db> From<TerminalStringPtr<'db>> for TokenNodePtr<'db> {
39849    fn from(value: TerminalStringPtr<'db>) -> Self {
39850        Self(value.0)
39851    }
39852}
39853impl<'db> From<TerminalAsPtr<'db>> for TokenNodePtr<'db> {
39854    fn from(value: TerminalAsPtr<'db>) -> Self {
39855        Self(value.0)
39856    }
39857}
39858impl<'db> From<TerminalConstPtr<'db>> for TokenNodePtr<'db> {
39859    fn from(value: TerminalConstPtr<'db>) -> Self {
39860        Self(value.0)
39861    }
39862}
39863impl<'db> From<TerminalElsePtr<'db>> for TokenNodePtr<'db> {
39864    fn from(value: TerminalElsePtr<'db>) -> Self {
39865        Self(value.0)
39866    }
39867}
39868impl<'db> From<TerminalEnumPtr<'db>> for TokenNodePtr<'db> {
39869    fn from(value: TerminalEnumPtr<'db>) -> Self {
39870        Self(value.0)
39871    }
39872}
39873impl<'db> From<TerminalExternPtr<'db>> for TokenNodePtr<'db> {
39874    fn from(value: TerminalExternPtr<'db>) -> Self {
39875        Self(value.0)
39876    }
39877}
39878impl<'db> From<TerminalFalsePtr<'db>> for TokenNodePtr<'db> {
39879    fn from(value: TerminalFalsePtr<'db>) -> Self {
39880        Self(value.0)
39881    }
39882}
39883impl<'db> From<TerminalFunctionPtr<'db>> for TokenNodePtr<'db> {
39884    fn from(value: TerminalFunctionPtr<'db>) -> Self {
39885        Self(value.0)
39886    }
39887}
39888impl<'db> From<TerminalIfPtr<'db>> for TokenNodePtr<'db> {
39889    fn from(value: TerminalIfPtr<'db>) -> Self {
39890        Self(value.0)
39891    }
39892}
39893impl<'db> From<TerminalWhilePtr<'db>> for TokenNodePtr<'db> {
39894    fn from(value: TerminalWhilePtr<'db>) -> Self {
39895        Self(value.0)
39896    }
39897}
39898impl<'db> From<TerminalForPtr<'db>> for TokenNodePtr<'db> {
39899    fn from(value: TerminalForPtr<'db>) -> Self {
39900        Self(value.0)
39901    }
39902}
39903impl<'db> From<TerminalLoopPtr<'db>> for TokenNodePtr<'db> {
39904    fn from(value: TerminalLoopPtr<'db>) -> Self {
39905        Self(value.0)
39906    }
39907}
39908impl<'db> From<TerminalImplPtr<'db>> for TokenNodePtr<'db> {
39909    fn from(value: TerminalImplPtr<'db>) -> Self {
39910        Self(value.0)
39911    }
39912}
39913impl<'db> From<TerminalImplicitsPtr<'db>> for TokenNodePtr<'db> {
39914    fn from(value: TerminalImplicitsPtr<'db>) -> Self {
39915        Self(value.0)
39916    }
39917}
39918impl<'db> From<TerminalLetPtr<'db>> for TokenNodePtr<'db> {
39919    fn from(value: TerminalLetPtr<'db>) -> Self {
39920        Self(value.0)
39921    }
39922}
39923impl<'db> From<TerminalMacroPtr<'db>> for TokenNodePtr<'db> {
39924    fn from(value: TerminalMacroPtr<'db>) -> Self {
39925        Self(value.0)
39926    }
39927}
39928impl<'db> From<TerminalMatchPtr<'db>> for TokenNodePtr<'db> {
39929    fn from(value: TerminalMatchPtr<'db>) -> Self {
39930        Self(value.0)
39931    }
39932}
39933impl<'db> From<TerminalModulePtr<'db>> for TokenNodePtr<'db> {
39934    fn from(value: TerminalModulePtr<'db>) -> Self {
39935        Self(value.0)
39936    }
39937}
39938impl<'db> From<TerminalMutPtr<'db>> for TokenNodePtr<'db> {
39939    fn from(value: TerminalMutPtr<'db>) -> Self {
39940        Self(value.0)
39941    }
39942}
39943impl<'db> From<TerminalNoPanicPtr<'db>> for TokenNodePtr<'db> {
39944    fn from(value: TerminalNoPanicPtr<'db>) -> Self {
39945        Self(value.0)
39946    }
39947}
39948impl<'db> From<TerminalOfPtr<'db>> for TokenNodePtr<'db> {
39949    fn from(value: TerminalOfPtr<'db>) -> Self {
39950        Self(value.0)
39951    }
39952}
39953impl<'db> From<TerminalRefPtr<'db>> for TokenNodePtr<'db> {
39954    fn from(value: TerminalRefPtr<'db>) -> Self {
39955        Self(value.0)
39956    }
39957}
39958impl<'db> From<TerminalContinuePtr<'db>> for TokenNodePtr<'db> {
39959    fn from(value: TerminalContinuePtr<'db>) -> Self {
39960        Self(value.0)
39961    }
39962}
39963impl<'db> From<TerminalReturnPtr<'db>> for TokenNodePtr<'db> {
39964    fn from(value: TerminalReturnPtr<'db>) -> Self {
39965        Self(value.0)
39966    }
39967}
39968impl<'db> From<TerminalBreakPtr<'db>> for TokenNodePtr<'db> {
39969    fn from(value: TerminalBreakPtr<'db>) -> Self {
39970        Self(value.0)
39971    }
39972}
39973impl<'db> From<TerminalStructPtr<'db>> for TokenNodePtr<'db> {
39974    fn from(value: TerminalStructPtr<'db>) -> Self {
39975        Self(value.0)
39976    }
39977}
39978impl<'db> From<TerminalTraitPtr<'db>> for TokenNodePtr<'db> {
39979    fn from(value: TerminalTraitPtr<'db>) -> Self {
39980        Self(value.0)
39981    }
39982}
39983impl<'db> From<TerminalTruePtr<'db>> for TokenNodePtr<'db> {
39984    fn from(value: TerminalTruePtr<'db>) -> Self {
39985        Self(value.0)
39986    }
39987}
39988impl<'db> From<TerminalTypePtr<'db>> for TokenNodePtr<'db> {
39989    fn from(value: TerminalTypePtr<'db>) -> Self {
39990        Self(value.0)
39991    }
39992}
39993impl<'db> From<TerminalUsePtr<'db>> for TokenNodePtr<'db> {
39994    fn from(value: TerminalUsePtr<'db>) -> Self {
39995        Self(value.0)
39996    }
39997}
39998impl<'db> From<TerminalPubPtr<'db>> for TokenNodePtr<'db> {
39999    fn from(value: TerminalPubPtr<'db>) -> Self {
40000        Self(value.0)
40001    }
40002}
40003impl<'db> From<TerminalAndPtr<'db>> for TokenNodePtr<'db> {
40004    fn from(value: TerminalAndPtr<'db>) -> Self {
40005        Self(value.0)
40006    }
40007}
40008impl<'db> From<TerminalAndAndPtr<'db>> for TokenNodePtr<'db> {
40009    fn from(value: TerminalAndAndPtr<'db>) -> Self {
40010        Self(value.0)
40011    }
40012}
40013impl<'db> From<TerminalArrowPtr<'db>> for TokenNodePtr<'db> {
40014    fn from(value: TerminalArrowPtr<'db>) -> Self {
40015        Self(value.0)
40016    }
40017}
40018impl<'db> From<TerminalAtPtr<'db>> for TokenNodePtr<'db> {
40019    fn from(value: TerminalAtPtr<'db>) -> Self {
40020        Self(value.0)
40021    }
40022}
40023impl<'db> From<TerminalBadCharactersPtr<'db>> for TokenNodePtr<'db> {
40024    fn from(value: TerminalBadCharactersPtr<'db>) -> Self {
40025        Self(value.0)
40026    }
40027}
40028impl<'db> From<TerminalColonPtr<'db>> for TokenNodePtr<'db> {
40029    fn from(value: TerminalColonPtr<'db>) -> Self {
40030        Self(value.0)
40031    }
40032}
40033impl<'db> From<TerminalColonColonPtr<'db>> for TokenNodePtr<'db> {
40034    fn from(value: TerminalColonColonPtr<'db>) -> Self {
40035        Self(value.0)
40036    }
40037}
40038impl<'db> From<TerminalCommaPtr<'db>> for TokenNodePtr<'db> {
40039    fn from(value: TerminalCommaPtr<'db>) -> Self {
40040        Self(value.0)
40041    }
40042}
40043impl<'db> From<TerminalDivPtr<'db>> for TokenNodePtr<'db> {
40044    fn from(value: TerminalDivPtr<'db>) -> Self {
40045        Self(value.0)
40046    }
40047}
40048impl<'db> From<TerminalDivEqPtr<'db>> for TokenNodePtr<'db> {
40049    fn from(value: TerminalDivEqPtr<'db>) -> Self {
40050        Self(value.0)
40051    }
40052}
40053impl<'db> From<TerminalDollarPtr<'db>> for TokenNodePtr<'db> {
40054    fn from(value: TerminalDollarPtr<'db>) -> Self {
40055        Self(value.0)
40056    }
40057}
40058impl<'db> From<TerminalDotPtr<'db>> for TokenNodePtr<'db> {
40059    fn from(value: TerminalDotPtr<'db>) -> Self {
40060        Self(value.0)
40061    }
40062}
40063impl<'db> From<TerminalDotDotPtr<'db>> for TokenNodePtr<'db> {
40064    fn from(value: TerminalDotDotPtr<'db>) -> Self {
40065        Self(value.0)
40066    }
40067}
40068impl<'db> From<TerminalDotDotEqPtr<'db>> for TokenNodePtr<'db> {
40069    fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
40070        Self(value.0)
40071    }
40072}
40073impl<'db> From<TerminalEndOfFilePtr<'db>> for TokenNodePtr<'db> {
40074    fn from(value: TerminalEndOfFilePtr<'db>) -> Self {
40075        Self(value.0)
40076    }
40077}
40078impl<'db> From<TerminalEqPtr<'db>> for TokenNodePtr<'db> {
40079    fn from(value: TerminalEqPtr<'db>) -> Self {
40080        Self(value.0)
40081    }
40082}
40083impl<'db> From<TerminalEqEqPtr<'db>> for TokenNodePtr<'db> {
40084    fn from(value: TerminalEqEqPtr<'db>) -> Self {
40085        Self(value.0)
40086    }
40087}
40088impl<'db> From<TerminalGEPtr<'db>> for TokenNodePtr<'db> {
40089    fn from(value: TerminalGEPtr<'db>) -> Self {
40090        Self(value.0)
40091    }
40092}
40093impl<'db> From<TerminalGTPtr<'db>> for TokenNodePtr<'db> {
40094    fn from(value: TerminalGTPtr<'db>) -> Self {
40095        Self(value.0)
40096    }
40097}
40098impl<'db> From<TerminalHashPtr<'db>> for TokenNodePtr<'db> {
40099    fn from(value: TerminalHashPtr<'db>) -> Self {
40100        Self(value.0)
40101    }
40102}
40103impl<'db> From<TerminalLBracePtr<'db>> for TokenNodePtr<'db> {
40104    fn from(value: TerminalLBracePtr<'db>) -> Self {
40105        Self(value.0)
40106    }
40107}
40108impl<'db> From<TerminalLBrackPtr<'db>> for TokenNodePtr<'db> {
40109    fn from(value: TerminalLBrackPtr<'db>) -> Self {
40110        Self(value.0)
40111    }
40112}
40113impl<'db> From<TerminalLEPtr<'db>> for TokenNodePtr<'db> {
40114    fn from(value: TerminalLEPtr<'db>) -> Self {
40115        Self(value.0)
40116    }
40117}
40118impl<'db> From<TerminalLParenPtr<'db>> for TokenNodePtr<'db> {
40119    fn from(value: TerminalLParenPtr<'db>) -> Self {
40120        Self(value.0)
40121    }
40122}
40123impl<'db> From<TerminalLTPtr<'db>> for TokenNodePtr<'db> {
40124    fn from(value: TerminalLTPtr<'db>) -> Self {
40125        Self(value.0)
40126    }
40127}
40128impl<'db> From<TerminalMatchArrowPtr<'db>> for TokenNodePtr<'db> {
40129    fn from(value: TerminalMatchArrowPtr<'db>) -> Self {
40130        Self(value.0)
40131    }
40132}
40133impl<'db> From<TerminalMinusPtr<'db>> for TokenNodePtr<'db> {
40134    fn from(value: TerminalMinusPtr<'db>) -> Self {
40135        Self(value.0)
40136    }
40137}
40138impl<'db> From<TerminalMinusEqPtr<'db>> for TokenNodePtr<'db> {
40139    fn from(value: TerminalMinusEqPtr<'db>) -> Self {
40140        Self(value.0)
40141    }
40142}
40143impl<'db> From<TerminalModPtr<'db>> for TokenNodePtr<'db> {
40144    fn from(value: TerminalModPtr<'db>) -> Self {
40145        Self(value.0)
40146    }
40147}
40148impl<'db> From<TerminalModEqPtr<'db>> for TokenNodePtr<'db> {
40149    fn from(value: TerminalModEqPtr<'db>) -> Self {
40150        Self(value.0)
40151    }
40152}
40153impl<'db> From<TerminalMulPtr<'db>> for TokenNodePtr<'db> {
40154    fn from(value: TerminalMulPtr<'db>) -> Self {
40155        Self(value.0)
40156    }
40157}
40158impl<'db> From<TerminalMulEqPtr<'db>> for TokenNodePtr<'db> {
40159    fn from(value: TerminalMulEqPtr<'db>) -> Self {
40160        Self(value.0)
40161    }
40162}
40163impl<'db> From<TerminalNeqPtr<'db>> for TokenNodePtr<'db> {
40164    fn from(value: TerminalNeqPtr<'db>) -> Self {
40165        Self(value.0)
40166    }
40167}
40168impl<'db> From<TerminalNotPtr<'db>> for TokenNodePtr<'db> {
40169    fn from(value: TerminalNotPtr<'db>) -> Self {
40170        Self(value.0)
40171    }
40172}
40173impl<'db> From<TerminalBitNotPtr<'db>> for TokenNodePtr<'db> {
40174    fn from(value: TerminalBitNotPtr<'db>) -> Self {
40175        Self(value.0)
40176    }
40177}
40178impl<'db> From<TerminalOrPtr<'db>> for TokenNodePtr<'db> {
40179    fn from(value: TerminalOrPtr<'db>) -> Self {
40180        Self(value.0)
40181    }
40182}
40183impl<'db> From<TerminalOrOrPtr<'db>> for TokenNodePtr<'db> {
40184    fn from(value: TerminalOrOrPtr<'db>) -> Self {
40185        Self(value.0)
40186    }
40187}
40188impl<'db> From<TerminalPlusPtr<'db>> for TokenNodePtr<'db> {
40189    fn from(value: TerminalPlusPtr<'db>) -> Self {
40190        Self(value.0)
40191    }
40192}
40193impl<'db> From<TerminalPlusEqPtr<'db>> for TokenNodePtr<'db> {
40194    fn from(value: TerminalPlusEqPtr<'db>) -> Self {
40195        Self(value.0)
40196    }
40197}
40198impl<'db> From<TerminalQuestionMarkPtr<'db>> for TokenNodePtr<'db> {
40199    fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
40200        Self(value.0)
40201    }
40202}
40203impl<'db> From<TerminalRBracePtr<'db>> for TokenNodePtr<'db> {
40204    fn from(value: TerminalRBracePtr<'db>) -> Self {
40205        Self(value.0)
40206    }
40207}
40208impl<'db> From<TerminalRBrackPtr<'db>> for TokenNodePtr<'db> {
40209    fn from(value: TerminalRBrackPtr<'db>) -> Self {
40210        Self(value.0)
40211    }
40212}
40213impl<'db> From<TerminalRParenPtr<'db>> for TokenNodePtr<'db> {
40214    fn from(value: TerminalRParenPtr<'db>) -> Self {
40215        Self(value.0)
40216    }
40217}
40218impl<'db> From<TerminalSemicolonPtr<'db>> for TokenNodePtr<'db> {
40219    fn from(value: TerminalSemicolonPtr<'db>) -> Self {
40220        Self(value.0)
40221    }
40222}
40223impl<'db> From<TerminalUnderscorePtr<'db>> for TokenNodePtr<'db> {
40224    fn from(value: TerminalUnderscorePtr<'db>) -> Self {
40225        Self(value.0)
40226    }
40227}
40228impl<'db> From<TerminalXorPtr<'db>> for TokenNodePtr<'db> {
40229    fn from(value: TerminalXorPtr<'db>) -> Self {
40230        Self(value.0)
40231    }
40232}
40233impl<'db> From<TerminalEmptyPtr<'db>> for TokenNodePtr<'db> {
40234    fn from(value: TerminalEmptyPtr<'db>) -> Self {
40235        Self(value.0)
40236    }
40237}
40238impl<'db> From<TerminalIdentifierGreen<'db>> for TokenNodeGreen<'db> {
40239    fn from(value: TerminalIdentifierGreen<'db>) -> Self {
40240        Self(value.0)
40241    }
40242}
40243impl<'db> From<TerminalLiteralNumberGreen<'db>> for TokenNodeGreen<'db> {
40244    fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
40245        Self(value.0)
40246    }
40247}
40248impl<'db> From<TerminalShortStringGreen<'db>> for TokenNodeGreen<'db> {
40249    fn from(value: TerminalShortStringGreen<'db>) -> Self {
40250        Self(value.0)
40251    }
40252}
40253impl<'db> From<TerminalStringGreen<'db>> for TokenNodeGreen<'db> {
40254    fn from(value: TerminalStringGreen<'db>) -> Self {
40255        Self(value.0)
40256    }
40257}
40258impl<'db> From<TerminalAsGreen<'db>> for TokenNodeGreen<'db> {
40259    fn from(value: TerminalAsGreen<'db>) -> Self {
40260        Self(value.0)
40261    }
40262}
40263impl<'db> From<TerminalConstGreen<'db>> for TokenNodeGreen<'db> {
40264    fn from(value: TerminalConstGreen<'db>) -> Self {
40265        Self(value.0)
40266    }
40267}
40268impl<'db> From<TerminalElseGreen<'db>> for TokenNodeGreen<'db> {
40269    fn from(value: TerminalElseGreen<'db>) -> Self {
40270        Self(value.0)
40271    }
40272}
40273impl<'db> From<TerminalEnumGreen<'db>> for TokenNodeGreen<'db> {
40274    fn from(value: TerminalEnumGreen<'db>) -> Self {
40275        Self(value.0)
40276    }
40277}
40278impl<'db> From<TerminalExternGreen<'db>> for TokenNodeGreen<'db> {
40279    fn from(value: TerminalExternGreen<'db>) -> Self {
40280        Self(value.0)
40281    }
40282}
40283impl<'db> From<TerminalFalseGreen<'db>> for TokenNodeGreen<'db> {
40284    fn from(value: TerminalFalseGreen<'db>) -> Self {
40285        Self(value.0)
40286    }
40287}
40288impl<'db> From<TerminalFunctionGreen<'db>> for TokenNodeGreen<'db> {
40289    fn from(value: TerminalFunctionGreen<'db>) -> Self {
40290        Self(value.0)
40291    }
40292}
40293impl<'db> From<TerminalIfGreen<'db>> for TokenNodeGreen<'db> {
40294    fn from(value: TerminalIfGreen<'db>) -> Self {
40295        Self(value.0)
40296    }
40297}
40298impl<'db> From<TerminalWhileGreen<'db>> for TokenNodeGreen<'db> {
40299    fn from(value: TerminalWhileGreen<'db>) -> Self {
40300        Self(value.0)
40301    }
40302}
40303impl<'db> From<TerminalForGreen<'db>> for TokenNodeGreen<'db> {
40304    fn from(value: TerminalForGreen<'db>) -> Self {
40305        Self(value.0)
40306    }
40307}
40308impl<'db> From<TerminalLoopGreen<'db>> for TokenNodeGreen<'db> {
40309    fn from(value: TerminalLoopGreen<'db>) -> Self {
40310        Self(value.0)
40311    }
40312}
40313impl<'db> From<TerminalImplGreen<'db>> for TokenNodeGreen<'db> {
40314    fn from(value: TerminalImplGreen<'db>) -> Self {
40315        Self(value.0)
40316    }
40317}
40318impl<'db> From<TerminalImplicitsGreen<'db>> for TokenNodeGreen<'db> {
40319    fn from(value: TerminalImplicitsGreen<'db>) -> Self {
40320        Self(value.0)
40321    }
40322}
40323impl<'db> From<TerminalLetGreen<'db>> for TokenNodeGreen<'db> {
40324    fn from(value: TerminalLetGreen<'db>) -> Self {
40325        Self(value.0)
40326    }
40327}
40328impl<'db> From<TerminalMacroGreen<'db>> for TokenNodeGreen<'db> {
40329    fn from(value: TerminalMacroGreen<'db>) -> Self {
40330        Self(value.0)
40331    }
40332}
40333impl<'db> From<TerminalMatchGreen<'db>> for TokenNodeGreen<'db> {
40334    fn from(value: TerminalMatchGreen<'db>) -> Self {
40335        Self(value.0)
40336    }
40337}
40338impl<'db> From<TerminalModuleGreen<'db>> for TokenNodeGreen<'db> {
40339    fn from(value: TerminalModuleGreen<'db>) -> Self {
40340        Self(value.0)
40341    }
40342}
40343impl<'db> From<TerminalMutGreen<'db>> for TokenNodeGreen<'db> {
40344    fn from(value: TerminalMutGreen<'db>) -> Self {
40345        Self(value.0)
40346    }
40347}
40348impl<'db> From<TerminalNoPanicGreen<'db>> for TokenNodeGreen<'db> {
40349    fn from(value: TerminalNoPanicGreen<'db>) -> Self {
40350        Self(value.0)
40351    }
40352}
40353impl<'db> From<TerminalOfGreen<'db>> for TokenNodeGreen<'db> {
40354    fn from(value: TerminalOfGreen<'db>) -> Self {
40355        Self(value.0)
40356    }
40357}
40358impl<'db> From<TerminalRefGreen<'db>> for TokenNodeGreen<'db> {
40359    fn from(value: TerminalRefGreen<'db>) -> Self {
40360        Self(value.0)
40361    }
40362}
40363impl<'db> From<TerminalContinueGreen<'db>> for TokenNodeGreen<'db> {
40364    fn from(value: TerminalContinueGreen<'db>) -> Self {
40365        Self(value.0)
40366    }
40367}
40368impl<'db> From<TerminalReturnGreen<'db>> for TokenNodeGreen<'db> {
40369    fn from(value: TerminalReturnGreen<'db>) -> Self {
40370        Self(value.0)
40371    }
40372}
40373impl<'db> From<TerminalBreakGreen<'db>> for TokenNodeGreen<'db> {
40374    fn from(value: TerminalBreakGreen<'db>) -> Self {
40375        Self(value.0)
40376    }
40377}
40378impl<'db> From<TerminalStructGreen<'db>> for TokenNodeGreen<'db> {
40379    fn from(value: TerminalStructGreen<'db>) -> Self {
40380        Self(value.0)
40381    }
40382}
40383impl<'db> From<TerminalTraitGreen<'db>> for TokenNodeGreen<'db> {
40384    fn from(value: TerminalTraitGreen<'db>) -> Self {
40385        Self(value.0)
40386    }
40387}
40388impl<'db> From<TerminalTrueGreen<'db>> for TokenNodeGreen<'db> {
40389    fn from(value: TerminalTrueGreen<'db>) -> Self {
40390        Self(value.0)
40391    }
40392}
40393impl<'db> From<TerminalTypeGreen<'db>> for TokenNodeGreen<'db> {
40394    fn from(value: TerminalTypeGreen<'db>) -> Self {
40395        Self(value.0)
40396    }
40397}
40398impl<'db> From<TerminalUseGreen<'db>> for TokenNodeGreen<'db> {
40399    fn from(value: TerminalUseGreen<'db>) -> Self {
40400        Self(value.0)
40401    }
40402}
40403impl<'db> From<TerminalPubGreen<'db>> for TokenNodeGreen<'db> {
40404    fn from(value: TerminalPubGreen<'db>) -> Self {
40405        Self(value.0)
40406    }
40407}
40408impl<'db> From<TerminalAndGreen<'db>> for TokenNodeGreen<'db> {
40409    fn from(value: TerminalAndGreen<'db>) -> Self {
40410        Self(value.0)
40411    }
40412}
40413impl<'db> From<TerminalAndAndGreen<'db>> for TokenNodeGreen<'db> {
40414    fn from(value: TerminalAndAndGreen<'db>) -> Self {
40415        Self(value.0)
40416    }
40417}
40418impl<'db> From<TerminalArrowGreen<'db>> for TokenNodeGreen<'db> {
40419    fn from(value: TerminalArrowGreen<'db>) -> Self {
40420        Self(value.0)
40421    }
40422}
40423impl<'db> From<TerminalAtGreen<'db>> for TokenNodeGreen<'db> {
40424    fn from(value: TerminalAtGreen<'db>) -> Self {
40425        Self(value.0)
40426    }
40427}
40428impl<'db> From<TerminalBadCharactersGreen<'db>> for TokenNodeGreen<'db> {
40429    fn from(value: TerminalBadCharactersGreen<'db>) -> Self {
40430        Self(value.0)
40431    }
40432}
40433impl<'db> From<TerminalColonGreen<'db>> for TokenNodeGreen<'db> {
40434    fn from(value: TerminalColonGreen<'db>) -> Self {
40435        Self(value.0)
40436    }
40437}
40438impl<'db> From<TerminalColonColonGreen<'db>> for TokenNodeGreen<'db> {
40439    fn from(value: TerminalColonColonGreen<'db>) -> Self {
40440        Self(value.0)
40441    }
40442}
40443impl<'db> From<TerminalCommaGreen<'db>> for TokenNodeGreen<'db> {
40444    fn from(value: TerminalCommaGreen<'db>) -> Self {
40445        Self(value.0)
40446    }
40447}
40448impl<'db> From<TerminalDivGreen<'db>> for TokenNodeGreen<'db> {
40449    fn from(value: TerminalDivGreen<'db>) -> Self {
40450        Self(value.0)
40451    }
40452}
40453impl<'db> From<TerminalDivEqGreen<'db>> for TokenNodeGreen<'db> {
40454    fn from(value: TerminalDivEqGreen<'db>) -> Self {
40455        Self(value.0)
40456    }
40457}
40458impl<'db> From<TerminalDollarGreen<'db>> for TokenNodeGreen<'db> {
40459    fn from(value: TerminalDollarGreen<'db>) -> Self {
40460        Self(value.0)
40461    }
40462}
40463impl<'db> From<TerminalDotGreen<'db>> for TokenNodeGreen<'db> {
40464    fn from(value: TerminalDotGreen<'db>) -> Self {
40465        Self(value.0)
40466    }
40467}
40468impl<'db> From<TerminalDotDotGreen<'db>> for TokenNodeGreen<'db> {
40469    fn from(value: TerminalDotDotGreen<'db>) -> Self {
40470        Self(value.0)
40471    }
40472}
40473impl<'db> From<TerminalDotDotEqGreen<'db>> for TokenNodeGreen<'db> {
40474    fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
40475        Self(value.0)
40476    }
40477}
40478impl<'db> From<TerminalEndOfFileGreen<'db>> for TokenNodeGreen<'db> {
40479    fn from(value: TerminalEndOfFileGreen<'db>) -> Self {
40480        Self(value.0)
40481    }
40482}
40483impl<'db> From<TerminalEqGreen<'db>> for TokenNodeGreen<'db> {
40484    fn from(value: TerminalEqGreen<'db>) -> Self {
40485        Self(value.0)
40486    }
40487}
40488impl<'db> From<TerminalEqEqGreen<'db>> for TokenNodeGreen<'db> {
40489    fn from(value: TerminalEqEqGreen<'db>) -> Self {
40490        Self(value.0)
40491    }
40492}
40493impl<'db> From<TerminalGEGreen<'db>> for TokenNodeGreen<'db> {
40494    fn from(value: TerminalGEGreen<'db>) -> Self {
40495        Self(value.0)
40496    }
40497}
40498impl<'db> From<TerminalGTGreen<'db>> for TokenNodeGreen<'db> {
40499    fn from(value: TerminalGTGreen<'db>) -> Self {
40500        Self(value.0)
40501    }
40502}
40503impl<'db> From<TerminalHashGreen<'db>> for TokenNodeGreen<'db> {
40504    fn from(value: TerminalHashGreen<'db>) -> Self {
40505        Self(value.0)
40506    }
40507}
40508impl<'db> From<TerminalLBraceGreen<'db>> for TokenNodeGreen<'db> {
40509    fn from(value: TerminalLBraceGreen<'db>) -> Self {
40510        Self(value.0)
40511    }
40512}
40513impl<'db> From<TerminalLBrackGreen<'db>> for TokenNodeGreen<'db> {
40514    fn from(value: TerminalLBrackGreen<'db>) -> Self {
40515        Self(value.0)
40516    }
40517}
40518impl<'db> From<TerminalLEGreen<'db>> for TokenNodeGreen<'db> {
40519    fn from(value: TerminalLEGreen<'db>) -> Self {
40520        Self(value.0)
40521    }
40522}
40523impl<'db> From<TerminalLParenGreen<'db>> for TokenNodeGreen<'db> {
40524    fn from(value: TerminalLParenGreen<'db>) -> Self {
40525        Self(value.0)
40526    }
40527}
40528impl<'db> From<TerminalLTGreen<'db>> for TokenNodeGreen<'db> {
40529    fn from(value: TerminalLTGreen<'db>) -> Self {
40530        Self(value.0)
40531    }
40532}
40533impl<'db> From<TerminalMatchArrowGreen<'db>> for TokenNodeGreen<'db> {
40534    fn from(value: TerminalMatchArrowGreen<'db>) -> Self {
40535        Self(value.0)
40536    }
40537}
40538impl<'db> From<TerminalMinusGreen<'db>> for TokenNodeGreen<'db> {
40539    fn from(value: TerminalMinusGreen<'db>) -> Self {
40540        Self(value.0)
40541    }
40542}
40543impl<'db> From<TerminalMinusEqGreen<'db>> for TokenNodeGreen<'db> {
40544    fn from(value: TerminalMinusEqGreen<'db>) -> Self {
40545        Self(value.0)
40546    }
40547}
40548impl<'db> From<TerminalModGreen<'db>> for TokenNodeGreen<'db> {
40549    fn from(value: TerminalModGreen<'db>) -> Self {
40550        Self(value.0)
40551    }
40552}
40553impl<'db> From<TerminalModEqGreen<'db>> for TokenNodeGreen<'db> {
40554    fn from(value: TerminalModEqGreen<'db>) -> Self {
40555        Self(value.0)
40556    }
40557}
40558impl<'db> From<TerminalMulGreen<'db>> for TokenNodeGreen<'db> {
40559    fn from(value: TerminalMulGreen<'db>) -> Self {
40560        Self(value.0)
40561    }
40562}
40563impl<'db> From<TerminalMulEqGreen<'db>> for TokenNodeGreen<'db> {
40564    fn from(value: TerminalMulEqGreen<'db>) -> Self {
40565        Self(value.0)
40566    }
40567}
40568impl<'db> From<TerminalNeqGreen<'db>> for TokenNodeGreen<'db> {
40569    fn from(value: TerminalNeqGreen<'db>) -> Self {
40570        Self(value.0)
40571    }
40572}
40573impl<'db> From<TerminalNotGreen<'db>> for TokenNodeGreen<'db> {
40574    fn from(value: TerminalNotGreen<'db>) -> Self {
40575        Self(value.0)
40576    }
40577}
40578impl<'db> From<TerminalBitNotGreen<'db>> for TokenNodeGreen<'db> {
40579    fn from(value: TerminalBitNotGreen<'db>) -> Self {
40580        Self(value.0)
40581    }
40582}
40583impl<'db> From<TerminalOrGreen<'db>> for TokenNodeGreen<'db> {
40584    fn from(value: TerminalOrGreen<'db>) -> Self {
40585        Self(value.0)
40586    }
40587}
40588impl<'db> From<TerminalOrOrGreen<'db>> for TokenNodeGreen<'db> {
40589    fn from(value: TerminalOrOrGreen<'db>) -> Self {
40590        Self(value.0)
40591    }
40592}
40593impl<'db> From<TerminalPlusGreen<'db>> for TokenNodeGreen<'db> {
40594    fn from(value: TerminalPlusGreen<'db>) -> Self {
40595        Self(value.0)
40596    }
40597}
40598impl<'db> From<TerminalPlusEqGreen<'db>> for TokenNodeGreen<'db> {
40599    fn from(value: TerminalPlusEqGreen<'db>) -> Self {
40600        Self(value.0)
40601    }
40602}
40603impl<'db> From<TerminalQuestionMarkGreen<'db>> for TokenNodeGreen<'db> {
40604    fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
40605        Self(value.0)
40606    }
40607}
40608impl<'db> From<TerminalRBraceGreen<'db>> for TokenNodeGreen<'db> {
40609    fn from(value: TerminalRBraceGreen<'db>) -> Self {
40610        Self(value.0)
40611    }
40612}
40613impl<'db> From<TerminalRBrackGreen<'db>> for TokenNodeGreen<'db> {
40614    fn from(value: TerminalRBrackGreen<'db>) -> Self {
40615        Self(value.0)
40616    }
40617}
40618impl<'db> From<TerminalRParenGreen<'db>> for TokenNodeGreen<'db> {
40619    fn from(value: TerminalRParenGreen<'db>) -> Self {
40620        Self(value.0)
40621    }
40622}
40623impl<'db> From<TerminalSemicolonGreen<'db>> for TokenNodeGreen<'db> {
40624    fn from(value: TerminalSemicolonGreen<'db>) -> Self {
40625        Self(value.0)
40626    }
40627}
40628impl<'db> From<TerminalUnderscoreGreen<'db>> for TokenNodeGreen<'db> {
40629    fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
40630        Self(value.0)
40631    }
40632}
40633impl<'db> From<TerminalXorGreen<'db>> for TokenNodeGreen<'db> {
40634    fn from(value: TerminalXorGreen<'db>) -> Self {
40635        Self(value.0)
40636    }
40637}
40638impl<'db> From<TerminalEmptyGreen<'db>> for TokenNodeGreen<'db> {
40639    fn from(value: TerminalEmptyGreen<'db>) -> Self {
40640        Self(value.0)
40641    }
40642}
40643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40644pub struct TokenNodeGreen<'db>(pub GreenId<'db>);
40645impl<'db> TypedSyntaxNode<'db> for TokenNode<'db> {
40646    const OPTIONAL_KIND: Option<SyntaxKind> = None;
40647    type StablePtr = TokenNodePtr<'db>;
40648    type Green = TokenNodeGreen<'db>;
40649    fn missing(db: &'db dyn Database) -> Self::Green {
40650        panic!("No missing variant.");
40651    }
40652    fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40653        let kind = node.kind(db);
40654        match kind {
40655            SyntaxKind::TerminalIdentifier => {
40656                TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
40657            }
40658            SyntaxKind::TerminalLiteralNumber => {
40659                TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
40660            }
40661            SyntaxKind::TerminalShortString => {
40662                TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
40663            }
40664            SyntaxKind::TerminalString => {
40665                TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
40666            }
40667            SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
40668            SyntaxKind::TerminalConst => {
40669                TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
40670            }
40671            SyntaxKind::TerminalElse => {
40672                TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
40673            }
40674            SyntaxKind::TerminalEnum => {
40675                TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
40676            }
40677            SyntaxKind::TerminalExtern => {
40678                TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
40679            }
40680            SyntaxKind::TerminalFalse => {
40681                TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
40682            }
40683            SyntaxKind::TerminalFunction => {
40684                TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
40685            }
40686            SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
40687            SyntaxKind::TerminalWhile => {
40688                TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
40689            }
40690            SyntaxKind::TerminalFor => {
40691                TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
40692            }
40693            SyntaxKind::TerminalLoop => {
40694                TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
40695            }
40696            SyntaxKind::TerminalImpl => {
40697                TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
40698            }
40699            SyntaxKind::TerminalImplicits => {
40700                TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
40701            }
40702            SyntaxKind::TerminalLet => {
40703                TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
40704            }
40705            SyntaxKind::TerminalMacro => {
40706                TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
40707            }
40708            SyntaxKind::TerminalMatch => {
40709                TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
40710            }
40711            SyntaxKind::TerminalModule => {
40712                TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
40713            }
40714            SyntaxKind::TerminalMut => {
40715                TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
40716            }
40717            SyntaxKind::TerminalNoPanic => {
40718                TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
40719            }
40720            SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
40721            SyntaxKind::TerminalRef => {
40722                TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
40723            }
40724            SyntaxKind::TerminalContinue => {
40725                TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
40726            }
40727            SyntaxKind::TerminalReturn => {
40728                TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
40729            }
40730            SyntaxKind::TerminalBreak => {
40731                TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
40732            }
40733            SyntaxKind::TerminalStruct => {
40734                TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
40735            }
40736            SyntaxKind::TerminalTrait => {
40737                TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
40738            }
40739            SyntaxKind::TerminalTrue => {
40740                TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
40741            }
40742            SyntaxKind::TerminalType => {
40743                TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
40744            }
40745            SyntaxKind::TerminalUse => {
40746                TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
40747            }
40748            SyntaxKind::TerminalPub => {
40749                TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
40750            }
40751            SyntaxKind::TerminalAnd => {
40752                TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
40753            }
40754            SyntaxKind::TerminalAndAnd => {
40755                TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
40756            }
40757            SyntaxKind::TerminalArrow => {
40758                TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
40759            }
40760            SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
40761            SyntaxKind::TerminalBadCharacters => {
40762                TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
40763            }
40764            SyntaxKind::TerminalColon => {
40765                TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
40766            }
40767            SyntaxKind::TerminalColonColon => {
40768                TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
40769            }
40770            SyntaxKind::TerminalComma => {
40771                TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
40772            }
40773            SyntaxKind::TerminalDiv => {
40774                TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
40775            }
40776            SyntaxKind::TerminalDivEq => {
40777                TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
40778            }
40779            SyntaxKind::TerminalDollar => {
40780                TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
40781            }
40782            SyntaxKind::TerminalDot => {
40783                TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
40784            }
40785            SyntaxKind::TerminalDotDot => {
40786                TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
40787            }
40788            SyntaxKind::TerminalDotDotEq => {
40789                TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
40790            }
40791            SyntaxKind::TerminalEndOfFile => {
40792                TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
40793            }
40794            SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
40795            SyntaxKind::TerminalEqEq => {
40796                TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
40797            }
40798            SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
40799            SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
40800            SyntaxKind::TerminalHash => {
40801                TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
40802            }
40803            SyntaxKind::TerminalLBrace => {
40804                TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
40805            }
40806            SyntaxKind::TerminalLBrack => {
40807                TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
40808            }
40809            SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
40810            SyntaxKind::TerminalLParen => {
40811                TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
40812            }
40813            SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
40814            SyntaxKind::TerminalMatchArrow => {
40815                TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
40816            }
40817            SyntaxKind::TerminalMinus => {
40818                TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
40819            }
40820            SyntaxKind::TerminalMinusEq => {
40821                TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
40822            }
40823            SyntaxKind::TerminalMod => {
40824                TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
40825            }
40826            SyntaxKind::TerminalModEq => {
40827                TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
40828            }
40829            SyntaxKind::TerminalMul => {
40830                TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
40831            }
40832            SyntaxKind::TerminalMulEq => {
40833                TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
40834            }
40835            SyntaxKind::TerminalNeq => {
40836                TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
40837            }
40838            SyntaxKind::TerminalNot => {
40839                TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
40840            }
40841            SyntaxKind::TerminalBitNot => {
40842                TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
40843            }
40844            SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
40845            SyntaxKind::TerminalOrOr => {
40846                TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
40847            }
40848            SyntaxKind::TerminalPlus => {
40849                TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
40850            }
40851            SyntaxKind::TerminalPlusEq => {
40852                TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
40853            }
40854            SyntaxKind::TerminalQuestionMark => {
40855                TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
40856            }
40857            SyntaxKind::TerminalRBrace => {
40858                TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
40859            }
40860            SyntaxKind::TerminalRBrack => {
40861                TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
40862            }
40863            SyntaxKind::TerminalRParen => {
40864                TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
40865            }
40866            SyntaxKind::TerminalSemicolon => {
40867                TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
40868            }
40869            SyntaxKind::TerminalUnderscore => {
40870                TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
40871            }
40872            SyntaxKind::TerminalXor => {
40873                TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
40874            }
40875            SyntaxKind::TerminalEmpty => {
40876                TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
40877            }
40878            _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
40879        }
40880    }
40881    fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
40882        let kind = node.kind(db);
40883        match kind {
40884            SyntaxKind::TerminalIdentifier => {
40885                Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
40886            }
40887            SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
40888                TerminalLiteralNumber::from_syntax_node(db, node),
40889            )),
40890            SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
40891                TerminalShortString::from_syntax_node(db, node),
40892            )),
40893            SyntaxKind::TerminalString => {
40894                Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
40895            }
40896            SyntaxKind::TerminalAs => {
40897                Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
40898            }
40899            SyntaxKind::TerminalConst => {
40900                Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
40901            }
40902            SyntaxKind::TerminalElse => {
40903                Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
40904            }
40905            SyntaxKind::TerminalEnum => {
40906                Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
40907            }
40908            SyntaxKind::TerminalExtern => {
40909                Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
40910            }
40911            SyntaxKind::TerminalFalse => {
40912                Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
40913            }
40914            SyntaxKind::TerminalFunction => {
40915                Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
40916            }
40917            SyntaxKind::TerminalIf => {
40918                Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
40919            }
40920            SyntaxKind::TerminalWhile => {
40921                Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
40922            }
40923            SyntaxKind::TerminalFor => {
40924                Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
40925            }
40926            SyntaxKind::TerminalLoop => {
40927                Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
40928            }
40929            SyntaxKind::TerminalImpl => {
40930                Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
40931            }
40932            SyntaxKind::TerminalImplicits => {
40933                Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
40934            }
40935            SyntaxKind::TerminalLet => {
40936                Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
40937            }
40938            SyntaxKind::TerminalMacro => {
40939                Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
40940            }
40941            SyntaxKind::TerminalMatch => {
40942                Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
40943            }
40944            SyntaxKind::TerminalModule => {
40945                Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
40946            }
40947            SyntaxKind::TerminalMut => {
40948                Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
40949            }
40950            SyntaxKind::TerminalNoPanic => {
40951                Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
40952            }
40953            SyntaxKind::TerminalOf => {
40954                Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
40955            }
40956            SyntaxKind::TerminalRef => {
40957                Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
40958            }
40959            SyntaxKind::TerminalContinue => {
40960                Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
40961            }
40962            SyntaxKind::TerminalReturn => {
40963                Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
40964            }
40965            SyntaxKind::TerminalBreak => {
40966                Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
40967            }
40968            SyntaxKind::TerminalStruct => {
40969                Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
40970            }
40971            SyntaxKind::TerminalTrait => {
40972                Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
40973            }
40974            SyntaxKind::TerminalTrue => {
40975                Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
40976            }
40977            SyntaxKind::TerminalType => {
40978                Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
40979            }
40980            SyntaxKind::TerminalUse => {
40981                Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
40982            }
40983            SyntaxKind::TerminalPub => {
40984                Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
40985            }
40986            SyntaxKind::TerminalAnd => {
40987                Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
40988            }
40989            SyntaxKind::TerminalAndAnd => {
40990                Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
40991            }
40992            SyntaxKind::TerminalArrow => {
40993                Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
40994            }
40995            SyntaxKind::TerminalAt => {
40996                Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
40997            }
40998            SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
40999                TerminalBadCharacters::from_syntax_node(db, node),
41000            )),
41001            SyntaxKind::TerminalColon => {
41002                Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
41003            }
41004            SyntaxKind::TerminalColonColon => {
41005                Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
41006            }
41007            SyntaxKind::TerminalComma => {
41008                Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
41009            }
41010            SyntaxKind::TerminalDiv => {
41011                Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
41012            }
41013            SyntaxKind::TerminalDivEq => {
41014                Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
41015            }
41016            SyntaxKind::TerminalDollar => {
41017                Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
41018            }
41019            SyntaxKind::TerminalDot => {
41020                Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
41021            }
41022            SyntaxKind::TerminalDotDot => {
41023                Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
41024            }
41025            SyntaxKind::TerminalDotDotEq => {
41026                Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
41027            }
41028            SyntaxKind::TerminalEndOfFile => {
41029                Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
41030            }
41031            SyntaxKind::TerminalEq => {
41032                Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
41033            }
41034            SyntaxKind::TerminalEqEq => {
41035                Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
41036            }
41037            SyntaxKind::TerminalGE => {
41038                Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
41039            }
41040            SyntaxKind::TerminalGT => {
41041                Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
41042            }
41043            SyntaxKind::TerminalHash => {
41044                Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
41045            }
41046            SyntaxKind::TerminalLBrace => {
41047                Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
41048            }
41049            SyntaxKind::TerminalLBrack => {
41050                Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
41051            }
41052            SyntaxKind::TerminalLE => {
41053                Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
41054            }
41055            SyntaxKind::TerminalLParen => {
41056                Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
41057            }
41058            SyntaxKind::TerminalLT => {
41059                Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
41060            }
41061            SyntaxKind::TerminalMatchArrow => {
41062                Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
41063            }
41064            SyntaxKind::TerminalMinus => {
41065                Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
41066            }
41067            SyntaxKind::TerminalMinusEq => {
41068                Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
41069            }
41070            SyntaxKind::TerminalMod => {
41071                Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
41072            }
41073            SyntaxKind::TerminalModEq => {
41074                Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
41075            }
41076            SyntaxKind::TerminalMul => {
41077                Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
41078            }
41079            SyntaxKind::TerminalMulEq => {
41080                Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
41081            }
41082            SyntaxKind::TerminalNeq => {
41083                Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
41084            }
41085            SyntaxKind::TerminalNot => {
41086                Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
41087            }
41088            SyntaxKind::TerminalBitNot => {
41089                Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
41090            }
41091            SyntaxKind::TerminalOr => {
41092                Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
41093            }
41094            SyntaxKind::TerminalOrOr => {
41095                Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
41096            }
41097            SyntaxKind::TerminalPlus => {
41098                Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
41099            }
41100            SyntaxKind::TerminalPlusEq => {
41101                Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
41102            }
41103            SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
41104                TerminalQuestionMark::from_syntax_node(db, node),
41105            )),
41106            SyntaxKind::TerminalRBrace => {
41107                Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
41108            }
41109            SyntaxKind::TerminalRBrack => {
41110                Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
41111            }
41112            SyntaxKind::TerminalRParen => {
41113                Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
41114            }
41115            SyntaxKind::TerminalSemicolon => {
41116                Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
41117            }
41118            SyntaxKind::TerminalUnderscore => {
41119                Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
41120            }
41121            SyntaxKind::TerminalXor => {
41122                Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
41123            }
41124            SyntaxKind::TerminalEmpty => {
41125                Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
41126            }
41127            _ => None,
41128        }
41129    }
41130    fn as_syntax_node(&self) -> SyntaxNode<'db> {
41131        match self {
41132            TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
41133            TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
41134            TokenNode::TerminalShortString(x) => x.as_syntax_node(),
41135            TokenNode::TerminalString(x) => x.as_syntax_node(),
41136            TokenNode::TerminalAs(x) => x.as_syntax_node(),
41137            TokenNode::TerminalConst(x) => x.as_syntax_node(),
41138            TokenNode::TerminalElse(x) => x.as_syntax_node(),
41139            TokenNode::TerminalEnum(x) => x.as_syntax_node(),
41140            TokenNode::TerminalExtern(x) => x.as_syntax_node(),
41141            TokenNode::TerminalFalse(x) => x.as_syntax_node(),
41142            TokenNode::TerminalFunction(x) => x.as_syntax_node(),
41143            TokenNode::TerminalIf(x) => x.as_syntax_node(),
41144            TokenNode::TerminalWhile(x) => x.as_syntax_node(),
41145            TokenNode::TerminalFor(x) => x.as_syntax_node(),
41146            TokenNode::TerminalLoop(x) => x.as_syntax_node(),
41147            TokenNode::TerminalImpl(x) => x.as_syntax_node(),
41148            TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
41149            TokenNode::TerminalLet(x) => x.as_syntax_node(),
41150            TokenNode::TerminalMacro(x) => x.as_syntax_node(),
41151            TokenNode::TerminalMatch(x) => x.as_syntax_node(),
41152            TokenNode::TerminalModule(x) => x.as_syntax_node(),
41153            TokenNode::TerminalMut(x) => x.as_syntax_node(),
41154            TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
41155            TokenNode::TerminalOf(x) => x.as_syntax_node(),
41156            TokenNode::TerminalRef(x) => x.as_syntax_node(),
41157            TokenNode::TerminalContinue(x) => x.as_syntax_node(),
41158            TokenNode::TerminalReturn(x) => x.as_syntax_node(),
41159            TokenNode::TerminalBreak(x) => x.as_syntax_node(),
41160            TokenNode::TerminalStruct(x) => x.as_syntax_node(),
41161            TokenNode::TerminalTrait(x) => x.as_syntax_node(),
41162            TokenNode::TerminalTrue(x) => x.as_syntax_node(),
41163            TokenNode::TerminalType(x) => x.as_syntax_node(),
41164            TokenNode::TerminalUse(x) => x.as_syntax_node(),
41165            TokenNode::TerminalPub(x) => x.as_syntax_node(),
41166            TokenNode::TerminalAnd(x) => x.as_syntax_node(),
41167            TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
41168            TokenNode::TerminalArrow(x) => x.as_syntax_node(),
41169            TokenNode::TerminalAt(x) => x.as_syntax_node(),
41170            TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
41171            TokenNode::TerminalColon(x) => x.as_syntax_node(),
41172            TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
41173            TokenNode::TerminalComma(x) => x.as_syntax_node(),
41174            TokenNode::TerminalDiv(x) => x.as_syntax_node(),
41175            TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
41176            TokenNode::TerminalDollar(x) => x.as_syntax_node(),
41177            TokenNode::TerminalDot(x) => x.as_syntax_node(),
41178            TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
41179            TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
41180            TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
41181            TokenNode::TerminalEq(x) => x.as_syntax_node(),
41182            TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
41183            TokenNode::TerminalGE(x) => x.as_syntax_node(),
41184            TokenNode::TerminalGT(x) => x.as_syntax_node(),
41185            TokenNode::TerminalHash(x) => x.as_syntax_node(),
41186            TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
41187            TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
41188            TokenNode::TerminalLE(x) => x.as_syntax_node(),
41189            TokenNode::TerminalLParen(x) => x.as_syntax_node(),
41190            TokenNode::TerminalLT(x) => x.as_syntax_node(),
41191            TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
41192            TokenNode::TerminalMinus(x) => x.as_syntax_node(),
41193            TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
41194            TokenNode::TerminalMod(x) => x.as_syntax_node(),
41195            TokenNode::TerminalModEq(x) => x.as_syntax_node(),
41196            TokenNode::TerminalMul(x) => x.as_syntax_node(),
41197            TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
41198            TokenNode::TerminalNeq(x) => x.as_syntax_node(),
41199            TokenNode::TerminalNot(x) => x.as_syntax_node(),
41200            TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
41201            TokenNode::TerminalOr(x) => x.as_syntax_node(),
41202            TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
41203            TokenNode::TerminalPlus(x) => x.as_syntax_node(),
41204            TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
41205            TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
41206            TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
41207            TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
41208            TokenNode::TerminalRParen(x) => x.as_syntax_node(),
41209            TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
41210            TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
41211            TokenNode::TerminalXor(x) => x.as_syntax_node(),
41212            TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
41213        }
41214    }
41215    fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
41216        TokenNodePtr(self.as_syntax_node().stable_ptr(db))
41217    }
41218}
41219impl<'db> TokenNode<'db> {
41220    /// Checks if a kind of a variant of [TokenNode].
41221    pub fn is_variant(kind: SyntaxKind) -> bool {
41222        matches!(
41223            kind,
41224            SyntaxKind::TerminalIdentifier
41225                | SyntaxKind::TerminalLiteralNumber
41226                | SyntaxKind::TerminalShortString
41227                | SyntaxKind::TerminalString
41228                | SyntaxKind::TerminalAs
41229                | SyntaxKind::TerminalConst
41230                | SyntaxKind::TerminalElse
41231                | SyntaxKind::TerminalEnum
41232                | SyntaxKind::TerminalExtern
41233                | SyntaxKind::TerminalFalse
41234                | SyntaxKind::TerminalFunction
41235                | SyntaxKind::TerminalIf
41236                | SyntaxKind::TerminalWhile
41237                | SyntaxKind::TerminalFor
41238                | SyntaxKind::TerminalLoop
41239                | SyntaxKind::TerminalImpl
41240                | SyntaxKind::TerminalImplicits
41241                | SyntaxKind::TerminalLet
41242                | SyntaxKind::TerminalMacro
41243                | SyntaxKind::TerminalMatch
41244                | SyntaxKind::TerminalModule
41245                | SyntaxKind::TerminalMut
41246                | SyntaxKind::TerminalNoPanic
41247                | SyntaxKind::TerminalOf
41248                | SyntaxKind::TerminalRef
41249                | SyntaxKind::TerminalContinue
41250                | SyntaxKind::TerminalReturn
41251                | SyntaxKind::TerminalBreak
41252                | SyntaxKind::TerminalStruct
41253                | SyntaxKind::TerminalTrait
41254                | SyntaxKind::TerminalTrue
41255                | SyntaxKind::TerminalType
41256                | SyntaxKind::TerminalUse
41257                | SyntaxKind::TerminalPub
41258                | SyntaxKind::TerminalAnd
41259                | SyntaxKind::TerminalAndAnd
41260                | SyntaxKind::TerminalArrow
41261                | SyntaxKind::TerminalAt
41262                | SyntaxKind::TerminalBadCharacters
41263                | SyntaxKind::TerminalColon
41264                | SyntaxKind::TerminalColonColon
41265                | SyntaxKind::TerminalComma
41266                | SyntaxKind::TerminalDiv
41267                | SyntaxKind::TerminalDivEq
41268                | SyntaxKind::TerminalDollar
41269                | SyntaxKind::TerminalDot
41270                | SyntaxKind::TerminalDotDot
41271                | SyntaxKind::TerminalDotDotEq
41272                | SyntaxKind::TerminalEndOfFile
41273                | SyntaxKind::TerminalEq
41274                | SyntaxKind::TerminalEqEq
41275                | SyntaxKind::TerminalGE
41276                | SyntaxKind::TerminalGT
41277                | SyntaxKind::TerminalHash
41278                | SyntaxKind::TerminalLBrace
41279                | SyntaxKind::TerminalLBrack
41280                | SyntaxKind::TerminalLE
41281                | SyntaxKind::TerminalLParen
41282                | SyntaxKind::TerminalLT
41283                | SyntaxKind::TerminalMatchArrow
41284                | SyntaxKind::TerminalMinus
41285                | SyntaxKind::TerminalMinusEq
41286                | SyntaxKind::TerminalMod
41287                | SyntaxKind::TerminalModEq
41288                | SyntaxKind::TerminalMul
41289                | SyntaxKind::TerminalMulEq
41290                | SyntaxKind::TerminalNeq
41291                | SyntaxKind::TerminalNot
41292                | SyntaxKind::TerminalBitNot
41293                | SyntaxKind::TerminalOr
41294                | SyntaxKind::TerminalOrOr
41295                | SyntaxKind::TerminalPlus
41296                | SyntaxKind::TerminalPlusEq
41297                | SyntaxKind::TerminalQuestionMark
41298                | SyntaxKind::TerminalRBrace
41299                | SyntaxKind::TerminalRBrack
41300                | SyntaxKind::TerminalRParen
41301                | SyntaxKind::TerminalSemicolon
41302                | SyntaxKind::TerminalUnderscore
41303                | SyntaxKind::TerminalXor
41304                | SyntaxKind::TerminalEmpty
41305        )
41306    }
41307}