1#![allow(clippy::match_single_binding)]
3#![allow(clippy::too_many_arguments)]
4#![allow(dead_code)]
5#![allow(unused_variables)]
6use std::ops::Deref;
7
8use cairo_lang_filesystem::ids::SmolStrId;
9use cairo_lang_filesystem::span::TextWidth;
10use cairo_lang_utils::{Intern, extract_matches};
11use salsa::Database;
12
13use super::element_list::ElementList;
14use super::green::GreenNodeDetails;
15use super::kind::SyntaxKind;
16use super::{
17 GreenId, GreenNode, SyntaxNode, SyntaxStablePtrId, Terminal, Token, TypedStablePtr,
18 TypedSyntaxNode,
19};
20#[path = "ast_ext.rs"]
21mod ast_ext;
22#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23pub struct Trivia<'db>(ElementList<'db, Trivium<'db>, 1>);
24impl<'db> Deref for Trivia<'db> {
25 type Target = ElementList<'db, Trivium<'db>, 1>;
26 fn deref(&self) -> &Self::Target {
27 &self.0
28 }
29}
30impl<'db> Trivia<'db> {
31 pub fn new_green(db: &'db dyn Database, children: &[TriviumGreen<'db>]) -> TriviaGreen<'db> {
32 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
33 TriviaGreen(
34 GreenNode {
35 kind: SyntaxKind::Trivia,
36 details: GreenNodeDetails::Node {
37 children: children.iter().map(|x| x.0).collect(),
38 width,
39 },
40 }
41 .intern(db),
42 )
43 }
44}
45#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
46pub struct TriviaPtr<'db>(pub SyntaxStablePtrId<'db>);
47impl<'db> TypedStablePtr<'db> for TriviaPtr<'db> {
48 type SyntaxNode = Trivia<'db>;
49 fn untyped(self) -> SyntaxStablePtrId<'db> {
50 self.0
51 }
52 fn lookup(&self, db: &'db dyn Database) -> Trivia<'db> {
53 Trivia::from_syntax_node(db, self.0.lookup(db))
54 }
55}
56impl<'db> From<TriviaPtr<'db>> for SyntaxStablePtrId<'db> {
57 fn from(ptr: TriviaPtr<'db>) -> Self {
58 ptr.untyped()
59 }
60}
61#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
62pub struct TriviaGreen<'db>(pub GreenId<'db>);
63impl<'db> TypedSyntaxNode<'db> for Trivia<'db> {
64 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Trivia);
65 type StablePtr = TriviaPtr<'db>;
66 type Green = TriviaGreen<'db>;
67 fn missing(db: &'db dyn Database) -> Self::Green {
68 TriviaGreen(
69 GreenNode {
70 kind: SyntaxKind::Trivia,
71 details: GreenNodeDetails::Node {
72 children: [].into(),
73 width: TextWidth::default(),
74 },
75 }
76 .intern(db),
77 )
78 }
79 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
80 Self(ElementList::new(node))
81 }
82 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
83 if node.kind(db) == SyntaxKind::Trivia { Some(Self(ElementList::new(node))) } else { None }
84 }
85 fn as_syntax_node(&self) -> SyntaxNode<'db> {
86 self.node
87 }
88 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
89 TriviaPtr(self.node.stable_ptr(db))
90 }
91}
92#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
93pub enum Trivium<'db> {
94 SingleLineComment(TokenSingleLineComment<'db>),
95 SingleLineDocComment(TokenSingleLineDocComment<'db>),
96 SingleLineInnerComment(TokenSingleLineInnerComment<'db>),
97 Whitespace(TokenWhitespace<'db>),
98 Newline(TokenNewline<'db>),
99 Skipped(TokenSkipped<'db>),
100 SkippedNode(TriviumSkippedNode<'db>),
101}
102#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
103pub struct TriviumPtr<'db>(pub SyntaxStablePtrId<'db>);
104impl<'db> TypedStablePtr<'db> for TriviumPtr<'db> {
105 type SyntaxNode = Trivium<'db>;
106 fn untyped(self) -> SyntaxStablePtrId<'db> {
107 self.0
108 }
109 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
110 Trivium::from_syntax_node(db, self.0.lookup(db))
111 }
112}
113impl<'db> From<TriviumPtr<'db>> for SyntaxStablePtrId<'db> {
114 fn from(ptr: TriviumPtr<'db>) -> Self {
115 ptr.untyped()
116 }
117}
118impl<'db> From<TokenSingleLineCommentPtr<'db>> for TriviumPtr<'db> {
119 fn from(value: TokenSingleLineCommentPtr<'db>) -> Self {
120 Self(value.0)
121 }
122}
123impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for TriviumPtr<'db> {
124 fn from(value: TokenSingleLineDocCommentPtr<'db>) -> Self {
125 Self(value.0)
126 }
127}
128impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for TriviumPtr<'db> {
129 fn from(value: TokenSingleLineInnerCommentPtr<'db>) -> Self {
130 Self(value.0)
131 }
132}
133impl<'db> From<TokenWhitespacePtr<'db>> for TriviumPtr<'db> {
134 fn from(value: TokenWhitespacePtr<'db>) -> Self {
135 Self(value.0)
136 }
137}
138impl<'db> From<TokenNewlinePtr<'db>> for TriviumPtr<'db> {
139 fn from(value: TokenNewlinePtr<'db>) -> Self {
140 Self(value.0)
141 }
142}
143impl<'db> From<TokenSkippedPtr<'db>> for TriviumPtr<'db> {
144 fn from(value: TokenSkippedPtr<'db>) -> Self {
145 Self(value.0)
146 }
147}
148impl<'db> From<TriviumSkippedNodePtr<'db>> for TriviumPtr<'db> {
149 fn from(value: TriviumSkippedNodePtr<'db>) -> Self {
150 Self(value.0)
151 }
152}
153impl<'db> From<TokenSingleLineCommentGreen<'db>> for TriviumGreen<'db> {
154 fn from(value: TokenSingleLineCommentGreen<'db>) -> Self {
155 Self(value.0)
156 }
157}
158impl<'db> From<TokenSingleLineDocCommentGreen<'db>> for TriviumGreen<'db> {
159 fn from(value: TokenSingleLineDocCommentGreen<'db>) -> Self {
160 Self(value.0)
161 }
162}
163impl<'db> From<TokenSingleLineInnerCommentGreen<'db>> for TriviumGreen<'db> {
164 fn from(value: TokenSingleLineInnerCommentGreen<'db>) -> Self {
165 Self(value.0)
166 }
167}
168impl<'db> From<TokenWhitespaceGreen<'db>> for TriviumGreen<'db> {
169 fn from(value: TokenWhitespaceGreen<'db>) -> Self {
170 Self(value.0)
171 }
172}
173impl<'db> From<TokenNewlineGreen<'db>> for TriviumGreen<'db> {
174 fn from(value: TokenNewlineGreen<'db>) -> Self {
175 Self(value.0)
176 }
177}
178impl<'db> From<TokenSkippedGreen<'db>> for TriviumGreen<'db> {
179 fn from(value: TokenSkippedGreen<'db>) -> Self {
180 Self(value.0)
181 }
182}
183impl<'db> From<TriviumSkippedNodeGreen<'db>> for TriviumGreen<'db> {
184 fn from(value: TriviumSkippedNodeGreen<'db>) -> Self {
185 Self(value.0)
186 }
187}
188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
189pub struct TriviumGreen<'db>(pub GreenId<'db>);
190impl<'db> TypedSyntaxNode<'db> for Trivium<'db> {
191 const OPTIONAL_KIND: Option<SyntaxKind> = None;
192 type StablePtr = TriviumPtr<'db>;
193 type Green = TriviumGreen<'db>;
194 fn missing(db: &'db dyn Database) -> Self::Green {
195 panic!("No missing variant.");
196 }
197 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
198 let kind = node.kind(db);
199 match kind {
200 SyntaxKind::TokenSingleLineComment => {
201 Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node))
202 }
203 SyntaxKind::TokenSingleLineDocComment => {
204 Trivium::SingleLineDocComment(TokenSingleLineDocComment::from_syntax_node(db, node))
205 }
206 SyntaxKind::TokenSingleLineInnerComment => Trivium::SingleLineInnerComment(
207 TokenSingleLineInnerComment::from_syntax_node(db, node),
208 ),
209 SyntaxKind::TokenWhitespace => {
210 Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node))
211 }
212 SyntaxKind::TokenNewline => Trivium::Newline(TokenNewline::from_syntax_node(db, node)),
213 SyntaxKind::TokenSkipped => Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)),
214 SyntaxKind::TriviumSkippedNode => {
215 Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node))
216 }
217 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Trivium"),
218 }
219 }
220 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
221 let kind = node.kind(db);
222 match kind {
223 SyntaxKind::TokenSingleLineComment => {
224 Some(Trivium::SingleLineComment(TokenSingleLineComment::from_syntax_node(db, node)))
225 }
226 SyntaxKind::TokenSingleLineDocComment => Some(Trivium::SingleLineDocComment(
227 TokenSingleLineDocComment::from_syntax_node(db, node),
228 )),
229 SyntaxKind::TokenSingleLineInnerComment => Some(Trivium::SingleLineInnerComment(
230 TokenSingleLineInnerComment::from_syntax_node(db, node),
231 )),
232 SyntaxKind::TokenWhitespace => {
233 Some(Trivium::Whitespace(TokenWhitespace::from_syntax_node(db, node)))
234 }
235 SyntaxKind::TokenNewline => {
236 Some(Trivium::Newline(TokenNewline::from_syntax_node(db, node)))
237 }
238 SyntaxKind::TokenSkipped => {
239 Some(Trivium::Skipped(TokenSkipped::from_syntax_node(db, node)))
240 }
241 SyntaxKind::TriviumSkippedNode => {
242 Some(Trivium::SkippedNode(TriviumSkippedNode::from_syntax_node(db, node)))
243 }
244 _ => None,
245 }
246 }
247 fn as_syntax_node(&self) -> SyntaxNode<'db> {
248 match self {
249 Trivium::SingleLineComment(x) => x.as_syntax_node(),
250 Trivium::SingleLineDocComment(x) => x.as_syntax_node(),
251 Trivium::SingleLineInnerComment(x) => x.as_syntax_node(),
252 Trivium::Whitespace(x) => x.as_syntax_node(),
253 Trivium::Newline(x) => x.as_syntax_node(),
254 Trivium::Skipped(x) => x.as_syntax_node(),
255 Trivium::SkippedNode(x) => x.as_syntax_node(),
256 }
257 }
258 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
259 TriviumPtr(self.as_syntax_node().stable_ptr(db))
260 }
261}
262impl<'db> Trivium<'db> {
263 pub fn is_variant(kind: SyntaxKind) -> bool {
265 matches!(
266 kind,
267 SyntaxKind::TokenSingleLineComment
268 | SyntaxKind::TokenSingleLineDocComment
269 | SyntaxKind::TokenSingleLineInnerComment
270 | SyntaxKind::TokenWhitespace
271 | SyntaxKind::TokenNewline
272 | SyntaxKind::TokenSkipped
273 | SyntaxKind::TriviumSkippedNode
274 )
275 }
276}
277#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
278pub enum Expr<'db> {
279 Path(ExprPath<'db>),
280 Literal(TerminalLiteralNumber<'db>),
281 ShortString(TerminalShortString<'db>),
282 String(TerminalString<'db>),
283 False(TerminalFalse<'db>),
284 True(TerminalTrue<'db>),
285 Parenthesized(ExprParenthesized<'db>),
286 Unary(ExprUnary<'db>),
287 Binary(ExprBinary<'db>),
288 Tuple(ExprListParenthesized<'db>),
289 FunctionCall(ExprFunctionCall<'db>),
290 StructCtorCall(ExprStructCtorCall<'db>),
291 Block(ExprBlock<'db>),
292 Match(ExprMatch<'db>),
293 If(ExprIf<'db>),
294 Loop(ExprLoop<'db>),
295 While(ExprWhile<'db>),
296 For(ExprFor<'db>),
297 Closure(ExprClosure<'db>),
298 ErrorPropagate(ExprErrorPropagate<'db>),
299 FieldInitShorthand(ExprFieldInitShorthand<'db>),
300 Indexed(ExprIndexed<'db>),
301 InlineMacro(ExprInlineMacro<'db>),
302 FixedSizeArray(ExprFixedSizeArray<'db>),
303 Missing(ExprMissing<'db>),
304}
305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
306pub struct ExprPtr<'db>(pub SyntaxStablePtrId<'db>);
307impl<'db> TypedStablePtr<'db> for ExprPtr<'db> {
308 type SyntaxNode = Expr<'db>;
309 fn untyped(self) -> SyntaxStablePtrId<'db> {
310 self.0
311 }
312 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
313 Expr::from_syntax_node(db, self.0.lookup(db))
314 }
315}
316impl<'db> From<ExprPtr<'db>> for SyntaxStablePtrId<'db> {
317 fn from(ptr: ExprPtr<'db>) -> Self {
318 ptr.untyped()
319 }
320}
321impl<'db> From<ExprPathPtr<'db>> for ExprPtr<'db> {
322 fn from(value: ExprPathPtr<'db>) -> Self {
323 Self(value.0)
324 }
325}
326impl<'db> From<TerminalLiteralNumberPtr<'db>> for ExprPtr<'db> {
327 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
328 Self(value.0)
329 }
330}
331impl<'db> From<TerminalShortStringPtr<'db>> for ExprPtr<'db> {
332 fn from(value: TerminalShortStringPtr<'db>) -> Self {
333 Self(value.0)
334 }
335}
336impl<'db> From<TerminalStringPtr<'db>> for ExprPtr<'db> {
337 fn from(value: TerminalStringPtr<'db>) -> Self {
338 Self(value.0)
339 }
340}
341impl<'db> From<TerminalFalsePtr<'db>> for ExprPtr<'db> {
342 fn from(value: TerminalFalsePtr<'db>) -> Self {
343 Self(value.0)
344 }
345}
346impl<'db> From<TerminalTruePtr<'db>> for ExprPtr<'db> {
347 fn from(value: TerminalTruePtr<'db>) -> Self {
348 Self(value.0)
349 }
350}
351impl<'db> From<ExprParenthesizedPtr<'db>> for ExprPtr<'db> {
352 fn from(value: ExprParenthesizedPtr<'db>) -> Self {
353 Self(value.0)
354 }
355}
356impl<'db> From<ExprUnaryPtr<'db>> for ExprPtr<'db> {
357 fn from(value: ExprUnaryPtr<'db>) -> Self {
358 Self(value.0)
359 }
360}
361impl<'db> From<ExprBinaryPtr<'db>> for ExprPtr<'db> {
362 fn from(value: ExprBinaryPtr<'db>) -> Self {
363 Self(value.0)
364 }
365}
366impl<'db> From<ExprListParenthesizedPtr<'db>> for ExprPtr<'db> {
367 fn from(value: ExprListParenthesizedPtr<'db>) -> Self {
368 Self(value.0)
369 }
370}
371impl<'db> From<ExprFunctionCallPtr<'db>> for ExprPtr<'db> {
372 fn from(value: ExprFunctionCallPtr<'db>) -> Self {
373 Self(value.0)
374 }
375}
376impl<'db> From<ExprStructCtorCallPtr<'db>> for ExprPtr<'db> {
377 fn from(value: ExprStructCtorCallPtr<'db>) -> Self {
378 Self(value.0)
379 }
380}
381impl<'db> From<ExprBlockPtr<'db>> for ExprPtr<'db> {
382 fn from(value: ExprBlockPtr<'db>) -> Self {
383 Self(value.0)
384 }
385}
386impl<'db> From<ExprMatchPtr<'db>> for ExprPtr<'db> {
387 fn from(value: ExprMatchPtr<'db>) -> Self {
388 Self(value.0)
389 }
390}
391impl<'db> From<ExprIfPtr<'db>> for ExprPtr<'db> {
392 fn from(value: ExprIfPtr<'db>) -> Self {
393 Self(value.0)
394 }
395}
396impl<'db> From<ExprLoopPtr<'db>> for ExprPtr<'db> {
397 fn from(value: ExprLoopPtr<'db>) -> Self {
398 Self(value.0)
399 }
400}
401impl<'db> From<ExprWhilePtr<'db>> for ExprPtr<'db> {
402 fn from(value: ExprWhilePtr<'db>) -> Self {
403 Self(value.0)
404 }
405}
406impl<'db> From<ExprForPtr<'db>> for ExprPtr<'db> {
407 fn from(value: ExprForPtr<'db>) -> Self {
408 Self(value.0)
409 }
410}
411impl<'db> From<ExprClosurePtr<'db>> for ExprPtr<'db> {
412 fn from(value: ExprClosurePtr<'db>) -> Self {
413 Self(value.0)
414 }
415}
416impl<'db> From<ExprErrorPropagatePtr<'db>> for ExprPtr<'db> {
417 fn from(value: ExprErrorPropagatePtr<'db>) -> Self {
418 Self(value.0)
419 }
420}
421impl<'db> From<ExprFieldInitShorthandPtr<'db>> for ExprPtr<'db> {
422 fn from(value: ExprFieldInitShorthandPtr<'db>) -> Self {
423 Self(value.0)
424 }
425}
426impl<'db> From<ExprIndexedPtr<'db>> for ExprPtr<'db> {
427 fn from(value: ExprIndexedPtr<'db>) -> Self {
428 Self(value.0)
429 }
430}
431impl<'db> From<ExprInlineMacroPtr<'db>> for ExprPtr<'db> {
432 fn from(value: ExprInlineMacroPtr<'db>) -> Self {
433 Self(value.0)
434 }
435}
436impl<'db> From<ExprFixedSizeArrayPtr<'db>> for ExprPtr<'db> {
437 fn from(value: ExprFixedSizeArrayPtr<'db>) -> Self {
438 Self(value.0)
439 }
440}
441impl<'db> From<ExprMissingPtr<'db>> for ExprPtr<'db> {
442 fn from(value: ExprMissingPtr<'db>) -> Self {
443 Self(value.0)
444 }
445}
446impl<'db> From<ExprPathGreen<'db>> for ExprGreen<'db> {
447 fn from(value: ExprPathGreen<'db>) -> Self {
448 Self(value.0)
449 }
450}
451impl<'db> From<TerminalLiteralNumberGreen<'db>> for ExprGreen<'db> {
452 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
453 Self(value.0)
454 }
455}
456impl<'db> From<TerminalShortStringGreen<'db>> for ExprGreen<'db> {
457 fn from(value: TerminalShortStringGreen<'db>) -> Self {
458 Self(value.0)
459 }
460}
461impl<'db> From<TerminalStringGreen<'db>> for ExprGreen<'db> {
462 fn from(value: TerminalStringGreen<'db>) -> Self {
463 Self(value.0)
464 }
465}
466impl<'db> From<TerminalFalseGreen<'db>> for ExprGreen<'db> {
467 fn from(value: TerminalFalseGreen<'db>) -> Self {
468 Self(value.0)
469 }
470}
471impl<'db> From<TerminalTrueGreen<'db>> for ExprGreen<'db> {
472 fn from(value: TerminalTrueGreen<'db>) -> Self {
473 Self(value.0)
474 }
475}
476impl<'db> From<ExprParenthesizedGreen<'db>> for ExprGreen<'db> {
477 fn from(value: ExprParenthesizedGreen<'db>) -> Self {
478 Self(value.0)
479 }
480}
481impl<'db> From<ExprUnaryGreen<'db>> for ExprGreen<'db> {
482 fn from(value: ExprUnaryGreen<'db>) -> Self {
483 Self(value.0)
484 }
485}
486impl<'db> From<ExprBinaryGreen<'db>> for ExprGreen<'db> {
487 fn from(value: ExprBinaryGreen<'db>) -> Self {
488 Self(value.0)
489 }
490}
491impl<'db> From<ExprListParenthesizedGreen<'db>> for ExprGreen<'db> {
492 fn from(value: ExprListParenthesizedGreen<'db>) -> Self {
493 Self(value.0)
494 }
495}
496impl<'db> From<ExprFunctionCallGreen<'db>> for ExprGreen<'db> {
497 fn from(value: ExprFunctionCallGreen<'db>) -> Self {
498 Self(value.0)
499 }
500}
501impl<'db> From<ExprStructCtorCallGreen<'db>> for ExprGreen<'db> {
502 fn from(value: ExprStructCtorCallGreen<'db>) -> Self {
503 Self(value.0)
504 }
505}
506impl<'db> From<ExprBlockGreen<'db>> for ExprGreen<'db> {
507 fn from(value: ExprBlockGreen<'db>) -> Self {
508 Self(value.0)
509 }
510}
511impl<'db> From<ExprMatchGreen<'db>> for ExprGreen<'db> {
512 fn from(value: ExprMatchGreen<'db>) -> Self {
513 Self(value.0)
514 }
515}
516impl<'db> From<ExprIfGreen<'db>> for ExprGreen<'db> {
517 fn from(value: ExprIfGreen<'db>) -> Self {
518 Self(value.0)
519 }
520}
521impl<'db> From<ExprLoopGreen<'db>> for ExprGreen<'db> {
522 fn from(value: ExprLoopGreen<'db>) -> Self {
523 Self(value.0)
524 }
525}
526impl<'db> From<ExprWhileGreen<'db>> for ExprGreen<'db> {
527 fn from(value: ExprWhileGreen<'db>) -> Self {
528 Self(value.0)
529 }
530}
531impl<'db> From<ExprForGreen<'db>> for ExprGreen<'db> {
532 fn from(value: ExprForGreen<'db>) -> Self {
533 Self(value.0)
534 }
535}
536impl<'db> From<ExprClosureGreen<'db>> for ExprGreen<'db> {
537 fn from(value: ExprClosureGreen<'db>) -> Self {
538 Self(value.0)
539 }
540}
541impl<'db> From<ExprErrorPropagateGreen<'db>> for ExprGreen<'db> {
542 fn from(value: ExprErrorPropagateGreen<'db>) -> Self {
543 Self(value.0)
544 }
545}
546impl<'db> From<ExprFieldInitShorthandGreen<'db>> for ExprGreen<'db> {
547 fn from(value: ExprFieldInitShorthandGreen<'db>) -> Self {
548 Self(value.0)
549 }
550}
551impl<'db> From<ExprIndexedGreen<'db>> for ExprGreen<'db> {
552 fn from(value: ExprIndexedGreen<'db>) -> Self {
553 Self(value.0)
554 }
555}
556impl<'db> From<ExprInlineMacroGreen<'db>> for ExprGreen<'db> {
557 fn from(value: ExprInlineMacroGreen<'db>) -> Self {
558 Self(value.0)
559 }
560}
561impl<'db> From<ExprFixedSizeArrayGreen<'db>> for ExprGreen<'db> {
562 fn from(value: ExprFixedSizeArrayGreen<'db>) -> Self {
563 Self(value.0)
564 }
565}
566impl<'db> From<ExprMissingGreen<'db>> for ExprGreen<'db> {
567 fn from(value: ExprMissingGreen<'db>) -> Self {
568 Self(value.0)
569 }
570}
571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
572pub struct ExprGreen<'db>(pub GreenId<'db>);
573impl<'db> TypedSyntaxNode<'db> for Expr<'db> {
574 const OPTIONAL_KIND: Option<SyntaxKind> = None;
575 type StablePtr = ExprPtr<'db>;
576 type Green = ExprGreen<'db>;
577 fn missing(db: &'db dyn Database) -> Self::Green {
578 ExprGreen(ExprMissing::missing(db).0)
579 }
580 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
581 let kind = node.kind(db);
582 match kind {
583 SyntaxKind::ExprPath => Expr::Path(ExprPath::from_syntax_node(db, node)),
584 SyntaxKind::TerminalLiteralNumber => {
585 Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
586 }
587 SyntaxKind::TerminalShortString => {
588 Expr::ShortString(TerminalShortString::from_syntax_node(db, node))
589 }
590 SyntaxKind::TerminalString => Expr::String(TerminalString::from_syntax_node(db, node)),
591 SyntaxKind::TerminalFalse => Expr::False(TerminalFalse::from_syntax_node(db, node)),
592 SyntaxKind::TerminalTrue => Expr::True(TerminalTrue::from_syntax_node(db, node)),
593 SyntaxKind::ExprParenthesized => {
594 Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node))
595 }
596 SyntaxKind::ExprUnary => Expr::Unary(ExprUnary::from_syntax_node(db, node)),
597 SyntaxKind::ExprBinary => Expr::Binary(ExprBinary::from_syntax_node(db, node)),
598 SyntaxKind::ExprListParenthesized => {
599 Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node))
600 }
601 SyntaxKind::ExprFunctionCall => {
602 Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node))
603 }
604 SyntaxKind::ExprStructCtorCall => {
605 Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node))
606 }
607 SyntaxKind::ExprBlock => Expr::Block(ExprBlock::from_syntax_node(db, node)),
608 SyntaxKind::ExprMatch => Expr::Match(ExprMatch::from_syntax_node(db, node)),
609 SyntaxKind::ExprIf => Expr::If(ExprIf::from_syntax_node(db, node)),
610 SyntaxKind::ExprLoop => Expr::Loop(ExprLoop::from_syntax_node(db, node)),
611 SyntaxKind::ExprWhile => Expr::While(ExprWhile::from_syntax_node(db, node)),
612 SyntaxKind::ExprFor => Expr::For(ExprFor::from_syntax_node(db, node)),
613 SyntaxKind::ExprClosure => Expr::Closure(ExprClosure::from_syntax_node(db, node)),
614 SyntaxKind::ExprErrorPropagate => {
615 Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node))
616 }
617 SyntaxKind::ExprFieldInitShorthand => {
618 Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node))
619 }
620 SyntaxKind::ExprIndexed => Expr::Indexed(ExprIndexed::from_syntax_node(db, node)),
621 SyntaxKind::ExprInlineMacro => {
622 Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node))
623 }
624 SyntaxKind::ExprFixedSizeArray => {
625 Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node))
626 }
627 SyntaxKind::ExprMissing => Expr::Missing(ExprMissing::from_syntax_node(db, node)),
628 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Expr"),
629 }
630 }
631 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
632 let kind = node.kind(db);
633 match kind {
634 SyntaxKind::ExprPath => Some(Expr::Path(ExprPath::from_syntax_node(db, node))),
635 SyntaxKind::TerminalLiteralNumber => {
636 Some(Expr::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
637 }
638 SyntaxKind::TerminalShortString => {
639 Some(Expr::ShortString(TerminalShortString::from_syntax_node(db, node)))
640 }
641 SyntaxKind::TerminalString => {
642 Some(Expr::String(TerminalString::from_syntax_node(db, node)))
643 }
644 SyntaxKind::TerminalFalse => {
645 Some(Expr::False(TerminalFalse::from_syntax_node(db, node)))
646 }
647 SyntaxKind::TerminalTrue => Some(Expr::True(TerminalTrue::from_syntax_node(db, node))),
648 SyntaxKind::ExprParenthesized => {
649 Some(Expr::Parenthesized(ExprParenthesized::from_syntax_node(db, node)))
650 }
651 SyntaxKind::ExprUnary => Some(Expr::Unary(ExprUnary::from_syntax_node(db, node))),
652 SyntaxKind::ExprBinary => Some(Expr::Binary(ExprBinary::from_syntax_node(db, node))),
653 SyntaxKind::ExprListParenthesized => {
654 Some(Expr::Tuple(ExprListParenthesized::from_syntax_node(db, node)))
655 }
656 SyntaxKind::ExprFunctionCall => {
657 Some(Expr::FunctionCall(ExprFunctionCall::from_syntax_node(db, node)))
658 }
659 SyntaxKind::ExprStructCtorCall => {
660 Some(Expr::StructCtorCall(ExprStructCtorCall::from_syntax_node(db, node)))
661 }
662 SyntaxKind::ExprBlock => Some(Expr::Block(ExprBlock::from_syntax_node(db, node))),
663 SyntaxKind::ExprMatch => Some(Expr::Match(ExprMatch::from_syntax_node(db, node))),
664 SyntaxKind::ExprIf => Some(Expr::If(ExprIf::from_syntax_node(db, node))),
665 SyntaxKind::ExprLoop => Some(Expr::Loop(ExprLoop::from_syntax_node(db, node))),
666 SyntaxKind::ExprWhile => Some(Expr::While(ExprWhile::from_syntax_node(db, node))),
667 SyntaxKind::ExprFor => Some(Expr::For(ExprFor::from_syntax_node(db, node))),
668 SyntaxKind::ExprClosure => Some(Expr::Closure(ExprClosure::from_syntax_node(db, node))),
669 SyntaxKind::ExprErrorPropagate => {
670 Some(Expr::ErrorPropagate(ExprErrorPropagate::from_syntax_node(db, node)))
671 }
672 SyntaxKind::ExprFieldInitShorthand => {
673 Some(Expr::FieldInitShorthand(ExprFieldInitShorthand::from_syntax_node(db, node)))
674 }
675 SyntaxKind::ExprIndexed => Some(Expr::Indexed(ExprIndexed::from_syntax_node(db, node))),
676 SyntaxKind::ExprInlineMacro => {
677 Some(Expr::InlineMacro(ExprInlineMacro::from_syntax_node(db, node)))
678 }
679 SyntaxKind::ExprFixedSizeArray => {
680 Some(Expr::FixedSizeArray(ExprFixedSizeArray::from_syntax_node(db, node)))
681 }
682 SyntaxKind::ExprMissing => Some(Expr::Missing(ExprMissing::from_syntax_node(db, node))),
683 _ => None,
684 }
685 }
686 fn as_syntax_node(&self) -> SyntaxNode<'db> {
687 match self {
688 Expr::Path(x) => x.as_syntax_node(),
689 Expr::Literal(x) => x.as_syntax_node(),
690 Expr::ShortString(x) => x.as_syntax_node(),
691 Expr::String(x) => x.as_syntax_node(),
692 Expr::False(x) => x.as_syntax_node(),
693 Expr::True(x) => x.as_syntax_node(),
694 Expr::Parenthesized(x) => x.as_syntax_node(),
695 Expr::Unary(x) => x.as_syntax_node(),
696 Expr::Binary(x) => x.as_syntax_node(),
697 Expr::Tuple(x) => x.as_syntax_node(),
698 Expr::FunctionCall(x) => x.as_syntax_node(),
699 Expr::StructCtorCall(x) => x.as_syntax_node(),
700 Expr::Block(x) => x.as_syntax_node(),
701 Expr::Match(x) => x.as_syntax_node(),
702 Expr::If(x) => x.as_syntax_node(),
703 Expr::Loop(x) => x.as_syntax_node(),
704 Expr::While(x) => x.as_syntax_node(),
705 Expr::For(x) => x.as_syntax_node(),
706 Expr::Closure(x) => x.as_syntax_node(),
707 Expr::ErrorPropagate(x) => x.as_syntax_node(),
708 Expr::FieldInitShorthand(x) => x.as_syntax_node(),
709 Expr::Indexed(x) => x.as_syntax_node(),
710 Expr::InlineMacro(x) => x.as_syntax_node(),
711 Expr::FixedSizeArray(x) => x.as_syntax_node(),
712 Expr::Missing(x) => x.as_syntax_node(),
713 }
714 }
715 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
716 ExprPtr(self.as_syntax_node().stable_ptr(db))
717 }
718}
719impl<'db> Expr<'db> {
720 pub fn is_variant(kind: SyntaxKind) -> bool {
722 matches!(
723 kind,
724 SyntaxKind::ExprPath
725 | SyntaxKind::TerminalLiteralNumber
726 | SyntaxKind::TerminalShortString
727 | SyntaxKind::TerminalString
728 | SyntaxKind::TerminalFalse
729 | SyntaxKind::TerminalTrue
730 | SyntaxKind::ExprParenthesized
731 | SyntaxKind::ExprUnary
732 | SyntaxKind::ExprBinary
733 | SyntaxKind::ExprListParenthesized
734 | SyntaxKind::ExprFunctionCall
735 | SyntaxKind::ExprStructCtorCall
736 | SyntaxKind::ExprBlock
737 | SyntaxKind::ExprMatch
738 | SyntaxKind::ExprIf
739 | SyntaxKind::ExprLoop
740 | SyntaxKind::ExprWhile
741 | SyntaxKind::ExprFor
742 | SyntaxKind::ExprClosure
743 | SyntaxKind::ExprErrorPropagate
744 | SyntaxKind::ExprFieldInitShorthand
745 | SyntaxKind::ExprIndexed
746 | SyntaxKind::ExprInlineMacro
747 | SyntaxKind::ExprFixedSizeArray
748 | SyntaxKind::ExprMissing
749 )
750 }
751}
752#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
753pub struct ExprList<'db>(ElementList<'db, Expr<'db>, 2>);
754impl<'db> Deref for ExprList<'db> {
755 type Target = ElementList<'db, Expr<'db>, 2>;
756 fn deref(&self) -> &Self::Target {
757 &self.0
758 }
759}
760impl<'db> ExprList<'db> {
761 pub fn new_green(
762 db: &'db dyn Database,
763 children: &[ExprListElementOrSeparatorGreen<'db>],
764 ) -> ExprListGreen<'db> {
765 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
766 ExprListGreen(
767 GreenNode {
768 kind: SyntaxKind::ExprList,
769 details: GreenNodeDetails::Node {
770 children: children.iter().map(|x| x.id()).collect(),
771 width,
772 },
773 }
774 .intern(db),
775 )
776 }
777}
778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
779pub struct ExprListPtr<'db>(pub SyntaxStablePtrId<'db>);
780impl<'db> TypedStablePtr<'db> for ExprListPtr<'db> {
781 type SyntaxNode = ExprList<'db>;
782 fn untyped(self) -> SyntaxStablePtrId<'db> {
783 self.0
784 }
785 fn lookup(&self, db: &'db dyn Database) -> ExprList<'db> {
786 ExprList::from_syntax_node(db, self.0.lookup(db))
787 }
788}
789impl<'db> From<ExprListPtr<'db>> for SyntaxStablePtrId<'db> {
790 fn from(ptr: ExprListPtr<'db>) -> Self {
791 ptr.untyped()
792 }
793}
794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
795pub enum ExprListElementOrSeparatorGreen<'db> {
796 Separator(TerminalCommaGreen<'db>),
797 Element(ExprGreen<'db>),
798}
799impl<'db> From<TerminalCommaGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
800 fn from(value: TerminalCommaGreen<'db>) -> Self {
801 ExprListElementOrSeparatorGreen::Separator(value)
802 }
803}
804impl<'db> From<ExprGreen<'db>> for ExprListElementOrSeparatorGreen<'db> {
805 fn from(value: ExprGreen<'db>) -> Self {
806 ExprListElementOrSeparatorGreen::Element(value)
807 }
808}
809impl<'db> ExprListElementOrSeparatorGreen<'db> {
810 fn id(&self) -> GreenId<'db> {
811 match self {
812 ExprListElementOrSeparatorGreen::Separator(green) => green.0,
813 ExprListElementOrSeparatorGreen::Element(green) => green.0,
814 }
815 }
816}
817#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
818pub struct ExprListGreen<'db>(pub GreenId<'db>);
819impl<'db> TypedSyntaxNode<'db> for ExprList<'db> {
820 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprList);
821 type StablePtr = ExprListPtr<'db>;
822 type Green = ExprListGreen<'db>;
823 fn missing(db: &'db dyn Database) -> Self::Green {
824 ExprListGreen(
825 GreenNode {
826 kind: SyntaxKind::ExprList,
827 details: GreenNodeDetails::Node {
828 children: [].into(),
829 width: TextWidth::default(),
830 },
831 }
832 .intern(db),
833 )
834 }
835 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
836 Self(ElementList::new(node))
837 }
838 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
839 if node.kind(db) == SyntaxKind::ExprList {
840 Some(Self(ElementList::new(node)))
841 } else {
842 None
843 }
844 }
845 fn as_syntax_node(&self) -> SyntaxNode<'db> {
846 self.node
847 }
848 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
849 ExprListPtr(self.node.stable_ptr(db))
850 }
851}
852#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
853pub struct Arg<'db> {
854 node: SyntaxNode<'db>,
855}
856impl<'db> Arg<'db> {
857 pub const INDEX_MODIFIERS: usize = 0;
858 pub const INDEX_ARG_CLAUSE: usize = 1;
859 pub fn new_green(
860 db: &'db dyn Database,
861 modifiers: ModifierListGreen<'db>,
862 arg_clause: ArgClauseGreen<'db>,
863 ) -> ArgGreen<'db> {
864 let children = [modifiers.0, arg_clause.0];
865 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
866 ArgGreen(
867 GreenNode {
868 kind: SyntaxKind::Arg,
869 details: GreenNodeDetails::Node { children: children.into(), width },
870 }
871 .intern(db),
872 )
873 }
874}
875impl<'db> Arg<'db> {
876 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
877 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
878 }
879 pub fn arg_clause(&self, db: &'db dyn Database) -> ArgClause<'db> {
880 ArgClause::from_syntax_node(db, self.node.get_children(db)[1])
881 }
882}
883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
884pub struct ArgPtr<'db>(pub SyntaxStablePtrId<'db>);
885impl<'db> ArgPtr<'db> {}
886impl<'db> TypedStablePtr<'db> for ArgPtr<'db> {
887 type SyntaxNode = Arg<'db>;
888 fn untyped(self) -> SyntaxStablePtrId<'db> {
889 self.0
890 }
891 fn lookup(&self, db: &'db dyn Database) -> Arg<'db> {
892 Arg::from_syntax_node(db, self.0.lookup(db))
893 }
894}
895impl<'db> From<ArgPtr<'db>> for SyntaxStablePtrId<'db> {
896 fn from(ptr: ArgPtr<'db>) -> Self {
897 ptr.untyped()
898 }
899}
900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
901pub struct ArgGreen<'db>(pub GreenId<'db>);
902impl<'db> TypedSyntaxNode<'db> for Arg<'db> {
903 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Arg);
904 type StablePtr = ArgPtr<'db>;
905 type Green = ArgGreen<'db>;
906 fn missing(db: &'db dyn Database) -> Self::Green {
907 ArgGreen(
908 GreenNode {
909 kind: SyntaxKind::Arg,
910 details: GreenNodeDetails::Node {
911 children: [ModifierList::missing(db).0, ArgClause::missing(db).0].into(),
912 width: TextWidth::default(),
913 },
914 }
915 .intern(db),
916 )
917 }
918 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
919 let kind = node.kind(db);
920 assert_eq!(
921 kind,
922 SyntaxKind::Arg,
923 "Unexpected SyntaxKind {:?}. Expected {:?}.",
924 kind,
925 SyntaxKind::Arg
926 );
927 Self { node }
928 }
929 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
930 let kind = node.kind(db);
931 if kind == SyntaxKind::Arg { Some(Self::from_syntax_node(db, node)) } else { None }
932 }
933 fn as_syntax_node(&self) -> SyntaxNode<'db> {
934 self.node
935 }
936 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
937 ArgPtr(self.node.stable_ptr(db))
938 }
939}
940#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
941pub enum ArgClause<'db> {
942 Unnamed(ArgClauseUnnamed<'db>),
943 Named(ArgClauseNamed<'db>),
944 FieldInitShorthand(ArgClauseFieldInitShorthand<'db>),
945}
946#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
947pub struct ArgClausePtr<'db>(pub SyntaxStablePtrId<'db>);
948impl<'db> TypedStablePtr<'db> for ArgClausePtr<'db> {
949 type SyntaxNode = ArgClause<'db>;
950 fn untyped(self) -> SyntaxStablePtrId<'db> {
951 self.0
952 }
953 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
954 ArgClause::from_syntax_node(db, self.0.lookup(db))
955 }
956}
957impl<'db> From<ArgClausePtr<'db>> for SyntaxStablePtrId<'db> {
958 fn from(ptr: ArgClausePtr<'db>) -> Self {
959 ptr.untyped()
960 }
961}
962impl<'db> From<ArgClauseUnnamedPtr<'db>> for ArgClausePtr<'db> {
963 fn from(value: ArgClauseUnnamedPtr<'db>) -> Self {
964 Self(value.0)
965 }
966}
967impl<'db> From<ArgClauseNamedPtr<'db>> for ArgClausePtr<'db> {
968 fn from(value: ArgClauseNamedPtr<'db>) -> Self {
969 Self(value.0)
970 }
971}
972impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for ArgClausePtr<'db> {
973 fn from(value: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
974 Self(value.0)
975 }
976}
977impl<'db> From<ArgClauseUnnamedGreen<'db>> for ArgClauseGreen<'db> {
978 fn from(value: ArgClauseUnnamedGreen<'db>) -> Self {
979 Self(value.0)
980 }
981}
982impl<'db> From<ArgClauseNamedGreen<'db>> for ArgClauseGreen<'db> {
983 fn from(value: ArgClauseNamedGreen<'db>) -> Self {
984 Self(value.0)
985 }
986}
987impl<'db> From<ArgClauseFieldInitShorthandGreen<'db>> for ArgClauseGreen<'db> {
988 fn from(value: ArgClauseFieldInitShorthandGreen<'db>) -> Self {
989 Self(value.0)
990 }
991}
992#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
993pub struct ArgClauseGreen<'db>(pub GreenId<'db>);
994impl<'db> TypedSyntaxNode<'db> for ArgClause<'db> {
995 const OPTIONAL_KIND: Option<SyntaxKind> = None;
996 type StablePtr = ArgClausePtr<'db>;
997 type Green = ArgClauseGreen<'db>;
998 fn missing(db: &'db dyn Database) -> Self::Green {
999 panic!("No missing variant.");
1000 }
1001 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1002 let kind = node.kind(db);
1003 match kind {
1004 SyntaxKind::ArgClauseUnnamed => {
1005 ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node))
1006 }
1007 SyntaxKind::ArgClauseNamed => {
1008 ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node))
1009 }
1010 SyntaxKind::ArgClauseFieldInitShorthand => ArgClause::FieldInitShorthand(
1011 ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1012 ),
1013 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ArgClause"),
1014 }
1015 }
1016 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1017 let kind = node.kind(db);
1018 match kind {
1019 SyntaxKind::ArgClauseUnnamed => {
1020 Some(ArgClause::Unnamed(ArgClauseUnnamed::from_syntax_node(db, node)))
1021 }
1022 SyntaxKind::ArgClauseNamed => {
1023 Some(ArgClause::Named(ArgClauseNamed::from_syntax_node(db, node)))
1024 }
1025 SyntaxKind::ArgClauseFieldInitShorthand => Some(ArgClause::FieldInitShorthand(
1026 ArgClauseFieldInitShorthand::from_syntax_node(db, node),
1027 )),
1028 _ => None,
1029 }
1030 }
1031 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1032 match self {
1033 ArgClause::Unnamed(x) => x.as_syntax_node(),
1034 ArgClause::Named(x) => x.as_syntax_node(),
1035 ArgClause::FieldInitShorthand(x) => x.as_syntax_node(),
1036 }
1037 }
1038 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1039 ArgClausePtr(self.as_syntax_node().stable_ptr(db))
1040 }
1041}
1042impl<'db> ArgClause<'db> {
1043 pub fn is_variant(kind: SyntaxKind) -> bool {
1045 matches!(
1046 kind,
1047 SyntaxKind::ArgClauseUnnamed
1048 | SyntaxKind::ArgClauseNamed
1049 | SyntaxKind::ArgClauseFieldInitShorthand
1050 )
1051 }
1052}
1053#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1054pub struct ArgClauseNamed<'db> {
1055 node: SyntaxNode<'db>,
1056}
1057impl<'db> ArgClauseNamed<'db> {
1058 pub const INDEX_NAME: usize = 0;
1059 pub const INDEX_COLON: usize = 1;
1060 pub const INDEX_VALUE: usize = 2;
1061 pub fn new_green(
1062 db: &'db dyn Database,
1063 name: TerminalIdentifierGreen<'db>,
1064 colon: TerminalColonGreen<'db>,
1065 value: ExprGreen<'db>,
1066 ) -> ArgClauseNamedGreen<'db> {
1067 let children = [name.0, colon.0, value.0];
1068 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1069 ArgClauseNamedGreen(
1070 GreenNode {
1071 kind: SyntaxKind::ArgClauseNamed,
1072 details: GreenNodeDetails::Node { children: children.into(), width },
1073 }
1074 .intern(db),
1075 )
1076 }
1077}
1078impl<'db> ArgClauseNamed<'db> {
1079 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1080 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1081 }
1082 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1083 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
1084 }
1085 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1086 Expr::from_syntax_node(db, self.node.get_children(db)[2])
1087 }
1088}
1089#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1090pub struct ArgClauseNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1091impl<'db> ArgClauseNamedPtr<'db> {}
1092impl<'db> TypedStablePtr<'db> for ArgClauseNamedPtr<'db> {
1093 type SyntaxNode = ArgClauseNamed<'db>;
1094 fn untyped(self) -> SyntaxStablePtrId<'db> {
1095 self.0
1096 }
1097 fn lookup(&self, db: &'db dyn Database) -> ArgClauseNamed<'db> {
1098 ArgClauseNamed::from_syntax_node(db, self.0.lookup(db))
1099 }
1100}
1101impl<'db> From<ArgClauseNamedPtr<'db>> for SyntaxStablePtrId<'db> {
1102 fn from(ptr: ArgClauseNamedPtr<'db>) -> Self {
1103 ptr.untyped()
1104 }
1105}
1106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1107pub struct ArgClauseNamedGreen<'db>(pub GreenId<'db>);
1108impl<'db> TypedSyntaxNode<'db> for ArgClauseNamed<'db> {
1109 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseNamed);
1110 type StablePtr = ArgClauseNamedPtr<'db>;
1111 type Green = ArgClauseNamedGreen<'db>;
1112 fn missing(db: &'db dyn Database) -> Self::Green {
1113 ArgClauseNamedGreen(
1114 GreenNode {
1115 kind: SyntaxKind::ArgClauseNamed,
1116 details: GreenNodeDetails::Node {
1117 children: [
1118 TerminalIdentifier::missing(db).0,
1119 TerminalColon::missing(db).0,
1120 Expr::missing(db).0,
1121 ]
1122 .into(),
1123 width: TextWidth::default(),
1124 },
1125 }
1126 .intern(db),
1127 )
1128 }
1129 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1130 let kind = node.kind(db);
1131 assert_eq!(
1132 kind,
1133 SyntaxKind::ArgClauseNamed,
1134 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1135 kind,
1136 SyntaxKind::ArgClauseNamed
1137 );
1138 Self { node }
1139 }
1140 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1141 let kind = node.kind(db);
1142 if kind == SyntaxKind::ArgClauseNamed {
1143 Some(Self::from_syntax_node(db, node))
1144 } else {
1145 None
1146 }
1147 }
1148 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1149 self.node
1150 }
1151 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1152 ArgClauseNamedPtr(self.node.stable_ptr(db))
1153 }
1154}
1155#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1156pub struct ArgClauseUnnamed<'db> {
1157 node: SyntaxNode<'db>,
1158}
1159impl<'db> ArgClauseUnnamed<'db> {
1160 pub const INDEX_VALUE: usize = 0;
1161 pub fn new_green(db: &'db dyn Database, value: ExprGreen<'db>) -> ArgClauseUnnamedGreen<'db> {
1162 let children = [value.0];
1163 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1164 ArgClauseUnnamedGreen(
1165 GreenNode {
1166 kind: SyntaxKind::ArgClauseUnnamed,
1167 details: GreenNodeDetails::Node { children: children.into(), width },
1168 }
1169 .intern(db),
1170 )
1171 }
1172}
1173impl<'db> ArgClauseUnnamed<'db> {
1174 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
1175 Expr::from_syntax_node(db, self.node.get_children(db)[0])
1176 }
1177}
1178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1179pub struct ArgClauseUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
1180impl<'db> ArgClauseUnnamedPtr<'db> {}
1181impl<'db> TypedStablePtr<'db> for ArgClauseUnnamedPtr<'db> {
1182 type SyntaxNode = ArgClauseUnnamed<'db>;
1183 fn untyped(self) -> SyntaxStablePtrId<'db> {
1184 self.0
1185 }
1186 fn lookup(&self, db: &'db dyn Database) -> ArgClauseUnnamed<'db> {
1187 ArgClauseUnnamed::from_syntax_node(db, self.0.lookup(db))
1188 }
1189}
1190impl<'db> From<ArgClauseUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
1191 fn from(ptr: ArgClauseUnnamedPtr<'db>) -> Self {
1192 ptr.untyped()
1193 }
1194}
1195#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1196pub struct ArgClauseUnnamedGreen<'db>(pub GreenId<'db>);
1197impl<'db> TypedSyntaxNode<'db> for ArgClauseUnnamed<'db> {
1198 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseUnnamed);
1199 type StablePtr = ArgClauseUnnamedPtr<'db>;
1200 type Green = ArgClauseUnnamedGreen<'db>;
1201 fn missing(db: &'db dyn Database) -> Self::Green {
1202 ArgClauseUnnamedGreen(
1203 GreenNode {
1204 kind: SyntaxKind::ArgClauseUnnamed,
1205 details: GreenNodeDetails::Node {
1206 children: [Expr::missing(db).0].into(),
1207 width: TextWidth::default(),
1208 },
1209 }
1210 .intern(db),
1211 )
1212 }
1213 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1214 let kind = node.kind(db);
1215 assert_eq!(
1216 kind,
1217 SyntaxKind::ArgClauseUnnamed,
1218 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1219 kind,
1220 SyntaxKind::ArgClauseUnnamed
1221 );
1222 Self { node }
1223 }
1224 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1225 let kind = node.kind(db);
1226 if kind == SyntaxKind::ArgClauseUnnamed {
1227 Some(Self::from_syntax_node(db, node))
1228 } else {
1229 None
1230 }
1231 }
1232 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1233 self.node
1234 }
1235 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1236 ArgClauseUnnamedPtr(self.node.stable_ptr(db))
1237 }
1238}
1239#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1240pub struct ArgClauseFieldInitShorthand<'db> {
1241 node: SyntaxNode<'db>,
1242}
1243impl<'db> ArgClauseFieldInitShorthand<'db> {
1244 pub const INDEX_COLON: usize = 0;
1245 pub const INDEX_NAME: usize = 1;
1246 pub fn new_green(
1247 db: &'db dyn Database,
1248 colon: TerminalColonGreen<'db>,
1249 name: ExprFieldInitShorthandGreen<'db>,
1250 ) -> ArgClauseFieldInitShorthandGreen<'db> {
1251 let children = [colon.0, name.0];
1252 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1253 ArgClauseFieldInitShorthandGreen(
1254 GreenNode {
1255 kind: SyntaxKind::ArgClauseFieldInitShorthand,
1256 details: GreenNodeDetails::Node { children: children.into(), width },
1257 }
1258 .intern(db),
1259 )
1260 }
1261}
1262impl<'db> ArgClauseFieldInitShorthand<'db> {
1263 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
1264 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
1265 }
1266 pub fn name(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1267 ExprFieldInitShorthand::from_syntax_node(db, self.node.get_children(db)[1])
1268 }
1269}
1270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1271pub struct ArgClauseFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1272impl<'db> ArgClauseFieldInitShorthandPtr<'db> {}
1273impl<'db> TypedStablePtr<'db> for ArgClauseFieldInitShorthandPtr<'db> {
1274 type SyntaxNode = ArgClauseFieldInitShorthand<'db>;
1275 fn untyped(self) -> SyntaxStablePtrId<'db> {
1276 self.0
1277 }
1278 fn lookup(&self, db: &'db dyn Database) -> ArgClauseFieldInitShorthand<'db> {
1279 ArgClauseFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1280 }
1281}
1282impl<'db> From<ArgClauseFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1283 fn from(ptr: ArgClauseFieldInitShorthandPtr<'db>) -> Self {
1284 ptr.untyped()
1285 }
1286}
1287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1288pub struct ArgClauseFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1289impl<'db> TypedSyntaxNode<'db> for ArgClauseFieldInitShorthand<'db> {
1290 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgClauseFieldInitShorthand);
1291 type StablePtr = ArgClauseFieldInitShorthandPtr<'db>;
1292 type Green = ArgClauseFieldInitShorthandGreen<'db>;
1293 fn missing(db: &'db dyn Database) -> Self::Green {
1294 ArgClauseFieldInitShorthandGreen(
1295 GreenNode {
1296 kind: SyntaxKind::ArgClauseFieldInitShorthand,
1297 details: GreenNodeDetails::Node {
1298 children: [TerminalColon::missing(db).0, ExprFieldInitShorthand::missing(db).0]
1299 .into(),
1300 width: TextWidth::default(),
1301 },
1302 }
1303 .intern(db),
1304 )
1305 }
1306 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1307 let kind = node.kind(db);
1308 assert_eq!(
1309 kind,
1310 SyntaxKind::ArgClauseFieldInitShorthand,
1311 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1312 kind,
1313 SyntaxKind::ArgClauseFieldInitShorthand
1314 );
1315 Self { node }
1316 }
1317 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1318 let kind = node.kind(db);
1319 if kind == SyntaxKind::ArgClauseFieldInitShorthand {
1320 Some(Self::from_syntax_node(db, node))
1321 } else {
1322 None
1323 }
1324 }
1325 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1326 self.node
1327 }
1328 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1329 ArgClauseFieldInitShorthandPtr(self.node.stable_ptr(db))
1330 }
1331}
1332#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1333pub struct ExprFieldInitShorthand<'db> {
1334 node: SyntaxNode<'db>,
1335}
1336impl<'db> ExprFieldInitShorthand<'db> {
1337 pub const INDEX_NAME: usize = 0;
1338 pub fn new_green(
1339 db: &'db dyn Database,
1340 name: TerminalIdentifierGreen<'db>,
1341 ) -> ExprFieldInitShorthandGreen<'db> {
1342 let children = [name.0];
1343 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1344 ExprFieldInitShorthandGreen(
1345 GreenNode {
1346 kind: SyntaxKind::ExprFieldInitShorthand,
1347 details: GreenNodeDetails::Node { children: children.into(), width },
1348 }
1349 .intern(db),
1350 )
1351 }
1352}
1353impl<'db> ExprFieldInitShorthand<'db> {
1354 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1355 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1356 }
1357}
1358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1359pub struct ExprFieldInitShorthandPtr<'db>(pub SyntaxStablePtrId<'db>);
1360impl<'db> ExprFieldInitShorthandPtr<'db> {}
1361impl<'db> TypedStablePtr<'db> for ExprFieldInitShorthandPtr<'db> {
1362 type SyntaxNode = ExprFieldInitShorthand<'db>;
1363 fn untyped(self) -> SyntaxStablePtrId<'db> {
1364 self.0
1365 }
1366 fn lookup(&self, db: &'db dyn Database) -> ExprFieldInitShorthand<'db> {
1367 ExprFieldInitShorthand::from_syntax_node(db, self.0.lookup(db))
1368 }
1369}
1370impl<'db> From<ExprFieldInitShorthandPtr<'db>> for SyntaxStablePtrId<'db> {
1371 fn from(ptr: ExprFieldInitShorthandPtr<'db>) -> Self {
1372 ptr.untyped()
1373 }
1374}
1375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1376pub struct ExprFieldInitShorthandGreen<'db>(pub GreenId<'db>);
1377impl<'db> TypedSyntaxNode<'db> for ExprFieldInitShorthand<'db> {
1378 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFieldInitShorthand);
1379 type StablePtr = ExprFieldInitShorthandPtr<'db>;
1380 type Green = ExprFieldInitShorthandGreen<'db>;
1381 fn missing(db: &'db dyn Database) -> Self::Green {
1382 ExprFieldInitShorthandGreen(
1383 GreenNode {
1384 kind: SyntaxKind::ExprFieldInitShorthand,
1385 details: GreenNodeDetails::Node {
1386 children: [TerminalIdentifier::missing(db).0].into(),
1387 width: TextWidth::default(),
1388 },
1389 }
1390 .intern(db),
1391 )
1392 }
1393 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1394 let kind = node.kind(db);
1395 assert_eq!(
1396 kind,
1397 SyntaxKind::ExprFieldInitShorthand,
1398 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1399 kind,
1400 SyntaxKind::ExprFieldInitShorthand
1401 );
1402 Self { node }
1403 }
1404 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1405 let kind = node.kind(db);
1406 if kind == SyntaxKind::ExprFieldInitShorthand {
1407 Some(Self::from_syntax_node(db, node))
1408 } else {
1409 None
1410 }
1411 }
1412 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1413 self.node
1414 }
1415 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1416 ExprFieldInitShorthandPtr(self.node.stable_ptr(db))
1417 }
1418}
1419#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1420pub struct ArgList<'db>(ElementList<'db, Arg<'db>, 2>);
1421impl<'db> Deref for ArgList<'db> {
1422 type Target = ElementList<'db, Arg<'db>, 2>;
1423 fn deref(&self) -> &Self::Target {
1424 &self.0
1425 }
1426}
1427impl<'db> ArgList<'db> {
1428 pub fn new_green(
1429 db: &'db dyn Database,
1430 children: &[ArgListElementOrSeparatorGreen<'db>],
1431 ) -> ArgListGreen<'db> {
1432 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
1433 ArgListGreen(
1434 GreenNode {
1435 kind: SyntaxKind::ArgList,
1436 details: GreenNodeDetails::Node {
1437 children: children.iter().map(|x| x.id()).collect(),
1438 width,
1439 },
1440 }
1441 .intern(db),
1442 )
1443 }
1444}
1445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1446pub struct ArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
1447impl<'db> TypedStablePtr<'db> for ArgListPtr<'db> {
1448 type SyntaxNode = ArgList<'db>;
1449 fn untyped(self) -> SyntaxStablePtrId<'db> {
1450 self.0
1451 }
1452 fn lookup(&self, db: &'db dyn Database) -> ArgList<'db> {
1453 ArgList::from_syntax_node(db, self.0.lookup(db))
1454 }
1455}
1456impl<'db> From<ArgListPtr<'db>> for SyntaxStablePtrId<'db> {
1457 fn from(ptr: ArgListPtr<'db>) -> Self {
1458 ptr.untyped()
1459 }
1460}
1461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1462pub enum ArgListElementOrSeparatorGreen<'db> {
1463 Separator(TerminalCommaGreen<'db>),
1464 Element(ArgGreen<'db>),
1465}
1466impl<'db> From<TerminalCommaGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1467 fn from(value: TerminalCommaGreen<'db>) -> Self {
1468 ArgListElementOrSeparatorGreen::Separator(value)
1469 }
1470}
1471impl<'db> From<ArgGreen<'db>> for ArgListElementOrSeparatorGreen<'db> {
1472 fn from(value: ArgGreen<'db>) -> Self {
1473 ArgListElementOrSeparatorGreen::Element(value)
1474 }
1475}
1476impl<'db> ArgListElementOrSeparatorGreen<'db> {
1477 fn id(&self) -> GreenId<'db> {
1478 match self {
1479 ArgListElementOrSeparatorGreen::Separator(green) => green.0,
1480 ArgListElementOrSeparatorGreen::Element(green) => green.0,
1481 }
1482 }
1483}
1484#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1485pub struct ArgListGreen<'db>(pub GreenId<'db>);
1486impl<'db> TypedSyntaxNode<'db> for ArgList<'db> {
1487 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgList);
1488 type StablePtr = ArgListPtr<'db>;
1489 type Green = ArgListGreen<'db>;
1490 fn missing(db: &'db dyn Database) -> Self::Green {
1491 ArgListGreen(
1492 GreenNode {
1493 kind: SyntaxKind::ArgList,
1494 details: GreenNodeDetails::Node {
1495 children: [].into(),
1496 width: TextWidth::default(),
1497 },
1498 }
1499 .intern(db),
1500 )
1501 }
1502 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1503 Self(ElementList::new(node))
1504 }
1505 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1506 if node.kind(db) == SyntaxKind::ArgList { Some(Self(ElementList::new(node))) } else { None }
1507 }
1508 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1509 self.node
1510 }
1511 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1512 ArgListPtr(self.node.stable_ptr(db))
1513 }
1514}
1515#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1516pub struct ExprMissing<'db> {
1517 node: SyntaxNode<'db>,
1518}
1519impl<'db> ExprMissing<'db> {
1520 pub fn new_green(db: &'db dyn Database) -> ExprMissingGreen<'db> {
1521 let children = [];
1522 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1523 ExprMissingGreen(
1524 GreenNode {
1525 kind: SyntaxKind::ExprMissing,
1526 details: GreenNodeDetails::Node { children: children.into(), width },
1527 }
1528 .intern(db),
1529 )
1530 }
1531}
1532impl<'db> ExprMissing<'db> {}
1533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1534pub struct ExprMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
1535impl<'db> ExprMissingPtr<'db> {}
1536impl<'db> TypedStablePtr<'db> for ExprMissingPtr<'db> {
1537 type SyntaxNode = ExprMissing<'db>;
1538 fn untyped(self) -> SyntaxStablePtrId<'db> {
1539 self.0
1540 }
1541 fn lookup(&self, db: &'db dyn Database) -> ExprMissing<'db> {
1542 ExprMissing::from_syntax_node(db, self.0.lookup(db))
1543 }
1544}
1545impl<'db> From<ExprMissingPtr<'db>> for SyntaxStablePtrId<'db> {
1546 fn from(ptr: ExprMissingPtr<'db>) -> Self {
1547 ptr.untyped()
1548 }
1549}
1550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1551pub struct ExprMissingGreen<'db>(pub GreenId<'db>);
1552impl<'db> TypedSyntaxNode<'db> for ExprMissing<'db> {
1553 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMissing);
1554 type StablePtr = ExprMissingPtr<'db>;
1555 type Green = ExprMissingGreen<'db>;
1556 fn missing(db: &'db dyn Database) -> Self::Green {
1557 ExprMissingGreen(
1558 GreenNode {
1559 kind: SyntaxKind::ExprMissing,
1560 details: GreenNodeDetails::Node {
1561 children: [].into(),
1562 width: TextWidth::default(),
1563 },
1564 }
1565 .intern(db),
1566 )
1567 }
1568 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1569 let kind = node.kind(db);
1570 assert_eq!(
1571 kind,
1572 SyntaxKind::ExprMissing,
1573 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1574 kind,
1575 SyntaxKind::ExprMissing
1576 );
1577 Self { node }
1578 }
1579 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1580 let kind = node.kind(db);
1581 if kind == SyntaxKind::ExprMissing { Some(Self::from_syntax_node(db, node)) } else { None }
1582 }
1583 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1584 self.node
1585 }
1586 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1587 ExprMissingPtr(self.node.stable_ptr(db))
1588 }
1589}
1590#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1591pub enum PathSegment<'db> {
1592 Simple(PathSegmentSimple<'db>),
1593 WithGenericArgs(PathSegmentWithGenericArgs<'db>),
1594 Missing(PathSegmentMissing<'db>),
1595}
1596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1597pub struct PathSegmentPtr<'db>(pub SyntaxStablePtrId<'db>);
1598impl<'db> TypedStablePtr<'db> for PathSegmentPtr<'db> {
1599 type SyntaxNode = PathSegment<'db>;
1600 fn untyped(self) -> SyntaxStablePtrId<'db> {
1601 self.0
1602 }
1603 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1604 PathSegment::from_syntax_node(db, self.0.lookup(db))
1605 }
1606}
1607impl<'db> From<PathSegmentPtr<'db>> for SyntaxStablePtrId<'db> {
1608 fn from(ptr: PathSegmentPtr<'db>) -> Self {
1609 ptr.untyped()
1610 }
1611}
1612impl<'db> From<PathSegmentSimplePtr<'db>> for PathSegmentPtr<'db> {
1613 fn from(value: PathSegmentSimplePtr<'db>) -> Self {
1614 Self(value.0)
1615 }
1616}
1617impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for PathSegmentPtr<'db> {
1618 fn from(value: PathSegmentWithGenericArgsPtr<'db>) -> Self {
1619 Self(value.0)
1620 }
1621}
1622impl<'db> From<PathSegmentMissingPtr<'db>> for PathSegmentPtr<'db> {
1623 fn from(value: PathSegmentMissingPtr<'db>) -> Self {
1624 Self(value.0)
1625 }
1626}
1627impl<'db> From<PathSegmentSimpleGreen<'db>> for PathSegmentGreen<'db> {
1628 fn from(value: PathSegmentSimpleGreen<'db>) -> Self {
1629 Self(value.0)
1630 }
1631}
1632impl<'db> From<PathSegmentWithGenericArgsGreen<'db>> for PathSegmentGreen<'db> {
1633 fn from(value: PathSegmentWithGenericArgsGreen<'db>) -> Self {
1634 Self(value.0)
1635 }
1636}
1637impl<'db> From<PathSegmentMissingGreen<'db>> for PathSegmentGreen<'db> {
1638 fn from(value: PathSegmentMissingGreen<'db>) -> Self {
1639 Self(value.0)
1640 }
1641}
1642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1643pub struct PathSegmentGreen<'db>(pub GreenId<'db>);
1644impl<'db> TypedSyntaxNode<'db> for PathSegment<'db> {
1645 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1646 type StablePtr = PathSegmentPtr<'db>;
1647 type Green = PathSegmentGreen<'db>;
1648 fn missing(db: &'db dyn Database) -> Self::Green {
1649 PathSegmentGreen(PathSegmentMissing::missing(db).0)
1650 }
1651 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1652 let kind = node.kind(db);
1653 match kind {
1654 SyntaxKind::PathSegmentSimple => {
1655 PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node))
1656 }
1657 SyntaxKind::PathSegmentWithGenericArgs => {
1658 PathSegment::WithGenericArgs(PathSegmentWithGenericArgs::from_syntax_node(db, node))
1659 }
1660 SyntaxKind::PathSegmentMissing => {
1661 PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node))
1662 }
1663 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "PathSegment"),
1664 }
1665 }
1666 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1667 let kind = node.kind(db);
1668 match kind {
1669 SyntaxKind::PathSegmentSimple => {
1670 Some(PathSegment::Simple(PathSegmentSimple::from_syntax_node(db, node)))
1671 }
1672 SyntaxKind::PathSegmentWithGenericArgs => Some(PathSegment::WithGenericArgs(
1673 PathSegmentWithGenericArgs::from_syntax_node(db, node),
1674 )),
1675 SyntaxKind::PathSegmentMissing => {
1676 Some(PathSegment::Missing(PathSegmentMissing::from_syntax_node(db, node)))
1677 }
1678 _ => None,
1679 }
1680 }
1681 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1682 match self {
1683 PathSegment::Simple(x) => x.as_syntax_node(),
1684 PathSegment::WithGenericArgs(x) => x.as_syntax_node(),
1685 PathSegment::Missing(x) => x.as_syntax_node(),
1686 }
1687 }
1688 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1689 PathSegmentPtr(self.as_syntax_node().stable_ptr(db))
1690 }
1691}
1692impl<'db> PathSegment<'db> {
1693 pub fn is_variant(kind: SyntaxKind) -> bool {
1695 matches!(
1696 kind,
1697 SyntaxKind::PathSegmentSimple
1698 | SyntaxKind::PathSegmentWithGenericArgs
1699 | SyntaxKind::PathSegmentMissing
1700 )
1701 }
1702}
1703#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1704pub struct PathSegmentSimple<'db> {
1705 node: SyntaxNode<'db>,
1706}
1707impl<'db> PathSegmentSimple<'db> {
1708 pub const INDEX_IDENT: usize = 0;
1709 pub fn new_green(
1710 db: &'db dyn Database,
1711 ident: TerminalIdentifierGreen<'db>,
1712 ) -> PathSegmentSimpleGreen<'db> {
1713 let children = [ident.0];
1714 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1715 PathSegmentSimpleGreen(
1716 GreenNode {
1717 kind: SyntaxKind::PathSegmentSimple,
1718 details: GreenNodeDetails::Node { children: children.into(), width },
1719 }
1720 .intern(db),
1721 )
1722 }
1723}
1724impl<'db> PathSegmentSimple<'db> {
1725 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1726 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1727 }
1728}
1729#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1730pub struct PathSegmentSimplePtr<'db>(pub SyntaxStablePtrId<'db>);
1731impl<'db> PathSegmentSimplePtr<'db> {}
1732impl<'db> TypedStablePtr<'db> for PathSegmentSimplePtr<'db> {
1733 type SyntaxNode = PathSegmentSimple<'db>;
1734 fn untyped(self) -> SyntaxStablePtrId<'db> {
1735 self.0
1736 }
1737 fn lookup(&self, db: &'db dyn Database) -> PathSegmentSimple<'db> {
1738 PathSegmentSimple::from_syntax_node(db, self.0.lookup(db))
1739 }
1740}
1741impl<'db> From<PathSegmentSimplePtr<'db>> for SyntaxStablePtrId<'db> {
1742 fn from(ptr: PathSegmentSimplePtr<'db>) -> Self {
1743 ptr.untyped()
1744 }
1745}
1746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1747pub struct PathSegmentSimpleGreen<'db>(pub GreenId<'db>);
1748impl<'db> TypedSyntaxNode<'db> for PathSegmentSimple<'db> {
1749 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentSimple);
1750 type StablePtr = PathSegmentSimplePtr<'db>;
1751 type Green = PathSegmentSimpleGreen<'db>;
1752 fn missing(db: &'db dyn Database) -> Self::Green {
1753 PathSegmentSimpleGreen(
1754 GreenNode {
1755 kind: SyntaxKind::PathSegmentSimple,
1756 details: GreenNodeDetails::Node {
1757 children: [TerminalIdentifier::missing(db).0].into(),
1758 width: TextWidth::default(),
1759 },
1760 }
1761 .intern(db),
1762 )
1763 }
1764 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1765 let kind = node.kind(db);
1766 assert_eq!(
1767 kind,
1768 SyntaxKind::PathSegmentSimple,
1769 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1770 kind,
1771 SyntaxKind::PathSegmentSimple
1772 );
1773 Self { node }
1774 }
1775 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1776 let kind = node.kind(db);
1777 if kind == SyntaxKind::PathSegmentSimple {
1778 Some(Self::from_syntax_node(db, node))
1779 } else {
1780 None
1781 }
1782 }
1783 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1784 self.node
1785 }
1786 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1787 PathSegmentSimplePtr(self.node.stable_ptr(db))
1788 }
1789}
1790#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1791pub enum OptionTerminalColonColon<'db> {
1792 Empty(OptionTerminalColonColonEmpty<'db>),
1793 TerminalColonColon(TerminalColonColon<'db>),
1794}
1795#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1796pub struct OptionTerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
1797impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonPtr<'db> {
1798 type SyntaxNode = OptionTerminalColonColon<'db>;
1799 fn untyped(self) -> SyntaxStablePtrId<'db> {
1800 self.0
1801 }
1802 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
1803 OptionTerminalColonColon::from_syntax_node(db, self.0.lookup(db))
1804 }
1805}
1806impl<'db> From<OptionTerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
1807 fn from(ptr: OptionTerminalColonColonPtr<'db>) -> Self {
1808 ptr.untyped()
1809 }
1810}
1811impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1812 fn from(value: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1813 Self(value.0)
1814 }
1815}
1816impl<'db> From<TerminalColonColonPtr<'db>> for OptionTerminalColonColonPtr<'db> {
1817 fn from(value: TerminalColonColonPtr<'db>) -> Self {
1818 Self(value.0)
1819 }
1820}
1821impl<'db> From<OptionTerminalColonColonEmptyGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1822 fn from(value: OptionTerminalColonColonEmptyGreen<'db>) -> Self {
1823 Self(value.0)
1824 }
1825}
1826impl<'db> From<TerminalColonColonGreen<'db>> for OptionTerminalColonColonGreen<'db> {
1827 fn from(value: TerminalColonColonGreen<'db>) -> Self {
1828 Self(value.0)
1829 }
1830}
1831#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1832pub struct OptionTerminalColonColonGreen<'db>(pub GreenId<'db>);
1833impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColon<'db> {
1834 const OPTIONAL_KIND: Option<SyntaxKind> = None;
1835 type StablePtr = OptionTerminalColonColonPtr<'db>;
1836 type Green = OptionTerminalColonColonGreen<'db>;
1837 fn missing(db: &'db dyn Database) -> Self::Green {
1838 panic!("No missing variant.");
1839 }
1840 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1841 let kind = node.kind(db);
1842 match kind {
1843 SyntaxKind::OptionTerminalColonColonEmpty => OptionTerminalColonColon::Empty(
1844 OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1845 ),
1846 SyntaxKind::TerminalColonColon => OptionTerminalColonColon::TerminalColonColon(
1847 TerminalColonColon::from_syntax_node(db, node),
1848 ),
1849 _ => panic!(
1850 "Unexpected syntax kind {:?} when constructing {}.",
1851 kind, "OptionTerminalColonColon"
1852 ),
1853 }
1854 }
1855 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1856 let kind = node.kind(db);
1857 match kind {
1858 SyntaxKind::OptionTerminalColonColonEmpty => Some(OptionTerminalColonColon::Empty(
1859 OptionTerminalColonColonEmpty::from_syntax_node(db, node),
1860 )),
1861 SyntaxKind::TerminalColonColon => Some(OptionTerminalColonColon::TerminalColonColon(
1862 TerminalColonColon::from_syntax_node(db, node),
1863 )),
1864 _ => None,
1865 }
1866 }
1867 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1868 match self {
1869 OptionTerminalColonColon::Empty(x) => x.as_syntax_node(),
1870 OptionTerminalColonColon::TerminalColonColon(x) => x.as_syntax_node(),
1871 }
1872 }
1873 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1874 OptionTerminalColonColonPtr(self.as_syntax_node().stable_ptr(db))
1875 }
1876}
1877impl<'db> OptionTerminalColonColon<'db> {
1878 pub fn is_variant(kind: SyntaxKind) -> bool {
1880 matches!(kind, SyntaxKind::OptionTerminalColonColonEmpty | SyntaxKind::TerminalColonColon)
1881 }
1882}
1883#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1884pub struct OptionTerminalColonColonEmpty<'db> {
1885 node: SyntaxNode<'db>,
1886}
1887impl<'db> OptionTerminalColonColonEmpty<'db> {
1888 pub fn new_green(db: &'db dyn Database) -> OptionTerminalColonColonEmptyGreen<'db> {
1889 let children = [];
1890 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1891 OptionTerminalColonColonEmptyGreen(
1892 GreenNode {
1893 kind: SyntaxKind::OptionTerminalColonColonEmpty,
1894 details: GreenNodeDetails::Node { children: children.into(), width },
1895 }
1896 .intern(db),
1897 )
1898 }
1899}
1900impl<'db> OptionTerminalColonColonEmpty<'db> {}
1901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1902pub struct OptionTerminalColonColonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
1903impl<'db> OptionTerminalColonColonEmptyPtr<'db> {}
1904impl<'db> TypedStablePtr<'db> for OptionTerminalColonColonEmptyPtr<'db> {
1905 type SyntaxNode = OptionTerminalColonColonEmpty<'db>;
1906 fn untyped(self) -> SyntaxStablePtrId<'db> {
1907 self.0
1908 }
1909 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalColonColonEmpty<'db> {
1910 OptionTerminalColonColonEmpty::from_syntax_node(db, self.0.lookup(db))
1911 }
1912}
1913impl<'db> From<OptionTerminalColonColonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
1914 fn from(ptr: OptionTerminalColonColonEmptyPtr<'db>) -> Self {
1915 ptr.untyped()
1916 }
1917}
1918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1919pub struct OptionTerminalColonColonEmptyGreen<'db>(pub GreenId<'db>);
1920impl<'db> TypedSyntaxNode<'db> for OptionTerminalColonColonEmpty<'db> {
1921 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalColonColonEmpty);
1922 type StablePtr = OptionTerminalColonColonEmptyPtr<'db>;
1923 type Green = OptionTerminalColonColonEmptyGreen<'db>;
1924 fn missing(db: &'db dyn Database) -> Self::Green {
1925 OptionTerminalColonColonEmptyGreen(
1926 GreenNode {
1927 kind: SyntaxKind::OptionTerminalColonColonEmpty,
1928 details: GreenNodeDetails::Node {
1929 children: [].into(),
1930 width: TextWidth::default(),
1931 },
1932 }
1933 .intern(db),
1934 )
1935 }
1936 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
1937 let kind = node.kind(db);
1938 assert_eq!(
1939 kind,
1940 SyntaxKind::OptionTerminalColonColonEmpty,
1941 "Unexpected SyntaxKind {:?}. Expected {:?}.",
1942 kind,
1943 SyntaxKind::OptionTerminalColonColonEmpty
1944 );
1945 Self { node }
1946 }
1947 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
1948 let kind = node.kind(db);
1949 if kind == SyntaxKind::OptionTerminalColonColonEmpty {
1950 Some(Self::from_syntax_node(db, node))
1951 } else {
1952 None
1953 }
1954 }
1955 fn as_syntax_node(&self) -> SyntaxNode<'db> {
1956 self.node
1957 }
1958 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
1959 OptionTerminalColonColonEmptyPtr(self.node.stable_ptr(db))
1960 }
1961}
1962#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
1963pub struct PathSegmentWithGenericArgs<'db> {
1964 node: SyntaxNode<'db>,
1965}
1966impl<'db> PathSegmentWithGenericArgs<'db> {
1967 pub const INDEX_IDENT: usize = 0;
1968 pub const INDEX_SEPARATOR: usize = 1;
1969 pub const INDEX_GENERIC_ARGS: usize = 2;
1970 pub fn new_green(
1971 db: &'db dyn Database,
1972 ident: TerminalIdentifierGreen<'db>,
1973 separator: OptionTerminalColonColonGreen<'db>,
1974 generic_args: GenericArgsGreen<'db>,
1975 ) -> PathSegmentWithGenericArgsGreen<'db> {
1976 let children = [ident.0, separator.0, generic_args.0];
1977 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
1978 PathSegmentWithGenericArgsGreen(
1979 GreenNode {
1980 kind: SyntaxKind::PathSegmentWithGenericArgs,
1981 details: GreenNodeDetails::Node { children: children.into(), width },
1982 }
1983 .intern(db),
1984 )
1985 }
1986}
1987impl<'db> PathSegmentWithGenericArgs<'db> {
1988 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
1989 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
1990 }
1991 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalColonColon<'db> {
1992 OptionTerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
1993 }
1994 pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgs<'db> {
1995 GenericArgs::from_syntax_node(db, self.node.get_children(db)[2])
1996 }
1997}
1998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
1999pub struct PathSegmentWithGenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
2000impl<'db> PathSegmentWithGenericArgsPtr<'db> {}
2001impl<'db> TypedStablePtr<'db> for PathSegmentWithGenericArgsPtr<'db> {
2002 type SyntaxNode = PathSegmentWithGenericArgs<'db>;
2003 fn untyped(self) -> SyntaxStablePtrId<'db> {
2004 self.0
2005 }
2006 fn lookup(&self, db: &'db dyn Database) -> PathSegmentWithGenericArgs<'db> {
2007 PathSegmentWithGenericArgs::from_syntax_node(db, self.0.lookup(db))
2008 }
2009}
2010impl<'db> From<PathSegmentWithGenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
2011 fn from(ptr: PathSegmentWithGenericArgsPtr<'db>) -> Self {
2012 ptr.untyped()
2013 }
2014}
2015#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2016pub struct PathSegmentWithGenericArgsGreen<'db>(pub GreenId<'db>);
2017impl<'db> TypedSyntaxNode<'db> for PathSegmentWithGenericArgs<'db> {
2018 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentWithGenericArgs);
2019 type StablePtr = PathSegmentWithGenericArgsPtr<'db>;
2020 type Green = PathSegmentWithGenericArgsGreen<'db>;
2021 fn missing(db: &'db dyn Database) -> Self::Green {
2022 PathSegmentWithGenericArgsGreen(
2023 GreenNode {
2024 kind: SyntaxKind::PathSegmentWithGenericArgs,
2025 details: GreenNodeDetails::Node {
2026 children: [
2027 TerminalIdentifier::missing(db).0,
2028 OptionTerminalColonColon::missing(db).0,
2029 GenericArgs::missing(db).0,
2030 ]
2031 .into(),
2032 width: TextWidth::default(),
2033 },
2034 }
2035 .intern(db),
2036 )
2037 }
2038 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2039 let kind = node.kind(db);
2040 assert_eq!(
2041 kind,
2042 SyntaxKind::PathSegmentWithGenericArgs,
2043 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2044 kind,
2045 SyntaxKind::PathSegmentWithGenericArgs
2046 );
2047 Self { node }
2048 }
2049 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2050 let kind = node.kind(db);
2051 if kind == SyntaxKind::PathSegmentWithGenericArgs {
2052 Some(Self::from_syntax_node(db, node))
2053 } else {
2054 None
2055 }
2056 }
2057 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2058 self.node
2059 }
2060 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2061 PathSegmentWithGenericArgsPtr(self.node.stable_ptr(db))
2062 }
2063}
2064#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2065pub struct ExprPath<'db> {
2066 node: SyntaxNode<'db>,
2067}
2068impl<'db> ExprPath<'db> {
2069 pub const INDEX_DOLLAR: usize = 0;
2070 pub const INDEX_SEGMENTS: usize = 1;
2071 pub fn new_green(
2072 db: &'db dyn Database,
2073 dollar: OptionTerminalDollarGreen<'db>,
2074 segments: ExprPathInnerGreen<'db>,
2075 ) -> ExprPathGreen<'db> {
2076 let children = [dollar.0, segments.0];
2077 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2078 ExprPathGreen(
2079 GreenNode {
2080 kind: SyntaxKind::ExprPath,
2081 details: GreenNodeDetails::Node { children: children.into(), width },
2082 }
2083 .intern(db),
2084 )
2085 }
2086}
2087impl<'db> ExprPath<'db> {
2088 pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
2089 OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
2090 }
2091 pub fn segments(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2092 ExprPathInner::from_syntax_node(db, self.node.get_children(db)[1])
2093 }
2094}
2095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2096pub struct ExprPathPtr<'db>(pub SyntaxStablePtrId<'db>);
2097impl<'db> ExprPathPtr<'db> {}
2098impl<'db> TypedStablePtr<'db> for ExprPathPtr<'db> {
2099 type SyntaxNode = ExprPath<'db>;
2100 fn untyped(self) -> SyntaxStablePtrId<'db> {
2101 self.0
2102 }
2103 fn lookup(&self, db: &'db dyn Database) -> ExprPath<'db> {
2104 ExprPath::from_syntax_node(db, self.0.lookup(db))
2105 }
2106}
2107impl<'db> From<ExprPathPtr<'db>> for SyntaxStablePtrId<'db> {
2108 fn from(ptr: ExprPathPtr<'db>) -> Self {
2109 ptr.untyped()
2110 }
2111}
2112#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2113pub struct ExprPathGreen<'db>(pub GreenId<'db>);
2114impl<'db> TypedSyntaxNode<'db> for ExprPath<'db> {
2115 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPath);
2116 type StablePtr = ExprPathPtr<'db>;
2117 type Green = ExprPathGreen<'db>;
2118 fn missing(db: &'db dyn Database) -> Self::Green {
2119 ExprPathGreen(
2120 GreenNode {
2121 kind: SyntaxKind::ExprPath,
2122 details: GreenNodeDetails::Node {
2123 children: [OptionTerminalDollar::missing(db).0, ExprPathInner::missing(db).0]
2124 .into(),
2125 width: TextWidth::default(),
2126 },
2127 }
2128 .intern(db),
2129 )
2130 }
2131 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2132 let kind = node.kind(db);
2133 assert_eq!(
2134 kind,
2135 SyntaxKind::ExprPath,
2136 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2137 kind,
2138 SyntaxKind::ExprPath
2139 );
2140 Self { node }
2141 }
2142 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2143 let kind = node.kind(db);
2144 if kind == SyntaxKind::ExprPath { Some(Self::from_syntax_node(db, node)) } else { None }
2145 }
2146 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2147 self.node
2148 }
2149 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2150 ExprPathPtr(self.node.stable_ptr(db))
2151 }
2152}
2153#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2154pub enum OptionTerminalDollar<'db> {
2155 Empty(OptionTerminalDollarEmpty<'db>),
2156 TerminalDollar(TerminalDollar<'db>),
2157}
2158#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2159pub struct OptionTerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
2160impl<'db> TypedStablePtr<'db> for OptionTerminalDollarPtr<'db> {
2161 type SyntaxNode = OptionTerminalDollar<'db>;
2162 fn untyped(self) -> SyntaxStablePtrId<'db> {
2163 self.0
2164 }
2165 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2166 OptionTerminalDollar::from_syntax_node(db, self.0.lookup(db))
2167 }
2168}
2169impl<'db> From<OptionTerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
2170 fn from(ptr: OptionTerminalDollarPtr<'db>) -> Self {
2171 ptr.untyped()
2172 }
2173}
2174impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for OptionTerminalDollarPtr<'db> {
2175 fn from(value: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2176 Self(value.0)
2177 }
2178}
2179impl<'db> From<TerminalDollarPtr<'db>> for OptionTerminalDollarPtr<'db> {
2180 fn from(value: TerminalDollarPtr<'db>) -> Self {
2181 Self(value.0)
2182 }
2183}
2184impl<'db> From<OptionTerminalDollarEmptyGreen<'db>> for OptionTerminalDollarGreen<'db> {
2185 fn from(value: OptionTerminalDollarEmptyGreen<'db>) -> Self {
2186 Self(value.0)
2187 }
2188}
2189impl<'db> From<TerminalDollarGreen<'db>> for OptionTerminalDollarGreen<'db> {
2190 fn from(value: TerminalDollarGreen<'db>) -> Self {
2191 Self(value.0)
2192 }
2193}
2194#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2195pub struct OptionTerminalDollarGreen<'db>(pub GreenId<'db>);
2196impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollar<'db> {
2197 const OPTIONAL_KIND: Option<SyntaxKind> = None;
2198 type StablePtr = OptionTerminalDollarPtr<'db>;
2199 type Green = OptionTerminalDollarGreen<'db>;
2200 fn missing(db: &'db dyn Database) -> Self::Green {
2201 panic!("No missing variant.");
2202 }
2203 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2204 let kind = node.kind(db);
2205 match kind {
2206 SyntaxKind::OptionTerminalDollarEmpty => {
2207 OptionTerminalDollar::Empty(OptionTerminalDollarEmpty::from_syntax_node(db, node))
2208 }
2209 SyntaxKind::TerminalDollar => {
2210 OptionTerminalDollar::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
2211 }
2212 _ => panic!(
2213 "Unexpected syntax kind {:?} when constructing {}.",
2214 kind, "OptionTerminalDollar"
2215 ),
2216 }
2217 }
2218 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2219 let kind = node.kind(db);
2220 match kind {
2221 SyntaxKind::OptionTerminalDollarEmpty => Some(OptionTerminalDollar::Empty(
2222 OptionTerminalDollarEmpty::from_syntax_node(db, node),
2223 )),
2224 SyntaxKind::TerminalDollar => Some(OptionTerminalDollar::TerminalDollar(
2225 TerminalDollar::from_syntax_node(db, node),
2226 )),
2227 _ => None,
2228 }
2229 }
2230 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2231 match self {
2232 OptionTerminalDollar::Empty(x) => x.as_syntax_node(),
2233 OptionTerminalDollar::TerminalDollar(x) => x.as_syntax_node(),
2234 }
2235 }
2236 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2237 OptionTerminalDollarPtr(self.as_syntax_node().stable_ptr(db))
2238 }
2239}
2240impl<'db> OptionTerminalDollar<'db> {
2241 pub fn is_variant(kind: SyntaxKind) -> bool {
2243 matches!(kind, SyntaxKind::OptionTerminalDollarEmpty | SyntaxKind::TerminalDollar)
2244 }
2245}
2246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2247pub struct OptionTerminalDollarEmpty<'db> {
2248 node: SyntaxNode<'db>,
2249}
2250impl<'db> OptionTerminalDollarEmpty<'db> {
2251 pub fn new_green(db: &'db dyn Database) -> OptionTerminalDollarEmptyGreen<'db> {
2252 let children = [];
2253 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2254 OptionTerminalDollarEmptyGreen(
2255 GreenNode {
2256 kind: SyntaxKind::OptionTerminalDollarEmpty,
2257 details: GreenNodeDetails::Node { children: children.into(), width },
2258 }
2259 .intern(db),
2260 )
2261 }
2262}
2263impl<'db> OptionTerminalDollarEmpty<'db> {}
2264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2265pub struct OptionTerminalDollarEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
2266impl<'db> OptionTerminalDollarEmptyPtr<'db> {}
2267impl<'db> TypedStablePtr<'db> for OptionTerminalDollarEmptyPtr<'db> {
2268 type SyntaxNode = OptionTerminalDollarEmpty<'db>;
2269 fn untyped(self) -> SyntaxStablePtrId<'db> {
2270 self.0
2271 }
2272 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalDollarEmpty<'db> {
2273 OptionTerminalDollarEmpty::from_syntax_node(db, self.0.lookup(db))
2274 }
2275}
2276impl<'db> From<OptionTerminalDollarEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
2277 fn from(ptr: OptionTerminalDollarEmptyPtr<'db>) -> Self {
2278 ptr.untyped()
2279 }
2280}
2281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2282pub struct OptionTerminalDollarEmptyGreen<'db>(pub GreenId<'db>);
2283impl<'db> TypedSyntaxNode<'db> for OptionTerminalDollarEmpty<'db> {
2284 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalDollarEmpty);
2285 type StablePtr = OptionTerminalDollarEmptyPtr<'db>;
2286 type Green = OptionTerminalDollarEmptyGreen<'db>;
2287 fn missing(db: &'db dyn Database) -> Self::Green {
2288 OptionTerminalDollarEmptyGreen(
2289 GreenNode {
2290 kind: SyntaxKind::OptionTerminalDollarEmpty,
2291 details: GreenNodeDetails::Node {
2292 children: [].into(),
2293 width: TextWidth::default(),
2294 },
2295 }
2296 .intern(db),
2297 )
2298 }
2299 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2300 let kind = node.kind(db);
2301 assert_eq!(
2302 kind,
2303 SyntaxKind::OptionTerminalDollarEmpty,
2304 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2305 kind,
2306 SyntaxKind::OptionTerminalDollarEmpty
2307 );
2308 Self { node }
2309 }
2310 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2311 let kind = node.kind(db);
2312 if kind == SyntaxKind::OptionTerminalDollarEmpty {
2313 Some(Self::from_syntax_node(db, node))
2314 } else {
2315 None
2316 }
2317 }
2318 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2319 self.node
2320 }
2321 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2322 OptionTerminalDollarEmptyPtr(self.node.stable_ptr(db))
2323 }
2324}
2325#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2326pub struct PathSegmentMissing<'db> {
2327 node: SyntaxNode<'db>,
2328}
2329impl<'db> PathSegmentMissing<'db> {
2330 pub const INDEX_IDENT: usize = 0;
2331 pub fn new_green(
2332 db: &'db dyn Database,
2333 ident: TerminalIdentifierGreen<'db>,
2334 ) -> PathSegmentMissingGreen<'db> {
2335 let children = [ident.0];
2336 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2337 PathSegmentMissingGreen(
2338 GreenNode {
2339 kind: SyntaxKind::PathSegmentMissing,
2340 details: GreenNodeDetails::Node { children: children.into(), width },
2341 }
2342 .intern(db),
2343 )
2344 }
2345}
2346impl<'db> PathSegmentMissing<'db> {
2347 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
2348 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
2349 }
2350}
2351#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2352pub struct PathSegmentMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
2353impl<'db> PathSegmentMissingPtr<'db> {}
2354impl<'db> TypedStablePtr<'db> for PathSegmentMissingPtr<'db> {
2355 type SyntaxNode = PathSegmentMissing<'db>;
2356 fn untyped(self) -> SyntaxStablePtrId<'db> {
2357 self.0
2358 }
2359 fn lookup(&self, db: &'db dyn Database) -> PathSegmentMissing<'db> {
2360 PathSegmentMissing::from_syntax_node(db, self.0.lookup(db))
2361 }
2362}
2363impl<'db> From<PathSegmentMissingPtr<'db>> for SyntaxStablePtrId<'db> {
2364 fn from(ptr: PathSegmentMissingPtr<'db>) -> Self {
2365 ptr.untyped()
2366 }
2367}
2368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2369pub struct PathSegmentMissingGreen<'db>(pub GreenId<'db>);
2370impl<'db> TypedSyntaxNode<'db> for PathSegmentMissing<'db> {
2371 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PathSegmentMissing);
2372 type StablePtr = PathSegmentMissingPtr<'db>;
2373 type Green = PathSegmentMissingGreen<'db>;
2374 fn missing(db: &'db dyn Database) -> Self::Green {
2375 PathSegmentMissingGreen(
2376 GreenNode {
2377 kind: SyntaxKind::PathSegmentMissing,
2378 details: GreenNodeDetails::Node {
2379 children: [TerminalIdentifier::missing(db).0].into(),
2380 width: TextWidth::default(),
2381 },
2382 }
2383 .intern(db),
2384 )
2385 }
2386 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2387 let kind = node.kind(db);
2388 assert_eq!(
2389 kind,
2390 SyntaxKind::PathSegmentMissing,
2391 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2392 kind,
2393 SyntaxKind::PathSegmentMissing
2394 );
2395 Self { node }
2396 }
2397 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2398 let kind = node.kind(db);
2399 if kind == SyntaxKind::PathSegmentMissing {
2400 Some(Self::from_syntax_node(db, node))
2401 } else {
2402 None
2403 }
2404 }
2405 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2406 self.node
2407 }
2408 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2409 PathSegmentMissingPtr(self.node.stable_ptr(db))
2410 }
2411}
2412#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2413pub struct ExprPathInner<'db>(ElementList<'db, PathSegment<'db>, 2>);
2414impl<'db> Deref for ExprPathInner<'db> {
2415 type Target = ElementList<'db, PathSegment<'db>, 2>;
2416 fn deref(&self) -> &Self::Target {
2417 &self.0
2418 }
2419}
2420impl<'db> ExprPathInner<'db> {
2421 pub fn new_green(
2422 db: &'db dyn Database,
2423 children: &[ExprPathInnerElementOrSeparatorGreen<'db>],
2424 ) -> ExprPathInnerGreen<'db> {
2425 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
2426 ExprPathInnerGreen(
2427 GreenNode {
2428 kind: SyntaxKind::ExprPathInner,
2429 details: GreenNodeDetails::Node {
2430 children: children.iter().map(|x| x.id()).collect(),
2431 width,
2432 },
2433 }
2434 .intern(db),
2435 )
2436 }
2437}
2438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2439pub struct ExprPathInnerPtr<'db>(pub SyntaxStablePtrId<'db>);
2440impl<'db> TypedStablePtr<'db> for ExprPathInnerPtr<'db> {
2441 type SyntaxNode = ExprPathInner<'db>;
2442 fn untyped(self) -> SyntaxStablePtrId<'db> {
2443 self.0
2444 }
2445 fn lookup(&self, db: &'db dyn Database) -> ExprPathInner<'db> {
2446 ExprPathInner::from_syntax_node(db, self.0.lookup(db))
2447 }
2448}
2449impl<'db> From<ExprPathInnerPtr<'db>> for SyntaxStablePtrId<'db> {
2450 fn from(ptr: ExprPathInnerPtr<'db>) -> Self {
2451 ptr.untyped()
2452 }
2453}
2454#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2455pub enum ExprPathInnerElementOrSeparatorGreen<'db> {
2456 Separator(TerminalColonColonGreen<'db>),
2457 Element(PathSegmentGreen<'db>),
2458}
2459impl<'db> From<TerminalColonColonGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2460 fn from(value: TerminalColonColonGreen<'db>) -> Self {
2461 ExprPathInnerElementOrSeparatorGreen::Separator(value)
2462 }
2463}
2464impl<'db> From<PathSegmentGreen<'db>> for ExprPathInnerElementOrSeparatorGreen<'db> {
2465 fn from(value: PathSegmentGreen<'db>) -> Self {
2466 ExprPathInnerElementOrSeparatorGreen::Element(value)
2467 }
2468}
2469impl<'db> ExprPathInnerElementOrSeparatorGreen<'db> {
2470 fn id(&self) -> GreenId<'db> {
2471 match self {
2472 ExprPathInnerElementOrSeparatorGreen::Separator(green) => green.0,
2473 ExprPathInnerElementOrSeparatorGreen::Element(green) => green.0,
2474 }
2475 }
2476}
2477#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2478pub struct ExprPathInnerGreen<'db>(pub GreenId<'db>);
2479impl<'db> TypedSyntaxNode<'db> for ExprPathInner<'db> {
2480 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprPathInner);
2481 type StablePtr = ExprPathInnerPtr<'db>;
2482 type Green = ExprPathInnerGreen<'db>;
2483 fn missing(db: &'db dyn Database) -> Self::Green {
2484 ExprPathInnerGreen(
2485 GreenNode {
2486 kind: SyntaxKind::ExprPathInner,
2487 details: GreenNodeDetails::Node {
2488 children: [].into(),
2489 width: TextWidth::default(),
2490 },
2491 }
2492 .intern(db),
2493 )
2494 }
2495 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2496 Self(ElementList::new(node))
2497 }
2498 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2499 if node.kind(db) == SyntaxKind::ExprPathInner {
2500 Some(Self(ElementList::new(node)))
2501 } else {
2502 None
2503 }
2504 }
2505 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2506 self.node
2507 }
2508 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2509 ExprPathInnerPtr(self.node.stable_ptr(db))
2510 }
2511}
2512#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2513pub struct ExprParenthesized<'db> {
2514 node: SyntaxNode<'db>,
2515}
2516impl<'db> ExprParenthesized<'db> {
2517 pub const INDEX_LPAREN: usize = 0;
2518 pub const INDEX_EXPR: usize = 1;
2519 pub const INDEX_RPAREN: usize = 2;
2520 pub fn new_green(
2521 db: &'db dyn Database,
2522 lparen: TerminalLParenGreen<'db>,
2523 expr: ExprGreen<'db>,
2524 rparen: TerminalRParenGreen<'db>,
2525 ) -> ExprParenthesizedGreen<'db> {
2526 let children = [lparen.0, expr.0, rparen.0];
2527 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2528 ExprParenthesizedGreen(
2529 GreenNode {
2530 kind: SyntaxKind::ExprParenthesized,
2531 details: GreenNodeDetails::Node { children: children.into(), width },
2532 }
2533 .intern(db),
2534 )
2535 }
2536}
2537impl<'db> ExprParenthesized<'db> {
2538 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
2539 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
2540 }
2541 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2542 Expr::from_syntax_node(db, self.node.get_children(db)[1])
2543 }
2544 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
2545 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
2546 }
2547}
2548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2549pub struct ExprParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
2550impl<'db> ExprParenthesizedPtr<'db> {}
2551impl<'db> TypedStablePtr<'db> for ExprParenthesizedPtr<'db> {
2552 type SyntaxNode = ExprParenthesized<'db>;
2553 fn untyped(self) -> SyntaxStablePtrId<'db> {
2554 self.0
2555 }
2556 fn lookup(&self, db: &'db dyn Database) -> ExprParenthesized<'db> {
2557 ExprParenthesized::from_syntax_node(db, self.0.lookup(db))
2558 }
2559}
2560impl<'db> From<ExprParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
2561 fn from(ptr: ExprParenthesizedPtr<'db>) -> Self {
2562 ptr.untyped()
2563 }
2564}
2565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2566pub struct ExprParenthesizedGreen<'db>(pub GreenId<'db>);
2567impl<'db> TypedSyntaxNode<'db> for ExprParenthesized<'db> {
2568 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprParenthesized);
2569 type StablePtr = ExprParenthesizedPtr<'db>;
2570 type Green = ExprParenthesizedGreen<'db>;
2571 fn missing(db: &'db dyn Database) -> Self::Green {
2572 ExprParenthesizedGreen(
2573 GreenNode {
2574 kind: SyntaxKind::ExprParenthesized,
2575 details: GreenNodeDetails::Node {
2576 children: [
2577 TerminalLParen::missing(db).0,
2578 Expr::missing(db).0,
2579 TerminalRParen::missing(db).0,
2580 ]
2581 .into(),
2582 width: TextWidth::default(),
2583 },
2584 }
2585 .intern(db),
2586 )
2587 }
2588 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2589 let kind = node.kind(db);
2590 assert_eq!(
2591 kind,
2592 SyntaxKind::ExprParenthesized,
2593 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2594 kind,
2595 SyntaxKind::ExprParenthesized
2596 );
2597 Self { node }
2598 }
2599 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2600 let kind = node.kind(db);
2601 if kind == SyntaxKind::ExprParenthesized {
2602 Some(Self::from_syntax_node(db, node))
2603 } else {
2604 None
2605 }
2606 }
2607 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2608 self.node
2609 }
2610 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2611 ExprParenthesizedPtr(self.node.stable_ptr(db))
2612 }
2613}
2614#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2615pub struct ExprUnary<'db> {
2616 node: SyntaxNode<'db>,
2617}
2618impl<'db> ExprUnary<'db> {
2619 pub const INDEX_OP: usize = 0;
2620 pub const INDEX_EXPR: usize = 1;
2621 pub fn new_green(
2622 db: &'db dyn Database,
2623 op: UnaryOperatorGreen<'db>,
2624 expr: ExprGreen<'db>,
2625 ) -> ExprUnaryGreen<'db> {
2626 let children = [op.0, expr.0];
2627 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2628 ExprUnaryGreen(
2629 GreenNode {
2630 kind: SyntaxKind::ExprUnary,
2631 details: GreenNodeDetails::Node { children: children.into(), width },
2632 }
2633 .intern(db),
2634 )
2635 }
2636}
2637impl<'db> ExprUnary<'db> {
2638 pub fn op(&self, db: &'db dyn Database) -> UnaryOperator<'db> {
2639 UnaryOperator::from_syntax_node(db, self.node.get_children(db)[0])
2640 }
2641 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
2642 Expr::from_syntax_node(db, self.node.get_children(db)[1])
2643 }
2644}
2645#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2646pub struct ExprUnaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2647impl<'db> ExprUnaryPtr<'db> {}
2648impl<'db> TypedStablePtr<'db> for ExprUnaryPtr<'db> {
2649 type SyntaxNode = ExprUnary<'db>;
2650 fn untyped(self) -> SyntaxStablePtrId<'db> {
2651 self.0
2652 }
2653 fn lookup(&self, db: &'db dyn Database) -> ExprUnary<'db> {
2654 ExprUnary::from_syntax_node(db, self.0.lookup(db))
2655 }
2656}
2657impl<'db> From<ExprUnaryPtr<'db>> for SyntaxStablePtrId<'db> {
2658 fn from(ptr: ExprUnaryPtr<'db>) -> Self {
2659 ptr.untyped()
2660 }
2661}
2662#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2663pub struct ExprUnaryGreen<'db>(pub GreenId<'db>);
2664impl<'db> TypedSyntaxNode<'db> for ExprUnary<'db> {
2665 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprUnary);
2666 type StablePtr = ExprUnaryPtr<'db>;
2667 type Green = ExprUnaryGreen<'db>;
2668 fn missing(db: &'db dyn Database) -> Self::Green {
2669 ExprUnaryGreen(
2670 GreenNode {
2671 kind: SyntaxKind::ExprUnary,
2672 details: GreenNodeDetails::Node {
2673 children: [UnaryOperator::missing(db).0, Expr::missing(db).0].into(),
2674 width: TextWidth::default(),
2675 },
2676 }
2677 .intern(db),
2678 )
2679 }
2680 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2681 let kind = node.kind(db);
2682 assert_eq!(
2683 kind,
2684 SyntaxKind::ExprUnary,
2685 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2686 kind,
2687 SyntaxKind::ExprUnary
2688 );
2689 Self { node }
2690 }
2691 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2692 let kind = node.kind(db);
2693 if kind == SyntaxKind::ExprUnary { Some(Self::from_syntax_node(db, node)) } else { None }
2694 }
2695 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2696 self.node
2697 }
2698 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2699 ExprUnaryPtr(self.node.stable_ptr(db))
2700 }
2701}
2702#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2703pub enum UnaryOperator<'db> {
2704 Not(TerminalNot<'db>),
2705 BitNot(TerminalBitNot<'db>),
2706 Minus(TerminalMinus<'db>),
2707 At(TerminalAt<'db>),
2708 Desnap(TerminalMul<'db>),
2709 Reference(TerminalAnd<'db>),
2710}
2711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2712pub struct UnaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2713impl<'db> TypedStablePtr<'db> for UnaryOperatorPtr<'db> {
2714 type SyntaxNode = UnaryOperator<'db>;
2715 fn untyped(self) -> SyntaxStablePtrId<'db> {
2716 self.0
2717 }
2718 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
2719 UnaryOperator::from_syntax_node(db, self.0.lookup(db))
2720 }
2721}
2722impl<'db> From<UnaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
2723 fn from(ptr: UnaryOperatorPtr<'db>) -> Self {
2724 ptr.untyped()
2725 }
2726}
2727impl<'db> From<TerminalNotPtr<'db>> for UnaryOperatorPtr<'db> {
2728 fn from(value: TerminalNotPtr<'db>) -> Self {
2729 Self(value.0)
2730 }
2731}
2732impl<'db> From<TerminalBitNotPtr<'db>> for UnaryOperatorPtr<'db> {
2733 fn from(value: TerminalBitNotPtr<'db>) -> Self {
2734 Self(value.0)
2735 }
2736}
2737impl<'db> From<TerminalMinusPtr<'db>> for UnaryOperatorPtr<'db> {
2738 fn from(value: TerminalMinusPtr<'db>) -> Self {
2739 Self(value.0)
2740 }
2741}
2742impl<'db> From<TerminalAtPtr<'db>> for UnaryOperatorPtr<'db> {
2743 fn from(value: TerminalAtPtr<'db>) -> Self {
2744 Self(value.0)
2745 }
2746}
2747impl<'db> From<TerminalMulPtr<'db>> for UnaryOperatorPtr<'db> {
2748 fn from(value: TerminalMulPtr<'db>) -> Self {
2749 Self(value.0)
2750 }
2751}
2752impl<'db> From<TerminalAndPtr<'db>> for UnaryOperatorPtr<'db> {
2753 fn from(value: TerminalAndPtr<'db>) -> Self {
2754 Self(value.0)
2755 }
2756}
2757impl<'db> From<TerminalNotGreen<'db>> for UnaryOperatorGreen<'db> {
2758 fn from(value: TerminalNotGreen<'db>) -> Self {
2759 Self(value.0)
2760 }
2761}
2762impl<'db> From<TerminalBitNotGreen<'db>> for UnaryOperatorGreen<'db> {
2763 fn from(value: TerminalBitNotGreen<'db>) -> Self {
2764 Self(value.0)
2765 }
2766}
2767impl<'db> From<TerminalMinusGreen<'db>> for UnaryOperatorGreen<'db> {
2768 fn from(value: TerminalMinusGreen<'db>) -> Self {
2769 Self(value.0)
2770 }
2771}
2772impl<'db> From<TerminalAtGreen<'db>> for UnaryOperatorGreen<'db> {
2773 fn from(value: TerminalAtGreen<'db>) -> Self {
2774 Self(value.0)
2775 }
2776}
2777impl<'db> From<TerminalMulGreen<'db>> for UnaryOperatorGreen<'db> {
2778 fn from(value: TerminalMulGreen<'db>) -> Self {
2779 Self(value.0)
2780 }
2781}
2782impl<'db> From<TerminalAndGreen<'db>> for UnaryOperatorGreen<'db> {
2783 fn from(value: TerminalAndGreen<'db>) -> Self {
2784 Self(value.0)
2785 }
2786}
2787#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2788pub struct UnaryOperatorGreen<'db>(pub GreenId<'db>);
2789impl<'db> TypedSyntaxNode<'db> for UnaryOperator<'db> {
2790 const OPTIONAL_KIND: Option<SyntaxKind> = None;
2791 type StablePtr = UnaryOperatorPtr<'db>;
2792 type Green = UnaryOperatorGreen<'db>;
2793 fn missing(db: &'db dyn Database) -> Self::Green {
2794 panic!("No missing variant.");
2795 }
2796 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2797 let kind = node.kind(db);
2798 match kind {
2799 SyntaxKind::TerminalNot => UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
2800 SyntaxKind::TerminalBitNot => {
2801 UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node))
2802 }
2803 SyntaxKind::TerminalMinus => {
2804 UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
2805 }
2806 SyntaxKind::TerminalAt => UnaryOperator::At(TerminalAt::from_syntax_node(db, node)),
2807 SyntaxKind::TerminalMul => {
2808 UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node))
2809 }
2810 SyntaxKind::TerminalAnd => {
2811 UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node))
2812 }
2813 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UnaryOperator"),
2814 }
2815 }
2816 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2817 let kind = node.kind(db);
2818 match kind {
2819 SyntaxKind::TerminalNot => {
2820 Some(UnaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
2821 }
2822 SyntaxKind::TerminalBitNot => {
2823 Some(UnaryOperator::BitNot(TerminalBitNot::from_syntax_node(db, node)))
2824 }
2825 SyntaxKind::TerminalMinus => {
2826 Some(UnaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
2827 }
2828 SyntaxKind::TerminalAt => {
2829 Some(UnaryOperator::At(TerminalAt::from_syntax_node(db, node)))
2830 }
2831 SyntaxKind::TerminalMul => {
2832 Some(UnaryOperator::Desnap(TerminalMul::from_syntax_node(db, node)))
2833 }
2834 SyntaxKind::TerminalAnd => {
2835 Some(UnaryOperator::Reference(TerminalAnd::from_syntax_node(db, node)))
2836 }
2837 _ => None,
2838 }
2839 }
2840 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2841 match self {
2842 UnaryOperator::Not(x) => x.as_syntax_node(),
2843 UnaryOperator::BitNot(x) => x.as_syntax_node(),
2844 UnaryOperator::Minus(x) => x.as_syntax_node(),
2845 UnaryOperator::At(x) => x.as_syntax_node(),
2846 UnaryOperator::Desnap(x) => x.as_syntax_node(),
2847 UnaryOperator::Reference(x) => x.as_syntax_node(),
2848 }
2849 }
2850 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2851 UnaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
2852 }
2853}
2854impl<'db> UnaryOperator<'db> {
2855 pub fn is_variant(kind: SyntaxKind) -> bool {
2857 matches!(
2858 kind,
2859 SyntaxKind::TerminalNot
2860 | SyntaxKind::TerminalBitNot
2861 | SyntaxKind::TerminalMinus
2862 | SyntaxKind::TerminalAt
2863 | SyntaxKind::TerminalMul
2864 | SyntaxKind::TerminalAnd
2865 )
2866 }
2867}
2868#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2869pub struct ExprBinary<'db> {
2870 node: SyntaxNode<'db>,
2871}
2872impl<'db> ExprBinary<'db> {
2873 pub const INDEX_LHS: usize = 0;
2874 pub const INDEX_OP: usize = 1;
2875 pub const INDEX_RHS: usize = 2;
2876 pub fn new_green(
2877 db: &'db dyn Database,
2878 lhs: ExprGreen<'db>,
2879 op: BinaryOperatorGreen<'db>,
2880 rhs: ExprGreen<'db>,
2881 ) -> ExprBinaryGreen<'db> {
2882 let children = [lhs.0, op.0, rhs.0];
2883 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
2884 ExprBinaryGreen(
2885 GreenNode {
2886 kind: SyntaxKind::ExprBinary,
2887 details: GreenNodeDetails::Node { children: children.into(), width },
2888 }
2889 .intern(db),
2890 )
2891 }
2892}
2893impl<'db> ExprBinary<'db> {
2894 pub fn lhs(&self, db: &'db dyn Database) -> Expr<'db> {
2895 Expr::from_syntax_node(db, self.node.get_children(db)[0])
2896 }
2897 pub fn op(&self, db: &'db dyn Database) -> BinaryOperator<'db> {
2898 BinaryOperator::from_syntax_node(db, self.node.get_children(db)[1])
2899 }
2900 pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
2901 Expr::from_syntax_node(db, self.node.get_children(db)[2])
2902 }
2903}
2904#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2905pub struct ExprBinaryPtr<'db>(pub SyntaxStablePtrId<'db>);
2906impl<'db> ExprBinaryPtr<'db> {}
2907impl<'db> TypedStablePtr<'db> for ExprBinaryPtr<'db> {
2908 type SyntaxNode = ExprBinary<'db>;
2909 fn untyped(self) -> SyntaxStablePtrId<'db> {
2910 self.0
2911 }
2912 fn lookup(&self, db: &'db dyn Database) -> ExprBinary<'db> {
2913 ExprBinary::from_syntax_node(db, self.0.lookup(db))
2914 }
2915}
2916impl<'db> From<ExprBinaryPtr<'db>> for SyntaxStablePtrId<'db> {
2917 fn from(ptr: ExprBinaryPtr<'db>) -> Self {
2918 ptr.untyped()
2919 }
2920}
2921#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2922pub struct ExprBinaryGreen<'db>(pub GreenId<'db>);
2923impl<'db> TypedSyntaxNode<'db> for ExprBinary<'db> {
2924 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBinary);
2925 type StablePtr = ExprBinaryPtr<'db>;
2926 type Green = ExprBinaryGreen<'db>;
2927 fn missing(db: &'db dyn Database) -> Self::Green {
2928 ExprBinaryGreen(
2929 GreenNode {
2930 kind: SyntaxKind::ExprBinary,
2931 details: GreenNodeDetails::Node {
2932 children: [
2933 Expr::missing(db).0,
2934 BinaryOperator::missing(db).0,
2935 Expr::missing(db).0,
2936 ]
2937 .into(),
2938 width: TextWidth::default(),
2939 },
2940 }
2941 .intern(db),
2942 )
2943 }
2944 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
2945 let kind = node.kind(db);
2946 assert_eq!(
2947 kind,
2948 SyntaxKind::ExprBinary,
2949 "Unexpected SyntaxKind {:?}. Expected {:?}.",
2950 kind,
2951 SyntaxKind::ExprBinary
2952 );
2953 Self { node }
2954 }
2955 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
2956 let kind = node.kind(db);
2957 if kind == SyntaxKind::ExprBinary { Some(Self::from_syntax_node(db, node)) } else { None }
2958 }
2959 fn as_syntax_node(&self) -> SyntaxNode<'db> {
2960 self.node
2961 }
2962 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
2963 ExprBinaryPtr(self.node.stable_ptr(db))
2964 }
2965}
2966#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
2967pub enum BinaryOperator<'db> {
2968 Dot(TerminalDot<'db>),
2969 Not(TerminalNot<'db>),
2970 Mul(TerminalMul<'db>),
2971 MulEq(TerminalMulEq<'db>),
2972 Div(TerminalDiv<'db>),
2973 DivEq(TerminalDivEq<'db>),
2974 Mod(TerminalMod<'db>),
2975 ModEq(TerminalModEq<'db>),
2976 Plus(TerminalPlus<'db>),
2977 PlusEq(TerminalPlusEq<'db>),
2978 Minus(TerminalMinus<'db>),
2979 MinusEq(TerminalMinusEq<'db>),
2980 EqEq(TerminalEqEq<'db>),
2981 Neq(TerminalNeq<'db>),
2982 Eq(TerminalEq<'db>),
2983 And(TerminalAnd<'db>),
2984 AndAnd(TerminalAndAnd<'db>),
2985 Or(TerminalOr<'db>),
2986 OrOr(TerminalOrOr<'db>),
2987 Xor(TerminalXor<'db>),
2988 LE(TerminalLE<'db>),
2989 GE(TerminalGE<'db>),
2990 LT(TerminalLT<'db>),
2991 GT(TerminalGT<'db>),
2992 DotDot(TerminalDotDot<'db>),
2993 DotDotEq(TerminalDotDotEq<'db>),
2994}
2995#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
2996pub struct BinaryOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
2997impl<'db> TypedStablePtr<'db> for BinaryOperatorPtr<'db> {
2998 type SyntaxNode = BinaryOperator<'db>;
2999 fn untyped(self) -> SyntaxStablePtrId<'db> {
3000 self.0
3001 }
3002 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3003 BinaryOperator::from_syntax_node(db, self.0.lookup(db))
3004 }
3005}
3006impl<'db> From<BinaryOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
3007 fn from(ptr: BinaryOperatorPtr<'db>) -> Self {
3008 ptr.untyped()
3009 }
3010}
3011impl<'db> From<TerminalDotPtr<'db>> for BinaryOperatorPtr<'db> {
3012 fn from(value: TerminalDotPtr<'db>) -> Self {
3013 Self(value.0)
3014 }
3015}
3016impl<'db> From<TerminalNotPtr<'db>> for BinaryOperatorPtr<'db> {
3017 fn from(value: TerminalNotPtr<'db>) -> Self {
3018 Self(value.0)
3019 }
3020}
3021impl<'db> From<TerminalMulPtr<'db>> for BinaryOperatorPtr<'db> {
3022 fn from(value: TerminalMulPtr<'db>) -> Self {
3023 Self(value.0)
3024 }
3025}
3026impl<'db> From<TerminalMulEqPtr<'db>> for BinaryOperatorPtr<'db> {
3027 fn from(value: TerminalMulEqPtr<'db>) -> Self {
3028 Self(value.0)
3029 }
3030}
3031impl<'db> From<TerminalDivPtr<'db>> for BinaryOperatorPtr<'db> {
3032 fn from(value: TerminalDivPtr<'db>) -> Self {
3033 Self(value.0)
3034 }
3035}
3036impl<'db> From<TerminalDivEqPtr<'db>> for BinaryOperatorPtr<'db> {
3037 fn from(value: TerminalDivEqPtr<'db>) -> Self {
3038 Self(value.0)
3039 }
3040}
3041impl<'db> From<TerminalModPtr<'db>> for BinaryOperatorPtr<'db> {
3042 fn from(value: TerminalModPtr<'db>) -> Self {
3043 Self(value.0)
3044 }
3045}
3046impl<'db> From<TerminalModEqPtr<'db>> for BinaryOperatorPtr<'db> {
3047 fn from(value: TerminalModEqPtr<'db>) -> Self {
3048 Self(value.0)
3049 }
3050}
3051impl<'db> From<TerminalPlusPtr<'db>> for BinaryOperatorPtr<'db> {
3052 fn from(value: TerminalPlusPtr<'db>) -> Self {
3053 Self(value.0)
3054 }
3055}
3056impl<'db> From<TerminalPlusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3057 fn from(value: TerminalPlusEqPtr<'db>) -> Self {
3058 Self(value.0)
3059 }
3060}
3061impl<'db> From<TerminalMinusPtr<'db>> for BinaryOperatorPtr<'db> {
3062 fn from(value: TerminalMinusPtr<'db>) -> Self {
3063 Self(value.0)
3064 }
3065}
3066impl<'db> From<TerminalMinusEqPtr<'db>> for BinaryOperatorPtr<'db> {
3067 fn from(value: TerminalMinusEqPtr<'db>) -> Self {
3068 Self(value.0)
3069 }
3070}
3071impl<'db> From<TerminalEqEqPtr<'db>> for BinaryOperatorPtr<'db> {
3072 fn from(value: TerminalEqEqPtr<'db>) -> Self {
3073 Self(value.0)
3074 }
3075}
3076impl<'db> From<TerminalNeqPtr<'db>> for BinaryOperatorPtr<'db> {
3077 fn from(value: TerminalNeqPtr<'db>) -> Self {
3078 Self(value.0)
3079 }
3080}
3081impl<'db> From<TerminalEqPtr<'db>> for BinaryOperatorPtr<'db> {
3082 fn from(value: TerminalEqPtr<'db>) -> Self {
3083 Self(value.0)
3084 }
3085}
3086impl<'db> From<TerminalAndPtr<'db>> for BinaryOperatorPtr<'db> {
3087 fn from(value: TerminalAndPtr<'db>) -> Self {
3088 Self(value.0)
3089 }
3090}
3091impl<'db> From<TerminalAndAndPtr<'db>> for BinaryOperatorPtr<'db> {
3092 fn from(value: TerminalAndAndPtr<'db>) -> Self {
3093 Self(value.0)
3094 }
3095}
3096impl<'db> From<TerminalOrPtr<'db>> for BinaryOperatorPtr<'db> {
3097 fn from(value: TerminalOrPtr<'db>) -> Self {
3098 Self(value.0)
3099 }
3100}
3101impl<'db> From<TerminalOrOrPtr<'db>> for BinaryOperatorPtr<'db> {
3102 fn from(value: TerminalOrOrPtr<'db>) -> Self {
3103 Self(value.0)
3104 }
3105}
3106impl<'db> From<TerminalXorPtr<'db>> for BinaryOperatorPtr<'db> {
3107 fn from(value: TerminalXorPtr<'db>) -> Self {
3108 Self(value.0)
3109 }
3110}
3111impl<'db> From<TerminalLEPtr<'db>> for BinaryOperatorPtr<'db> {
3112 fn from(value: TerminalLEPtr<'db>) -> Self {
3113 Self(value.0)
3114 }
3115}
3116impl<'db> From<TerminalGEPtr<'db>> for BinaryOperatorPtr<'db> {
3117 fn from(value: TerminalGEPtr<'db>) -> Self {
3118 Self(value.0)
3119 }
3120}
3121impl<'db> From<TerminalLTPtr<'db>> for BinaryOperatorPtr<'db> {
3122 fn from(value: TerminalLTPtr<'db>) -> Self {
3123 Self(value.0)
3124 }
3125}
3126impl<'db> From<TerminalGTPtr<'db>> for BinaryOperatorPtr<'db> {
3127 fn from(value: TerminalGTPtr<'db>) -> Self {
3128 Self(value.0)
3129 }
3130}
3131impl<'db> From<TerminalDotDotPtr<'db>> for BinaryOperatorPtr<'db> {
3132 fn from(value: TerminalDotDotPtr<'db>) -> Self {
3133 Self(value.0)
3134 }
3135}
3136impl<'db> From<TerminalDotDotEqPtr<'db>> for BinaryOperatorPtr<'db> {
3137 fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
3138 Self(value.0)
3139 }
3140}
3141impl<'db> From<TerminalDotGreen<'db>> for BinaryOperatorGreen<'db> {
3142 fn from(value: TerminalDotGreen<'db>) -> Self {
3143 Self(value.0)
3144 }
3145}
3146impl<'db> From<TerminalNotGreen<'db>> for BinaryOperatorGreen<'db> {
3147 fn from(value: TerminalNotGreen<'db>) -> Self {
3148 Self(value.0)
3149 }
3150}
3151impl<'db> From<TerminalMulGreen<'db>> for BinaryOperatorGreen<'db> {
3152 fn from(value: TerminalMulGreen<'db>) -> Self {
3153 Self(value.0)
3154 }
3155}
3156impl<'db> From<TerminalMulEqGreen<'db>> for BinaryOperatorGreen<'db> {
3157 fn from(value: TerminalMulEqGreen<'db>) -> Self {
3158 Self(value.0)
3159 }
3160}
3161impl<'db> From<TerminalDivGreen<'db>> for BinaryOperatorGreen<'db> {
3162 fn from(value: TerminalDivGreen<'db>) -> Self {
3163 Self(value.0)
3164 }
3165}
3166impl<'db> From<TerminalDivEqGreen<'db>> for BinaryOperatorGreen<'db> {
3167 fn from(value: TerminalDivEqGreen<'db>) -> Self {
3168 Self(value.0)
3169 }
3170}
3171impl<'db> From<TerminalModGreen<'db>> for BinaryOperatorGreen<'db> {
3172 fn from(value: TerminalModGreen<'db>) -> Self {
3173 Self(value.0)
3174 }
3175}
3176impl<'db> From<TerminalModEqGreen<'db>> for BinaryOperatorGreen<'db> {
3177 fn from(value: TerminalModEqGreen<'db>) -> Self {
3178 Self(value.0)
3179 }
3180}
3181impl<'db> From<TerminalPlusGreen<'db>> for BinaryOperatorGreen<'db> {
3182 fn from(value: TerminalPlusGreen<'db>) -> Self {
3183 Self(value.0)
3184 }
3185}
3186impl<'db> From<TerminalPlusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3187 fn from(value: TerminalPlusEqGreen<'db>) -> Self {
3188 Self(value.0)
3189 }
3190}
3191impl<'db> From<TerminalMinusGreen<'db>> for BinaryOperatorGreen<'db> {
3192 fn from(value: TerminalMinusGreen<'db>) -> Self {
3193 Self(value.0)
3194 }
3195}
3196impl<'db> From<TerminalMinusEqGreen<'db>> for BinaryOperatorGreen<'db> {
3197 fn from(value: TerminalMinusEqGreen<'db>) -> Self {
3198 Self(value.0)
3199 }
3200}
3201impl<'db> From<TerminalEqEqGreen<'db>> for BinaryOperatorGreen<'db> {
3202 fn from(value: TerminalEqEqGreen<'db>) -> Self {
3203 Self(value.0)
3204 }
3205}
3206impl<'db> From<TerminalNeqGreen<'db>> for BinaryOperatorGreen<'db> {
3207 fn from(value: TerminalNeqGreen<'db>) -> Self {
3208 Self(value.0)
3209 }
3210}
3211impl<'db> From<TerminalEqGreen<'db>> for BinaryOperatorGreen<'db> {
3212 fn from(value: TerminalEqGreen<'db>) -> Self {
3213 Self(value.0)
3214 }
3215}
3216impl<'db> From<TerminalAndGreen<'db>> for BinaryOperatorGreen<'db> {
3217 fn from(value: TerminalAndGreen<'db>) -> Self {
3218 Self(value.0)
3219 }
3220}
3221impl<'db> From<TerminalAndAndGreen<'db>> for BinaryOperatorGreen<'db> {
3222 fn from(value: TerminalAndAndGreen<'db>) -> Self {
3223 Self(value.0)
3224 }
3225}
3226impl<'db> From<TerminalOrGreen<'db>> for BinaryOperatorGreen<'db> {
3227 fn from(value: TerminalOrGreen<'db>) -> Self {
3228 Self(value.0)
3229 }
3230}
3231impl<'db> From<TerminalOrOrGreen<'db>> for BinaryOperatorGreen<'db> {
3232 fn from(value: TerminalOrOrGreen<'db>) -> Self {
3233 Self(value.0)
3234 }
3235}
3236impl<'db> From<TerminalXorGreen<'db>> for BinaryOperatorGreen<'db> {
3237 fn from(value: TerminalXorGreen<'db>) -> Self {
3238 Self(value.0)
3239 }
3240}
3241impl<'db> From<TerminalLEGreen<'db>> for BinaryOperatorGreen<'db> {
3242 fn from(value: TerminalLEGreen<'db>) -> Self {
3243 Self(value.0)
3244 }
3245}
3246impl<'db> From<TerminalGEGreen<'db>> for BinaryOperatorGreen<'db> {
3247 fn from(value: TerminalGEGreen<'db>) -> Self {
3248 Self(value.0)
3249 }
3250}
3251impl<'db> From<TerminalLTGreen<'db>> for BinaryOperatorGreen<'db> {
3252 fn from(value: TerminalLTGreen<'db>) -> Self {
3253 Self(value.0)
3254 }
3255}
3256impl<'db> From<TerminalGTGreen<'db>> for BinaryOperatorGreen<'db> {
3257 fn from(value: TerminalGTGreen<'db>) -> Self {
3258 Self(value.0)
3259 }
3260}
3261impl<'db> From<TerminalDotDotGreen<'db>> for BinaryOperatorGreen<'db> {
3262 fn from(value: TerminalDotDotGreen<'db>) -> Self {
3263 Self(value.0)
3264 }
3265}
3266impl<'db> From<TerminalDotDotEqGreen<'db>> for BinaryOperatorGreen<'db> {
3267 fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
3268 Self(value.0)
3269 }
3270}
3271#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3272pub struct BinaryOperatorGreen<'db>(pub GreenId<'db>);
3273impl<'db> TypedSyntaxNode<'db> for BinaryOperator<'db> {
3274 const OPTIONAL_KIND: Option<SyntaxKind> = None;
3275 type StablePtr = BinaryOperatorPtr<'db>;
3276 type Green = BinaryOperatorGreen<'db>;
3277 fn missing(db: &'db dyn Database) -> Self::Green {
3278 panic!("No missing variant.");
3279 }
3280 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3281 let kind = node.kind(db);
3282 match kind {
3283 SyntaxKind::TerminalDot => BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)),
3284 SyntaxKind::TerminalNot => BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)),
3285 SyntaxKind::TerminalMul => BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)),
3286 SyntaxKind::TerminalMulEq => {
3287 BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node))
3288 }
3289 SyntaxKind::TerminalDiv => BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)),
3290 SyntaxKind::TerminalDivEq => {
3291 BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node))
3292 }
3293 SyntaxKind::TerminalMod => BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)),
3294 SyntaxKind::TerminalModEq => {
3295 BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node))
3296 }
3297 SyntaxKind::TerminalPlus => {
3298 BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node))
3299 }
3300 SyntaxKind::TerminalPlusEq => {
3301 BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node))
3302 }
3303 SyntaxKind::TerminalMinus => {
3304 BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node))
3305 }
3306 SyntaxKind::TerminalMinusEq => {
3307 BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node))
3308 }
3309 SyntaxKind::TerminalEqEq => {
3310 BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node))
3311 }
3312 SyntaxKind::TerminalNeq => BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)),
3313 SyntaxKind::TerminalEq => BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)),
3314 SyntaxKind::TerminalAnd => BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)),
3315 SyntaxKind::TerminalAndAnd => {
3316 BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node))
3317 }
3318 SyntaxKind::TerminalOr => BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)),
3319 SyntaxKind::TerminalOrOr => {
3320 BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node))
3321 }
3322 SyntaxKind::TerminalXor => BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)),
3323 SyntaxKind::TerminalLE => BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)),
3324 SyntaxKind::TerminalGE => BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)),
3325 SyntaxKind::TerminalLT => BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)),
3326 SyntaxKind::TerminalGT => BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)),
3327 SyntaxKind::TerminalDotDot => {
3328 BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node))
3329 }
3330 SyntaxKind::TerminalDotDotEq => {
3331 BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
3332 }
3333 _ => {
3334 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BinaryOperator")
3335 }
3336 }
3337 }
3338 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3339 let kind = node.kind(db);
3340 match kind {
3341 SyntaxKind::TerminalDot => {
3342 Some(BinaryOperator::Dot(TerminalDot::from_syntax_node(db, node)))
3343 }
3344 SyntaxKind::TerminalNot => {
3345 Some(BinaryOperator::Not(TerminalNot::from_syntax_node(db, node)))
3346 }
3347 SyntaxKind::TerminalMul => {
3348 Some(BinaryOperator::Mul(TerminalMul::from_syntax_node(db, node)))
3349 }
3350 SyntaxKind::TerminalMulEq => {
3351 Some(BinaryOperator::MulEq(TerminalMulEq::from_syntax_node(db, node)))
3352 }
3353 SyntaxKind::TerminalDiv => {
3354 Some(BinaryOperator::Div(TerminalDiv::from_syntax_node(db, node)))
3355 }
3356 SyntaxKind::TerminalDivEq => {
3357 Some(BinaryOperator::DivEq(TerminalDivEq::from_syntax_node(db, node)))
3358 }
3359 SyntaxKind::TerminalMod => {
3360 Some(BinaryOperator::Mod(TerminalMod::from_syntax_node(db, node)))
3361 }
3362 SyntaxKind::TerminalModEq => {
3363 Some(BinaryOperator::ModEq(TerminalModEq::from_syntax_node(db, node)))
3364 }
3365 SyntaxKind::TerminalPlus => {
3366 Some(BinaryOperator::Plus(TerminalPlus::from_syntax_node(db, node)))
3367 }
3368 SyntaxKind::TerminalPlusEq => {
3369 Some(BinaryOperator::PlusEq(TerminalPlusEq::from_syntax_node(db, node)))
3370 }
3371 SyntaxKind::TerminalMinus => {
3372 Some(BinaryOperator::Minus(TerminalMinus::from_syntax_node(db, node)))
3373 }
3374 SyntaxKind::TerminalMinusEq => {
3375 Some(BinaryOperator::MinusEq(TerminalMinusEq::from_syntax_node(db, node)))
3376 }
3377 SyntaxKind::TerminalEqEq => {
3378 Some(BinaryOperator::EqEq(TerminalEqEq::from_syntax_node(db, node)))
3379 }
3380 SyntaxKind::TerminalNeq => {
3381 Some(BinaryOperator::Neq(TerminalNeq::from_syntax_node(db, node)))
3382 }
3383 SyntaxKind::TerminalEq => {
3384 Some(BinaryOperator::Eq(TerminalEq::from_syntax_node(db, node)))
3385 }
3386 SyntaxKind::TerminalAnd => {
3387 Some(BinaryOperator::And(TerminalAnd::from_syntax_node(db, node)))
3388 }
3389 SyntaxKind::TerminalAndAnd => {
3390 Some(BinaryOperator::AndAnd(TerminalAndAnd::from_syntax_node(db, node)))
3391 }
3392 SyntaxKind::TerminalOr => {
3393 Some(BinaryOperator::Or(TerminalOr::from_syntax_node(db, node)))
3394 }
3395 SyntaxKind::TerminalOrOr => {
3396 Some(BinaryOperator::OrOr(TerminalOrOr::from_syntax_node(db, node)))
3397 }
3398 SyntaxKind::TerminalXor => {
3399 Some(BinaryOperator::Xor(TerminalXor::from_syntax_node(db, node)))
3400 }
3401 SyntaxKind::TerminalLE => {
3402 Some(BinaryOperator::LE(TerminalLE::from_syntax_node(db, node)))
3403 }
3404 SyntaxKind::TerminalGE => {
3405 Some(BinaryOperator::GE(TerminalGE::from_syntax_node(db, node)))
3406 }
3407 SyntaxKind::TerminalLT => {
3408 Some(BinaryOperator::LT(TerminalLT::from_syntax_node(db, node)))
3409 }
3410 SyntaxKind::TerminalGT => {
3411 Some(BinaryOperator::GT(TerminalGT::from_syntax_node(db, node)))
3412 }
3413 SyntaxKind::TerminalDotDot => {
3414 Some(BinaryOperator::DotDot(TerminalDotDot::from_syntax_node(db, node)))
3415 }
3416 SyntaxKind::TerminalDotDotEq => {
3417 Some(BinaryOperator::DotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
3418 }
3419 _ => None,
3420 }
3421 }
3422 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3423 match self {
3424 BinaryOperator::Dot(x) => x.as_syntax_node(),
3425 BinaryOperator::Not(x) => x.as_syntax_node(),
3426 BinaryOperator::Mul(x) => x.as_syntax_node(),
3427 BinaryOperator::MulEq(x) => x.as_syntax_node(),
3428 BinaryOperator::Div(x) => x.as_syntax_node(),
3429 BinaryOperator::DivEq(x) => x.as_syntax_node(),
3430 BinaryOperator::Mod(x) => x.as_syntax_node(),
3431 BinaryOperator::ModEq(x) => x.as_syntax_node(),
3432 BinaryOperator::Plus(x) => x.as_syntax_node(),
3433 BinaryOperator::PlusEq(x) => x.as_syntax_node(),
3434 BinaryOperator::Minus(x) => x.as_syntax_node(),
3435 BinaryOperator::MinusEq(x) => x.as_syntax_node(),
3436 BinaryOperator::EqEq(x) => x.as_syntax_node(),
3437 BinaryOperator::Neq(x) => x.as_syntax_node(),
3438 BinaryOperator::Eq(x) => x.as_syntax_node(),
3439 BinaryOperator::And(x) => x.as_syntax_node(),
3440 BinaryOperator::AndAnd(x) => x.as_syntax_node(),
3441 BinaryOperator::Or(x) => x.as_syntax_node(),
3442 BinaryOperator::OrOr(x) => x.as_syntax_node(),
3443 BinaryOperator::Xor(x) => x.as_syntax_node(),
3444 BinaryOperator::LE(x) => x.as_syntax_node(),
3445 BinaryOperator::GE(x) => x.as_syntax_node(),
3446 BinaryOperator::LT(x) => x.as_syntax_node(),
3447 BinaryOperator::GT(x) => x.as_syntax_node(),
3448 BinaryOperator::DotDot(x) => x.as_syntax_node(),
3449 BinaryOperator::DotDotEq(x) => x.as_syntax_node(),
3450 }
3451 }
3452 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3453 BinaryOperatorPtr(self.as_syntax_node().stable_ptr(db))
3454 }
3455}
3456impl<'db> BinaryOperator<'db> {
3457 pub fn is_variant(kind: SyntaxKind) -> bool {
3459 matches!(
3460 kind,
3461 SyntaxKind::TerminalDot
3462 | SyntaxKind::TerminalNot
3463 | SyntaxKind::TerminalMul
3464 | SyntaxKind::TerminalMulEq
3465 | SyntaxKind::TerminalDiv
3466 | SyntaxKind::TerminalDivEq
3467 | SyntaxKind::TerminalMod
3468 | SyntaxKind::TerminalModEq
3469 | SyntaxKind::TerminalPlus
3470 | SyntaxKind::TerminalPlusEq
3471 | SyntaxKind::TerminalMinus
3472 | SyntaxKind::TerminalMinusEq
3473 | SyntaxKind::TerminalEqEq
3474 | SyntaxKind::TerminalNeq
3475 | SyntaxKind::TerminalEq
3476 | SyntaxKind::TerminalAnd
3477 | SyntaxKind::TerminalAndAnd
3478 | SyntaxKind::TerminalOr
3479 | SyntaxKind::TerminalOrOr
3480 | SyntaxKind::TerminalXor
3481 | SyntaxKind::TerminalLE
3482 | SyntaxKind::TerminalGE
3483 | SyntaxKind::TerminalLT
3484 | SyntaxKind::TerminalGT
3485 | SyntaxKind::TerminalDotDot
3486 | SyntaxKind::TerminalDotDotEq
3487 )
3488 }
3489}
3490#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3491pub struct ExprListParenthesized<'db> {
3492 node: SyntaxNode<'db>,
3493}
3494impl<'db> ExprListParenthesized<'db> {
3495 pub const INDEX_LPAREN: usize = 0;
3496 pub const INDEX_EXPRESSIONS: usize = 1;
3497 pub const INDEX_RPAREN: usize = 2;
3498 pub fn new_green(
3499 db: &'db dyn Database,
3500 lparen: TerminalLParenGreen<'db>,
3501 expressions: ExprListGreen<'db>,
3502 rparen: TerminalRParenGreen<'db>,
3503 ) -> ExprListParenthesizedGreen<'db> {
3504 let children = [lparen.0, expressions.0, rparen.0];
3505 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3506 ExprListParenthesizedGreen(
3507 GreenNode {
3508 kind: SyntaxKind::ExprListParenthesized,
3509 details: GreenNodeDetails::Node { children: children.into(), width },
3510 }
3511 .intern(db),
3512 )
3513 }
3514}
3515impl<'db> ExprListParenthesized<'db> {
3516 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3517 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3518 }
3519 pub fn expressions(&self, db: &'db dyn Database) -> ExprList<'db> {
3520 ExprList::from_syntax_node(db, self.node.get_children(db)[1])
3521 }
3522 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3523 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3524 }
3525}
3526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3527pub struct ExprListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3528impl<'db> ExprListParenthesizedPtr<'db> {}
3529impl<'db> TypedStablePtr<'db> for ExprListParenthesizedPtr<'db> {
3530 type SyntaxNode = ExprListParenthesized<'db>;
3531 fn untyped(self) -> SyntaxStablePtrId<'db> {
3532 self.0
3533 }
3534 fn lookup(&self, db: &'db dyn Database) -> ExprListParenthesized<'db> {
3535 ExprListParenthesized::from_syntax_node(db, self.0.lookup(db))
3536 }
3537}
3538impl<'db> From<ExprListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3539 fn from(ptr: ExprListParenthesizedPtr<'db>) -> Self {
3540 ptr.untyped()
3541 }
3542}
3543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3544pub struct ExprListParenthesizedGreen<'db>(pub GreenId<'db>);
3545impl<'db> TypedSyntaxNode<'db> for ExprListParenthesized<'db> {
3546 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprListParenthesized);
3547 type StablePtr = ExprListParenthesizedPtr<'db>;
3548 type Green = ExprListParenthesizedGreen<'db>;
3549 fn missing(db: &'db dyn Database) -> Self::Green {
3550 ExprListParenthesizedGreen(
3551 GreenNode {
3552 kind: SyntaxKind::ExprListParenthesized,
3553 details: GreenNodeDetails::Node {
3554 children: [
3555 TerminalLParen::missing(db).0,
3556 ExprList::missing(db).0,
3557 TerminalRParen::missing(db).0,
3558 ]
3559 .into(),
3560 width: TextWidth::default(),
3561 },
3562 }
3563 .intern(db),
3564 )
3565 }
3566 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3567 let kind = node.kind(db);
3568 assert_eq!(
3569 kind,
3570 SyntaxKind::ExprListParenthesized,
3571 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3572 kind,
3573 SyntaxKind::ExprListParenthesized
3574 );
3575 Self { node }
3576 }
3577 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3578 let kind = node.kind(db);
3579 if kind == SyntaxKind::ExprListParenthesized {
3580 Some(Self::from_syntax_node(db, node))
3581 } else {
3582 None
3583 }
3584 }
3585 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3586 self.node
3587 }
3588 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3589 ExprListParenthesizedPtr(self.node.stable_ptr(db))
3590 }
3591}
3592#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3593pub struct ExprFunctionCall<'db> {
3594 node: SyntaxNode<'db>,
3595}
3596impl<'db> ExprFunctionCall<'db> {
3597 pub const INDEX_PATH: usize = 0;
3598 pub const INDEX_ARGUMENTS: usize = 1;
3599 pub fn new_green(
3600 db: &'db dyn Database,
3601 path: ExprPathGreen<'db>,
3602 arguments: ArgListParenthesizedGreen<'db>,
3603 ) -> ExprFunctionCallGreen<'db> {
3604 let children = [path.0, arguments.0];
3605 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3606 ExprFunctionCallGreen(
3607 GreenNode {
3608 kind: SyntaxKind::ExprFunctionCall,
3609 details: GreenNodeDetails::Node { children: children.into(), width },
3610 }
3611 .intern(db),
3612 )
3613 }
3614}
3615impl<'db> ExprFunctionCall<'db> {
3616 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3617 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3618 }
3619 pub fn arguments(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3620 ArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[1])
3621 }
3622}
3623#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3624pub struct ExprFunctionCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3625impl<'db> ExprFunctionCallPtr<'db> {}
3626impl<'db> TypedStablePtr<'db> for ExprFunctionCallPtr<'db> {
3627 type SyntaxNode = ExprFunctionCall<'db>;
3628 fn untyped(self) -> SyntaxStablePtrId<'db> {
3629 self.0
3630 }
3631 fn lookup(&self, db: &'db dyn Database) -> ExprFunctionCall<'db> {
3632 ExprFunctionCall::from_syntax_node(db, self.0.lookup(db))
3633 }
3634}
3635impl<'db> From<ExprFunctionCallPtr<'db>> for SyntaxStablePtrId<'db> {
3636 fn from(ptr: ExprFunctionCallPtr<'db>) -> Self {
3637 ptr.untyped()
3638 }
3639}
3640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3641pub struct ExprFunctionCallGreen<'db>(pub GreenId<'db>);
3642impl<'db> TypedSyntaxNode<'db> for ExprFunctionCall<'db> {
3643 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFunctionCall);
3644 type StablePtr = ExprFunctionCallPtr<'db>;
3645 type Green = ExprFunctionCallGreen<'db>;
3646 fn missing(db: &'db dyn Database) -> Self::Green {
3647 ExprFunctionCallGreen(
3648 GreenNode {
3649 kind: SyntaxKind::ExprFunctionCall,
3650 details: GreenNodeDetails::Node {
3651 children: [ExprPath::missing(db).0, ArgListParenthesized::missing(db).0].into(),
3652 width: TextWidth::default(),
3653 },
3654 }
3655 .intern(db),
3656 )
3657 }
3658 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3659 let kind = node.kind(db);
3660 assert_eq!(
3661 kind,
3662 SyntaxKind::ExprFunctionCall,
3663 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3664 kind,
3665 SyntaxKind::ExprFunctionCall
3666 );
3667 Self { node }
3668 }
3669 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3670 let kind = node.kind(db);
3671 if kind == SyntaxKind::ExprFunctionCall {
3672 Some(Self::from_syntax_node(db, node))
3673 } else {
3674 None
3675 }
3676 }
3677 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3678 self.node
3679 }
3680 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3681 ExprFunctionCallPtr(self.node.stable_ptr(db))
3682 }
3683}
3684#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3685pub struct ArgListParenthesized<'db> {
3686 node: SyntaxNode<'db>,
3687}
3688impl<'db> ArgListParenthesized<'db> {
3689 pub const INDEX_LPAREN: usize = 0;
3690 pub const INDEX_ARGUMENTS: usize = 1;
3691 pub const INDEX_RPAREN: usize = 2;
3692 pub fn new_green(
3693 db: &'db dyn Database,
3694 lparen: TerminalLParenGreen<'db>,
3695 arguments: ArgListGreen<'db>,
3696 rparen: TerminalRParenGreen<'db>,
3697 ) -> ArgListParenthesizedGreen<'db> {
3698 let children = [lparen.0, arguments.0, rparen.0];
3699 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3700 ArgListParenthesizedGreen(
3701 GreenNode {
3702 kind: SyntaxKind::ArgListParenthesized,
3703 details: GreenNodeDetails::Node { children: children.into(), width },
3704 }
3705 .intern(db),
3706 )
3707 }
3708}
3709impl<'db> ArgListParenthesized<'db> {
3710 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
3711 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
3712 }
3713 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
3714 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
3715 }
3716 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
3717 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
3718 }
3719}
3720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3721pub struct ArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3722impl<'db> ArgListParenthesizedPtr<'db> {}
3723impl<'db> TypedStablePtr<'db> for ArgListParenthesizedPtr<'db> {
3724 type SyntaxNode = ArgListParenthesized<'db>;
3725 fn untyped(self) -> SyntaxStablePtrId<'db> {
3726 self.0
3727 }
3728 fn lookup(&self, db: &'db dyn Database) -> ArgListParenthesized<'db> {
3729 ArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3730 }
3731}
3732impl<'db> From<ArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3733 fn from(ptr: ArgListParenthesizedPtr<'db>) -> Self {
3734 ptr.untyped()
3735 }
3736}
3737#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3738pub struct ArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3739impl<'db> TypedSyntaxNode<'db> for ArgListParenthesized<'db> {
3740 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListParenthesized);
3741 type StablePtr = ArgListParenthesizedPtr<'db>;
3742 type Green = ArgListParenthesizedGreen<'db>;
3743 fn missing(db: &'db dyn Database) -> Self::Green {
3744 ArgListParenthesizedGreen(
3745 GreenNode {
3746 kind: SyntaxKind::ArgListParenthesized,
3747 details: GreenNodeDetails::Node {
3748 children: [
3749 TerminalLParen::missing(db).0,
3750 ArgList::missing(db).0,
3751 TerminalRParen::missing(db).0,
3752 ]
3753 .into(),
3754 width: TextWidth::default(),
3755 },
3756 }
3757 .intern(db),
3758 )
3759 }
3760 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3761 let kind = node.kind(db);
3762 assert_eq!(
3763 kind,
3764 SyntaxKind::ArgListParenthesized,
3765 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3766 kind,
3767 SyntaxKind::ArgListParenthesized
3768 );
3769 Self { node }
3770 }
3771 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3772 let kind = node.kind(db);
3773 if kind == SyntaxKind::ArgListParenthesized {
3774 Some(Self::from_syntax_node(db, node))
3775 } else {
3776 None
3777 }
3778 }
3779 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3780 self.node
3781 }
3782 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3783 ArgListParenthesizedPtr(self.node.stable_ptr(db))
3784 }
3785}
3786#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3787pub enum OptionArgListParenthesized<'db> {
3788 Empty(OptionArgListParenthesizedEmpty<'db>),
3789 ArgListParenthesized(ArgListParenthesized<'db>),
3790}
3791#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3792pub struct OptionArgListParenthesizedPtr<'db>(pub SyntaxStablePtrId<'db>);
3793impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedPtr<'db> {
3794 type SyntaxNode = OptionArgListParenthesized<'db>;
3795 fn untyped(self) -> SyntaxStablePtrId<'db> {
3796 self.0
3797 }
3798 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
3799 OptionArgListParenthesized::from_syntax_node(db, self.0.lookup(db))
3800 }
3801}
3802impl<'db> From<OptionArgListParenthesizedPtr<'db>> for SyntaxStablePtrId<'db> {
3803 fn from(ptr: OptionArgListParenthesizedPtr<'db>) -> Self {
3804 ptr.untyped()
3805 }
3806}
3807impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3808 fn from(value: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3809 Self(value.0)
3810 }
3811}
3812impl<'db> From<ArgListParenthesizedPtr<'db>> for OptionArgListParenthesizedPtr<'db> {
3813 fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
3814 Self(value.0)
3815 }
3816}
3817impl<'db> From<OptionArgListParenthesizedEmptyGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3818 fn from(value: OptionArgListParenthesizedEmptyGreen<'db>) -> Self {
3819 Self(value.0)
3820 }
3821}
3822impl<'db> From<ArgListParenthesizedGreen<'db>> for OptionArgListParenthesizedGreen<'db> {
3823 fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
3824 Self(value.0)
3825 }
3826}
3827#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3828pub struct OptionArgListParenthesizedGreen<'db>(pub GreenId<'db>);
3829impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesized<'db> {
3830 const OPTIONAL_KIND: Option<SyntaxKind> = None;
3831 type StablePtr = OptionArgListParenthesizedPtr<'db>;
3832 type Green = OptionArgListParenthesizedGreen<'db>;
3833 fn missing(db: &'db dyn Database) -> Self::Green {
3834 panic!("No missing variant.");
3835 }
3836 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3837 let kind = node.kind(db);
3838 match kind {
3839 SyntaxKind::OptionArgListParenthesizedEmpty => OptionArgListParenthesized::Empty(
3840 OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3841 ),
3842 SyntaxKind::ArgListParenthesized => OptionArgListParenthesized::ArgListParenthesized(
3843 ArgListParenthesized::from_syntax_node(db, node),
3844 ),
3845 _ => panic!(
3846 "Unexpected syntax kind {:?} when constructing {}.",
3847 kind, "OptionArgListParenthesized"
3848 ),
3849 }
3850 }
3851 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3852 let kind = node.kind(db);
3853 match kind {
3854 SyntaxKind::OptionArgListParenthesizedEmpty => Some(OptionArgListParenthesized::Empty(
3855 OptionArgListParenthesizedEmpty::from_syntax_node(db, node),
3856 )),
3857 SyntaxKind::ArgListParenthesized => {
3858 Some(OptionArgListParenthesized::ArgListParenthesized(
3859 ArgListParenthesized::from_syntax_node(db, node),
3860 ))
3861 }
3862 _ => None,
3863 }
3864 }
3865 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3866 match self {
3867 OptionArgListParenthesized::Empty(x) => x.as_syntax_node(),
3868 OptionArgListParenthesized::ArgListParenthesized(x) => x.as_syntax_node(),
3869 }
3870 }
3871 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3872 OptionArgListParenthesizedPtr(self.as_syntax_node().stable_ptr(db))
3873 }
3874}
3875impl<'db> OptionArgListParenthesized<'db> {
3876 pub fn is_variant(kind: SyntaxKind) -> bool {
3878 matches!(
3879 kind,
3880 SyntaxKind::OptionArgListParenthesizedEmpty | SyntaxKind::ArgListParenthesized
3881 )
3882 }
3883}
3884#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3885pub struct OptionArgListParenthesizedEmpty<'db> {
3886 node: SyntaxNode<'db>,
3887}
3888impl<'db> OptionArgListParenthesizedEmpty<'db> {
3889 pub fn new_green(db: &'db dyn Database) -> OptionArgListParenthesizedEmptyGreen<'db> {
3890 let children = [];
3891 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3892 OptionArgListParenthesizedEmptyGreen(
3893 GreenNode {
3894 kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3895 details: GreenNodeDetails::Node { children: children.into(), width },
3896 }
3897 .intern(db),
3898 )
3899 }
3900}
3901impl<'db> OptionArgListParenthesizedEmpty<'db> {}
3902#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3903pub struct OptionArgListParenthesizedEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
3904impl<'db> OptionArgListParenthesizedEmptyPtr<'db> {}
3905impl<'db> TypedStablePtr<'db> for OptionArgListParenthesizedEmptyPtr<'db> {
3906 type SyntaxNode = OptionArgListParenthesizedEmpty<'db>;
3907 fn untyped(self) -> SyntaxStablePtrId<'db> {
3908 self.0
3909 }
3910 fn lookup(&self, db: &'db dyn Database) -> OptionArgListParenthesizedEmpty<'db> {
3911 OptionArgListParenthesizedEmpty::from_syntax_node(db, self.0.lookup(db))
3912 }
3913}
3914impl<'db> From<OptionArgListParenthesizedEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
3915 fn from(ptr: OptionArgListParenthesizedEmptyPtr<'db>) -> Self {
3916 ptr.untyped()
3917 }
3918}
3919#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3920pub struct OptionArgListParenthesizedEmptyGreen<'db>(pub GreenId<'db>);
3921impl<'db> TypedSyntaxNode<'db> for OptionArgListParenthesizedEmpty<'db> {
3922 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionArgListParenthesizedEmpty);
3923 type StablePtr = OptionArgListParenthesizedEmptyPtr<'db>;
3924 type Green = OptionArgListParenthesizedEmptyGreen<'db>;
3925 fn missing(db: &'db dyn Database) -> Self::Green {
3926 OptionArgListParenthesizedEmptyGreen(
3927 GreenNode {
3928 kind: SyntaxKind::OptionArgListParenthesizedEmpty,
3929 details: GreenNodeDetails::Node {
3930 children: [].into(),
3931 width: TextWidth::default(),
3932 },
3933 }
3934 .intern(db),
3935 )
3936 }
3937 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
3938 let kind = node.kind(db);
3939 assert_eq!(
3940 kind,
3941 SyntaxKind::OptionArgListParenthesizedEmpty,
3942 "Unexpected SyntaxKind {:?}. Expected {:?}.",
3943 kind,
3944 SyntaxKind::OptionArgListParenthesizedEmpty
3945 );
3946 Self { node }
3947 }
3948 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
3949 let kind = node.kind(db);
3950 if kind == SyntaxKind::OptionArgListParenthesizedEmpty {
3951 Some(Self::from_syntax_node(db, node))
3952 } else {
3953 None
3954 }
3955 }
3956 fn as_syntax_node(&self) -> SyntaxNode<'db> {
3957 self.node
3958 }
3959 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
3960 OptionArgListParenthesizedEmptyPtr(self.node.stable_ptr(db))
3961 }
3962}
3963#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
3964pub struct ExprStructCtorCall<'db> {
3965 node: SyntaxNode<'db>,
3966}
3967impl<'db> ExprStructCtorCall<'db> {
3968 pub const INDEX_PATH: usize = 0;
3969 pub const INDEX_ARGUMENTS: usize = 1;
3970 pub fn new_green(
3971 db: &'db dyn Database,
3972 path: ExprPathGreen<'db>,
3973 arguments: StructArgListBracedGreen<'db>,
3974 ) -> ExprStructCtorCallGreen<'db> {
3975 let children = [path.0, arguments.0];
3976 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
3977 ExprStructCtorCallGreen(
3978 GreenNode {
3979 kind: SyntaxKind::ExprStructCtorCall,
3980 details: GreenNodeDetails::Node { children: children.into(), width },
3981 }
3982 .intern(db),
3983 )
3984 }
3985}
3986impl<'db> ExprStructCtorCall<'db> {
3987 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
3988 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
3989 }
3990 pub fn arguments(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
3991 StructArgListBraced::from_syntax_node(db, self.node.get_children(db)[1])
3992 }
3993}
3994#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
3995pub struct ExprStructCtorCallPtr<'db>(pub SyntaxStablePtrId<'db>);
3996impl<'db> ExprStructCtorCallPtr<'db> {}
3997impl<'db> TypedStablePtr<'db> for ExprStructCtorCallPtr<'db> {
3998 type SyntaxNode = ExprStructCtorCall<'db>;
3999 fn untyped(self) -> SyntaxStablePtrId<'db> {
4000 self.0
4001 }
4002 fn lookup(&self, db: &'db dyn Database) -> ExprStructCtorCall<'db> {
4003 ExprStructCtorCall::from_syntax_node(db, self.0.lookup(db))
4004 }
4005}
4006impl<'db> From<ExprStructCtorCallPtr<'db>> for SyntaxStablePtrId<'db> {
4007 fn from(ptr: ExprStructCtorCallPtr<'db>) -> Self {
4008 ptr.untyped()
4009 }
4010}
4011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4012pub struct ExprStructCtorCallGreen<'db>(pub GreenId<'db>);
4013impl<'db> TypedSyntaxNode<'db> for ExprStructCtorCall<'db> {
4014 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprStructCtorCall);
4015 type StablePtr = ExprStructCtorCallPtr<'db>;
4016 type Green = ExprStructCtorCallGreen<'db>;
4017 fn missing(db: &'db dyn Database) -> Self::Green {
4018 ExprStructCtorCallGreen(
4019 GreenNode {
4020 kind: SyntaxKind::ExprStructCtorCall,
4021 details: GreenNodeDetails::Node {
4022 children: [ExprPath::missing(db).0, StructArgListBraced::missing(db).0].into(),
4023 width: TextWidth::default(),
4024 },
4025 }
4026 .intern(db),
4027 )
4028 }
4029 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4030 let kind = node.kind(db);
4031 assert_eq!(
4032 kind,
4033 SyntaxKind::ExprStructCtorCall,
4034 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4035 kind,
4036 SyntaxKind::ExprStructCtorCall
4037 );
4038 Self { node }
4039 }
4040 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4041 let kind = node.kind(db);
4042 if kind == SyntaxKind::ExprStructCtorCall {
4043 Some(Self::from_syntax_node(db, node))
4044 } else {
4045 None
4046 }
4047 }
4048 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4049 self.node
4050 }
4051 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4052 ExprStructCtorCallPtr(self.node.stable_ptr(db))
4053 }
4054}
4055#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4056pub struct StructArgListBraced<'db> {
4057 node: SyntaxNode<'db>,
4058}
4059impl<'db> StructArgListBraced<'db> {
4060 pub const INDEX_LBRACE: usize = 0;
4061 pub const INDEX_ARGUMENTS: usize = 1;
4062 pub const INDEX_RBRACE: usize = 2;
4063 pub fn new_green(
4064 db: &'db dyn Database,
4065 lbrace: TerminalLBraceGreen<'db>,
4066 arguments: StructArgListGreen<'db>,
4067 rbrace: TerminalRBraceGreen<'db>,
4068 ) -> StructArgListBracedGreen<'db> {
4069 let children = [lbrace.0, arguments.0, rbrace.0];
4070 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4071 StructArgListBracedGreen(
4072 GreenNode {
4073 kind: SyntaxKind::StructArgListBraced,
4074 details: GreenNodeDetails::Node { children: children.into(), width },
4075 }
4076 .intern(db),
4077 )
4078 }
4079}
4080impl<'db> StructArgListBraced<'db> {
4081 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4082 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4083 }
4084 pub fn arguments(&self, db: &'db dyn Database) -> StructArgList<'db> {
4085 StructArgList::from_syntax_node(db, self.node.get_children(db)[1])
4086 }
4087 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4088 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4089 }
4090}
4091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4092pub struct StructArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
4093impl<'db> StructArgListBracedPtr<'db> {}
4094impl<'db> TypedStablePtr<'db> for StructArgListBracedPtr<'db> {
4095 type SyntaxNode = StructArgListBraced<'db>;
4096 fn untyped(self) -> SyntaxStablePtrId<'db> {
4097 self.0
4098 }
4099 fn lookup(&self, db: &'db dyn Database) -> StructArgListBraced<'db> {
4100 StructArgListBraced::from_syntax_node(db, self.0.lookup(db))
4101 }
4102}
4103impl<'db> From<StructArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
4104 fn from(ptr: StructArgListBracedPtr<'db>) -> Self {
4105 ptr.untyped()
4106 }
4107}
4108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4109pub struct StructArgListBracedGreen<'db>(pub GreenId<'db>);
4110impl<'db> TypedSyntaxNode<'db> for StructArgListBraced<'db> {
4111 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgListBraced);
4112 type StablePtr = StructArgListBracedPtr<'db>;
4113 type Green = StructArgListBracedGreen<'db>;
4114 fn missing(db: &'db dyn Database) -> Self::Green {
4115 StructArgListBracedGreen(
4116 GreenNode {
4117 kind: SyntaxKind::StructArgListBraced,
4118 details: GreenNodeDetails::Node {
4119 children: [
4120 TerminalLBrace::missing(db).0,
4121 StructArgList::missing(db).0,
4122 TerminalRBrace::missing(db).0,
4123 ]
4124 .into(),
4125 width: TextWidth::default(),
4126 },
4127 }
4128 .intern(db),
4129 )
4130 }
4131 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4132 let kind = node.kind(db);
4133 assert_eq!(
4134 kind,
4135 SyntaxKind::StructArgListBraced,
4136 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4137 kind,
4138 SyntaxKind::StructArgListBraced
4139 );
4140 Self { node }
4141 }
4142 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4143 let kind = node.kind(db);
4144 if kind == SyntaxKind::StructArgListBraced {
4145 Some(Self::from_syntax_node(db, node))
4146 } else {
4147 None
4148 }
4149 }
4150 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4151 self.node
4152 }
4153 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4154 StructArgListBracedPtr(self.node.stable_ptr(db))
4155 }
4156}
4157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4158pub struct ExprBlock<'db> {
4159 node: SyntaxNode<'db>,
4160}
4161impl<'db> ExprBlock<'db> {
4162 pub const INDEX_LBRACE: usize = 0;
4163 pub const INDEX_STATEMENTS: usize = 1;
4164 pub const INDEX_RBRACE: usize = 2;
4165 pub fn new_green(
4166 db: &'db dyn Database,
4167 lbrace: TerminalLBraceGreen<'db>,
4168 statements: StatementListGreen<'db>,
4169 rbrace: TerminalRBraceGreen<'db>,
4170 ) -> ExprBlockGreen<'db> {
4171 let children = [lbrace.0, statements.0, rbrace.0];
4172 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4173 ExprBlockGreen(
4174 GreenNode {
4175 kind: SyntaxKind::ExprBlock,
4176 details: GreenNodeDetails::Node { children: children.into(), width },
4177 }
4178 .intern(db),
4179 )
4180 }
4181}
4182impl<'db> ExprBlock<'db> {
4183 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4184 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
4185 }
4186 pub fn statements(&self, db: &'db dyn Database) -> StatementList<'db> {
4187 StatementList::from_syntax_node(db, self.node.get_children(db)[1])
4188 }
4189 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4190 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
4191 }
4192}
4193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4194pub struct ExprBlockPtr<'db>(pub SyntaxStablePtrId<'db>);
4195impl<'db> ExprBlockPtr<'db> {}
4196impl<'db> TypedStablePtr<'db> for ExprBlockPtr<'db> {
4197 type SyntaxNode = ExprBlock<'db>;
4198 fn untyped(self) -> SyntaxStablePtrId<'db> {
4199 self.0
4200 }
4201 fn lookup(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4202 ExprBlock::from_syntax_node(db, self.0.lookup(db))
4203 }
4204}
4205impl<'db> From<ExprBlockPtr<'db>> for SyntaxStablePtrId<'db> {
4206 fn from(ptr: ExprBlockPtr<'db>) -> Self {
4207 ptr.untyped()
4208 }
4209}
4210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4211pub struct ExprBlockGreen<'db>(pub GreenId<'db>);
4212impl<'db> TypedSyntaxNode<'db> for ExprBlock<'db> {
4213 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprBlock);
4214 type StablePtr = ExprBlockPtr<'db>;
4215 type Green = ExprBlockGreen<'db>;
4216 fn missing(db: &'db dyn Database) -> Self::Green {
4217 ExprBlockGreen(
4218 GreenNode {
4219 kind: SyntaxKind::ExprBlock,
4220 details: GreenNodeDetails::Node {
4221 children: [
4222 TerminalLBrace::missing(db).0,
4223 StatementList::missing(db).0,
4224 TerminalRBrace::missing(db).0,
4225 ]
4226 .into(),
4227 width: TextWidth::default(),
4228 },
4229 }
4230 .intern(db),
4231 )
4232 }
4233 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4234 let kind = node.kind(db);
4235 assert_eq!(
4236 kind,
4237 SyntaxKind::ExprBlock,
4238 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4239 kind,
4240 SyntaxKind::ExprBlock
4241 );
4242 Self { node }
4243 }
4244 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4245 let kind = node.kind(db);
4246 if kind == SyntaxKind::ExprBlock { Some(Self::from_syntax_node(db, node)) } else { None }
4247 }
4248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4249 self.node
4250 }
4251 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4252 ExprBlockPtr(self.node.stable_ptr(db))
4253 }
4254}
4255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4256pub struct ExprMatch<'db> {
4257 node: SyntaxNode<'db>,
4258}
4259impl<'db> ExprMatch<'db> {
4260 pub const INDEX_MATCH_KW: usize = 0;
4261 pub const INDEX_EXPR: usize = 1;
4262 pub const INDEX_LBRACE: usize = 2;
4263 pub const INDEX_ARMS: usize = 3;
4264 pub const INDEX_RBRACE: usize = 4;
4265 pub fn new_green(
4266 db: &'db dyn Database,
4267 match_kw: TerminalMatchGreen<'db>,
4268 expr: ExprGreen<'db>,
4269 lbrace: TerminalLBraceGreen<'db>,
4270 arms: MatchArmsGreen<'db>,
4271 rbrace: TerminalRBraceGreen<'db>,
4272 ) -> ExprMatchGreen<'db> {
4273 let children = [match_kw.0, expr.0, lbrace.0, arms.0, rbrace.0];
4274 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4275 ExprMatchGreen(
4276 GreenNode {
4277 kind: SyntaxKind::ExprMatch,
4278 details: GreenNodeDetails::Node { children: children.into(), width },
4279 }
4280 .intern(db),
4281 )
4282 }
4283}
4284impl<'db> ExprMatch<'db> {
4285 pub fn match_kw(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
4286 TerminalMatch::from_syntax_node(db, self.node.get_children(db)[0])
4287 }
4288 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4289 Expr::from_syntax_node(db, self.node.get_children(db)[1])
4290 }
4291 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
4292 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[2])
4293 }
4294 pub fn arms(&self, db: &'db dyn Database) -> MatchArms<'db> {
4295 MatchArms::from_syntax_node(db, self.node.get_children(db)[3])
4296 }
4297 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
4298 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[4])
4299 }
4300}
4301#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4302pub struct ExprMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
4303impl<'db> ExprMatchPtr<'db> {}
4304impl<'db> TypedStablePtr<'db> for ExprMatchPtr<'db> {
4305 type SyntaxNode = ExprMatch<'db>;
4306 fn untyped(self) -> SyntaxStablePtrId<'db> {
4307 self.0
4308 }
4309 fn lookup(&self, db: &'db dyn Database) -> ExprMatch<'db> {
4310 ExprMatch::from_syntax_node(db, self.0.lookup(db))
4311 }
4312}
4313impl<'db> From<ExprMatchPtr<'db>> for SyntaxStablePtrId<'db> {
4314 fn from(ptr: ExprMatchPtr<'db>) -> Self {
4315 ptr.untyped()
4316 }
4317}
4318#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4319pub struct ExprMatchGreen<'db>(pub GreenId<'db>);
4320impl<'db> TypedSyntaxNode<'db> for ExprMatch<'db> {
4321 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprMatch);
4322 type StablePtr = ExprMatchPtr<'db>;
4323 type Green = ExprMatchGreen<'db>;
4324 fn missing(db: &'db dyn Database) -> Self::Green {
4325 ExprMatchGreen(
4326 GreenNode {
4327 kind: SyntaxKind::ExprMatch,
4328 details: GreenNodeDetails::Node {
4329 children: [
4330 TerminalMatch::missing(db).0,
4331 Expr::missing(db).0,
4332 TerminalLBrace::missing(db).0,
4333 MatchArms::missing(db).0,
4334 TerminalRBrace::missing(db).0,
4335 ]
4336 .into(),
4337 width: TextWidth::default(),
4338 },
4339 }
4340 .intern(db),
4341 )
4342 }
4343 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4344 let kind = node.kind(db);
4345 assert_eq!(
4346 kind,
4347 SyntaxKind::ExprMatch,
4348 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4349 kind,
4350 SyntaxKind::ExprMatch
4351 );
4352 Self { node }
4353 }
4354 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4355 let kind = node.kind(db);
4356 if kind == SyntaxKind::ExprMatch { Some(Self::from_syntax_node(db, node)) } else { None }
4357 }
4358 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4359 self.node
4360 }
4361 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4362 ExprMatchPtr(self.node.stable_ptr(db))
4363 }
4364}
4365#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4366pub struct MatchArms<'db>(ElementList<'db, MatchArm<'db>, 2>);
4367impl<'db> Deref for MatchArms<'db> {
4368 type Target = ElementList<'db, MatchArm<'db>, 2>;
4369 fn deref(&self) -> &Self::Target {
4370 &self.0
4371 }
4372}
4373impl<'db> MatchArms<'db> {
4374 pub fn new_green(
4375 db: &'db dyn Database,
4376 children: &[MatchArmsElementOrSeparatorGreen<'db>],
4377 ) -> MatchArmsGreen<'db> {
4378 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4379 MatchArmsGreen(
4380 GreenNode {
4381 kind: SyntaxKind::MatchArms,
4382 details: GreenNodeDetails::Node {
4383 children: children.iter().map(|x| x.id()).collect(),
4384 width,
4385 },
4386 }
4387 .intern(db),
4388 )
4389 }
4390}
4391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4392pub struct MatchArmsPtr<'db>(pub SyntaxStablePtrId<'db>);
4393impl<'db> TypedStablePtr<'db> for MatchArmsPtr<'db> {
4394 type SyntaxNode = MatchArms<'db>;
4395 fn untyped(self) -> SyntaxStablePtrId<'db> {
4396 self.0
4397 }
4398 fn lookup(&self, db: &'db dyn Database) -> MatchArms<'db> {
4399 MatchArms::from_syntax_node(db, self.0.lookup(db))
4400 }
4401}
4402impl<'db> From<MatchArmsPtr<'db>> for SyntaxStablePtrId<'db> {
4403 fn from(ptr: MatchArmsPtr<'db>) -> Self {
4404 ptr.untyped()
4405 }
4406}
4407#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4408pub enum MatchArmsElementOrSeparatorGreen<'db> {
4409 Separator(TerminalCommaGreen<'db>),
4410 Element(MatchArmGreen<'db>),
4411}
4412impl<'db> From<TerminalCommaGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4413 fn from(value: TerminalCommaGreen<'db>) -> Self {
4414 MatchArmsElementOrSeparatorGreen::Separator(value)
4415 }
4416}
4417impl<'db> From<MatchArmGreen<'db>> for MatchArmsElementOrSeparatorGreen<'db> {
4418 fn from(value: MatchArmGreen<'db>) -> Self {
4419 MatchArmsElementOrSeparatorGreen::Element(value)
4420 }
4421}
4422impl<'db> MatchArmsElementOrSeparatorGreen<'db> {
4423 fn id(&self) -> GreenId<'db> {
4424 match self {
4425 MatchArmsElementOrSeparatorGreen::Separator(green) => green.0,
4426 MatchArmsElementOrSeparatorGreen::Element(green) => green.0,
4427 }
4428 }
4429}
4430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4431pub struct MatchArmsGreen<'db>(pub GreenId<'db>);
4432impl<'db> TypedSyntaxNode<'db> for MatchArms<'db> {
4433 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArms);
4434 type StablePtr = MatchArmsPtr<'db>;
4435 type Green = MatchArmsGreen<'db>;
4436 fn missing(db: &'db dyn Database) -> Self::Green {
4437 MatchArmsGreen(
4438 GreenNode {
4439 kind: SyntaxKind::MatchArms,
4440 details: GreenNodeDetails::Node {
4441 children: [].into(),
4442 width: TextWidth::default(),
4443 },
4444 }
4445 .intern(db),
4446 )
4447 }
4448 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4449 Self(ElementList::new(node))
4450 }
4451 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4452 if node.kind(db) == SyntaxKind::MatchArms {
4453 Some(Self(ElementList::new(node)))
4454 } else {
4455 None
4456 }
4457 }
4458 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4459 self.node
4460 }
4461 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4462 MatchArmsPtr(self.node.stable_ptr(db))
4463 }
4464}
4465#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4466pub struct MatchArm<'db> {
4467 node: SyntaxNode<'db>,
4468}
4469impl<'db> MatchArm<'db> {
4470 pub const INDEX_PATTERNS: usize = 0;
4471 pub const INDEX_ARROW: usize = 1;
4472 pub const INDEX_EXPRESSION: usize = 2;
4473 pub fn new_green(
4474 db: &'db dyn Database,
4475 patterns: PatternListOrGreen<'db>,
4476 arrow: TerminalMatchArrowGreen<'db>,
4477 expression: ExprGreen<'db>,
4478 ) -> MatchArmGreen<'db> {
4479 let children = [patterns.0, arrow.0, expression.0];
4480 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4481 MatchArmGreen(
4482 GreenNode {
4483 kind: SyntaxKind::MatchArm,
4484 details: GreenNodeDetails::Node { children: children.into(), width },
4485 }
4486 .intern(db),
4487 )
4488 }
4489}
4490impl<'db> MatchArm<'db> {
4491 pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4492 PatternListOr::from_syntax_node(db, self.node.get_children(db)[0])
4493 }
4494 pub fn arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
4495 TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
4496 }
4497 pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
4498 Expr::from_syntax_node(db, self.node.get_children(db)[2])
4499 }
4500}
4501#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4502pub struct MatchArmPtr<'db>(pub SyntaxStablePtrId<'db>);
4503impl<'db> MatchArmPtr<'db> {}
4504impl<'db> TypedStablePtr<'db> for MatchArmPtr<'db> {
4505 type SyntaxNode = MatchArm<'db>;
4506 fn untyped(self) -> SyntaxStablePtrId<'db> {
4507 self.0
4508 }
4509 fn lookup(&self, db: &'db dyn Database) -> MatchArm<'db> {
4510 MatchArm::from_syntax_node(db, self.0.lookup(db))
4511 }
4512}
4513impl<'db> From<MatchArmPtr<'db>> for SyntaxStablePtrId<'db> {
4514 fn from(ptr: MatchArmPtr<'db>) -> Self {
4515 ptr.untyped()
4516 }
4517}
4518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4519pub struct MatchArmGreen<'db>(pub GreenId<'db>);
4520impl<'db> TypedSyntaxNode<'db> for MatchArm<'db> {
4521 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MatchArm);
4522 type StablePtr = MatchArmPtr<'db>;
4523 type Green = MatchArmGreen<'db>;
4524 fn missing(db: &'db dyn Database) -> Self::Green {
4525 MatchArmGreen(
4526 GreenNode {
4527 kind: SyntaxKind::MatchArm,
4528 details: GreenNodeDetails::Node {
4529 children: [
4530 PatternListOr::missing(db).0,
4531 TerminalMatchArrow::missing(db).0,
4532 Expr::missing(db).0,
4533 ]
4534 .into(),
4535 width: TextWidth::default(),
4536 },
4537 }
4538 .intern(db),
4539 )
4540 }
4541 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4542 let kind = node.kind(db);
4543 assert_eq!(
4544 kind,
4545 SyntaxKind::MatchArm,
4546 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4547 kind,
4548 SyntaxKind::MatchArm
4549 );
4550 Self { node }
4551 }
4552 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4553 let kind = node.kind(db);
4554 if kind == SyntaxKind::MatchArm { Some(Self::from_syntax_node(db, node)) } else { None }
4555 }
4556 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4557 self.node
4558 }
4559 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4560 MatchArmPtr(self.node.stable_ptr(db))
4561 }
4562}
4563#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4564pub struct ExprIf<'db> {
4565 node: SyntaxNode<'db>,
4566}
4567impl<'db> ExprIf<'db> {
4568 pub const INDEX_IF_KW: usize = 0;
4569 pub const INDEX_CONDITIONS: usize = 1;
4570 pub const INDEX_IF_BLOCK: usize = 2;
4571 pub const INDEX_ELSE_CLAUSE: usize = 3;
4572 pub fn new_green(
4573 db: &'db dyn Database,
4574 if_kw: TerminalIfGreen<'db>,
4575 conditions: ConditionListAndGreen<'db>,
4576 if_block: ExprBlockGreen<'db>,
4577 else_clause: OptionElseClauseGreen<'db>,
4578 ) -> ExprIfGreen<'db> {
4579 let children = [if_kw.0, conditions.0, if_block.0, else_clause.0];
4580 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4581 ExprIfGreen(
4582 GreenNode {
4583 kind: SyntaxKind::ExprIf,
4584 details: GreenNodeDetails::Node { children: children.into(), width },
4585 }
4586 .intern(db),
4587 )
4588 }
4589}
4590impl<'db> ExprIf<'db> {
4591 pub fn if_kw(&self, db: &'db dyn Database) -> TerminalIf<'db> {
4592 TerminalIf::from_syntax_node(db, self.node.get_children(db)[0])
4593 }
4594 pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4595 ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
4596 }
4597 pub fn if_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
4598 ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
4599 }
4600 pub fn else_clause(&self, db: &'db dyn Database) -> OptionElseClause<'db> {
4601 OptionElseClause::from_syntax_node(db, self.node.get_children(db)[3])
4602 }
4603}
4604#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4605pub struct ExprIfPtr<'db>(pub SyntaxStablePtrId<'db>);
4606impl<'db> ExprIfPtr<'db> {}
4607impl<'db> TypedStablePtr<'db> for ExprIfPtr<'db> {
4608 type SyntaxNode = ExprIf<'db>;
4609 fn untyped(self) -> SyntaxStablePtrId<'db> {
4610 self.0
4611 }
4612 fn lookup(&self, db: &'db dyn Database) -> ExprIf<'db> {
4613 ExprIf::from_syntax_node(db, self.0.lookup(db))
4614 }
4615}
4616impl<'db> From<ExprIfPtr<'db>> for SyntaxStablePtrId<'db> {
4617 fn from(ptr: ExprIfPtr<'db>) -> Self {
4618 ptr.untyped()
4619 }
4620}
4621#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4622pub struct ExprIfGreen<'db>(pub GreenId<'db>);
4623impl<'db> TypedSyntaxNode<'db> for ExprIf<'db> {
4624 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIf);
4625 type StablePtr = ExprIfPtr<'db>;
4626 type Green = ExprIfGreen<'db>;
4627 fn missing(db: &'db dyn Database) -> Self::Green {
4628 ExprIfGreen(
4629 GreenNode {
4630 kind: SyntaxKind::ExprIf,
4631 details: GreenNodeDetails::Node {
4632 children: [
4633 TerminalIf::missing(db).0,
4634 ConditionListAnd::missing(db).0,
4635 ExprBlock::missing(db).0,
4636 OptionElseClause::missing(db).0,
4637 ]
4638 .into(),
4639 width: TextWidth::default(),
4640 },
4641 }
4642 .intern(db),
4643 )
4644 }
4645 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4646 let kind = node.kind(db);
4647 assert_eq!(
4648 kind,
4649 SyntaxKind::ExprIf,
4650 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4651 kind,
4652 SyntaxKind::ExprIf
4653 );
4654 Self { node }
4655 }
4656 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4657 let kind = node.kind(db);
4658 if kind == SyntaxKind::ExprIf { Some(Self::from_syntax_node(db, node)) } else { None }
4659 }
4660 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4661 self.node
4662 }
4663 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4664 ExprIfPtr(self.node.stable_ptr(db))
4665 }
4666}
4667#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4668pub struct ConditionListAnd<'db>(ElementList<'db, Condition<'db>, 2>);
4669impl<'db> Deref for ConditionListAnd<'db> {
4670 type Target = ElementList<'db, Condition<'db>, 2>;
4671 fn deref(&self) -> &Self::Target {
4672 &self.0
4673 }
4674}
4675impl<'db> ConditionListAnd<'db> {
4676 pub fn new_green(
4677 db: &'db dyn Database,
4678 children: &[ConditionListAndElementOrSeparatorGreen<'db>],
4679 ) -> ConditionListAndGreen<'db> {
4680 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
4681 ConditionListAndGreen(
4682 GreenNode {
4683 kind: SyntaxKind::ConditionListAnd,
4684 details: GreenNodeDetails::Node {
4685 children: children.iter().map(|x| x.id()).collect(),
4686 width,
4687 },
4688 }
4689 .intern(db),
4690 )
4691 }
4692}
4693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4694pub struct ConditionListAndPtr<'db>(pub SyntaxStablePtrId<'db>);
4695impl<'db> TypedStablePtr<'db> for ConditionListAndPtr<'db> {
4696 type SyntaxNode = ConditionListAnd<'db>;
4697 fn untyped(self) -> SyntaxStablePtrId<'db> {
4698 self.0
4699 }
4700 fn lookup(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
4701 ConditionListAnd::from_syntax_node(db, self.0.lookup(db))
4702 }
4703}
4704impl<'db> From<ConditionListAndPtr<'db>> for SyntaxStablePtrId<'db> {
4705 fn from(ptr: ConditionListAndPtr<'db>) -> Self {
4706 ptr.untyped()
4707 }
4708}
4709#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4710pub enum ConditionListAndElementOrSeparatorGreen<'db> {
4711 Separator(TerminalAndAndGreen<'db>),
4712 Element(ConditionGreen<'db>),
4713}
4714impl<'db> From<TerminalAndAndGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4715 fn from(value: TerminalAndAndGreen<'db>) -> Self {
4716 ConditionListAndElementOrSeparatorGreen::Separator(value)
4717 }
4718}
4719impl<'db> From<ConditionGreen<'db>> for ConditionListAndElementOrSeparatorGreen<'db> {
4720 fn from(value: ConditionGreen<'db>) -> Self {
4721 ConditionListAndElementOrSeparatorGreen::Element(value)
4722 }
4723}
4724impl<'db> ConditionListAndElementOrSeparatorGreen<'db> {
4725 fn id(&self) -> GreenId<'db> {
4726 match self {
4727 ConditionListAndElementOrSeparatorGreen::Separator(green) => green.0,
4728 ConditionListAndElementOrSeparatorGreen::Element(green) => green.0,
4729 }
4730 }
4731}
4732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4733pub struct ConditionListAndGreen<'db>(pub GreenId<'db>);
4734impl<'db> TypedSyntaxNode<'db> for ConditionListAnd<'db> {
4735 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionListAnd);
4736 type StablePtr = ConditionListAndPtr<'db>;
4737 type Green = ConditionListAndGreen<'db>;
4738 fn missing(db: &'db dyn Database) -> Self::Green {
4739 ConditionListAndGreen(
4740 GreenNode {
4741 kind: SyntaxKind::ConditionListAnd,
4742 details: GreenNodeDetails::Node {
4743 children: [].into(),
4744 width: TextWidth::default(),
4745 },
4746 }
4747 .intern(db),
4748 )
4749 }
4750 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4751 Self(ElementList::new(node))
4752 }
4753 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4754 if node.kind(db) == SyntaxKind::ConditionListAnd {
4755 Some(Self(ElementList::new(node)))
4756 } else {
4757 None
4758 }
4759 }
4760 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4761 self.node
4762 }
4763 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4764 ConditionListAndPtr(self.node.stable_ptr(db))
4765 }
4766}
4767#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4768pub enum Condition<'db> {
4769 Let(ConditionLet<'db>),
4770 Expr(ConditionExpr<'db>),
4771}
4772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4773pub struct ConditionPtr<'db>(pub SyntaxStablePtrId<'db>);
4774impl<'db> TypedStablePtr<'db> for ConditionPtr<'db> {
4775 type SyntaxNode = Condition<'db>;
4776 fn untyped(self) -> SyntaxStablePtrId<'db> {
4777 self.0
4778 }
4779 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
4780 Condition::from_syntax_node(db, self.0.lookup(db))
4781 }
4782}
4783impl<'db> From<ConditionPtr<'db>> for SyntaxStablePtrId<'db> {
4784 fn from(ptr: ConditionPtr<'db>) -> Self {
4785 ptr.untyped()
4786 }
4787}
4788impl<'db> From<ConditionLetPtr<'db>> for ConditionPtr<'db> {
4789 fn from(value: ConditionLetPtr<'db>) -> Self {
4790 Self(value.0)
4791 }
4792}
4793impl<'db> From<ConditionExprPtr<'db>> for ConditionPtr<'db> {
4794 fn from(value: ConditionExprPtr<'db>) -> Self {
4795 Self(value.0)
4796 }
4797}
4798impl<'db> From<ConditionLetGreen<'db>> for ConditionGreen<'db> {
4799 fn from(value: ConditionLetGreen<'db>) -> Self {
4800 Self(value.0)
4801 }
4802}
4803impl<'db> From<ConditionExprGreen<'db>> for ConditionGreen<'db> {
4804 fn from(value: ConditionExprGreen<'db>) -> Self {
4805 Self(value.0)
4806 }
4807}
4808#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4809pub struct ConditionGreen<'db>(pub GreenId<'db>);
4810impl<'db> TypedSyntaxNode<'db> for Condition<'db> {
4811 const OPTIONAL_KIND: Option<SyntaxKind> = None;
4812 type StablePtr = ConditionPtr<'db>;
4813 type Green = ConditionGreen<'db>;
4814 fn missing(db: &'db dyn Database) -> Self::Green {
4815 panic!("No missing variant.");
4816 }
4817 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4818 let kind = node.kind(db);
4819 match kind {
4820 SyntaxKind::ConditionLet => Condition::Let(ConditionLet::from_syntax_node(db, node)),
4821 SyntaxKind::ConditionExpr => Condition::Expr(ConditionExpr::from_syntax_node(db, node)),
4822 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Condition"),
4823 }
4824 }
4825 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4826 let kind = node.kind(db);
4827 match kind {
4828 SyntaxKind::ConditionLet => {
4829 Some(Condition::Let(ConditionLet::from_syntax_node(db, node)))
4830 }
4831 SyntaxKind::ConditionExpr => {
4832 Some(Condition::Expr(ConditionExpr::from_syntax_node(db, node)))
4833 }
4834 _ => None,
4835 }
4836 }
4837 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4838 match self {
4839 Condition::Let(x) => x.as_syntax_node(),
4840 Condition::Expr(x) => x.as_syntax_node(),
4841 }
4842 }
4843 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4844 ConditionPtr(self.as_syntax_node().stable_ptr(db))
4845 }
4846}
4847impl<'db> Condition<'db> {
4848 pub fn is_variant(kind: SyntaxKind) -> bool {
4850 matches!(kind, SyntaxKind::ConditionLet | SyntaxKind::ConditionExpr)
4851 }
4852}
4853#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4854pub struct ConditionLet<'db> {
4855 node: SyntaxNode<'db>,
4856}
4857impl<'db> ConditionLet<'db> {
4858 pub const INDEX_LET_KW: usize = 0;
4859 pub const INDEX_PATTERNS: usize = 1;
4860 pub const INDEX_EQ: usize = 2;
4861 pub const INDEX_EXPR: usize = 3;
4862 pub fn new_green(
4863 db: &'db dyn Database,
4864 let_kw: TerminalLetGreen<'db>,
4865 patterns: PatternListOrGreen<'db>,
4866 eq: TerminalEqGreen<'db>,
4867 expr: ExprGreen<'db>,
4868 ) -> ConditionLetGreen<'db> {
4869 let children = [let_kw.0, patterns.0, eq.0, expr.0];
4870 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4871 ConditionLetGreen(
4872 GreenNode {
4873 kind: SyntaxKind::ConditionLet,
4874 details: GreenNodeDetails::Node { children: children.into(), width },
4875 }
4876 .intern(db),
4877 )
4878 }
4879}
4880impl<'db> ConditionLet<'db> {
4881 pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
4882 TerminalLet::from_syntax_node(db, self.node.get_children(db)[0])
4883 }
4884 pub fn patterns(&self, db: &'db dyn Database) -> PatternListOr<'db> {
4885 PatternListOr::from_syntax_node(db, self.node.get_children(db)[1])
4886 }
4887 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
4888 TerminalEq::from_syntax_node(db, self.node.get_children(db)[2])
4889 }
4890 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4891 Expr::from_syntax_node(db, self.node.get_children(db)[3])
4892 }
4893}
4894#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4895pub struct ConditionLetPtr<'db>(pub SyntaxStablePtrId<'db>);
4896impl<'db> ConditionLetPtr<'db> {}
4897impl<'db> TypedStablePtr<'db> for ConditionLetPtr<'db> {
4898 type SyntaxNode = ConditionLet<'db>;
4899 fn untyped(self) -> SyntaxStablePtrId<'db> {
4900 self.0
4901 }
4902 fn lookup(&self, db: &'db dyn Database) -> ConditionLet<'db> {
4903 ConditionLet::from_syntax_node(db, self.0.lookup(db))
4904 }
4905}
4906impl<'db> From<ConditionLetPtr<'db>> for SyntaxStablePtrId<'db> {
4907 fn from(ptr: ConditionLetPtr<'db>) -> Self {
4908 ptr.untyped()
4909 }
4910}
4911#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4912pub struct ConditionLetGreen<'db>(pub GreenId<'db>);
4913impl<'db> TypedSyntaxNode<'db> for ConditionLet<'db> {
4914 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionLet);
4915 type StablePtr = ConditionLetPtr<'db>;
4916 type Green = ConditionLetGreen<'db>;
4917 fn missing(db: &'db dyn Database) -> Self::Green {
4918 ConditionLetGreen(
4919 GreenNode {
4920 kind: SyntaxKind::ConditionLet,
4921 details: GreenNodeDetails::Node {
4922 children: [
4923 TerminalLet::missing(db).0,
4924 PatternListOr::missing(db).0,
4925 TerminalEq::missing(db).0,
4926 Expr::missing(db).0,
4927 ]
4928 .into(),
4929 width: TextWidth::default(),
4930 },
4931 }
4932 .intern(db),
4933 )
4934 }
4935 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
4936 let kind = node.kind(db);
4937 assert_eq!(
4938 kind,
4939 SyntaxKind::ConditionLet,
4940 "Unexpected SyntaxKind {:?}. Expected {:?}.",
4941 kind,
4942 SyntaxKind::ConditionLet
4943 );
4944 Self { node }
4945 }
4946 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
4947 let kind = node.kind(db);
4948 if kind == SyntaxKind::ConditionLet { Some(Self::from_syntax_node(db, node)) } else { None }
4949 }
4950 fn as_syntax_node(&self) -> SyntaxNode<'db> {
4951 self.node
4952 }
4953 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
4954 ConditionLetPtr(self.node.stable_ptr(db))
4955 }
4956}
4957#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
4958pub struct ConditionExpr<'db> {
4959 node: SyntaxNode<'db>,
4960}
4961impl<'db> ConditionExpr<'db> {
4962 pub const INDEX_EXPR: usize = 0;
4963 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ConditionExprGreen<'db> {
4964 let children = [expr.0];
4965 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
4966 ConditionExprGreen(
4967 GreenNode {
4968 kind: SyntaxKind::ConditionExpr,
4969 details: GreenNodeDetails::Node { children: children.into(), width },
4970 }
4971 .intern(db),
4972 )
4973 }
4974}
4975impl<'db> ConditionExpr<'db> {
4976 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
4977 Expr::from_syntax_node(db, self.node.get_children(db)[0])
4978 }
4979}
4980#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4981pub struct ConditionExprPtr<'db>(pub SyntaxStablePtrId<'db>);
4982impl<'db> ConditionExprPtr<'db> {}
4983impl<'db> TypedStablePtr<'db> for ConditionExprPtr<'db> {
4984 type SyntaxNode = ConditionExpr<'db>;
4985 fn untyped(self) -> SyntaxStablePtrId<'db> {
4986 self.0
4987 }
4988 fn lookup(&self, db: &'db dyn Database) -> ConditionExpr<'db> {
4989 ConditionExpr::from_syntax_node(db, self.0.lookup(db))
4990 }
4991}
4992impl<'db> From<ConditionExprPtr<'db>> for SyntaxStablePtrId<'db> {
4993 fn from(ptr: ConditionExprPtr<'db>) -> Self {
4994 ptr.untyped()
4995 }
4996}
4997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
4998pub struct ConditionExprGreen<'db>(pub GreenId<'db>);
4999impl<'db> TypedSyntaxNode<'db> for ConditionExpr<'db> {
5000 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ConditionExpr);
5001 type StablePtr = ConditionExprPtr<'db>;
5002 type Green = ConditionExprGreen<'db>;
5003 fn missing(db: &'db dyn Database) -> Self::Green {
5004 ConditionExprGreen(
5005 GreenNode {
5006 kind: SyntaxKind::ConditionExpr,
5007 details: GreenNodeDetails::Node {
5008 children: [Expr::missing(db).0].into(),
5009 width: TextWidth::default(),
5010 },
5011 }
5012 .intern(db),
5013 )
5014 }
5015 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5016 let kind = node.kind(db);
5017 assert_eq!(
5018 kind,
5019 SyntaxKind::ConditionExpr,
5020 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5021 kind,
5022 SyntaxKind::ConditionExpr
5023 );
5024 Self { node }
5025 }
5026 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5027 let kind = node.kind(db);
5028 if kind == SyntaxKind::ConditionExpr {
5029 Some(Self::from_syntax_node(db, node))
5030 } else {
5031 None
5032 }
5033 }
5034 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5035 self.node
5036 }
5037 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5038 ConditionExprPtr(self.node.stable_ptr(db))
5039 }
5040}
5041#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5042pub enum BlockOrIf<'db> {
5043 Block(ExprBlock<'db>),
5044 If(ExprIf<'db>),
5045}
5046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5047pub struct BlockOrIfPtr<'db>(pub SyntaxStablePtrId<'db>);
5048impl<'db> TypedStablePtr<'db> for BlockOrIfPtr<'db> {
5049 type SyntaxNode = BlockOrIf<'db>;
5050 fn untyped(self) -> SyntaxStablePtrId<'db> {
5051 self.0
5052 }
5053 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5054 BlockOrIf::from_syntax_node(db, self.0.lookup(db))
5055 }
5056}
5057impl<'db> From<BlockOrIfPtr<'db>> for SyntaxStablePtrId<'db> {
5058 fn from(ptr: BlockOrIfPtr<'db>) -> Self {
5059 ptr.untyped()
5060 }
5061}
5062impl<'db> From<ExprBlockPtr<'db>> for BlockOrIfPtr<'db> {
5063 fn from(value: ExprBlockPtr<'db>) -> Self {
5064 Self(value.0)
5065 }
5066}
5067impl<'db> From<ExprIfPtr<'db>> for BlockOrIfPtr<'db> {
5068 fn from(value: ExprIfPtr<'db>) -> Self {
5069 Self(value.0)
5070 }
5071}
5072impl<'db> From<ExprBlockGreen<'db>> for BlockOrIfGreen<'db> {
5073 fn from(value: ExprBlockGreen<'db>) -> Self {
5074 Self(value.0)
5075 }
5076}
5077impl<'db> From<ExprIfGreen<'db>> for BlockOrIfGreen<'db> {
5078 fn from(value: ExprIfGreen<'db>) -> Self {
5079 Self(value.0)
5080 }
5081}
5082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5083pub struct BlockOrIfGreen<'db>(pub GreenId<'db>);
5084impl<'db> TypedSyntaxNode<'db> for BlockOrIf<'db> {
5085 const OPTIONAL_KIND: Option<SyntaxKind> = None;
5086 type StablePtr = BlockOrIfPtr<'db>;
5087 type Green = BlockOrIfGreen<'db>;
5088 fn missing(db: &'db dyn Database) -> Self::Green {
5089 panic!("No missing variant.");
5090 }
5091 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5092 let kind = node.kind(db);
5093 match kind {
5094 SyntaxKind::ExprBlock => BlockOrIf::Block(ExprBlock::from_syntax_node(db, node)),
5095 SyntaxKind::ExprIf => BlockOrIf::If(ExprIf::from_syntax_node(db, node)),
5096 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "BlockOrIf"),
5097 }
5098 }
5099 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5100 let kind = node.kind(db);
5101 match kind {
5102 SyntaxKind::ExprBlock => Some(BlockOrIf::Block(ExprBlock::from_syntax_node(db, node))),
5103 SyntaxKind::ExprIf => Some(BlockOrIf::If(ExprIf::from_syntax_node(db, node))),
5104 _ => None,
5105 }
5106 }
5107 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5108 match self {
5109 BlockOrIf::Block(x) => x.as_syntax_node(),
5110 BlockOrIf::If(x) => x.as_syntax_node(),
5111 }
5112 }
5113 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5114 BlockOrIfPtr(self.as_syntax_node().stable_ptr(db))
5115 }
5116}
5117impl<'db> BlockOrIf<'db> {
5118 pub fn is_variant(kind: SyntaxKind) -> bool {
5120 matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::ExprIf)
5121 }
5122}
5123#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5124pub struct ExprLoop<'db> {
5125 node: SyntaxNode<'db>,
5126}
5127impl<'db> ExprLoop<'db> {
5128 pub const INDEX_LOOP_KW: usize = 0;
5129 pub const INDEX_BODY: usize = 1;
5130 pub fn new_green(
5131 db: &'db dyn Database,
5132 loop_kw: TerminalLoopGreen<'db>,
5133 body: ExprBlockGreen<'db>,
5134 ) -> ExprLoopGreen<'db> {
5135 let children = [loop_kw.0, body.0];
5136 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5137 ExprLoopGreen(
5138 GreenNode {
5139 kind: SyntaxKind::ExprLoop,
5140 details: GreenNodeDetails::Node { children: children.into(), width },
5141 }
5142 .intern(db),
5143 )
5144 }
5145}
5146impl<'db> ExprLoop<'db> {
5147 pub fn loop_kw(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
5148 TerminalLoop::from_syntax_node(db, self.node.get_children(db)[0])
5149 }
5150 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5151 ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
5152 }
5153}
5154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5155pub struct ExprLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
5156impl<'db> ExprLoopPtr<'db> {}
5157impl<'db> TypedStablePtr<'db> for ExprLoopPtr<'db> {
5158 type SyntaxNode = ExprLoop<'db>;
5159 fn untyped(self) -> SyntaxStablePtrId<'db> {
5160 self.0
5161 }
5162 fn lookup(&self, db: &'db dyn Database) -> ExprLoop<'db> {
5163 ExprLoop::from_syntax_node(db, self.0.lookup(db))
5164 }
5165}
5166impl<'db> From<ExprLoopPtr<'db>> for SyntaxStablePtrId<'db> {
5167 fn from(ptr: ExprLoopPtr<'db>) -> Self {
5168 ptr.untyped()
5169 }
5170}
5171#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5172pub struct ExprLoopGreen<'db>(pub GreenId<'db>);
5173impl<'db> TypedSyntaxNode<'db> for ExprLoop<'db> {
5174 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprLoop);
5175 type StablePtr = ExprLoopPtr<'db>;
5176 type Green = ExprLoopGreen<'db>;
5177 fn missing(db: &'db dyn Database) -> Self::Green {
5178 ExprLoopGreen(
5179 GreenNode {
5180 kind: SyntaxKind::ExprLoop,
5181 details: GreenNodeDetails::Node {
5182 children: [TerminalLoop::missing(db).0, ExprBlock::missing(db).0].into(),
5183 width: TextWidth::default(),
5184 },
5185 }
5186 .intern(db),
5187 )
5188 }
5189 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5190 let kind = node.kind(db);
5191 assert_eq!(
5192 kind,
5193 SyntaxKind::ExprLoop,
5194 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5195 kind,
5196 SyntaxKind::ExprLoop
5197 );
5198 Self { node }
5199 }
5200 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5201 let kind = node.kind(db);
5202 if kind == SyntaxKind::ExprLoop { Some(Self::from_syntax_node(db, node)) } else { None }
5203 }
5204 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5205 self.node
5206 }
5207 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5208 ExprLoopPtr(self.node.stable_ptr(db))
5209 }
5210}
5211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5212pub struct ExprWhile<'db> {
5213 node: SyntaxNode<'db>,
5214}
5215impl<'db> ExprWhile<'db> {
5216 pub const INDEX_WHILE_KW: usize = 0;
5217 pub const INDEX_CONDITIONS: usize = 1;
5218 pub const INDEX_BODY: usize = 2;
5219 pub fn new_green(
5220 db: &'db dyn Database,
5221 while_kw: TerminalWhileGreen<'db>,
5222 conditions: ConditionListAndGreen<'db>,
5223 body: ExprBlockGreen<'db>,
5224 ) -> ExprWhileGreen<'db> {
5225 let children = [while_kw.0, conditions.0, body.0];
5226 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5227 ExprWhileGreen(
5228 GreenNode {
5229 kind: SyntaxKind::ExprWhile,
5230 details: GreenNodeDetails::Node { children: children.into(), width },
5231 }
5232 .intern(db),
5233 )
5234 }
5235}
5236impl<'db> ExprWhile<'db> {
5237 pub fn while_kw(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
5238 TerminalWhile::from_syntax_node(db, self.node.get_children(db)[0])
5239 }
5240 pub fn conditions(&self, db: &'db dyn Database) -> ConditionListAnd<'db> {
5241 ConditionListAnd::from_syntax_node(db, self.node.get_children(db)[1])
5242 }
5243 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5244 ExprBlock::from_syntax_node(db, self.node.get_children(db)[2])
5245 }
5246}
5247#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5248pub struct ExprWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
5249impl<'db> ExprWhilePtr<'db> {}
5250impl<'db> TypedStablePtr<'db> for ExprWhilePtr<'db> {
5251 type SyntaxNode = ExprWhile<'db>;
5252 fn untyped(self) -> SyntaxStablePtrId<'db> {
5253 self.0
5254 }
5255 fn lookup(&self, db: &'db dyn Database) -> ExprWhile<'db> {
5256 ExprWhile::from_syntax_node(db, self.0.lookup(db))
5257 }
5258}
5259impl<'db> From<ExprWhilePtr<'db>> for SyntaxStablePtrId<'db> {
5260 fn from(ptr: ExprWhilePtr<'db>) -> Self {
5261 ptr.untyped()
5262 }
5263}
5264#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5265pub struct ExprWhileGreen<'db>(pub GreenId<'db>);
5266impl<'db> TypedSyntaxNode<'db> for ExprWhile<'db> {
5267 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprWhile);
5268 type StablePtr = ExprWhilePtr<'db>;
5269 type Green = ExprWhileGreen<'db>;
5270 fn missing(db: &'db dyn Database) -> Self::Green {
5271 ExprWhileGreen(
5272 GreenNode {
5273 kind: SyntaxKind::ExprWhile,
5274 details: GreenNodeDetails::Node {
5275 children: [
5276 TerminalWhile::missing(db).0,
5277 ConditionListAnd::missing(db).0,
5278 ExprBlock::missing(db).0,
5279 ]
5280 .into(),
5281 width: TextWidth::default(),
5282 },
5283 }
5284 .intern(db),
5285 )
5286 }
5287 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5288 let kind = node.kind(db);
5289 assert_eq!(
5290 kind,
5291 SyntaxKind::ExprWhile,
5292 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5293 kind,
5294 SyntaxKind::ExprWhile
5295 );
5296 Self { node }
5297 }
5298 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5299 let kind = node.kind(db);
5300 if kind == SyntaxKind::ExprWhile { Some(Self::from_syntax_node(db, node)) } else { None }
5301 }
5302 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5303 self.node
5304 }
5305 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5306 ExprWhilePtr(self.node.stable_ptr(db))
5307 }
5308}
5309#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5310pub struct ExprFor<'db> {
5311 node: SyntaxNode<'db>,
5312}
5313impl<'db> ExprFor<'db> {
5314 pub const INDEX_FOR_KW: usize = 0;
5315 pub const INDEX_PATTERN: usize = 1;
5316 pub const INDEX_IDENTIFIER: usize = 2;
5317 pub const INDEX_EXPR: usize = 3;
5318 pub const INDEX_BODY: usize = 4;
5319 pub fn new_green(
5320 db: &'db dyn Database,
5321 for_kw: TerminalForGreen<'db>,
5322 pattern: PatternGreen<'db>,
5323 identifier: TerminalIdentifierGreen<'db>,
5324 expr: ExprGreen<'db>,
5325 body: ExprBlockGreen<'db>,
5326 ) -> ExprForGreen<'db> {
5327 let children = [for_kw.0, pattern.0, identifier.0, expr.0, body.0];
5328 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5329 ExprForGreen(
5330 GreenNode {
5331 kind: SyntaxKind::ExprFor,
5332 details: GreenNodeDetails::Node { children: children.into(), width },
5333 }
5334 .intern(db),
5335 )
5336 }
5337}
5338impl<'db> ExprFor<'db> {
5339 pub fn for_kw(&self, db: &'db dyn Database) -> TerminalFor<'db> {
5340 TerminalFor::from_syntax_node(db, self.node.get_children(db)[0])
5341 }
5342 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
5343 Pattern::from_syntax_node(db, self.node.get_children(db)[1])
5344 }
5345 pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
5346 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
5347 }
5348 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5349 Expr::from_syntax_node(db, self.node.get_children(db)[3])
5350 }
5351 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
5352 ExprBlock::from_syntax_node(db, self.node.get_children(db)[4])
5353 }
5354}
5355#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5356pub struct ExprForPtr<'db>(pub SyntaxStablePtrId<'db>);
5357impl<'db> ExprForPtr<'db> {
5358 pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
5359 PatternGreen(self.0.0.key_fields(db)[0])
5360 }
5361 pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
5362 TerminalIdentifierGreen(self.0.0.key_fields(db)[1])
5363 }
5364}
5365impl<'db> TypedStablePtr<'db> for ExprForPtr<'db> {
5366 type SyntaxNode = ExprFor<'db>;
5367 fn untyped(self) -> SyntaxStablePtrId<'db> {
5368 self.0
5369 }
5370 fn lookup(&self, db: &'db dyn Database) -> ExprFor<'db> {
5371 ExprFor::from_syntax_node(db, self.0.lookup(db))
5372 }
5373}
5374impl<'db> From<ExprForPtr<'db>> for SyntaxStablePtrId<'db> {
5375 fn from(ptr: ExprForPtr<'db>) -> Self {
5376 ptr.untyped()
5377 }
5378}
5379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5380pub struct ExprForGreen<'db>(pub GreenId<'db>);
5381impl<'db> TypedSyntaxNode<'db> for ExprFor<'db> {
5382 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFor);
5383 type StablePtr = ExprForPtr<'db>;
5384 type Green = ExprForGreen<'db>;
5385 fn missing(db: &'db dyn Database) -> Self::Green {
5386 ExprForGreen(
5387 GreenNode {
5388 kind: SyntaxKind::ExprFor,
5389 details: GreenNodeDetails::Node {
5390 children: [
5391 TerminalFor::missing(db).0,
5392 Pattern::missing(db).0,
5393 TerminalIdentifier::missing(db).0,
5394 Expr::missing(db).0,
5395 ExprBlock::missing(db).0,
5396 ]
5397 .into(),
5398 width: TextWidth::default(),
5399 },
5400 }
5401 .intern(db),
5402 )
5403 }
5404 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5405 let kind = node.kind(db);
5406 assert_eq!(
5407 kind,
5408 SyntaxKind::ExprFor,
5409 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5410 kind,
5411 SyntaxKind::ExprFor
5412 );
5413 Self { node }
5414 }
5415 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5416 let kind = node.kind(db);
5417 if kind == SyntaxKind::ExprFor { Some(Self::from_syntax_node(db, node)) } else { None }
5418 }
5419 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5420 self.node
5421 }
5422 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5423 ExprForPtr(self.node.stable_ptr(db))
5424 }
5425}
5426#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5427pub struct ElseClause<'db> {
5428 node: SyntaxNode<'db>,
5429}
5430impl<'db> ElseClause<'db> {
5431 pub const INDEX_ELSE_KW: usize = 0;
5432 pub const INDEX_ELSE_BLOCK_OR_IF: usize = 1;
5433 pub fn new_green(
5434 db: &'db dyn Database,
5435 else_kw: TerminalElseGreen<'db>,
5436 else_block_or_if: BlockOrIfGreen<'db>,
5437 ) -> ElseClauseGreen<'db> {
5438 let children = [else_kw.0, else_block_or_if.0];
5439 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5440 ElseClauseGreen(
5441 GreenNode {
5442 kind: SyntaxKind::ElseClause,
5443 details: GreenNodeDetails::Node { children: children.into(), width },
5444 }
5445 .intern(db),
5446 )
5447 }
5448}
5449impl<'db> ElseClause<'db> {
5450 pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
5451 TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
5452 }
5453 pub fn else_block_or_if(&self, db: &'db dyn Database) -> BlockOrIf<'db> {
5454 BlockOrIf::from_syntax_node(db, self.node.get_children(db)[1])
5455 }
5456}
5457#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5458pub struct ElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5459impl<'db> ElseClausePtr<'db> {}
5460impl<'db> TypedStablePtr<'db> for ElseClausePtr<'db> {
5461 type SyntaxNode = ElseClause<'db>;
5462 fn untyped(self) -> SyntaxStablePtrId<'db> {
5463 self.0
5464 }
5465 fn lookup(&self, db: &'db dyn Database) -> ElseClause<'db> {
5466 ElseClause::from_syntax_node(db, self.0.lookup(db))
5467 }
5468}
5469impl<'db> From<ElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5470 fn from(ptr: ElseClausePtr<'db>) -> Self {
5471 ptr.untyped()
5472 }
5473}
5474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5475pub struct ElseClauseGreen<'db>(pub GreenId<'db>);
5476impl<'db> TypedSyntaxNode<'db> for ElseClause<'db> {
5477 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ElseClause);
5478 type StablePtr = ElseClausePtr<'db>;
5479 type Green = ElseClauseGreen<'db>;
5480 fn missing(db: &'db dyn Database) -> Self::Green {
5481 ElseClauseGreen(
5482 GreenNode {
5483 kind: SyntaxKind::ElseClause,
5484 details: GreenNodeDetails::Node {
5485 children: [TerminalElse::missing(db).0, BlockOrIf::missing(db).0].into(),
5486 width: TextWidth::default(),
5487 },
5488 }
5489 .intern(db),
5490 )
5491 }
5492 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5493 let kind = node.kind(db);
5494 assert_eq!(
5495 kind,
5496 SyntaxKind::ElseClause,
5497 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5498 kind,
5499 SyntaxKind::ElseClause
5500 );
5501 Self { node }
5502 }
5503 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5504 let kind = node.kind(db);
5505 if kind == SyntaxKind::ElseClause { Some(Self::from_syntax_node(db, node)) } else { None }
5506 }
5507 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5508 self.node
5509 }
5510 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5511 ElseClausePtr(self.node.stable_ptr(db))
5512 }
5513}
5514#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5515pub enum OptionElseClause<'db> {
5516 Empty(OptionElseClauseEmpty<'db>),
5517 ElseClause(ElseClause<'db>),
5518}
5519#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5520pub struct OptionElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
5521impl<'db> TypedStablePtr<'db> for OptionElseClausePtr<'db> {
5522 type SyntaxNode = OptionElseClause<'db>;
5523 fn untyped(self) -> SyntaxStablePtrId<'db> {
5524 self.0
5525 }
5526 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
5527 OptionElseClause::from_syntax_node(db, self.0.lookup(db))
5528 }
5529}
5530impl<'db> From<OptionElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
5531 fn from(ptr: OptionElseClausePtr<'db>) -> Self {
5532 ptr.untyped()
5533 }
5534}
5535impl<'db> From<OptionElseClauseEmptyPtr<'db>> for OptionElseClausePtr<'db> {
5536 fn from(value: OptionElseClauseEmptyPtr<'db>) -> Self {
5537 Self(value.0)
5538 }
5539}
5540impl<'db> From<ElseClausePtr<'db>> for OptionElseClausePtr<'db> {
5541 fn from(value: ElseClausePtr<'db>) -> Self {
5542 Self(value.0)
5543 }
5544}
5545impl<'db> From<OptionElseClauseEmptyGreen<'db>> for OptionElseClauseGreen<'db> {
5546 fn from(value: OptionElseClauseEmptyGreen<'db>) -> Self {
5547 Self(value.0)
5548 }
5549}
5550impl<'db> From<ElseClauseGreen<'db>> for OptionElseClauseGreen<'db> {
5551 fn from(value: ElseClauseGreen<'db>) -> Self {
5552 Self(value.0)
5553 }
5554}
5555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5556pub struct OptionElseClauseGreen<'db>(pub GreenId<'db>);
5557impl<'db> TypedSyntaxNode<'db> for OptionElseClause<'db> {
5558 const OPTIONAL_KIND: Option<SyntaxKind> = None;
5559 type StablePtr = OptionElseClausePtr<'db>;
5560 type Green = OptionElseClauseGreen<'db>;
5561 fn missing(db: &'db dyn Database) -> Self::Green {
5562 panic!("No missing variant.");
5563 }
5564 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5565 let kind = node.kind(db);
5566 match kind {
5567 SyntaxKind::OptionElseClauseEmpty => {
5568 OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node))
5569 }
5570 SyntaxKind::ElseClause => {
5571 OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node))
5572 }
5573 _ => panic!(
5574 "Unexpected syntax kind {:?} when constructing {}.",
5575 kind, "OptionElseClause"
5576 ),
5577 }
5578 }
5579 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5580 let kind = node.kind(db);
5581 match kind {
5582 SyntaxKind::OptionElseClauseEmpty => {
5583 Some(OptionElseClause::Empty(OptionElseClauseEmpty::from_syntax_node(db, node)))
5584 }
5585 SyntaxKind::ElseClause => {
5586 Some(OptionElseClause::ElseClause(ElseClause::from_syntax_node(db, node)))
5587 }
5588 _ => None,
5589 }
5590 }
5591 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5592 match self {
5593 OptionElseClause::Empty(x) => x.as_syntax_node(),
5594 OptionElseClause::ElseClause(x) => x.as_syntax_node(),
5595 }
5596 }
5597 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5598 OptionElseClausePtr(self.as_syntax_node().stable_ptr(db))
5599 }
5600}
5601impl<'db> OptionElseClause<'db> {
5602 pub fn is_variant(kind: SyntaxKind) -> bool {
5604 matches!(kind, SyntaxKind::OptionElseClauseEmpty | SyntaxKind::ElseClause)
5605 }
5606}
5607#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5608pub struct OptionElseClauseEmpty<'db> {
5609 node: SyntaxNode<'db>,
5610}
5611impl<'db> OptionElseClauseEmpty<'db> {
5612 pub fn new_green(db: &'db dyn Database) -> OptionElseClauseEmptyGreen<'db> {
5613 let children = [];
5614 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5615 OptionElseClauseEmptyGreen(
5616 GreenNode {
5617 kind: SyntaxKind::OptionElseClauseEmpty,
5618 details: GreenNodeDetails::Node { children: children.into(), width },
5619 }
5620 .intern(db),
5621 )
5622 }
5623}
5624impl<'db> OptionElseClauseEmpty<'db> {}
5625#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5626pub struct OptionElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
5627impl<'db> OptionElseClauseEmptyPtr<'db> {}
5628impl<'db> TypedStablePtr<'db> for OptionElseClauseEmptyPtr<'db> {
5629 type SyntaxNode = OptionElseClauseEmpty<'db>;
5630 fn untyped(self) -> SyntaxStablePtrId<'db> {
5631 self.0
5632 }
5633 fn lookup(&self, db: &'db dyn Database) -> OptionElseClauseEmpty<'db> {
5634 OptionElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
5635 }
5636}
5637impl<'db> From<OptionElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
5638 fn from(ptr: OptionElseClauseEmptyPtr<'db>) -> Self {
5639 ptr.untyped()
5640 }
5641}
5642#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5643pub struct OptionElseClauseEmptyGreen<'db>(pub GreenId<'db>);
5644impl<'db> TypedSyntaxNode<'db> for OptionElseClauseEmpty<'db> {
5645 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionElseClauseEmpty);
5646 type StablePtr = OptionElseClauseEmptyPtr<'db>;
5647 type Green = OptionElseClauseEmptyGreen<'db>;
5648 fn missing(db: &'db dyn Database) -> Self::Green {
5649 OptionElseClauseEmptyGreen(
5650 GreenNode {
5651 kind: SyntaxKind::OptionElseClauseEmpty,
5652 details: GreenNodeDetails::Node {
5653 children: [].into(),
5654 width: TextWidth::default(),
5655 },
5656 }
5657 .intern(db),
5658 )
5659 }
5660 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5661 let kind = node.kind(db);
5662 assert_eq!(
5663 kind,
5664 SyntaxKind::OptionElseClauseEmpty,
5665 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5666 kind,
5667 SyntaxKind::OptionElseClauseEmpty
5668 );
5669 Self { node }
5670 }
5671 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5672 let kind = node.kind(db);
5673 if kind == SyntaxKind::OptionElseClauseEmpty {
5674 Some(Self::from_syntax_node(db, node))
5675 } else {
5676 None
5677 }
5678 }
5679 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5680 self.node
5681 }
5682 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5683 OptionElseClauseEmptyPtr(self.node.stable_ptr(db))
5684 }
5685}
5686#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5687pub struct ExprErrorPropagate<'db> {
5688 node: SyntaxNode<'db>,
5689}
5690impl<'db> ExprErrorPropagate<'db> {
5691 pub const INDEX_EXPR: usize = 0;
5692 pub const INDEX_OP: usize = 1;
5693 pub fn new_green(
5694 db: &'db dyn Database,
5695 expr: ExprGreen<'db>,
5696 op: TerminalQuestionMarkGreen<'db>,
5697 ) -> ExprErrorPropagateGreen<'db> {
5698 let children = [expr.0, op.0];
5699 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5700 ExprErrorPropagateGreen(
5701 GreenNode {
5702 kind: SyntaxKind::ExprErrorPropagate,
5703 details: GreenNodeDetails::Node { children: children.into(), width },
5704 }
5705 .intern(db),
5706 )
5707 }
5708}
5709impl<'db> ExprErrorPropagate<'db> {
5710 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5711 Expr::from_syntax_node(db, self.node.get_children(db)[0])
5712 }
5713 pub fn op(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
5714 TerminalQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
5715 }
5716}
5717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5718pub struct ExprErrorPropagatePtr<'db>(pub SyntaxStablePtrId<'db>);
5719impl<'db> ExprErrorPropagatePtr<'db> {}
5720impl<'db> TypedStablePtr<'db> for ExprErrorPropagatePtr<'db> {
5721 type SyntaxNode = ExprErrorPropagate<'db>;
5722 fn untyped(self) -> SyntaxStablePtrId<'db> {
5723 self.0
5724 }
5725 fn lookup(&self, db: &'db dyn Database) -> ExprErrorPropagate<'db> {
5726 ExprErrorPropagate::from_syntax_node(db, self.0.lookup(db))
5727 }
5728}
5729impl<'db> From<ExprErrorPropagatePtr<'db>> for SyntaxStablePtrId<'db> {
5730 fn from(ptr: ExprErrorPropagatePtr<'db>) -> Self {
5731 ptr.untyped()
5732 }
5733}
5734#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5735pub struct ExprErrorPropagateGreen<'db>(pub GreenId<'db>);
5736impl<'db> TypedSyntaxNode<'db> for ExprErrorPropagate<'db> {
5737 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprErrorPropagate);
5738 type StablePtr = ExprErrorPropagatePtr<'db>;
5739 type Green = ExprErrorPropagateGreen<'db>;
5740 fn missing(db: &'db dyn Database) -> Self::Green {
5741 ExprErrorPropagateGreen(
5742 GreenNode {
5743 kind: SyntaxKind::ExprErrorPropagate,
5744 details: GreenNodeDetails::Node {
5745 children: [Expr::missing(db).0, TerminalQuestionMark::missing(db).0].into(),
5746 width: TextWidth::default(),
5747 },
5748 }
5749 .intern(db),
5750 )
5751 }
5752 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5753 let kind = node.kind(db);
5754 assert_eq!(
5755 kind,
5756 SyntaxKind::ExprErrorPropagate,
5757 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5758 kind,
5759 SyntaxKind::ExprErrorPropagate
5760 );
5761 Self { node }
5762 }
5763 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5764 let kind = node.kind(db);
5765 if kind == SyntaxKind::ExprErrorPropagate {
5766 Some(Self::from_syntax_node(db, node))
5767 } else {
5768 None
5769 }
5770 }
5771 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5772 self.node
5773 }
5774 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5775 ExprErrorPropagatePtr(self.node.stable_ptr(db))
5776 }
5777}
5778#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5779pub struct ExprIndexed<'db> {
5780 node: SyntaxNode<'db>,
5781}
5782impl<'db> ExprIndexed<'db> {
5783 pub const INDEX_EXPR: usize = 0;
5784 pub const INDEX_LBRACK: usize = 1;
5785 pub const INDEX_INDEX_EXPR: usize = 2;
5786 pub const INDEX_RBRACK: usize = 3;
5787 pub fn new_green(
5788 db: &'db dyn Database,
5789 expr: ExprGreen<'db>,
5790 lbrack: TerminalLBrackGreen<'db>,
5791 index_expr: ExprGreen<'db>,
5792 rbrack: TerminalRBrackGreen<'db>,
5793 ) -> ExprIndexedGreen<'db> {
5794 let children = [expr.0, lbrack.0, index_expr.0, rbrack.0];
5795 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5796 ExprIndexedGreen(
5797 GreenNode {
5798 kind: SyntaxKind::ExprIndexed,
5799 details: GreenNodeDetails::Node { children: children.into(), width },
5800 }
5801 .intern(db),
5802 )
5803 }
5804}
5805impl<'db> ExprIndexed<'db> {
5806 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
5807 Expr::from_syntax_node(db, self.node.get_children(db)[0])
5808 }
5809 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5810 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
5811 }
5812 pub fn index_expr(&self, db: &'db dyn Database) -> Expr<'db> {
5813 Expr::from_syntax_node(db, self.node.get_children(db)[2])
5814 }
5815 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5816 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5817 }
5818}
5819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5820pub struct ExprIndexedPtr<'db>(pub SyntaxStablePtrId<'db>);
5821impl<'db> ExprIndexedPtr<'db> {}
5822impl<'db> TypedStablePtr<'db> for ExprIndexedPtr<'db> {
5823 type SyntaxNode = ExprIndexed<'db>;
5824 fn untyped(self) -> SyntaxStablePtrId<'db> {
5825 self.0
5826 }
5827 fn lookup(&self, db: &'db dyn Database) -> ExprIndexed<'db> {
5828 ExprIndexed::from_syntax_node(db, self.0.lookup(db))
5829 }
5830}
5831impl<'db> From<ExprIndexedPtr<'db>> for SyntaxStablePtrId<'db> {
5832 fn from(ptr: ExprIndexedPtr<'db>) -> Self {
5833 ptr.untyped()
5834 }
5835}
5836#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5837pub struct ExprIndexedGreen<'db>(pub GreenId<'db>);
5838impl<'db> TypedSyntaxNode<'db> for ExprIndexed<'db> {
5839 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprIndexed);
5840 type StablePtr = ExprIndexedPtr<'db>;
5841 type Green = ExprIndexedGreen<'db>;
5842 fn missing(db: &'db dyn Database) -> Self::Green {
5843 ExprIndexedGreen(
5844 GreenNode {
5845 kind: SyntaxKind::ExprIndexed,
5846 details: GreenNodeDetails::Node {
5847 children: [
5848 Expr::missing(db).0,
5849 TerminalLBrack::missing(db).0,
5850 Expr::missing(db).0,
5851 TerminalRBrack::missing(db).0,
5852 ]
5853 .into(),
5854 width: TextWidth::default(),
5855 },
5856 }
5857 .intern(db),
5858 )
5859 }
5860 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5861 let kind = node.kind(db);
5862 assert_eq!(
5863 kind,
5864 SyntaxKind::ExprIndexed,
5865 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5866 kind,
5867 SyntaxKind::ExprIndexed
5868 );
5869 Self { node }
5870 }
5871 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5872 let kind = node.kind(db);
5873 if kind == SyntaxKind::ExprIndexed { Some(Self::from_syntax_node(db, node)) } else { None }
5874 }
5875 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5876 self.node
5877 }
5878 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5879 ExprIndexedPtr(self.node.stable_ptr(db))
5880 }
5881}
5882#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5883pub struct ExprFixedSizeArray<'db> {
5884 node: SyntaxNode<'db>,
5885}
5886impl<'db> ExprFixedSizeArray<'db> {
5887 pub const INDEX_LBRACK: usize = 0;
5888 pub const INDEX_EXPRS: usize = 1;
5889 pub const INDEX_SIZE: usize = 2;
5890 pub const INDEX_RBRACK: usize = 3;
5891 pub fn new_green(
5892 db: &'db dyn Database,
5893 lbrack: TerminalLBrackGreen<'db>,
5894 exprs: ExprListGreen<'db>,
5895 size: OptionFixedSizeArraySizeGreen<'db>,
5896 rbrack: TerminalRBrackGreen<'db>,
5897 ) -> ExprFixedSizeArrayGreen<'db> {
5898 let children = [lbrack.0, exprs.0, size.0, rbrack.0];
5899 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
5900 ExprFixedSizeArrayGreen(
5901 GreenNode {
5902 kind: SyntaxKind::ExprFixedSizeArray,
5903 details: GreenNodeDetails::Node { children: children.into(), width },
5904 }
5905 .intern(db),
5906 )
5907 }
5908}
5909impl<'db> ExprFixedSizeArray<'db> {
5910 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
5911 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
5912 }
5913 pub fn exprs(&self, db: &'db dyn Database) -> ExprList<'db> {
5914 ExprList::from_syntax_node(db, self.node.get_children(db)[1])
5915 }
5916 pub fn size(&self, db: &'db dyn Database) -> OptionFixedSizeArraySize<'db> {
5917 OptionFixedSizeArraySize::from_syntax_node(db, self.node.get_children(db)[2])
5918 }
5919 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
5920 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[3])
5921 }
5922}
5923#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5924pub struct ExprFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
5925impl<'db> ExprFixedSizeArrayPtr<'db> {}
5926impl<'db> TypedStablePtr<'db> for ExprFixedSizeArrayPtr<'db> {
5927 type SyntaxNode = ExprFixedSizeArray<'db>;
5928 fn untyped(self) -> SyntaxStablePtrId<'db> {
5929 self.0
5930 }
5931 fn lookup(&self, db: &'db dyn Database) -> ExprFixedSizeArray<'db> {
5932 ExprFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
5933 }
5934}
5935impl<'db> From<ExprFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
5936 fn from(ptr: ExprFixedSizeArrayPtr<'db>) -> Self {
5937 ptr.untyped()
5938 }
5939}
5940#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
5941pub struct ExprFixedSizeArrayGreen<'db>(pub GreenId<'db>);
5942impl<'db> TypedSyntaxNode<'db> for ExprFixedSizeArray<'db> {
5943 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprFixedSizeArray);
5944 type StablePtr = ExprFixedSizeArrayPtr<'db>;
5945 type Green = ExprFixedSizeArrayGreen<'db>;
5946 fn missing(db: &'db dyn Database) -> Self::Green {
5947 ExprFixedSizeArrayGreen(
5948 GreenNode {
5949 kind: SyntaxKind::ExprFixedSizeArray,
5950 details: GreenNodeDetails::Node {
5951 children: [
5952 TerminalLBrack::missing(db).0,
5953 ExprList::missing(db).0,
5954 OptionFixedSizeArraySize::missing(db).0,
5955 TerminalRBrack::missing(db).0,
5956 ]
5957 .into(),
5958 width: TextWidth::default(),
5959 },
5960 }
5961 .intern(db),
5962 )
5963 }
5964 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
5965 let kind = node.kind(db);
5966 assert_eq!(
5967 kind,
5968 SyntaxKind::ExprFixedSizeArray,
5969 "Unexpected SyntaxKind {:?}. Expected {:?}.",
5970 kind,
5971 SyntaxKind::ExprFixedSizeArray
5972 );
5973 Self { node }
5974 }
5975 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
5976 let kind = node.kind(db);
5977 if kind == SyntaxKind::ExprFixedSizeArray {
5978 Some(Self::from_syntax_node(db, node))
5979 } else {
5980 None
5981 }
5982 }
5983 fn as_syntax_node(&self) -> SyntaxNode<'db> {
5984 self.node
5985 }
5986 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
5987 ExprFixedSizeArrayPtr(self.node.stable_ptr(db))
5988 }
5989}
5990#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
5991pub struct FixedSizeArraySize<'db> {
5992 node: SyntaxNode<'db>,
5993}
5994impl<'db> FixedSizeArraySize<'db> {
5995 pub const INDEX_SEMICOLON: usize = 0;
5996 pub const INDEX_SIZE: usize = 1;
5997 pub fn new_green(
5998 db: &'db dyn Database,
5999 semicolon: TerminalSemicolonGreen<'db>,
6000 size: ExprGreen<'db>,
6001 ) -> FixedSizeArraySizeGreen<'db> {
6002 let children = [semicolon.0, size.0];
6003 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6004 FixedSizeArraySizeGreen(
6005 GreenNode {
6006 kind: SyntaxKind::FixedSizeArraySize,
6007 details: GreenNodeDetails::Node { children: children.into(), width },
6008 }
6009 .intern(db),
6010 )
6011 }
6012}
6013impl<'db> FixedSizeArraySize<'db> {
6014 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
6015 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[0])
6016 }
6017 pub fn size(&self, db: &'db dyn Database) -> Expr<'db> {
6018 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6019 }
6020}
6021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6022pub struct FixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6023impl<'db> FixedSizeArraySizePtr<'db> {}
6024impl<'db> TypedStablePtr<'db> for FixedSizeArraySizePtr<'db> {
6025 type SyntaxNode = FixedSizeArraySize<'db>;
6026 fn untyped(self) -> SyntaxStablePtrId<'db> {
6027 self.0
6028 }
6029 fn lookup(&self, db: &'db dyn Database) -> FixedSizeArraySize<'db> {
6030 FixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6031 }
6032}
6033impl<'db> From<FixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6034 fn from(ptr: FixedSizeArraySizePtr<'db>) -> Self {
6035 ptr.untyped()
6036 }
6037}
6038#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6039pub struct FixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6040impl<'db> TypedSyntaxNode<'db> for FixedSizeArraySize<'db> {
6041 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FixedSizeArraySize);
6042 type StablePtr = FixedSizeArraySizePtr<'db>;
6043 type Green = FixedSizeArraySizeGreen<'db>;
6044 fn missing(db: &'db dyn Database) -> Self::Green {
6045 FixedSizeArraySizeGreen(
6046 GreenNode {
6047 kind: SyntaxKind::FixedSizeArraySize,
6048 details: GreenNodeDetails::Node {
6049 children: [TerminalSemicolon::missing(db).0, Expr::missing(db).0].into(),
6050 width: TextWidth::default(),
6051 },
6052 }
6053 .intern(db),
6054 )
6055 }
6056 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6057 let kind = node.kind(db);
6058 assert_eq!(
6059 kind,
6060 SyntaxKind::FixedSizeArraySize,
6061 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6062 kind,
6063 SyntaxKind::FixedSizeArraySize
6064 );
6065 Self { node }
6066 }
6067 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6068 let kind = node.kind(db);
6069 if kind == SyntaxKind::FixedSizeArraySize {
6070 Some(Self::from_syntax_node(db, node))
6071 } else {
6072 None
6073 }
6074 }
6075 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6076 self.node
6077 }
6078 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6079 FixedSizeArraySizePtr(self.node.stable_ptr(db))
6080 }
6081}
6082#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6083pub enum OptionFixedSizeArraySize<'db> {
6084 Empty(OptionFixedSizeArraySizeEmpty<'db>),
6085 FixedSizeArraySize(FixedSizeArraySize<'db>),
6086}
6087#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6088pub struct OptionFixedSizeArraySizePtr<'db>(pub SyntaxStablePtrId<'db>);
6089impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizePtr<'db> {
6090 type SyntaxNode = OptionFixedSizeArraySize<'db>;
6091 fn untyped(self) -> SyntaxStablePtrId<'db> {
6092 self.0
6093 }
6094 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6095 OptionFixedSizeArraySize::from_syntax_node(db, self.0.lookup(db))
6096 }
6097}
6098impl<'db> From<OptionFixedSizeArraySizePtr<'db>> for SyntaxStablePtrId<'db> {
6099 fn from(ptr: OptionFixedSizeArraySizePtr<'db>) -> Self {
6100 ptr.untyped()
6101 }
6102}
6103impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6104 fn from(value: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6105 Self(value.0)
6106 }
6107}
6108impl<'db> From<FixedSizeArraySizePtr<'db>> for OptionFixedSizeArraySizePtr<'db> {
6109 fn from(value: FixedSizeArraySizePtr<'db>) -> Self {
6110 Self(value.0)
6111 }
6112}
6113impl<'db> From<OptionFixedSizeArraySizeEmptyGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6114 fn from(value: OptionFixedSizeArraySizeEmptyGreen<'db>) -> Self {
6115 Self(value.0)
6116 }
6117}
6118impl<'db> From<FixedSizeArraySizeGreen<'db>> for OptionFixedSizeArraySizeGreen<'db> {
6119 fn from(value: FixedSizeArraySizeGreen<'db>) -> Self {
6120 Self(value.0)
6121 }
6122}
6123#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6124pub struct OptionFixedSizeArraySizeGreen<'db>(pub GreenId<'db>);
6125impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySize<'db> {
6126 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6127 type StablePtr = OptionFixedSizeArraySizePtr<'db>;
6128 type Green = OptionFixedSizeArraySizeGreen<'db>;
6129 fn missing(db: &'db dyn Database) -> Self::Green {
6130 panic!("No missing variant.");
6131 }
6132 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6133 let kind = node.kind(db);
6134 match kind {
6135 SyntaxKind::OptionFixedSizeArraySizeEmpty => OptionFixedSizeArraySize::Empty(
6136 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6137 ),
6138 SyntaxKind::FixedSizeArraySize => OptionFixedSizeArraySize::FixedSizeArraySize(
6139 FixedSizeArraySize::from_syntax_node(db, node),
6140 ),
6141 _ => panic!(
6142 "Unexpected syntax kind {:?} when constructing {}.",
6143 kind, "OptionFixedSizeArraySize"
6144 ),
6145 }
6146 }
6147 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6148 let kind = node.kind(db);
6149 match kind {
6150 SyntaxKind::OptionFixedSizeArraySizeEmpty => Some(OptionFixedSizeArraySize::Empty(
6151 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, node),
6152 )),
6153 SyntaxKind::FixedSizeArraySize => Some(OptionFixedSizeArraySize::FixedSizeArraySize(
6154 FixedSizeArraySize::from_syntax_node(db, node),
6155 )),
6156 _ => None,
6157 }
6158 }
6159 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6160 match self {
6161 OptionFixedSizeArraySize::Empty(x) => x.as_syntax_node(),
6162 OptionFixedSizeArraySize::FixedSizeArraySize(x) => x.as_syntax_node(),
6163 }
6164 }
6165 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6166 OptionFixedSizeArraySizePtr(self.as_syntax_node().stable_ptr(db))
6167 }
6168}
6169impl<'db> OptionFixedSizeArraySize<'db> {
6170 pub fn is_variant(kind: SyntaxKind) -> bool {
6172 matches!(kind, SyntaxKind::OptionFixedSizeArraySizeEmpty | SyntaxKind::FixedSizeArraySize)
6173 }
6174}
6175#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6176pub struct OptionFixedSizeArraySizeEmpty<'db> {
6177 node: SyntaxNode<'db>,
6178}
6179impl<'db> OptionFixedSizeArraySizeEmpty<'db> {
6180 pub fn new_green(db: &'db dyn Database) -> OptionFixedSizeArraySizeEmptyGreen<'db> {
6181 let children = [];
6182 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6183 OptionFixedSizeArraySizeEmptyGreen(
6184 GreenNode {
6185 kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6186 details: GreenNodeDetails::Node { children: children.into(), width },
6187 }
6188 .intern(db),
6189 )
6190 }
6191}
6192impl<'db> OptionFixedSizeArraySizeEmpty<'db> {}
6193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6194pub struct OptionFixedSizeArraySizeEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6195impl<'db> OptionFixedSizeArraySizeEmptyPtr<'db> {}
6196impl<'db> TypedStablePtr<'db> for OptionFixedSizeArraySizeEmptyPtr<'db> {
6197 type SyntaxNode = OptionFixedSizeArraySizeEmpty<'db>;
6198 fn untyped(self) -> SyntaxStablePtrId<'db> {
6199 self.0
6200 }
6201 fn lookup(&self, db: &'db dyn Database) -> OptionFixedSizeArraySizeEmpty<'db> {
6202 OptionFixedSizeArraySizeEmpty::from_syntax_node(db, self.0.lookup(db))
6203 }
6204}
6205impl<'db> From<OptionFixedSizeArraySizeEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6206 fn from(ptr: OptionFixedSizeArraySizeEmptyPtr<'db>) -> Self {
6207 ptr.untyped()
6208 }
6209}
6210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6211pub struct OptionFixedSizeArraySizeEmptyGreen<'db>(pub GreenId<'db>);
6212impl<'db> TypedSyntaxNode<'db> for OptionFixedSizeArraySizeEmpty<'db> {
6213 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionFixedSizeArraySizeEmpty);
6214 type StablePtr = OptionFixedSizeArraySizeEmptyPtr<'db>;
6215 type Green = OptionFixedSizeArraySizeEmptyGreen<'db>;
6216 fn missing(db: &'db dyn Database) -> Self::Green {
6217 OptionFixedSizeArraySizeEmptyGreen(
6218 GreenNode {
6219 kind: SyntaxKind::OptionFixedSizeArraySizeEmpty,
6220 details: GreenNodeDetails::Node {
6221 children: [].into(),
6222 width: TextWidth::default(),
6223 },
6224 }
6225 .intern(db),
6226 )
6227 }
6228 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6229 let kind = node.kind(db);
6230 assert_eq!(
6231 kind,
6232 SyntaxKind::OptionFixedSizeArraySizeEmpty,
6233 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6234 kind,
6235 SyntaxKind::OptionFixedSizeArraySizeEmpty
6236 );
6237 Self { node }
6238 }
6239 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6240 let kind = node.kind(db);
6241 if kind == SyntaxKind::OptionFixedSizeArraySizeEmpty {
6242 Some(Self::from_syntax_node(db, node))
6243 } else {
6244 None
6245 }
6246 }
6247 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6248 self.node
6249 }
6250 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6251 OptionFixedSizeArraySizeEmptyPtr(self.node.stable_ptr(db))
6252 }
6253}
6254#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6255pub struct ExprClosure<'db> {
6256 node: SyntaxNode<'db>,
6257}
6258impl<'db> ExprClosure<'db> {
6259 pub const INDEX_WRAPPER: usize = 0;
6260 pub const INDEX_RET_TY: usize = 1;
6261 pub const INDEX_OPTIONAL_NO_PANIC: usize = 2;
6262 pub const INDEX_EXPR: usize = 3;
6263 pub fn new_green(
6264 db: &'db dyn Database,
6265 wrapper: ClosureParamWrapperGreen<'db>,
6266 ret_ty: OptionReturnTypeClauseGreen<'db>,
6267 optional_no_panic: OptionTerminalNoPanicGreen<'db>,
6268 expr: ExprGreen<'db>,
6269 ) -> ExprClosureGreen<'db> {
6270 let children = [wrapper.0, ret_ty.0, optional_no_panic.0, expr.0];
6271 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6272 ExprClosureGreen(
6273 GreenNode {
6274 kind: SyntaxKind::ExprClosure,
6275 details: GreenNodeDetails::Node { children: children.into(), width },
6276 }
6277 .intern(db),
6278 )
6279 }
6280}
6281impl<'db> ExprClosure<'db> {
6282 pub fn wrapper(&self, db: &'db dyn Database) -> ClosureParamWrapper<'db> {
6283 ClosureParamWrapper::from_syntax_node(db, self.node.get_children(db)[0])
6284 }
6285 pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
6286 OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[1])
6287 }
6288 pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
6289 OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[2])
6290 }
6291 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6292 Expr::from_syntax_node(db, self.node.get_children(db)[3])
6293 }
6294}
6295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6296pub struct ExprClosurePtr<'db>(pub SyntaxStablePtrId<'db>);
6297impl<'db> ExprClosurePtr<'db> {}
6298impl<'db> TypedStablePtr<'db> for ExprClosurePtr<'db> {
6299 type SyntaxNode = ExprClosure<'db>;
6300 fn untyped(self) -> SyntaxStablePtrId<'db> {
6301 self.0
6302 }
6303 fn lookup(&self, db: &'db dyn Database) -> ExprClosure<'db> {
6304 ExprClosure::from_syntax_node(db, self.0.lookup(db))
6305 }
6306}
6307impl<'db> From<ExprClosurePtr<'db>> for SyntaxStablePtrId<'db> {
6308 fn from(ptr: ExprClosurePtr<'db>) -> Self {
6309 ptr.untyped()
6310 }
6311}
6312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6313pub struct ExprClosureGreen<'db>(pub GreenId<'db>);
6314impl<'db> TypedSyntaxNode<'db> for ExprClosure<'db> {
6315 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClosure);
6316 type StablePtr = ExprClosurePtr<'db>;
6317 type Green = ExprClosureGreen<'db>;
6318 fn missing(db: &'db dyn Database) -> Self::Green {
6319 ExprClosureGreen(
6320 GreenNode {
6321 kind: SyntaxKind::ExprClosure,
6322 details: GreenNodeDetails::Node {
6323 children: [
6324 ClosureParamWrapper::missing(db).0,
6325 OptionReturnTypeClause::missing(db).0,
6326 OptionTerminalNoPanic::missing(db).0,
6327 Expr::missing(db).0,
6328 ]
6329 .into(),
6330 width: TextWidth::default(),
6331 },
6332 }
6333 .intern(db),
6334 )
6335 }
6336 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6337 let kind = node.kind(db);
6338 assert_eq!(
6339 kind,
6340 SyntaxKind::ExprClosure,
6341 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6342 kind,
6343 SyntaxKind::ExprClosure
6344 );
6345 Self { node }
6346 }
6347 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6348 let kind = node.kind(db);
6349 if kind == SyntaxKind::ExprClosure { Some(Self::from_syntax_node(db, node)) } else { None }
6350 }
6351 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6352 self.node
6353 }
6354 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6355 ExprClosurePtr(self.node.stable_ptr(db))
6356 }
6357}
6358#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6359pub enum ClosureParamWrapper<'db> {
6360 Nullary(TerminalOrOr<'db>),
6361 NAry(ClosureParamWrapperNAry<'db>),
6362}
6363#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6364pub struct ClosureParamWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
6365impl<'db> TypedStablePtr<'db> for ClosureParamWrapperPtr<'db> {
6366 type SyntaxNode = ClosureParamWrapper<'db>;
6367 fn untyped(self) -> SyntaxStablePtrId<'db> {
6368 self.0
6369 }
6370 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6371 ClosureParamWrapper::from_syntax_node(db, self.0.lookup(db))
6372 }
6373}
6374impl<'db> From<ClosureParamWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
6375 fn from(ptr: ClosureParamWrapperPtr<'db>) -> Self {
6376 ptr.untyped()
6377 }
6378}
6379impl<'db> From<TerminalOrOrPtr<'db>> for ClosureParamWrapperPtr<'db> {
6380 fn from(value: TerminalOrOrPtr<'db>) -> Self {
6381 Self(value.0)
6382 }
6383}
6384impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for ClosureParamWrapperPtr<'db> {
6385 fn from(value: ClosureParamWrapperNAryPtr<'db>) -> Self {
6386 Self(value.0)
6387 }
6388}
6389impl<'db> From<TerminalOrOrGreen<'db>> for ClosureParamWrapperGreen<'db> {
6390 fn from(value: TerminalOrOrGreen<'db>) -> Self {
6391 Self(value.0)
6392 }
6393}
6394impl<'db> From<ClosureParamWrapperNAryGreen<'db>> for ClosureParamWrapperGreen<'db> {
6395 fn from(value: ClosureParamWrapperNAryGreen<'db>) -> Self {
6396 Self(value.0)
6397 }
6398}
6399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6400pub struct ClosureParamWrapperGreen<'db>(pub GreenId<'db>);
6401impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapper<'db> {
6402 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6403 type StablePtr = ClosureParamWrapperPtr<'db>;
6404 type Green = ClosureParamWrapperGreen<'db>;
6405 fn missing(db: &'db dyn Database) -> Self::Green {
6406 panic!("No missing variant.");
6407 }
6408 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6409 let kind = node.kind(db);
6410 match kind {
6411 SyntaxKind::TerminalOrOr => {
6412 ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node))
6413 }
6414 SyntaxKind::ClosureParamWrapperNAry => {
6415 ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node))
6416 }
6417 _ => panic!(
6418 "Unexpected syntax kind {:?} when constructing {}.",
6419 kind, "ClosureParamWrapper"
6420 ),
6421 }
6422 }
6423 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6424 let kind = node.kind(db);
6425 match kind {
6426 SyntaxKind::TerminalOrOr => {
6427 Some(ClosureParamWrapper::Nullary(TerminalOrOr::from_syntax_node(db, node)))
6428 }
6429 SyntaxKind::ClosureParamWrapperNAry => {
6430 Some(ClosureParamWrapper::NAry(ClosureParamWrapperNAry::from_syntax_node(db, node)))
6431 }
6432 _ => None,
6433 }
6434 }
6435 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6436 match self {
6437 ClosureParamWrapper::Nullary(x) => x.as_syntax_node(),
6438 ClosureParamWrapper::NAry(x) => x.as_syntax_node(),
6439 }
6440 }
6441 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6442 ClosureParamWrapperPtr(self.as_syntax_node().stable_ptr(db))
6443 }
6444}
6445impl<'db> ClosureParamWrapper<'db> {
6446 pub fn is_variant(kind: SyntaxKind) -> bool {
6448 matches!(kind, SyntaxKind::TerminalOrOr | SyntaxKind::ClosureParamWrapperNAry)
6449 }
6450}
6451#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6452pub struct ClosureParamWrapperNAry<'db> {
6453 node: SyntaxNode<'db>,
6454}
6455impl<'db> ClosureParamWrapperNAry<'db> {
6456 pub const INDEX_LEFTOR: usize = 0;
6457 pub const INDEX_PARAMS: usize = 1;
6458 pub const INDEX_RIGHTOR: usize = 2;
6459 pub fn new_green(
6460 db: &'db dyn Database,
6461 leftor: TerminalOrGreen<'db>,
6462 params: ParamListGreen<'db>,
6463 rightor: TerminalOrGreen<'db>,
6464 ) -> ClosureParamWrapperNAryGreen<'db> {
6465 let children = [leftor.0, params.0, rightor.0];
6466 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6467 ClosureParamWrapperNAryGreen(
6468 GreenNode {
6469 kind: SyntaxKind::ClosureParamWrapperNAry,
6470 details: GreenNodeDetails::Node { children: children.into(), width },
6471 }
6472 .intern(db),
6473 )
6474 }
6475}
6476impl<'db> ClosureParamWrapperNAry<'db> {
6477 pub fn leftor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6478 TerminalOr::from_syntax_node(db, self.node.get_children(db)[0])
6479 }
6480 pub fn params(&self, db: &'db dyn Database) -> ParamList<'db> {
6481 ParamList::from_syntax_node(db, self.node.get_children(db)[1])
6482 }
6483 pub fn rightor(&self, db: &'db dyn Database) -> TerminalOr<'db> {
6484 TerminalOr::from_syntax_node(db, self.node.get_children(db)[2])
6485 }
6486}
6487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6488pub struct ClosureParamWrapperNAryPtr<'db>(pub SyntaxStablePtrId<'db>);
6489impl<'db> ClosureParamWrapperNAryPtr<'db> {}
6490impl<'db> TypedStablePtr<'db> for ClosureParamWrapperNAryPtr<'db> {
6491 type SyntaxNode = ClosureParamWrapperNAry<'db>;
6492 fn untyped(self) -> SyntaxStablePtrId<'db> {
6493 self.0
6494 }
6495 fn lookup(&self, db: &'db dyn Database) -> ClosureParamWrapperNAry<'db> {
6496 ClosureParamWrapperNAry::from_syntax_node(db, self.0.lookup(db))
6497 }
6498}
6499impl<'db> From<ClosureParamWrapperNAryPtr<'db>> for SyntaxStablePtrId<'db> {
6500 fn from(ptr: ClosureParamWrapperNAryPtr<'db>) -> Self {
6501 ptr.untyped()
6502 }
6503}
6504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6505pub struct ClosureParamWrapperNAryGreen<'db>(pub GreenId<'db>);
6506impl<'db> TypedSyntaxNode<'db> for ClosureParamWrapperNAry<'db> {
6507 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ClosureParamWrapperNAry);
6508 type StablePtr = ClosureParamWrapperNAryPtr<'db>;
6509 type Green = ClosureParamWrapperNAryGreen<'db>;
6510 fn missing(db: &'db dyn Database) -> Self::Green {
6511 ClosureParamWrapperNAryGreen(
6512 GreenNode {
6513 kind: SyntaxKind::ClosureParamWrapperNAry,
6514 details: GreenNodeDetails::Node {
6515 children: [
6516 TerminalOr::missing(db).0,
6517 ParamList::missing(db).0,
6518 TerminalOr::missing(db).0,
6519 ]
6520 .into(),
6521 width: TextWidth::default(),
6522 },
6523 }
6524 .intern(db),
6525 )
6526 }
6527 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6528 let kind = node.kind(db);
6529 assert_eq!(
6530 kind,
6531 SyntaxKind::ClosureParamWrapperNAry,
6532 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6533 kind,
6534 SyntaxKind::ClosureParamWrapperNAry
6535 );
6536 Self { node }
6537 }
6538 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6539 let kind = node.kind(db);
6540 if kind == SyntaxKind::ClosureParamWrapperNAry {
6541 Some(Self::from_syntax_node(db, node))
6542 } else {
6543 None
6544 }
6545 }
6546 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6547 self.node
6548 }
6549 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6550 ClosureParamWrapperNAryPtr(self.node.stable_ptr(db))
6551 }
6552}
6553#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6554pub struct StructArgExpr<'db> {
6555 node: SyntaxNode<'db>,
6556}
6557impl<'db> StructArgExpr<'db> {
6558 pub const INDEX_COLON: usize = 0;
6559 pub const INDEX_EXPR: usize = 1;
6560 pub fn new_green(
6561 db: &'db dyn Database,
6562 colon: TerminalColonGreen<'db>,
6563 expr: ExprGreen<'db>,
6564 ) -> StructArgExprGreen<'db> {
6565 let children = [colon.0, expr.0];
6566 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6567 StructArgExprGreen(
6568 GreenNode {
6569 kind: SyntaxKind::StructArgExpr,
6570 details: GreenNodeDetails::Node { children: children.into(), width },
6571 }
6572 .intern(db),
6573 )
6574 }
6575}
6576impl<'db> StructArgExpr<'db> {
6577 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
6578 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
6579 }
6580 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
6581 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6582 }
6583}
6584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6585pub struct StructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6586impl<'db> StructArgExprPtr<'db> {}
6587impl<'db> TypedStablePtr<'db> for StructArgExprPtr<'db> {
6588 type SyntaxNode = StructArgExpr<'db>;
6589 fn untyped(self) -> SyntaxStablePtrId<'db> {
6590 self.0
6591 }
6592 fn lookup(&self, db: &'db dyn Database) -> StructArgExpr<'db> {
6593 StructArgExpr::from_syntax_node(db, self.0.lookup(db))
6594 }
6595}
6596impl<'db> From<StructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6597 fn from(ptr: StructArgExprPtr<'db>) -> Self {
6598 ptr.untyped()
6599 }
6600}
6601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6602pub struct StructArgExprGreen<'db>(pub GreenId<'db>);
6603impl<'db> TypedSyntaxNode<'db> for StructArgExpr<'db> {
6604 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgExpr);
6605 type StablePtr = StructArgExprPtr<'db>;
6606 type Green = StructArgExprGreen<'db>;
6607 fn missing(db: &'db dyn Database) -> Self::Green {
6608 StructArgExprGreen(
6609 GreenNode {
6610 kind: SyntaxKind::StructArgExpr,
6611 details: GreenNodeDetails::Node {
6612 children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
6613 width: TextWidth::default(),
6614 },
6615 }
6616 .intern(db),
6617 )
6618 }
6619 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6620 let kind = node.kind(db);
6621 assert_eq!(
6622 kind,
6623 SyntaxKind::StructArgExpr,
6624 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6625 kind,
6626 SyntaxKind::StructArgExpr
6627 );
6628 Self { node }
6629 }
6630 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6631 let kind = node.kind(db);
6632 if kind == SyntaxKind::StructArgExpr {
6633 Some(Self::from_syntax_node(db, node))
6634 } else {
6635 None
6636 }
6637 }
6638 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6639 self.node
6640 }
6641 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6642 StructArgExprPtr(self.node.stable_ptr(db))
6643 }
6644}
6645#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6646pub enum OptionStructArgExpr<'db> {
6647 Empty(OptionStructArgExprEmpty<'db>),
6648 StructArgExpr(StructArgExpr<'db>),
6649}
6650#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6651pub struct OptionStructArgExprPtr<'db>(pub SyntaxStablePtrId<'db>);
6652impl<'db> TypedStablePtr<'db> for OptionStructArgExprPtr<'db> {
6653 type SyntaxNode = OptionStructArgExpr<'db>;
6654 fn untyped(self) -> SyntaxStablePtrId<'db> {
6655 self.0
6656 }
6657 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
6658 OptionStructArgExpr::from_syntax_node(db, self.0.lookup(db))
6659 }
6660}
6661impl<'db> From<OptionStructArgExprPtr<'db>> for SyntaxStablePtrId<'db> {
6662 fn from(ptr: OptionStructArgExprPtr<'db>) -> Self {
6663 ptr.untyped()
6664 }
6665}
6666impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for OptionStructArgExprPtr<'db> {
6667 fn from(value: OptionStructArgExprEmptyPtr<'db>) -> Self {
6668 Self(value.0)
6669 }
6670}
6671impl<'db> From<StructArgExprPtr<'db>> for OptionStructArgExprPtr<'db> {
6672 fn from(value: StructArgExprPtr<'db>) -> Self {
6673 Self(value.0)
6674 }
6675}
6676impl<'db> From<OptionStructArgExprEmptyGreen<'db>> for OptionStructArgExprGreen<'db> {
6677 fn from(value: OptionStructArgExprEmptyGreen<'db>) -> Self {
6678 Self(value.0)
6679 }
6680}
6681impl<'db> From<StructArgExprGreen<'db>> for OptionStructArgExprGreen<'db> {
6682 fn from(value: StructArgExprGreen<'db>) -> Self {
6683 Self(value.0)
6684 }
6685}
6686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6687pub struct OptionStructArgExprGreen<'db>(pub GreenId<'db>);
6688impl<'db> TypedSyntaxNode<'db> for OptionStructArgExpr<'db> {
6689 const OPTIONAL_KIND: Option<SyntaxKind> = None;
6690 type StablePtr = OptionStructArgExprPtr<'db>;
6691 type Green = OptionStructArgExprGreen<'db>;
6692 fn missing(db: &'db dyn Database) -> Self::Green {
6693 panic!("No missing variant.");
6694 }
6695 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6696 let kind = node.kind(db);
6697 match kind {
6698 SyntaxKind::OptionStructArgExprEmpty => {
6699 OptionStructArgExpr::Empty(OptionStructArgExprEmpty::from_syntax_node(db, node))
6700 }
6701 SyntaxKind::StructArgExpr => {
6702 OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node))
6703 }
6704 _ => panic!(
6705 "Unexpected syntax kind {:?} when constructing {}.",
6706 kind, "OptionStructArgExpr"
6707 ),
6708 }
6709 }
6710 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6711 let kind = node.kind(db);
6712 match kind {
6713 SyntaxKind::OptionStructArgExprEmpty => Some(OptionStructArgExpr::Empty(
6714 OptionStructArgExprEmpty::from_syntax_node(db, node),
6715 )),
6716 SyntaxKind::StructArgExpr => {
6717 Some(OptionStructArgExpr::StructArgExpr(StructArgExpr::from_syntax_node(db, node)))
6718 }
6719 _ => None,
6720 }
6721 }
6722 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6723 match self {
6724 OptionStructArgExpr::Empty(x) => x.as_syntax_node(),
6725 OptionStructArgExpr::StructArgExpr(x) => x.as_syntax_node(),
6726 }
6727 }
6728 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6729 OptionStructArgExprPtr(self.as_syntax_node().stable_ptr(db))
6730 }
6731}
6732impl<'db> OptionStructArgExpr<'db> {
6733 pub fn is_variant(kind: SyntaxKind) -> bool {
6735 matches!(kind, SyntaxKind::OptionStructArgExprEmpty | SyntaxKind::StructArgExpr)
6736 }
6737}
6738#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6739pub struct OptionStructArgExprEmpty<'db> {
6740 node: SyntaxNode<'db>,
6741}
6742impl<'db> OptionStructArgExprEmpty<'db> {
6743 pub fn new_green(db: &'db dyn Database) -> OptionStructArgExprEmptyGreen<'db> {
6744 let children = [];
6745 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6746 OptionStructArgExprEmptyGreen(
6747 GreenNode {
6748 kind: SyntaxKind::OptionStructArgExprEmpty,
6749 details: GreenNodeDetails::Node { children: children.into(), width },
6750 }
6751 .intern(db),
6752 )
6753 }
6754}
6755impl<'db> OptionStructArgExprEmpty<'db> {}
6756#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6757pub struct OptionStructArgExprEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
6758impl<'db> OptionStructArgExprEmptyPtr<'db> {}
6759impl<'db> TypedStablePtr<'db> for OptionStructArgExprEmptyPtr<'db> {
6760 type SyntaxNode = OptionStructArgExprEmpty<'db>;
6761 fn untyped(self) -> SyntaxStablePtrId<'db> {
6762 self.0
6763 }
6764 fn lookup(&self, db: &'db dyn Database) -> OptionStructArgExprEmpty<'db> {
6765 OptionStructArgExprEmpty::from_syntax_node(db, self.0.lookup(db))
6766 }
6767}
6768impl<'db> From<OptionStructArgExprEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
6769 fn from(ptr: OptionStructArgExprEmptyPtr<'db>) -> Self {
6770 ptr.untyped()
6771 }
6772}
6773#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6774pub struct OptionStructArgExprEmptyGreen<'db>(pub GreenId<'db>);
6775impl<'db> TypedSyntaxNode<'db> for OptionStructArgExprEmpty<'db> {
6776 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionStructArgExprEmpty);
6777 type StablePtr = OptionStructArgExprEmptyPtr<'db>;
6778 type Green = OptionStructArgExprEmptyGreen<'db>;
6779 fn missing(db: &'db dyn Database) -> Self::Green {
6780 OptionStructArgExprEmptyGreen(
6781 GreenNode {
6782 kind: SyntaxKind::OptionStructArgExprEmpty,
6783 details: GreenNodeDetails::Node {
6784 children: [].into(),
6785 width: TextWidth::default(),
6786 },
6787 }
6788 .intern(db),
6789 )
6790 }
6791 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6792 let kind = node.kind(db);
6793 assert_eq!(
6794 kind,
6795 SyntaxKind::OptionStructArgExprEmpty,
6796 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6797 kind,
6798 SyntaxKind::OptionStructArgExprEmpty
6799 );
6800 Self { node }
6801 }
6802 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6803 let kind = node.kind(db);
6804 if kind == SyntaxKind::OptionStructArgExprEmpty {
6805 Some(Self::from_syntax_node(db, node))
6806 } else {
6807 None
6808 }
6809 }
6810 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6811 self.node
6812 }
6813 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6814 OptionStructArgExprEmptyPtr(self.node.stable_ptr(db))
6815 }
6816}
6817#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6818pub struct StructArgSingle<'db> {
6819 node: SyntaxNode<'db>,
6820}
6821impl<'db> StructArgSingle<'db> {
6822 pub const INDEX_IDENTIFIER: usize = 0;
6823 pub const INDEX_ARG_EXPR: usize = 1;
6824 pub fn new_green(
6825 db: &'db dyn Database,
6826 identifier: TerminalIdentifierGreen<'db>,
6827 arg_expr: OptionStructArgExprGreen<'db>,
6828 ) -> StructArgSingleGreen<'db> {
6829 let children = [identifier.0, arg_expr.0];
6830 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6831 StructArgSingleGreen(
6832 GreenNode {
6833 kind: SyntaxKind::StructArgSingle,
6834 details: GreenNodeDetails::Node { children: children.into(), width },
6835 }
6836 .intern(db),
6837 )
6838 }
6839}
6840impl<'db> StructArgSingle<'db> {
6841 pub fn identifier(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
6842 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
6843 }
6844 pub fn arg_expr(&self, db: &'db dyn Database) -> OptionStructArgExpr<'db> {
6845 OptionStructArgExpr::from_syntax_node(db, self.node.get_children(db)[1])
6846 }
6847}
6848#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6849pub struct StructArgSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
6850impl<'db> StructArgSinglePtr<'db> {
6851 pub fn identifier_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
6852 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
6853 }
6854}
6855impl<'db> TypedStablePtr<'db> for StructArgSinglePtr<'db> {
6856 type SyntaxNode = StructArgSingle<'db>;
6857 fn untyped(self) -> SyntaxStablePtrId<'db> {
6858 self.0
6859 }
6860 fn lookup(&self, db: &'db dyn Database) -> StructArgSingle<'db> {
6861 StructArgSingle::from_syntax_node(db, self.0.lookup(db))
6862 }
6863}
6864impl<'db> From<StructArgSinglePtr<'db>> for SyntaxStablePtrId<'db> {
6865 fn from(ptr: StructArgSinglePtr<'db>) -> Self {
6866 ptr.untyped()
6867 }
6868}
6869#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6870pub struct StructArgSingleGreen<'db>(pub GreenId<'db>);
6871impl<'db> TypedSyntaxNode<'db> for StructArgSingle<'db> {
6872 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgSingle);
6873 type StablePtr = StructArgSinglePtr<'db>;
6874 type Green = StructArgSingleGreen<'db>;
6875 fn missing(db: &'db dyn Database) -> Self::Green {
6876 StructArgSingleGreen(
6877 GreenNode {
6878 kind: SyntaxKind::StructArgSingle,
6879 details: GreenNodeDetails::Node {
6880 children: [
6881 TerminalIdentifier::missing(db).0,
6882 OptionStructArgExpr::missing(db).0,
6883 ]
6884 .into(),
6885 width: TextWidth::default(),
6886 },
6887 }
6888 .intern(db),
6889 )
6890 }
6891 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6892 let kind = node.kind(db);
6893 assert_eq!(
6894 kind,
6895 SyntaxKind::StructArgSingle,
6896 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6897 kind,
6898 SyntaxKind::StructArgSingle
6899 );
6900 Self { node }
6901 }
6902 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6903 let kind = node.kind(db);
6904 if kind == SyntaxKind::StructArgSingle {
6905 Some(Self::from_syntax_node(db, node))
6906 } else {
6907 None
6908 }
6909 }
6910 fn as_syntax_node(&self) -> SyntaxNode<'db> {
6911 self.node
6912 }
6913 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
6914 StructArgSinglePtr(self.node.stable_ptr(db))
6915 }
6916}
6917#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
6918pub struct StructArgTail<'db> {
6919 node: SyntaxNode<'db>,
6920}
6921impl<'db> StructArgTail<'db> {
6922 pub const INDEX_DOTDOT: usize = 0;
6923 pub const INDEX_EXPRESSION: usize = 1;
6924 pub fn new_green(
6925 db: &'db dyn Database,
6926 dotdot: TerminalDotDotGreen<'db>,
6927 expression: ExprGreen<'db>,
6928 ) -> StructArgTailGreen<'db> {
6929 let children = [dotdot.0, expression.0];
6930 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
6931 StructArgTailGreen(
6932 GreenNode {
6933 kind: SyntaxKind::StructArgTail,
6934 details: GreenNodeDetails::Node { children: children.into(), width },
6935 }
6936 .intern(db),
6937 )
6938 }
6939}
6940impl<'db> StructArgTail<'db> {
6941 pub fn dotdot(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
6942 TerminalDotDot::from_syntax_node(db, self.node.get_children(db)[0])
6943 }
6944 pub fn expression(&self, db: &'db dyn Database) -> Expr<'db> {
6945 Expr::from_syntax_node(db, self.node.get_children(db)[1])
6946 }
6947}
6948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6949pub struct StructArgTailPtr<'db>(pub SyntaxStablePtrId<'db>);
6950impl<'db> StructArgTailPtr<'db> {}
6951impl<'db> TypedStablePtr<'db> for StructArgTailPtr<'db> {
6952 type SyntaxNode = StructArgTail<'db>;
6953 fn untyped(self) -> SyntaxStablePtrId<'db> {
6954 self.0
6955 }
6956 fn lookup(&self, db: &'db dyn Database) -> StructArgTail<'db> {
6957 StructArgTail::from_syntax_node(db, self.0.lookup(db))
6958 }
6959}
6960impl<'db> From<StructArgTailPtr<'db>> for SyntaxStablePtrId<'db> {
6961 fn from(ptr: StructArgTailPtr<'db>) -> Self {
6962 ptr.untyped()
6963 }
6964}
6965#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
6966pub struct StructArgTailGreen<'db>(pub GreenId<'db>);
6967impl<'db> TypedSyntaxNode<'db> for StructArgTail<'db> {
6968 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgTail);
6969 type StablePtr = StructArgTailPtr<'db>;
6970 type Green = StructArgTailGreen<'db>;
6971 fn missing(db: &'db dyn Database) -> Self::Green {
6972 StructArgTailGreen(
6973 GreenNode {
6974 kind: SyntaxKind::StructArgTail,
6975 details: GreenNodeDetails::Node {
6976 children: [TerminalDotDot::missing(db).0, Expr::missing(db).0].into(),
6977 width: TextWidth::default(),
6978 },
6979 }
6980 .intern(db),
6981 )
6982 }
6983 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
6984 let kind = node.kind(db);
6985 assert_eq!(
6986 kind,
6987 SyntaxKind::StructArgTail,
6988 "Unexpected SyntaxKind {:?}. Expected {:?}.",
6989 kind,
6990 SyntaxKind::StructArgTail
6991 );
6992 Self { node }
6993 }
6994 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
6995 let kind = node.kind(db);
6996 if kind == SyntaxKind::StructArgTail {
6997 Some(Self::from_syntax_node(db, node))
6998 } else {
6999 None
7000 }
7001 }
7002 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7003 self.node
7004 }
7005 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7006 StructArgTailPtr(self.node.stable_ptr(db))
7007 }
7008}
7009#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7010pub enum StructArg<'db> {
7011 StructArgSingle(StructArgSingle<'db>),
7012 StructArgTail(StructArgTail<'db>),
7013}
7014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7015pub struct StructArgPtr<'db>(pub SyntaxStablePtrId<'db>);
7016impl<'db> TypedStablePtr<'db> for StructArgPtr<'db> {
7017 type SyntaxNode = StructArg<'db>;
7018 fn untyped(self) -> SyntaxStablePtrId<'db> {
7019 self.0
7020 }
7021 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7022 StructArg::from_syntax_node(db, self.0.lookup(db))
7023 }
7024}
7025impl<'db> From<StructArgPtr<'db>> for SyntaxStablePtrId<'db> {
7026 fn from(ptr: StructArgPtr<'db>) -> Self {
7027 ptr.untyped()
7028 }
7029}
7030impl<'db> From<StructArgSinglePtr<'db>> for StructArgPtr<'db> {
7031 fn from(value: StructArgSinglePtr<'db>) -> Self {
7032 Self(value.0)
7033 }
7034}
7035impl<'db> From<StructArgTailPtr<'db>> for StructArgPtr<'db> {
7036 fn from(value: StructArgTailPtr<'db>) -> Self {
7037 Self(value.0)
7038 }
7039}
7040impl<'db> From<StructArgSingleGreen<'db>> for StructArgGreen<'db> {
7041 fn from(value: StructArgSingleGreen<'db>) -> Self {
7042 Self(value.0)
7043 }
7044}
7045impl<'db> From<StructArgTailGreen<'db>> for StructArgGreen<'db> {
7046 fn from(value: StructArgTailGreen<'db>) -> Self {
7047 Self(value.0)
7048 }
7049}
7050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7051pub struct StructArgGreen<'db>(pub GreenId<'db>);
7052impl<'db> TypedSyntaxNode<'db> for StructArg<'db> {
7053 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7054 type StablePtr = StructArgPtr<'db>;
7055 type Green = StructArgGreen<'db>;
7056 fn missing(db: &'db dyn Database) -> Self::Green {
7057 panic!("No missing variant.");
7058 }
7059 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7060 let kind = node.kind(db);
7061 match kind {
7062 SyntaxKind::StructArgSingle => {
7063 StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node))
7064 }
7065 SyntaxKind::StructArgTail => {
7066 StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node))
7067 }
7068 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "StructArg"),
7069 }
7070 }
7071 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7072 let kind = node.kind(db);
7073 match kind {
7074 SyntaxKind::StructArgSingle => {
7075 Some(StructArg::StructArgSingle(StructArgSingle::from_syntax_node(db, node)))
7076 }
7077 SyntaxKind::StructArgTail => {
7078 Some(StructArg::StructArgTail(StructArgTail::from_syntax_node(db, node)))
7079 }
7080 _ => None,
7081 }
7082 }
7083 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7084 match self {
7085 StructArg::StructArgSingle(x) => x.as_syntax_node(),
7086 StructArg::StructArgTail(x) => x.as_syntax_node(),
7087 }
7088 }
7089 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7090 StructArgPtr(self.as_syntax_node().stable_ptr(db))
7091 }
7092}
7093impl<'db> StructArg<'db> {
7094 pub fn is_variant(kind: SyntaxKind) -> bool {
7096 matches!(kind, SyntaxKind::StructArgSingle | SyntaxKind::StructArgTail)
7097 }
7098}
7099#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7100pub struct StructArgList<'db>(ElementList<'db, StructArg<'db>, 2>);
7101impl<'db> Deref for StructArgList<'db> {
7102 type Target = ElementList<'db, StructArg<'db>, 2>;
7103 fn deref(&self) -> &Self::Target {
7104 &self.0
7105 }
7106}
7107impl<'db> StructArgList<'db> {
7108 pub fn new_green(
7109 db: &'db dyn Database,
7110 children: &[StructArgListElementOrSeparatorGreen<'db>],
7111 ) -> StructArgListGreen<'db> {
7112 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
7113 StructArgListGreen(
7114 GreenNode {
7115 kind: SyntaxKind::StructArgList,
7116 details: GreenNodeDetails::Node {
7117 children: children.iter().map(|x| x.id()).collect(),
7118 width,
7119 },
7120 }
7121 .intern(db),
7122 )
7123 }
7124}
7125#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7126pub struct StructArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7127impl<'db> TypedStablePtr<'db> for StructArgListPtr<'db> {
7128 type SyntaxNode = StructArgList<'db>;
7129 fn untyped(self) -> SyntaxStablePtrId<'db> {
7130 self.0
7131 }
7132 fn lookup(&self, db: &'db dyn Database) -> StructArgList<'db> {
7133 StructArgList::from_syntax_node(db, self.0.lookup(db))
7134 }
7135}
7136impl<'db> From<StructArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7137 fn from(ptr: StructArgListPtr<'db>) -> Self {
7138 ptr.untyped()
7139 }
7140}
7141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7142pub enum StructArgListElementOrSeparatorGreen<'db> {
7143 Separator(TerminalCommaGreen<'db>),
7144 Element(StructArgGreen<'db>),
7145}
7146impl<'db> From<TerminalCommaGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7147 fn from(value: TerminalCommaGreen<'db>) -> Self {
7148 StructArgListElementOrSeparatorGreen::Separator(value)
7149 }
7150}
7151impl<'db> From<StructArgGreen<'db>> for StructArgListElementOrSeparatorGreen<'db> {
7152 fn from(value: StructArgGreen<'db>) -> Self {
7153 StructArgListElementOrSeparatorGreen::Element(value)
7154 }
7155}
7156impl<'db> StructArgListElementOrSeparatorGreen<'db> {
7157 fn id(&self) -> GreenId<'db> {
7158 match self {
7159 StructArgListElementOrSeparatorGreen::Separator(green) => green.0,
7160 StructArgListElementOrSeparatorGreen::Element(green) => green.0,
7161 }
7162 }
7163}
7164#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7165pub struct StructArgListGreen<'db>(pub GreenId<'db>);
7166impl<'db> TypedSyntaxNode<'db> for StructArgList<'db> {
7167 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StructArgList);
7168 type StablePtr = StructArgListPtr<'db>;
7169 type Green = StructArgListGreen<'db>;
7170 fn missing(db: &'db dyn Database) -> Self::Green {
7171 StructArgListGreen(
7172 GreenNode {
7173 kind: SyntaxKind::StructArgList,
7174 details: GreenNodeDetails::Node {
7175 children: [].into(),
7176 width: TextWidth::default(),
7177 },
7178 }
7179 .intern(db),
7180 )
7181 }
7182 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7183 Self(ElementList::new(node))
7184 }
7185 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7186 if node.kind(db) == SyntaxKind::StructArgList {
7187 Some(Self(ElementList::new(node)))
7188 } else {
7189 None
7190 }
7191 }
7192 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7193 self.node
7194 }
7195 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7196 StructArgListPtr(self.node.stable_ptr(db))
7197 }
7198}
7199#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7200pub struct ArgListBraced<'db> {
7201 node: SyntaxNode<'db>,
7202}
7203impl<'db> ArgListBraced<'db> {
7204 pub const INDEX_LBRACE: usize = 0;
7205 pub const INDEX_ARGUMENTS: usize = 1;
7206 pub const INDEX_RBRACE: usize = 2;
7207 pub fn new_green(
7208 db: &'db dyn Database,
7209 lbrace: TerminalLBraceGreen<'db>,
7210 arguments: ArgListGreen<'db>,
7211 rbrace: TerminalRBraceGreen<'db>,
7212 ) -> ArgListBracedGreen<'db> {
7213 let children = [lbrace.0, arguments.0, rbrace.0];
7214 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7215 ArgListBracedGreen(
7216 GreenNode {
7217 kind: SyntaxKind::ArgListBraced,
7218 details: GreenNodeDetails::Node { children: children.into(), width },
7219 }
7220 .intern(db),
7221 )
7222 }
7223}
7224impl<'db> ArgListBraced<'db> {
7225 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
7226 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
7227 }
7228 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7229 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7230 }
7231 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
7232 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
7233 }
7234}
7235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7236pub struct ArgListBracedPtr<'db>(pub SyntaxStablePtrId<'db>);
7237impl<'db> ArgListBracedPtr<'db> {}
7238impl<'db> TypedStablePtr<'db> for ArgListBracedPtr<'db> {
7239 type SyntaxNode = ArgListBraced<'db>;
7240 fn untyped(self) -> SyntaxStablePtrId<'db> {
7241 self.0
7242 }
7243 fn lookup(&self, db: &'db dyn Database) -> ArgListBraced<'db> {
7244 ArgListBraced::from_syntax_node(db, self.0.lookup(db))
7245 }
7246}
7247impl<'db> From<ArgListBracedPtr<'db>> for SyntaxStablePtrId<'db> {
7248 fn from(ptr: ArgListBracedPtr<'db>) -> Self {
7249 ptr.untyped()
7250 }
7251}
7252#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7253pub struct ArgListBracedGreen<'db>(pub GreenId<'db>);
7254impl<'db> TypedSyntaxNode<'db> for ArgListBraced<'db> {
7255 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBraced);
7256 type StablePtr = ArgListBracedPtr<'db>;
7257 type Green = ArgListBracedGreen<'db>;
7258 fn missing(db: &'db dyn Database) -> Self::Green {
7259 ArgListBracedGreen(
7260 GreenNode {
7261 kind: SyntaxKind::ArgListBraced,
7262 details: GreenNodeDetails::Node {
7263 children: [
7264 TerminalLBrace::missing(db).0,
7265 ArgList::missing(db).0,
7266 TerminalRBrace::missing(db).0,
7267 ]
7268 .into(),
7269 width: TextWidth::default(),
7270 },
7271 }
7272 .intern(db),
7273 )
7274 }
7275 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7276 let kind = node.kind(db);
7277 assert_eq!(
7278 kind,
7279 SyntaxKind::ArgListBraced,
7280 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7281 kind,
7282 SyntaxKind::ArgListBraced
7283 );
7284 Self { node }
7285 }
7286 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7287 let kind = node.kind(db);
7288 if kind == SyntaxKind::ArgListBraced {
7289 Some(Self::from_syntax_node(db, node))
7290 } else {
7291 None
7292 }
7293 }
7294 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7295 self.node
7296 }
7297 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7298 ArgListBracedPtr(self.node.stable_ptr(db))
7299 }
7300}
7301#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7302pub struct ArgListBracketed<'db> {
7303 node: SyntaxNode<'db>,
7304}
7305impl<'db> ArgListBracketed<'db> {
7306 pub const INDEX_LBRACK: usize = 0;
7307 pub const INDEX_ARGUMENTS: usize = 1;
7308 pub const INDEX_RBRACK: usize = 2;
7309 pub fn new_green(
7310 db: &'db dyn Database,
7311 lbrack: TerminalLBrackGreen<'db>,
7312 arguments: ArgListGreen<'db>,
7313 rbrack: TerminalRBrackGreen<'db>,
7314 ) -> ArgListBracketedGreen<'db> {
7315 let children = [lbrack.0, arguments.0, rbrack.0];
7316 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7317 ArgListBracketedGreen(
7318 GreenNode {
7319 kind: SyntaxKind::ArgListBracketed,
7320 details: GreenNodeDetails::Node { children: children.into(), width },
7321 }
7322 .intern(db),
7323 )
7324 }
7325}
7326impl<'db> ArgListBracketed<'db> {
7327 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
7328 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
7329 }
7330 pub fn arguments(&self, db: &'db dyn Database) -> ArgList<'db> {
7331 ArgList::from_syntax_node(db, self.node.get_children(db)[1])
7332 }
7333 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
7334 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
7335 }
7336}
7337#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7338pub struct ArgListBracketedPtr<'db>(pub SyntaxStablePtrId<'db>);
7339impl<'db> ArgListBracketedPtr<'db> {}
7340impl<'db> TypedStablePtr<'db> for ArgListBracketedPtr<'db> {
7341 type SyntaxNode = ArgListBracketed<'db>;
7342 fn untyped(self) -> SyntaxStablePtrId<'db> {
7343 self.0
7344 }
7345 fn lookup(&self, db: &'db dyn Database) -> ArgListBracketed<'db> {
7346 ArgListBracketed::from_syntax_node(db, self.0.lookup(db))
7347 }
7348}
7349impl<'db> From<ArgListBracketedPtr<'db>> for SyntaxStablePtrId<'db> {
7350 fn from(ptr: ArgListBracketedPtr<'db>) -> Self {
7351 ptr.untyped()
7352 }
7353}
7354#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7355pub struct ArgListBracketedGreen<'db>(pub GreenId<'db>);
7356impl<'db> TypedSyntaxNode<'db> for ArgListBracketed<'db> {
7357 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ArgListBracketed);
7358 type StablePtr = ArgListBracketedPtr<'db>;
7359 type Green = ArgListBracketedGreen<'db>;
7360 fn missing(db: &'db dyn Database) -> Self::Green {
7361 ArgListBracketedGreen(
7362 GreenNode {
7363 kind: SyntaxKind::ArgListBracketed,
7364 details: GreenNodeDetails::Node {
7365 children: [
7366 TerminalLBrack::missing(db).0,
7367 ArgList::missing(db).0,
7368 TerminalRBrack::missing(db).0,
7369 ]
7370 .into(),
7371 width: TextWidth::default(),
7372 },
7373 }
7374 .intern(db),
7375 )
7376 }
7377 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7378 let kind = node.kind(db);
7379 assert_eq!(
7380 kind,
7381 SyntaxKind::ArgListBracketed,
7382 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7383 kind,
7384 SyntaxKind::ArgListBracketed
7385 );
7386 Self { node }
7387 }
7388 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7389 let kind = node.kind(db);
7390 if kind == SyntaxKind::ArgListBracketed {
7391 Some(Self::from_syntax_node(db, node))
7392 } else {
7393 None
7394 }
7395 }
7396 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7397 self.node
7398 }
7399 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7400 ArgListBracketedPtr(self.node.stable_ptr(db))
7401 }
7402}
7403#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7404pub enum WrappedArgList<'db> {
7405 BracketedArgList(ArgListBracketed<'db>),
7406 ParenthesizedArgList(ArgListParenthesized<'db>),
7407 BracedArgList(ArgListBraced<'db>),
7408 Missing(WrappedArgListMissing<'db>),
7409}
7410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7411pub struct WrappedArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
7412impl<'db> TypedStablePtr<'db> for WrappedArgListPtr<'db> {
7413 type SyntaxNode = WrappedArgList<'db>;
7414 fn untyped(self) -> SyntaxStablePtrId<'db> {
7415 self.0
7416 }
7417 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7418 WrappedArgList::from_syntax_node(db, self.0.lookup(db))
7419 }
7420}
7421impl<'db> From<WrappedArgListPtr<'db>> for SyntaxStablePtrId<'db> {
7422 fn from(ptr: WrappedArgListPtr<'db>) -> Self {
7423 ptr.untyped()
7424 }
7425}
7426impl<'db> From<ArgListBracketedPtr<'db>> for WrappedArgListPtr<'db> {
7427 fn from(value: ArgListBracketedPtr<'db>) -> Self {
7428 Self(value.0)
7429 }
7430}
7431impl<'db> From<ArgListParenthesizedPtr<'db>> for WrappedArgListPtr<'db> {
7432 fn from(value: ArgListParenthesizedPtr<'db>) -> Self {
7433 Self(value.0)
7434 }
7435}
7436impl<'db> From<ArgListBracedPtr<'db>> for WrappedArgListPtr<'db> {
7437 fn from(value: ArgListBracedPtr<'db>) -> Self {
7438 Self(value.0)
7439 }
7440}
7441impl<'db> From<WrappedArgListMissingPtr<'db>> for WrappedArgListPtr<'db> {
7442 fn from(value: WrappedArgListMissingPtr<'db>) -> Self {
7443 Self(value.0)
7444 }
7445}
7446impl<'db> From<ArgListBracketedGreen<'db>> for WrappedArgListGreen<'db> {
7447 fn from(value: ArgListBracketedGreen<'db>) -> Self {
7448 Self(value.0)
7449 }
7450}
7451impl<'db> From<ArgListParenthesizedGreen<'db>> for WrappedArgListGreen<'db> {
7452 fn from(value: ArgListParenthesizedGreen<'db>) -> Self {
7453 Self(value.0)
7454 }
7455}
7456impl<'db> From<ArgListBracedGreen<'db>> for WrappedArgListGreen<'db> {
7457 fn from(value: ArgListBracedGreen<'db>) -> Self {
7458 Self(value.0)
7459 }
7460}
7461impl<'db> From<WrappedArgListMissingGreen<'db>> for WrappedArgListGreen<'db> {
7462 fn from(value: WrappedArgListMissingGreen<'db>) -> Self {
7463 Self(value.0)
7464 }
7465}
7466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7467pub struct WrappedArgListGreen<'db>(pub GreenId<'db>);
7468impl<'db> TypedSyntaxNode<'db> for WrappedArgList<'db> {
7469 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7470 type StablePtr = WrappedArgListPtr<'db>;
7471 type Green = WrappedArgListGreen<'db>;
7472 fn missing(db: &'db dyn Database) -> Self::Green {
7473 WrappedArgListGreen(WrappedArgListMissing::missing(db).0)
7474 }
7475 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7476 let kind = node.kind(db);
7477 match kind {
7478 SyntaxKind::ArgListBracketed => {
7479 WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node))
7480 }
7481 SyntaxKind::ArgListParenthesized => WrappedArgList::ParenthesizedArgList(
7482 ArgListParenthesized::from_syntax_node(db, node),
7483 ),
7484 SyntaxKind::ArgListBraced => {
7485 WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node))
7486 }
7487 SyntaxKind::WrappedArgListMissing => {
7488 WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node))
7489 }
7490 _ => {
7491 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedArgList")
7492 }
7493 }
7494 }
7495 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7496 let kind = node.kind(db);
7497 match kind {
7498 SyntaxKind::ArgListBracketed => {
7499 Some(WrappedArgList::BracketedArgList(ArgListBracketed::from_syntax_node(db, node)))
7500 }
7501 SyntaxKind::ArgListParenthesized => Some(WrappedArgList::ParenthesizedArgList(
7502 ArgListParenthesized::from_syntax_node(db, node),
7503 )),
7504 SyntaxKind::ArgListBraced => {
7505 Some(WrappedArgList::BracedArgList(ArgListBraced::from_syntax_node(db, node)))
7506 }
7507 SyntaxKind::WrappedArgListMissing => {
7508 Some(WrappedArgList::Missing(WrappedArgListMissing::from_syntax_node(db, node)))
7509 }
7510 _ => None,
7511 }
7512 }
7513 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7514 match self {
7515 WrappedArgList::BracketedArgList(x) => x.as_syntax_node(),
7516 WrappedArgList::ParenthesizedArgList(x) => x.as_syntax_node(),
7517 WrappedArgList::BracedArgList(x) => x.as_syntax_node(),
7518 WrappedArgList::Missing(x) => x.as_syntax_node(),
7519 }
7520 }
7521 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7522 WrappedArgListPtr(self.as_syntax_node().stable_ptr(db))
7523 }
7524}
7525impl<'db> WrappedArgList<'db> {
7526 pub fn is_variant(kind: SyntaxKind) -> bool {
7528 matches!(
7529 kind,
7530 SyntaxKind::ArgListBracketed
7531 | SyntaxKind::ArgListParenthesized
7532 | SyntaxKind::ArgListBraced
7533 | SyntaxKind::WrappedArgListMissing
7534 )
7535 }
7536}
7537#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7538pub struct WrappedArgListMissing<'db> {
7539 node: SyntaxNode<'db>,
7540}
7541impl<'db> WrappedArgListMissing<'db> {
7542 pub fn new_green(db: &'db dyn Database) -> WrappedArgListMissingGreen<'db> {
7543 let children = [];
7544 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7545 WrappedArgListMissingGreen(
7546 GreenNode {
7547 kind: SyntaxKind::WrappedArgListMissing,
7548 details: GreenNodeDetails::Node { children: children.into(), width },
7549 }
7550 .intern(db),
7551 )
7552 }
7553}
7554impl<'db> WrappedArgListMissing<'db> {}
7555#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7556pub struct WrappedArgListMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
7557impl<'db> WrappedArgListMissingPtr<'db> {}
7558impl<'db> TypedStablePtr<'db> for WrappedArgListMissingPtr<'db> {
7559 type SyntaxNode = WrappedArgListMissing<'db>;
7560 fn untyped(self) -> SyntaxStablePtrId<'db> {
7561 self.0
7562 }
7563 fn lookup(&self, db: &'db dyn Database) -> WrappedArgListMissing<'db> {
7564 WrappedArgListMissing::from_syntax_node(db, self.0.lookup(db))
7565 }
7566}
7567impl<'db> From<WrappedArgListMissingPtr<'db>> for SyntaxStablePtrId<'db> {
7568 fn from(ptr: WrappedArgListMissingPtr<'db>) -> Self {
7569 ptr.untyped()
7570 }
7571}
7572#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7573pub struct WrappedArgListMissingGreen<'db>(pub GreenId<'db>);
7574impl<'db> TypedSyntaxNode<'db> for WrappedArgListMissing<'db> {
7575 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedArgListMissing);
7576 type StablePtr = WrappedArgListMissingPtr<'db>;
7577 type Green = WrappedArgListMissingGreen<'db>;
7578 fn missing(db: &'db dyn Database) -> Self::Green {
7579 WrappedArgListMissingGreen(
7580 GreenNode {
7581 kind: SyntaxKind::WrappedArgListMissing,
7582 details: GreenNodeDetails::Node {
7583 children: [].into(),
7584 width: TextWidth::default(),
7585 },
7586 }
7587 .intern(db),
7588 )
7589 }
7590 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7591 let kind = node.kind(db);
7592 assert_eq!(
7593 kind,
7594 SyntaxKind::WrappedArgListMissing,
7595 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7596 kind,
7597 SyntaxKind::WrappedArgListMissing
7598 );
7599 Self { node }
7600 }
7601 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7602 let kind = node.kind(db);
7603 if kind == SyntaxKind::WrappedArgListMissing {
7604 Some(Self::from_syntax_node(db, node))
7605 } else {
7606 None
7607 }
7608 }
7609 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7610 self.node
7611 }
7612 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7613 WrappedArgListMissingPtr(self.node.stable_ptr(db))
7614 }
7615}
7616#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7617pub enum Pattern<'db> {
7618 Underscore(TerminalUnderscore<'db>),
7619 Literal(TerminalLiteralNumber<'db>),
7620 False(TerminalFalse<'db>),
7621 True(TerminalTrue<'db>),
7622 ShortString(TerminalShortString<'db>),
7623 String(TerminalString<'db>),
7624 Identifier(PatternIdentifier<'db>),
7625 Struct(PatternStruct<'db>),
7626 Tuple(PatternTuple<'db>),
7627 Enum(PatternEnum<'db>),
7628 FixedSizeArray(PatternFixedSizeArray<'db>),
7629 Path(ExprPath<'db>),
7630}
7631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7632pub struct PatternPtr<'db>(pub SyntaxStablePtrId<'db>);
7633impl<'db> TypedStablePtr<'db> for PatternPtr<'db> {
7634 type SyntaxNode = Pattern<'db>;
7635 fn untyped(self) -> SyntaxStablePtrId<'db> {
7636 self.0
7637 }
7638 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
7639 Pattern::from_syntax_node(db, self.0.lookup(db))
7640 }
7641}
7642impl<'db> From<PatternPtr<'db>> for SyntaxStablePtrId<'db> {
7643 fn from(ptr: PatternPtr<'db>) -> Self {
7644 ptr.untyped()
7645 }
7646}
7647impl<'db> From<TerminalUnderscorePtr<'db>> for PatternPtr<'db> {
7648 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
7649 Self(value.0)
7650 }
7651}
7652impl<'db> From<TerminalLiteralNumberPtr<'db>> for PatternPtr<'db> {
7653 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
7654 Self(value.0)
7655 }
7656}
7657impl<'db> From<TerminalFalsePtr<'db>> for PatternPtr<'db> {
7658 fn from(value: TerminalFalsePtr<'db>) -> Self {
7659 Self(value.0)
7660 }
7661}
7662impl<'db> From<TerminalTruePtr<'db>> for PatternPtr<'db> {
7663 fn from(value: TerminalTruePtr<'db>) -> Self {
7664 Self(value.0)
7665 }
7666}
7667impl<'db> From<TerminalShortStringPtr<'db>> for PatternPtr<'db> {
7668 fn from(value: TerminalShortStringPtr<'db>) -> Self {
7669 Self(value.0)
7670 }
7671}
7672impl<'db> From<TerminalStringPtr<'db>> for PatternPtr<'db> {
7673 fn from(value: TerminalStringPtr<'db>) -> Self {
7674 Self(value.0)
7675 }
7676}
7677impl<'db> From<PatternIdentifierPtr<'db>> for PatternPtr<'db> {
7678 fn from(value: PatternIdentifierPtr<'db>) -> Self {
7679 Self(value.0)
7680 }
7681}
7682impl<'db> From<PatternStructPtr<'db>> for PatternPtr<'db> {
7683 fn from(value: PatternStructPtr<'db>) -> Self {
7684 Self(value.0)
7685 }
7686}
7687impl<'db> From<PatternTuplePtr<'db>> for PatternPtr<'db> {
7688 fn from(value: PatternTuplePtr<'db>) -> Self {
7689 Self(value.0)
7690 }
7691}
7692impl<'db> From<PatternEnumPtr<'db>> for PatternPtr<'db> {
7693 fn from(value: PatternEnumPtr<'db>) -> Self {
7694 Self(value.0)
7695 }
7696}
7697impl<'db> From<PatternFixedSizeArrayPtr<'db>> for PatternPtr<'db> {
7698 fn from(value: PatternFixedSizeArrayPtr<'db>) -> Self {
7699 Self(value.0)
7700 }
7701}
7702impl<'db> From<ExprPathPtr<'db>> for PatternPtr<'db> {
7703 fn from(value: ExprPathPtr<'db>) -> Self {
7704 Self(value.0)
7705 }
7706}
7707impl<'db> From<TerminalUnderscoreGreen<'db>> for PatternGreen<'db> {
7708 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
7709 Self(value.0)
7710 }
7711}
7712impl<'db> From<TerminalLiteralNumberGreen<'db>> for PatternGreen<'db> {
7713 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
7714 Self(value.0)
7715 }
7716}
7717impl<'db> From<TerminalFalseGreen<'db>> for PatternGreen<'db> {
7718 fn from(value: TerminalFalseGreen<'db>) -> Self {
7719 Self(value.0)
7720 }
7721}
7722impl<'db> From<TerminalTrueGreen<'db>> for PatternGreen<'db> {
7723 fn from(value: TerminalTrueGreen<'db>) -> Self {
7724 Self(value.0)
7725 }
7726}
7727impl<'db> From<TerminalShortStringGreen<'db>> for PatternGreen<'db> {
7728 fn from(value: TerminalShortStringGreen<'db>) -> Self {
7729 Self(value.0)
7730 }
7731}
7732impl<'db> From<TerminalStringGreen<'db>> for PatternGreen<'db> {
7733 fn from(value: TerminalStringGreen<'db>) -> Self {
7734 Self(value.0)
7735 }
7736}
7737impl<'db> From<PatternIdentifierGreen<'db>> for PatternGreen<'db> {
7738 fn from(value: PatternIdentifierGreen<'db>) -> Self {
7739 Self(value.0)
7740 }
7741}
7742impl<'db> From<PatternStructGreen<'db>> for PatternGreen<'db> {
7743 fn from(value: PatternStructGreen<'db>) -> Self {
7744 Self(value.0)
7745 }
7746}
7747impl<'db> From<PatternTupleGreen<'db>> for PatternGreen<'db> {
7748 fn from(value: PatternTupleGreen<'db>) -> Self {
7749 Self(value.0)
7750 }
7751}
7752impl<'db> From<PatternEnumGreen<'db>> for PatternGreen<'db> {
7753 fn from(value: PatternEnumGreen<'db>) -> Self {
7754 Self(value.0)
7755 }
7756}
7757impl<'db> From<PatternFixedSizeArrayGreen<'db>> for PatternGreen<'db> {
7758 fn from(value: PatternFixedSizeArrayGreen<'db>) -> Self {
7759 Self(value.0)
7760 }
7761}
7762impl<'db> From<ExprPathGreen<'db>> for PatternGreen<'db> {
7763 fn from(value: ExprPathGreen<'db>) -> Self {
7764 Self(value.0)
7765 }
7766}
7767#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7768pub struct PatternGreen<'db>(pub GreenId<'db>);
7769impl<'db> TypedSyntaxNode<'db> for Pattern<'db> {
7770 const OPTIONAL_KIND: Option<SyntaxKind> = None;
7771 type StablePtr = PatternPtr<'db>;
7772 type Green = PatternGreen<'db>;
7773 fn missing(db: &'db dyn Database) -> Self::Green {
7774 panic!("No missing variant.");
7775 }
7776 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7777 let kind = node.kind(db);
7778 match kind {
7779 SyntaxKind::TerminalUnderscore => {
7780 Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node))
7781 }
7782 SyntaxKind::TerminalLiteralNumber => {
7783 Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node))
7784 }
7785 SyntaxKind::TerminalFalse => Pattern::False(TerminalFalse::from_syntax_node(db, node)),
7786 SyntaxKind::TerminalTrue => Pattern::True(TerminalTrue::from_syntax_node(db, node)),
7787 SyntaxKind::TerminalShortString => {
7788 Pattern::ShortString(TerminalShortString::from_syntax_node(db, node))
7789 }
7790 SyntaxKind::TerminalString => {
7791 Pattern::String(TerminalString::from_syntax_node(db, node))
7792 }
7793 SyntaxKind::PatternIdentifier => {
7794 Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node))
7795 }
7796 SyntaxKind::PatternStruct => Pattern::Struct(PatternStruct::from_syntax_node(db, node)),
7797 SyntaxKind::PatternTuple => Pattern::Tuple(PatternTuple::from_syntax_node(db, node)),
7798 SyntaxKind::PatternEnum => Pattern::Enum(PatternEnum::from_syntax_node(db, node)),
7799 SyntaxKind::PatternFixedSizeArray => {
7800 Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node))
7801 }
7802 SyntaxKind::ExprPath => Pattern::Path(ExprPath::from_syntax_node(db, node)),
7803 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Pattern"),
7804 }
7805 }
7806 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7807 let kind = node.kind(db);
7808 match kind {
7809 SyntaxKind::TerminalUnderscore => {
7810 Some(Pattern::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
7811 }
7812 SyntaxKind::TerminalLiteralNumber => {
7813 Some(Pattern::Literal(TerminalLiteralNumber::from_syntax_node(db, node)))
7814 }
7815 SyntaxKind::TerminalFalse => {
7816 Some(Pattern::False(TerminalFalse::from_syntax_node(db, node)))
7817 }
7818 SyntaxKind::TerminalTrue => {
7819 Some(Pattern::True(TerminalTrue::from_syntax_node(db, node)))
7820 }
7821 SyntaxKind::TerminalShortString => {
7822 Some(Pattern::ShortString(TerminalShortString::from_syntax_node(db, node)))
7823 }
7824 SyntaxKind::TerminalString => {
7825 Some(Pattern::String(TerminalString::from_syntax_node(db, node)))
7826 }
7827 SyntaxKind::PatternIdentifier => {
7828 Some(Pattern::Identifier(PatternIdentifier::from_syntax_node(db, node)))
7829 }
7830 SyntaxKind::PatternStruct => {
7831 Some(Pattern::Struct(PatternStruct::from_syntax_node(db, node)))
7832 }
7833 SyntaxKind::PatternTuple => {
7834 Some(Pattern::Tuple(PatternTuple::from_syntax_node(db, node)))
7835 }
7836 SyntaxKind::PatternEnum => Some(Pattern::Enum(PatternEnum::from_syntax_node(db, node))),
7837 SyntaxKind::PatternFixedSizeArray => {
7838 Some(Pattern::FixedSizeArray(PatternFixedSizeArray::from_syntax_node(db, node)))
7839 }
7840 SyntaxKind::ExprPath => Some(Pattern::Path(ExprPath::from_syntax_node(db, node))),
7841 _ => None,
7842 }
7843 }
7844 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7845 match self {
7846 Pattern::Underscore(x) => x.as_syntax_node(),
7847 Pattern::Literal(x) => x.as_syntax_node(),
7848 Pattern::False(x) => x.as_syntax_node(),
7849 Pattern::True(x) => x.as_syntax_node(),
7850 Pattern::ShortString(x) => x.as_syntax_node(),
7851 Pattern::String(x) => x.as_syntax_node(),
7852 Pattern::Identifier(x) => x.as_syntax_node(),
7853 Pattern::Struct(x) => x.as_syntax_node(),
7854 Pattern::Tuple(x) => x.as_syntax_node(),
7855 Pattern::Enum(x) => x.as_syntax_node(),
7856 Pattern::FixedSizeArray(x) => x.as_syntax_node(),
7857 Pattern::Path(x) => x.as_syntax_node(),
7858 }
7859 }
7860 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7861 PatternPtr(self.as_syntax_node().stable_ptr(db))
7862 }
7863}
7864impl<'db> Pattern<'db> {
7865 pub fn is_variant(kind: SyntaxKind) -> bool {
7867 matches!(
7868 kind,
7869 SyntaxKind::TerminalUnderscore
7870 | SyntaxKind::TerminalLiteralNumber
7871 | SyntaxKind::TerminalFalse
7872 | SyntaxKind::TerminalTrue
7873 | SyntaxKind::TerminalShortString
7874 | SyntaxKind::TerminalString
7875 | SyntaxKind::PatternIdentifier
7876 | SyntaxKind::PatternStruct
7877 | SyntaxKind::PatternTuple
7878 | SyntaxKind::PatternEnum
7879 | SyntaxKind::PatternFixedSizeArray
7880 | SyntaxKind::ExprPath
7881 )
7882 }
7883}
7884#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7885pub struct PatternIdentifier<'db> {
7886 node: SyntaxNode<'db>,
7887}
7888impl<'db> PatternIdentifier<'db> {
7889 pub const INDEX_MODIFIERS: usize = 0;
7890 pub const INDEX_NAME: usize = 1;
7891 pub fn new_green(
7892 db: &'db dyn Database,
7893 modifiers: ModifierListGreen<'db>,
7894 name: TerminalIdentifierGreen<'db>,
7895 ) -> PatternIdentifierGreen<'db> {
7896 let children = [modifiers.0, name.0];
7897 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7898 PatternIdentifierGreen(
7899 GreenNode {
7900 kind: SyntaxKind::PatternIdentifier,
7901 details: GreenNodeDetails::Node { children: children.into(), width },
7902 }
7903 .intern(db),
7904 )
7905 }
7906}
7907impl<'db> PatternIdentifier<'db> {
7908 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
7909 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
7910 }
7911 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
7912 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
7913 }
7914}
7915#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7916pub struct PatternIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
7917impl<'db> PatternIdentifierPtr<'db> {
7918 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
7919 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
7920 }
7921}
7922impl<'db> TypedStablePtr<'db> for PatternIdentifierPtr<'db> {
7923 type SyntaxNode = PatternIdentifier<'db>;
7924 fn untyped(self) -> SyntaxStablePtrId<'db> {
7925 self.0
7926 }
7927 fn lookup(&self, db: &'db dyn Database) -> PatternIdentifier<'db> {
7928 PatternIdentifier::from_syntax_node(db, self.0.lookup(db))
7929 }
7930}
7931impl<'db> From<PatternIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
7932 fn from(ptr: PatternIdentifierPtr<'db>) -> Self {
7933 ptr.untyped()
7934 }
7935}
7936#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
7937pub struct PatternIdentifierGreen<'db>(pub GreenId<'db>);
7938impl<'db> TypedSyntaxNode<'db> for PatternIdentifier<'db> {
7939 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternIdentifier);
7940 type StablePtr = PatternIdentifierPtr<'db>;
7941 type Green = PatternIdentifierGreen<'db>;
7942 fn missing(db: &'db dyn Database) -> Self::Green {
7943 PatternIdentifierGreen(
7944 GreenNode {
7945 kind: SyntaxKind::PatternIdentifier,
7946 details: GreenNodeDetails::Node {
7947 children: [ModifierList::missing(db).0, TerminalIdentifier::missing(db).0]
7948 .into(),
7949 width: TextWidth::default(),
7950 },
7951 }
7952 .intern(db),
7953 )
7954 }
7955 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
7956 let kind = node.kind(db);
7957 assert_eq!(
7958 kind,
7959 SyntaxKind::PatternIdentifier,
7960 "Unexpected SyntaxKind {:?}. Expected {:?}.",
7961 kind,
7962 SyntaxKind::PatternIdentifier
7963 );
7964 Self { node }
7965 }
7966 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
7967 let kind = node.kind(db);
7968 if kind == SyntaxKind::PatternIdentifier {
7969 Some(Self::from_syntax_node(db, node))
7970 } else {
7971 None
7972 }
7973 }
7974 fn as_syntax_node(&self) -> SyntaxNode<'db> {
7975 self.node
7976 }
7977 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
7978 PatternIdentifierPtr(self.node.stable_ptr(db))
7979 }
7980}
7981#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
7982pub struct PatternStruct<'db> {
7983 node: SyntaxNode<'db>,
7984}
7985impl<'db> PatternStruct<'db> {
7986 pub const INDEX_PATH: usize = 0;
7987 pub const INDEX_LBRACE: usize = 1;
7988 pub const INDEX_PARAMS: usize = 2;
7989 pub const INDEX_RBRACE: usize = 3;
7990 pub fn new_green(
7991 db: &'db dyn Database,
7992 path: ExprPathGreen<'db>,
7993 lbrace: TerminalLBraceGreen<'db>,
7994 params: PatternStructParamListGreen<'db>,
7995 rbrace: TerminalRBraceGreen<'db>,
7996 ) -> PatternStructGreen<'db> {
7997 let children = [path.0, lbrace.0, params.0, rbrace.0];
7998 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
7999 PatternStructGreen(
8000 GreenNode {
8001 kind: SyntaxKind::PatternStruct,
8002 details: GreenNodeDetails::Node { children: children.into(), width },
8003 }
8004 .intern(db),
8005 )
8006 }
8007}
8008impl<'db> PatternStruct<'db> {
8009 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8010 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8011 }
8012 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
8013 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[1])
8014 }
8015 pub fn params(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8016 PatternStructParamList::from_syntax_node(db, self.node.get_children(db)[2])
8017 }
8018 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
8019 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[3])
8020 }
8021}
8022#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8023pub struct PatternStructPtr<'db>(pub SyntaxStablePtrId<'db>);
8024impl<'db> PatternStructPtr<'db> {}
8025impl<'db> TypedStablePtr<'db> for PatternStructPtr<'db> {
8026 type SyntaxNode = PatternStruct<'db>;
8027 fn untyped(self) -> SyntaxStablePtrId<'db> {
8028 self.0
8029 }
8030 fn lookup(&self, db: &'db dyn Database) -> PatternStruct<'db> {
8031 PatternStruct::from_syntax_node(db, self.0.lookup(db))
8032 }
8033}
8034impl<'db> From<PatternStructPtr<'db>> for SyntaxStablePtrId<'db> {
8035 fn from(ptr: PatternStructPtr<'db>) -> Self {
8036 ptr.untyped()
8037 }
8038}
8039#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8040pub struct PatternStructGreen<'db>(pub GreenId<'db>);
8041impl<'db> TypedSyntaxNode<'db> for PatternStruct<'db> {
8042 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStruct);
8043 type StablePtr = PatternStructPtr<'db>;
8044 type Green = PatternStructGreen<'db>;
8045 fn missing(db: &'db dyn Database) -> Self::Green {
8046 PatternStructGreen(
8047 GreenNode {
8048 kind: SyntaxKind::PatternStruct,
8049 details: GreenNodeDetails::Node {
8050 children: [
8051 ExprPath::missing(db).0,
8052 TerminalLBrace::missing(db).0,
8053 PatternStructParamList::missing(db).0,
8054 TerminalRBrace::missing(db).0,
8055 ]
8056 .into(),
8057 width: TextWidth::default(),
8058 },
8059 }
8060 .intern(db),
8061 )
8062 }
8063 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8064 let kind = node.kind(db);
8065 assert_eq!(
8066 kind,
8067 SyntaxKind::PatternStruct,
8068 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8069 kind,
8070 SyntaxKind::PatternStruct
8071 );
8072 Self { node }
8073 }
8074 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8075 let kind = node.kind(db);
8076 if kind == SyntaxKind::PatternStruct {
8077 Some(Self::from_syntax_node(db, node))
8078 } else {
8079 None
8080 }
8081 }
8082 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8083 self.node
8084 }
8085 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8086 PatternStructPtr(self.node.stable_ptr(db))
8087 }
8088}
8089#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8090pub struct PatternStructParamList<'db>(ElementList<'db, PatternStructParam<'db>, 2>);
8091impl<'db> Deref for PatternStructParamList<'db> {
8092 type Target = ElementList<'db, PatternStructParam<'db>, 2>;
8093 fn deref(&self) -> &Self::Target {
8094 &self.0
8095 }
8096}
8097impl<'db> PatternStructParamList<'db> {
8098 pub fn new_green(
8099 db: &'db dyn Database,
8100 children: &[PatternStructParamListElementOrSeparatorGreen<'db>],
8101 ) -> PatternStructParamListGreen<'db> {
8102 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8103 PatternStructParamListGreen(
8104 GreenNode {
8105 kind: SyntaxKind::PatternStructParamList,
8106 details: GreenNodeDetails::Node {
8107 children: children.iter().map(|x| x.id()).collect(),
8108 width,
8109 },
8110 }
8111 .intern(db),
8112 )
8113 }
8114}
8115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8116pub struct PatternStructParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
8117impl<'db> TypedStablePtr<'db> for PatternStructParamListPtr<'db> {
8118 type SyntaxNode = PatternStructParamList<'db>;
8119 fn untyped(self) -> SyntaxStablePtrId<'db> {
8120 self.0
8121 }
8122 fn lookup(&self, db: &'db dyn Database) -> PatternStructParamList<'db> {
8123 PatternStructParamList::from_syntax_node(db, self.0.lookup(db))
8124 }
8125}
8126impl<'db> From<PatternStructParamListPtr<'db>> for SyntaxStablePtrId<'db> {
8127 fn from(ptr: PatternStructParamListPtr<'db>) -> Self {
8128 ptr.untyped()
8129 }
8130}
8131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8132pub enum PatternStructParamListElementOrSeparatorGreen<'db> {
8133 Separator(TerminalCommaGreen<'db>),
8134 Element(PatternStructParamGreen<'db>),
8135}
8136impl<'db> From<TerminalCommaGreen<'db>> for PatternStructParamListElementOrSeparatorGreen<'db> {
8137 fn from(value: TerminalCommaGreen<'db>) -> Self {
8138 PatternStructParamListElementOrSeparatorGreen::Separator(value)
8139 }
8140}
8141impl<'db> From<PatternStructParamGreen<'db>>
8142 for PatternStructParamListElementOrSeparatorGreen<'db>
8143{
8144 fn from(value: PatternStructParamGreen<'db>) -> Self {
8145 PatternStructParamListElementOrSeparatorGreen::Element(value)
8146 }
8147}
8148impl<'db> PatternStructParamListElementOrSeparatorGreen<'db> {
8149 fn id(&self) -> GreenId<'db> {
8150 match self {
8151 PatternStructParamListElementOrSeparatorGreen::Separator(green) => green.0,
8152 PatternStructParamListElementOrSeparatorGreen::Element(green) => green.0,
8153 }
8154 }
8155}
8156#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8157pub struct PatternStructParamListGreen<'db>(pub GreenId<'db>);
8158impl<'db> TypedSyntaxNode<'db> for PatternStructParamList<'db> {
8159 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamList);
8160 type StablePtr = PatternStructParamListPtr<'db>;
8161 type Green = PatternStructParamListGreen<'db>;
8162 fn missing(db: &'db dyn Database) -> Self::Green {
8163 PatternStructParamListGreen(
8164 GreenNode {
8165 kind: SyntaxKind::PatternStructParamList,
8166 details: GreenNodeDetails::Node {
8167 children: [].into(),
8168 width: TextWidth::default(),
8169 },
8170 }
8171 .intern(db),
8172 )
8173 }
8174 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8175 Self(ElementList::new(node))
8176 }
8177 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8178 if node.kind(db) == SyntaxKind::PatternStructParamList {
8179 Some(Self(ElementList::new(node)))
8180 } else {
8181 None
8182 }
8183 }
8184 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8185 self.node
8186 }
8187 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8188 PatternStructParamListPtr(self.node.stable_ptr(db))
8189 }
8190}
8191#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8192pub struct PatternTuple<'db> {
8193 node: SyntaxNode<'db>,
8194}
8195impl<'db> PatternTuple<'db> {
8196 pub const INDEX_LPAREN: usize = 0;
8197 pub const INDEX_PATTERNS: usize = 1;
8198 pub const INDEX_RPAREN: usize = 2;
8199 pub fn new_green(
8200 db: &'db dyn Database,
8201 lparen: TerminalLParenGreen<'db>,
8202 patterns: PatternListGreen<'db>,
8203 rparen: TerminalRParenGreen<'db>,
8204 ) -> PatternTupleGreen<'db> {
8205 let children = [lparen.0, patterns.0, rparen.0];
8206 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8207 PatternTupleGreen(
8208 GreenNode {
8209 kind: SyntaxKind::PatternTuple,
8210 details: GreenNodeDetails::Node { children: children.into(), width },
8211 }
8212 .intern(db),
8213 )
8214 }
8215}
8216impl<'db> PatternTuple<'db> {
8217 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8218 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8219 }
8220 pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8221 PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8222 }
8223 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8224 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8225 }
8226}
8227#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8228pub struct PatternTuplePtr<'db>(pub SyntaxStablePtrId<'db>);
8229impl<'db> PatternTuplePtr<'db> {}
8230impl<'db> TypedStablePtr<'db> for PatternTuplePtr<'db> {
8231 type SyntaxNode = PatternTuple<'db>;
8232 fn untyped(self) -> SyntaxStablePtrId<'db> {
8233 self.0
8234 }
8235 fn lookup(&self, db: &'db dyn Database) -> PatternTuple<'db> {
8236 PatternTuple::from_syntax_node(db, self.0.lookup(db))
8237 }
8238}
8239impl<'db> From<PatternTuplePtr<'db>> for SyntaxStablePtrId<'db> {
8240 fn from(ptr: PatternTuplePtr<'db>) -> Self {
8241 ptr.untyped()
8242 }
8243}
8244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8245pub struct PatternTupleGreen<'db>(pub GreenId<'db>);
8246impl<'db> TypedSyntaxNode<'db> for PatternTuple<'db> {
8247 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternTuple);
8248 type StablePtr = PatternTuplePtr<'db>;
8249 type Green = PatternTupleGreen<'db>;
8250 fn missing(db: &'db dyn Database) -> Self::Green {
8251 PatternTupleGreen(
8252 GreenNode {
8253 kind: SyntaxKind::PatternTuple,
8254 details: GreenNodeDetails::Node {
8255 children: [
8256 TerminalLParen::missing(db).0,
8257 PatternList::missing(db).0,
8258 TerminalRParen::missing(db).0,
8259 ]
8260 .into(),
8261 width: TextWidth::default(),
8262 },
8263 }
8264 .intern(db),
8265 )
8266 }
8267 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8268 let kind = node.kind(db);
8269 assert_eq!(
8270 kind,
8271 SyntaxKind::PatternTuple,
8272 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8273 kind,
8274 SyntaxKind::PatternTuple
8275 );
8276 Self { node }
8277 }
8278 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8279 let kind = node.kind(db);
8280 if kind == SyntaxKind::PatternTuple { Some(Self::from_syntax_node(db, node)) } else { None }
8281 }
8282 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8283 self.node
8284 }
8285 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8286 PatternTuplePtr(self.node.stable_ptr(db))
8287 }
8288}
8289#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8290pub struct PatternFixedSizeArray<'db> {
8291 node: SyntaxNode<'db>,
8292}
8293impl<'db> PatternFixedSizeArray<'db> {
8294 pub const INDEX_LBRACK: usize = 0;
8295 pub const INDEX_PATTERNS: usize = 1;
8296 pub const INDEX_RBRACK: usize = 2;
8297 pub fn new_green(
8298 db: &'db dyn Database,
8299 lbrack: TerminalLBrackGreen<'db>,
8300 patterns: PatternListGreen<'db>,
8301 rbrack: TerminalRBrackGreen<'db>,
8302 ) -> PatternFixedSizeArrayGreen<'db> {
8303 let children = [lbrack.0, patterns.0, rbrack.0];
8304 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8305 PatternFixedSizeArrayGreen(
8306 GreenNode {
8307 kind: SyntaxKind::PatternFixedSizeArray,
8308 details: GreenNodeDetails::Node { children: children.into(), width },
8309 }
8310 .intern(db),
8311 )
8312 }
8313}
8314impl<'db> PatternFixedSizeArray<'db> {
8315 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
8316 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
8317 }
8318 pub fn patterns(&self, db: &'db dyn Database) -> PatternList<'db> {
8319 PatternList::from_syntax_node(db, self.node.get_children(db)[1])
8320 }
8321 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
8322 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
8323 }
8324}
8325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8326pub struct PatternFixedSizeArrayPtr<'db>(pub SyntaxStablePtrId<'db>);
8327impl<'db> PatternFixedSizeArrayPtr<'db> {}
8328impl<'db> TypedStablePtr<'db> for PatternFixedSizeArrayPtr<'db> {
8329 type SyntaxNode = PatternFixedSizeArray<'db>;
8330 fn untyped(self) -> SyntaxStablePtrId<'db> {
8331 self.0
8332 }
8333 fn lookup(&self, db: &'db dyn Database) -> PatternFixedSizeArray<'db> {
8334 PatternFixedSizeArray::from_syntax_node(db, self.0.lookup(db))
8335 }
8336}
8337impl<'db> From<PatternFixedSizeArrayPtr<'db>> for SyntaxStablePtrId<'db> {
8338 fn from(ptr: PatternFixedSizeArrayPtr<'db>) -> Self {
8339 ptr.untyped()
8340 }
8341}
8342#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8343pub struct PatternFixedSizeArrayGreen<'db>(pub GreenId<'db>);
8344impl<'db> TypedSyntaxNode<'db> for PatternFixedSizeArray<'db> {
8345 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternFixedSizeArray);
8346 type StablePtr = PatternFixedSizeArrayPtr<'db>;
8347 type Green = PatternFixedSizeArrayGreen<'db>;
8348 fn missing(db: &'db dyn Database) -> Self::Green {
8349 PatternFixedSizeArrayGreen(
8350 GreenNode {
8351 kind: SyntaxKind::PatternFixedSizeArray,
8352 details: GreenNodeDetails::Node {
8353 children: [
8354 TerminalLBrack::missing(db).0,
8355 PatternList::missing(db).0,
8356 TerminalRBrack::missing(db).0,
8357 ]
8358 .into(),
8359 width: TextWidth::default(),
8360 },
8361 }
8362 .intern(db),
8363 )
8364 }
8365 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8366 let kind = node.kind(db);
8367 assert_eq!(
8368 kind,
8369 SyntaxKind::PatternFixedSizeArray,
8370 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8371 kind,
8372 SyntaxKind::PatternFixedSizeArray
8373 );
8374 Self { node }
8375 }
8376 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8377 let kind = node.kind(db);
8378 if kind == SyntaxKind::PatternFixedSizeArray {
8379 Some(Self::from_syntax_node(db, node))
8380 } else {
8381 None
8382 }
8383 }
8384 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8385 self.node
8386 }
8387 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8388 PatternFixedSizeArrayPtr(self.node.stable_ptr(db))
8389 }
8390}
8391#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8392pub struct PatternList<'db>(ElementList<'db, Pattern<'db>, 2>);
8393impl<'db> Deref for PatternList<'db> {
8394 type Target = ElementList<'db, Pattern<'db>, 2>;
8395 fn deref(&self) -> &Self::Target {
8396 &self.0
8397 }
8398}
8399impl<'db> PatternList<'db> {
8400 pub fn new_green(
8401 db: &'db dyn Database,
8402 children: &[PatternListElementOrSeparatorGreen<'db>],
8403 ) -> PatternListGreen<'db> {
8404 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8405 PatternListGreen(
8406 GreenNode {
8407 kind: SyntaxKind::PatternList,
8408 details: GreenNodeDetails::Node {
8409 children: children.iter().map(|x| x.id()).collect(),
8410 width,
8411 },
8412 }
8413 .intern(db),
8414 )
8415 }
8416}
8417#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8418pub struct PatternListPtr<'db>(pub SyntaxStablePtrId<'db>);
8419impl<'db> TypedStablePtr<'db> for PatternListPtr<'db> {
8420 type SyntaxNode = PatternList<'db>;
8421 fn untyped(self) -> SyntaxStablePtrId<'db> {
8422 self.0
8423 }
8424 fn lookup(&self, db: &'db dyn Database) -> PatternList<'db> {
8425 PatternList::from_syntax_node(db, self.0.lookup(db))
8426 }
8427}
8428impl<'db> From<PatternListPtr<'db>> for SyntaxStablePtrId<'db> {
8429 fn from(ptr: PatternListPtr<'db>) -> Self {
8430 ptr.untyped()
8431 }
8432}
8433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8434pub enum PatternListElementOrSeparatorGreen<'db> {
8435 Separator(TerminalCommaGreen<'db>),
8436 Element(PatternGreen<'db>),
8437}
8438impl<'db> From<TerminalCommaGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8439 fn from(value: TerminalCommaGreen<'db>) -> Self {
8440 PatternListElementOrSeparatorGreen::Separator(value)
8441 }
8442}
8443impl<'db> From<PatternGreen<'db>> for PatternListElementOrSeparatorGreen<'db> {
8444 fn from(value: PatternGreen<'db>) -> Self {
8445 PatternListElementOrSeparatorGreen::Element(value)
8446 }
8447}
8448impl<'db> PatternListElementOrSeparatorGreen<'db> {
8449 fn id(&self) -> GreenId<'db> {
8450 match self {
8451 PatternListElementOrSeparatorGreen::Separator(green) => green.0,
8452 PatternListElementOrSeparatorGreen::Element(green) => green.0,
8453 }
8454 }
8455}
8456#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8457pub struct PatternListGreen<'db>(pub GreenId<'db>);
8458impl<'db> TypedSyntaxNode<'db> for PatternList<'db> {
8459 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternList);
8460 type StablePtr = PatternListPtr<'db>;
8461 type Green = PatternListGreen<'db>;
8462 fn missing(db: &'db dyn Database) -> Self::Green {
8463 PatternListGreen(
8464 GreenNode {
8465 kind: SyntaxKind::PatternList,
8466 details: GreenNodeDetails::Node {
8467 children: [].into(),
8468 width: TextWidth::default(),
8469 },
8470 }
8471 .intern(db),
8472 )
8473 }
8474 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8475 Self(ElementList::new(node))
8476 }
8477 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8478 if node.kind(db) == SyntaxKind::PatternList {
8479 Some(Self(ElementList::new(node)))
8480 } else {
8481 None
8482 }
8483 }
8484 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8485 self.node
8486 }
8487 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8488 PatternListPtr(self.node.stable_ptr(db))
8489 }
8490}
8491#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8492pub struct PatternListOr<'db>(ElementList<'db, Pattern<'db>, 2>);
8493impl<'db> Deref for PatternListOr<'db> {
8494 type Target = ElementList<'db, Pattern<'db>, 2>;
8495 fn deref(&self) -> &Self::Target {
8496 &self.0
8497 }
8498}
8499impl<'db> PatternListOr<'db> {
8500 pub fn new_green(
8501 db: &'db dyn Database,
8502 children: &[PatternListOrElementOrSeparatorGreen<'db>],
8503 ) -> PatternListOrGreen<'db> {
8504 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
8505 PatternListOrGreen(
8506 GreenNode {
8507 kind: SyntaxKind::PatternListOr,
8508 details: GreenNodeDetails::Node {
8509 children: children.iter().map(|x| x.id()).collect(),
8510 width,
8511 },
8512 }
8513 .intern(db),
8514 )
8515 }
8516}
8517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8518pub struct PatternListOrPtr<'db>(pub SyntaxStablePtrId<'db>);
8519impl<'db> TypedStablePtr<'db> for PatternListOrPtr<'db> {
8520 type SyntaxNode = PatternListOr<'db>;
8521 fn untyped(self) -> SyntaxStablePtrId<'db> {
8522 self.0
8523 }
8524 fn lookup(&self, db: &'db dyn Database) -> PatternListOr<'db> {
8525 PatternListOr::from_syntax_node(db, self.0.lookup(db))
8526 }
8527}
8528impl<'db> From<PatternListOrPtr<'db>> for SyntaxStablePtrId<'db> {
8529 fn from(ptr: PatternListOrPtr<'db>) -> Self {
8530 ptr.untyped()
8531 }
8532}
8533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8534pub enum PatternListOrElementOrSeparatorGreen<'db> {
8535 Separator(TerminalOrGreen<'db>),
8536 Element(PatternGreen<'db>),
8537}
8538impl<'db> From<TerminalOrGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8539 fn from(value: TerminalOrGreen<'db>) -> Self {
8540 PatternListOrElementOrSeparatorGreen::Separator(value)
8541 }
8542}
8543impl<'db> From<PatternGreen<'db>> for PatternListOrElementOrSeparatorGreen<'db> {
8544 fn from(value: PatternGreen<'db>) -> Self {
8545 PatternListOrElementOrSeparatorGreen::Element(value)
8546 }
8547}
8548impl<'db> PatternListOrElementOrSeparatorGreen<'db> {
8549 fn id(&self) -> GreenId<'db> {
8550 match self {
8551 PatternListOrElementOrSeparatorGreen::Separator(green) => green.0,
8552 PatternListOrElementOrSeparatorGreen::Element(green) => green.0,
8553 }
8554 }
8555}
8556#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8557pub struct PatternListOrGreen<'db>(pub GreenId<'db>);
8558impl<'db> TypedSyntaxNode<'db> for PatternListOr<'db> {
8559 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternListOr);
8560 type StablePtr = PatternListOrPtr<'db>;
8561 type Green = PatternListOrGreen<'db>;
8562 fn missing(db: &'db dyn Database) -> Self::Green {
8563 PatternListOrGreen(
8564 GreenNode {
8565 kind: SyntaxKind::PatternListOr,
8566 details: GreenNodeDetails::Node {
8567 children: [].into(),
8568 width: TextWidth::default(),
8569 },
8570 }
8571 .intern(db),
8572 )
8573 }
8574 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8575 Self(ElementList::new(node))
8576 }
8577 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8578 if node.kind(db) == SyntaxKind::PatternListOr {
8579 Some(Self(ElementList::new(node)))
8580 } else {
8581 None
8582 }
8583 }
8584 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8585 self.node
8586 }
8587 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8588 PatternListOrPtr(self.node.stable_ptr(db))
8589 }
8590}
8591#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8592pub enum PatternStructParam<'db> {
8593 Single(PatternIdentifier<'db>),
8594 WithExpr(PatternStructParamWithExpr<'db>),
8595 Tail(TerminalDotDot<'db>),
8596}
8597#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8598pub struct PatternStructParamPtr<'db>(pub SyntaxStablePtrId<'db>);
8599impl<'db> TypedStablePtr<'db> for PatternStructParamPtr<'db> {
8600 type SyntaxNode = PatternStructParam<'db>;
8601 fn untyped(self) -> SyntaxStablePtrId<'db> {
8602 self.0
8603 }
8604 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
8605 PatternStructParam::from_syntax_node(db, self.0.lookup(db))
8606 }
8607}
8608impl<'db> From<PatternStructParamPtr<'db>> for SyntaxStablePtrId<'db> {
8609 fn from(ptr: PatternStructParamPtr<'db>) -> Self {
8610 ptr.untyped()
8611 }
8612}
8613impl<'db> From<PatternIdentifierPtr<'db>> for PatternStructParamPtr<'db> {
8614 fn from(value: PatternIdentifierPtr<'db>) -> Self {
8615 Self(value.0)
8616 }
8617}
8618impl<'db> From<PatternStructParamWithExprPtr<'db>> for PatternStructParamPtr<'db> {
8619 fn from(value: PatternStructParamWithExprPtr<'db>) -> Self {
8620 Self(value.0)
8621 }
8622}
8623impl<'db> From<TerminalDotDotPtr<'db>> for PatternStructParamPtr<'db> {
8624 fn from(value: TerminalDotDotPtr<'db>) -> Self {
8625 Self(value.0)
8626 }
8627}
8628impl<'db> From<PatternIdentifierGreen<'db>> for PatternStructParamGreen<'db> {
8629 fn from(value: PatternIdentifierGreen<'db>) -> Self {
8630 Self(value.0)
8631 }
8632}
8633impl<'db> From<PatternStructParamWithExprGreen<'db>> for PatternStructParamGreen<'db> {
8634 fn from(value: PatternStructParamWithExprGreen<'db>) -> Self {
8635 Self(value.0)
8636 }
8637}
8638impl<'db> From<TerminalDotDotGreen<'db>> for PatternStructParamGreen<'db> {
8639 fn from(value: TerminalDotDotGreen<'db>) -> Self {
8640 Self(value.0)
8641 }
8642}
8643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8644pub struct PatternStructParamGreen<'db>(pub GreenId<'db>);
8645impl<'db> TypedSyntaxNode<'db> for PatternStructParam<'db> {
8646 const OPTIONAL_KIND: Option<SyntaxKind> = None;
8647 type StablePtr = PatternStructParamPtr<'db>;
8648 type Green = PatternStructParamGreen<'db>;
8649 fn missing(db: &'db dyn Database) -> Self::Green {
8650 panic!("No missing variant.");
8651 }
8652 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8653 let kind = node.kind(db);
8654 match kind {
8655 SyntaxKind::PatternIdentifier => {
8656 PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node))
8657 }
8658 SyntaxKind::PatternStructParamWithExpr => {
8659 PatternStructParam::WithExpr(PatternStructParamWithExpr::from_syntax_node(db, node))
8660 }
8661 SyntaxKind::TerminalDotDot => {
8662 PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node))
8663 }
8664 _ => panic!(
8665 "Unexpected syntax kind {:?} when constructing {}.",
8666 kind, "PatternStructParam"
8667 ),
8668 }
8669 }
8670 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8671 let kind = node.kind(db);
8672 match kind {
8673 SyntaxKind::PatternIdentifier => {
8674 Some(PatternStructParam::Single(PatternIdentifier::from_syntax_node(db, node)))
8675 }
8676 SyntaxKind::PatternStructParamWithExpr => Some(PatternStructParam::WithExpr(
8677 PatternStructParamWithExpr::from_syntax_node(db, node),
8678 )),
8679 SyntaxKind::TerminalDotDot => {
8680 Some(PatternStructParam::Tail(TerminalDotDot::from_syntax_node(db, node)))
8681 }
8682 _ => None,
8683 }
8684 }
8685 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8686 match self {
8687 PatternStructParam::Single(x) => x.as_syntax_node(),
8688 PatternStructParam::WithExpr(x) => x.as_syntax_node(),
8689 PatternStructParam::Tail(x) => x.as_syntax_node(),
8690 }
8691 }
8692 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8693 PatternStructParamPtr(self.as_syntax_node().stable_ptr(db))
8694 }
8695}
8696impl<'db> PatternStructParam<'db> {
8697 pub fn is_variant(kind: SyntaxKind) -> bool {
8699 matches!(
8700 kind,
8701 SyntaxKind::PatternIdentifier
8702 | SyntaxKind::PatternStructParamWithExpr
8703 | SyntaxKind::TerminalDotDot
8704 )
8705 }
8706}
8707#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8708pub struct PatternStructParamWithExpr<'db> {
8709 node: SyntaxNode<'db>,
8710}
8711impl<'db> PatternStructParamWithExpr<'db> {
8712 pub const INDEX_MODIFIERS: usize = 0;
8713 pub const INDEX_NAME: usize = 1;
8714 pub const INDEX_COLON: usize = 2;
8715 pub const INDEX_PATTERN: usize = 3;
8716 pub fn new_green(
8717 db: &'db dyn Database,
8718 modifiers: ModifierListGreen<'db>,
8719 name: TerminalIdentifierGreen<'db>,
8720 colon: TerminalColonGreen<'db>,
8721 pattern: PatternGreen<'db>,
8722 ) -> PatternStructParamWithExprGreen<'db> {
8723 let children = [modifiers.0, name.0, colon.0, pattern.0];
8724 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8725 PatternStructParamWithExprGreen(
8726 GreenNode {
8727 kind: SyntaxKind::PatternStructParamWithExpr,
8728 details: GreenNodeDetails::Node { children: children.into(), width },
8729 }
8730 .intern(db),
8731 )
8732 }
8733}
8734impl<'db> PatternStructParamWithExpr<'db> {
8735 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
8736 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
8737 }
8738 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
8739 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
8740 }
8741 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
8742 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
8743 }
8744 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8745 Pattern::from_syntax_node(db, self.node.get_children(db)[3])
8746 }
8747}
8748#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8749pub struct PatternStructParamWithExprPtr<'db>(pub SyntaxStablePtrId<'db>);
8750impl<'db> PatternStructParamWithExprPtr<'db> {}
8751impl<'db> TypedStablePtr<'db> for PatternStructParamWithExprPtr<'db> {
8752 type SyntaxNode = PatternStructParamWithExpr<'db>;
8753 fn untyped(self) -> SyntaxStablePtrId<'db> {
8754 self.0
8755 }
8756 fn lookup(&self, db: &'db dyn Database) -> PatternStructParamWithExpr<'db> {
8757 PatternStructParamWithExpr::from_syntax_node(db, self.0.lookup(db))
8758 }
8759}
8760impl<'db> From<PatternStructParamWithExprPtr<'db>> for SyntaxStablePtrId<'db> {
8761 fn from(ptr: PatternStructParamWithExprPtr<'db>) -> Self {
8762 ptr.untyped()
8763 }
8764}
8765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8766pub struct PatternStructParamWithExprGreen<'db>(pub GreenId<'db>);
8767impl<'db> TypedSyntaxNode<'db> for PatternStructParamWithExpr<'db> {
8768 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternStructParamWithExpr);
8769 type StablePtr = PatternStructParamWithExprPtr<'db>;
8770 type Green = PatternStructParamWithExprGreen<'db>;
8771 fn missing(db: &'db dyn Database) -> Self::Green {
8772 PatternStructParamWithExprGreen(
8773 GreenNode {
8774 kind: SyntaxKind::PatternStructParamWithExpr,
8775 details: GreenNodeDetails::Node {
8776 children: [
8777 ModifierList::missing(db).0,
8778 TerminalIdentifier::missing(db).0,
8779 TerminalColon::missing(db).0,
8780 Pattern::missing(db).0,
8781 ]
8782 .into(),
8783 width: TextWidth::default(),
8784 },
8785 }
8786 .intern(db),
8787 )
8788 }
8789 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8790 let kind = node.kind(db);
8791 assert_eq!(
8792 kind,
8793 SyntaxKind::PatternStructParamWithExpr,
8794 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8795 kind,
8796 SyntaxKind::PatternStructParamWithExpr
8797 );
8798 Self { node }
8799 }
8800 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8801 let kind = node.kind(db);
8802 if kind == SyntaxKind::PatternStructParamWithExpr {
8803 Some(Self::from_syntax_node(db, node))
8804 } else {
8805 None
8806 }
8807 }
8808 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8809 self.node
8810 }
8811 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8812 PatternStructParamWithExprPtr(self.node.stable_ptr(db))
8813 }
8814}
8815#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8816pub struct PatternEnum<'db> {
8817 node: SyntaxNode<'db>,
8818}
8819impl<'db> PatternEnum<'db> {
8820 pub const INDEX_PATH: usize = 0;
8821 pub const INDEX_PATTERN: usize = 1;
8822 pub fn new_green(
8823 db: &'db dyn Database,
8824 path: ExprPathGreen<'db>,
8825 pattern: OptionPatternEnumInnerPatternGreen<'db>,
8826 ) -> PatternEnumGreen<'db> {
8827 let children = [path.0, pattern.0];
8828 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8829 PatternEnumGreen(
8830 GreenNode {
8831 kind: SyntaxKind::PatternEnum,
8832 details: GreenNodeDetails::Node { children: children.into(), width },
8833 }
8834 .intern(db),
8835 )
8836 }
8837}
8838impl<'db> PatternEnum<'db> {
8839 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
8840 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
8841 }
8842 pub fn pattern(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPattern<'db> {
8843 OptionPatternEnumInnerPattern::from_syntax_node(db, self.node.get_children(db)[1])
8844 }
8845}
8846#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8847pub struct PatternEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
8848impl<'db> PatternEnumPtr<'db> {}
8849impl<'db> TypedStablePtr<'db> for PatternEnumPtr<'db> {
8850 type SyntaxNode = PatternEnum<'db>;
8851 fn untyped(self) -> SyntaxStablePtrId<'db> {
8852 self.0
8853 }
8854 fn lookup(&self, db: &'db dyn Database) -> PatternEnum<'db> {
8855 PatternEnum::from_syntax_node(db, self.0.lookup(db))
8856 }
8857}
8858impl<'db> From<PatternEnumPtr<'db>> for SyntaxStablePtrId<'db> {
8859 fn from(ptr: PatternEnumPtr<'db>) -> Self {
8860 ptr.untyped()
8861 }
8862}
8863#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8864pub struct PatternEnumGreen<'db>(pub GreenId<'db>);
8865impl<'db> TypedSyntaxNode<'db> for PatternEnum<'db> {
8866 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnum);
8867 type StablePtr = PatternEnumPtr<'db>;
8868 type Green = PatternEnumGreen<'db>;
8869 fn missing(db: &'db dyn Database) -> Self::Green {
8870 PatternEnumGreen(
8871 GreenNode {
8872 kind: SyntaxKind::PatternEnum,
8873 details: GreenNodeDetails::Node {
8874 children: [
8875 ExprPath::missing(db).0,
8876 OptionPatternEnumInnerPattern::missing(db).0,
8877 ]
8878 .into(),
8879 width: TextWidth::default(),
8880 },
8881 }
8882 .intern(db),
8883 )
8884 }
8885 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8886 let kind = node.kind(db);
8887 assert_eq!(
8888 kind,
8889 SyntaxKind::PatternEnum,
8890 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8891 kind,
8892 SyntaxKind::PatternEnum
8893 );
8894 Self { node }
8895 }
8896 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8897 let kind = node.kind(db);
8898 if kind == SyntaxKind::PatternEnum { Some(Self::from_syntax_node(db, node)) } else { None }
8899 }
8900 fn as_syntax_node(&self) -> SyntaxNode<'db> {
8901 self.node
8902 }
8903 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
8904 PatternEnumPtr(self.node.stable_ptr(db))
8905 }
8906}
8907#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
8908pub struct PatternEnumInnerPattern<'db> {
8909 node: SyntaxNode<'db>,
8910}
8911impl<'db> PatternEnumInnerPattern<'db> {
8912 pub const INDEX_LPAREN: usize = 0;
8913 pub const INDEX_PATTERN: usize = 1;
8914 pub const INDEX_RPAREN: usize = 2;
8915 pub fn new_green(
8916 db: &'db dyn Database,
8917 lparen: TerminalLParenGreen<'db>,
8918 pattern: PatternGreen<'db>,
8919 rparen: TerminalRParenGreen<'db>,
8920 ) -> PatternEnumInnerPatternGreen<'db> {
8921 let children = [lparen.0, pattern.0, rparen.0];
8922 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
8923 PatternEnumInnerPatternGreen(
8924 GreenNode {
8925 kind: SyntaxKind::PatternEnumInnerPattern,
8926 details: GreenNodeDetails::Node { children: children.into(), width },
8927 }
8928 .intern(db),
8929 )
8930 }
8931}
8932impl<'db> PatternEnumInnerPattern<'db> {
8933 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
8934 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
8935 }
8936 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
8937 Pattern::from_syntax_node(db, self.node.get_children(db)[1])
8938 }
8939 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
8940 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
8941 }
8942}
8943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8944pub struct PatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
8945impl<'db> PatternEnumInnerPatternPtr<'db> {}
8946impl<'db> TypedStablePtr<'db> for PatternEnumInnerPatternPtr<'db> {
8947 type SyntaxNode = PatternEnumInnerPattern<'db>;
8948 fn untyped(self) -> SyntaxStablePtrId<'db> {
8949 self.0
8950 }
8951 fn lookup(&self, db: &'db dyn Database) -> PatternEnumInnerPattern<'db> {
8952 PatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
8953 }
8954}
8955impl<'db> From<PatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
8956 fn from(ptr: PatternEnumInnerPatternPtr<'db>) -> Self {
8957 ptr.untyped()
8958 }
8959}
8960#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
8961pub struct PatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
8962impl<'db> TypedSyntaxNode<'db> for PatternEnumInnerPattern<'db> {
8963 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::PatternEnumInnerPattern);
8964 type StablePtr = PatternEnumInnerPatternPtr<'db>;
8965 type Green = PatternEnumInnerPatternGreen<'db>;
8966 fn missing(db: &'db dyn Database) -> Self::Green {
8967 PatternEnumInnerPatternGreen(
8968 GreenNode {
8969 kind: SyntaxKind::PatternEnumInnerPattern,
8970 details: GreenNodeDetails::Node {
8971 children: [
8972 TerminalLParen::missing(db).0,
8973 Pattern::missing(db).0,
8974 TerminalRParen::missing(db).0,
8975 ]
8976 .into(),
8977 width: TextWidth::default(),
8978 },
8979 }
8980 .intern(db),
8981 )
8982 }
8983 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
8984 let kind = node.kind(db);
8985 assert_eq!(
8986 kind,
8987 SyntaxKind::PatternEnumInnerPattern,
8988 "Unexpected SyntaxKind {:?}. Expected {:?}.",
8989 kind,
8990 SyntaxKind::PatternEnumInnerPattern
8991 );
8992 Self { node }
8993 }
8994 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
8995 let kind = node.kind(db);
8996 if kind == SyntaxKind::PatternEnumInnerPattern {
8997 Some(Self::from_syntax_node(db, node))
8998 } else {
8999 None
9000 }
9001 }
9002 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9003 self.node
9004 }
9005 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9006 PatternEnumInnerPatternPtr(self.node.stable_ptr(db))
9007 }
9008}
9009#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9010pub enum OptionPatternEnumInnerPattern<'db> {
9011 Empty(OptionPatternEnumInnerPatternEmpty<'db>),
9012 PatternEnumInnerPattern(PatternEnumInnerPattern<'db>),
9013}
9014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9015pub struct OptionPatternEnumInnerPatternPtr<'db>(pub SyntaxStablePtrId<'db>);
9016impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternPtr<'db> {
9017 type SyntaxNode = OptionPatternEnumInnerPattern<'db>;
9018 fn untyped(self) -> SyntaxStablePtrId<'db> {
9019 self.0
9020 }
9021 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9022 OptionPatternEnumInnerPattern::from_syntax_node(db, self.0.lookup(db))
9023 }
9024}
9025impl<'db> From<OptionPatternEnumInnerPatternPtr<'db>> for SyntaxStablePtrId<'db> {
9026 fn from(ptr: OptionPatternEnumInnerPatternPtr<'db>) -> Self {
9027 ptr.untyped()
9028 }
9029}
9030impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>>
9031 for OptionPatternEnumInnerPatternPtr<'db>
9032{
9033 fn from(value: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9034 Self(value.0)
9035 }
9036}
9037impl<'db> From<PatternEnumInnerPatternPtr<'db>> for OptionPatternEnumInnerPatternPtr<'db> {
9038 fn from(value: PatternEnumInnerPatternPtr<'db>) -> Self {
9039 Self(value.0)
9040 }
9041}
9042impl<'db> From<OptionPatternEnumInnerPatternEmptyGreen<'db>>
9043 for OptionPatternEnumInnerPatternGreen<'db>
9044{
9045 fn from(value: OptionPatternEnumInnerPatternEmptyGreen<'db>) -> Self {
9046 Self(value.0)
9047 }
9048}
9049impl<'db> From<PatternEnumInnerPatternGreen<'db>> for OptionPatternEnumInnerPatternGreen<'db> {
9050 fn from(value: PatternEnumInnerPatternGreen<'db>) -> Self {
9051 Self(value.0)
9052 }
9053}
9054#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9055pub struct OptionPatternEnumInnerPatternGreen<'db>(pub GreenId<'db>);
9056impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPattern<'db> {
9057 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9058 type StablePtr = OptionPatternEnumInnerPatternPtr<'db>;
9059 type Green = OptionPatternEnumInnerPatternGreen<'db>;
9060 fn missing(db: &'db dyn Database) -> Self::Green {
9061 panic!("No missing variant.");
9062 }
9063 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9064 let kind = node.kind(db);
9065 match kind {
9066 SyntaxKind::OptionPatternEnumInnerPatternEmpty => OptionPatternEnumInnerPattern::Empty(
9067 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9068 ),
9069 SyntaxKind::PatternEnumInnerPattern => {
9070 OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9071 PatternEnumInnerPattern::from_syntax_node(db, node),
9072 )
9073 }
9074 _ => panic!(
9075 "Unexpected syntax kind {:?} when constructing {}.",
9076 kind, "OptionPatternEnumInnerPattern"
9077 ),
9078 }
9079 }
9080 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9081 let kind = node.kind(db);
9082 match kind {
9083 SyntaxKind::OptionPatternEnumInnerPatternEmpty => {
9084 Some(OptionPatternEnumInnerPattern::Empty(
9085 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, node),
9086 ))
9087 }
9088 SyntaxKind::PatternEnumInnerPattern => {
9089 Some(OptionPatternEnumInnerPattern::PatternEnumInnerPattern(
9090 PatternEnumInnerPattern::from_syntax_node(db, node),
9091 ))
9092 }
9093 _ => None,
9094 }
9095 }
9096 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9097 match self {
9098 OptionPatternEnumInnerPattern::Empty(x) => x.as_syntax_node(),
9099 OptionPatternEnumInnerPattern::PatternEnumInnerPattern(x) => x.as_syntax_node(),
9100 }
9101 }
9102 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9103 OptionPatternEnumInnerPatternPtr(self.as_syntax_node().stable_ptr(db))
9104 }
9105}
9106impl<'db> OptionPatternEnumInnerPattern<'db> {
9107 pub fn is_variant(kind: SyntaxKind) -> bool {
9109 matches!(
9110 kind,
9111 SyntaxKind::OptionPatternEnumInnerPatternEmpty | SyntaxKind::PatternEnumInnerPattern
9112 )
9113 }
9114}
9115#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9116pub struct OptionPatternEnumInnerPatternEmpty<'db> {
9117 node: SyntaxNode<'db>,
9118}
9119impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {
9120 pub fn new_green(db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmptyGreen<'db> {
9121 let children = [];
9122 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9123 OptionPatternEnumInnerPatternEmptyGreen(
9124 GreenNode {
9125 kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9126 details: GreenNodeDetails::Node { children: children.into(), width },
9127 }
9128 .intern(db),
9129 )
9130 }
9131}
9132impl<'db> OptionPatternEnumInnerPatternEmpty<'db> {}
9133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9134pub struct OptionPatternEnumInnerPatternEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9135impl<'db> OptionPatternEnumInnerPatternEmptyPtr<'db> {}
9136impl<'db> TypedStablePtr<'db> for OptionPatternEnumInnerPatternEmptyPtr<'db> {
9137 type SyntaxNode = OptionPatternEnumInnerPatternEmpty<'db>;
9138 fn untyped(self) -> SyntaxStablePtrId<'db> {
9139 self.0
9140 }
9141 fn lookup(&self, db: &'db dyn Database) -> OptionPatternEnumInnerPatternEmpty<'db> {
9142 OptionPatternEnumInnerPatternEmpty::from_syntax_node(db, self.0.lookup(db))
9143 }
9144}
9145impl<'db> From<OptionPatternEnumInnerPatternEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9146 fn from(ptr: OptionPatternEnumInnerPatternEmptyPtr<'db>) -> Self {
9147 ptr.untyped()
9148 }
9149}
9150#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9151pub struct OptionPatternEnumInnerPatternEmptyGreen<'db>(pub GreenId<'db>);
9152impl<'db> TypedSyntaxNode<'db> for OptionPatternEnumInnerPatternEmpty<'db> {
9153 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionPatternEnumInnerPatternEmpty);
9154 type StablePtr = OptionPatternEnumInnerPatternEmptyPtr<'db>;
9155 type Green = OptionPatternEnumInnerPatternEmptyGreen<'db>;
9156 fn missing(db: &'db dyn Database) -> Self::Green {
9157 OptionPatternEnumInnerPatternEmptyGreen(
9158 GreenNode {
9159 kind: SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9160 details: GreenNodeDetails::Node {
9161 children: [].into(),
9162 width: TextWidth::default(),
9163 },
9164 }
9165 .intern(db),
9166 )
9167 }
9168 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9169 let kind = node.kind(db);
9170 assert_eq!(
9171 kind,
9172 SyntaxKind::OptionPatternEnumInnerPatternEmpty,
9173 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9174 kind,
9175 SyntaxKind::OptionPatternEnumInnerPatternEmpty
9176 );
9177 Self { node }
9178 }
9179 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9180 let kind = node.kind(db);
9181 if kind == SyntaxKind::OptionPatternEnumInnerPatternEmpty {
9182 Some(Self::from_syntax_node(db, node))
9183 } else {
9184 None
9185 }
9186 }
9187 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9188 self.node
9189 }
9190 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9191 OptionPatternEnumInnerPatternEmptyPtr(self.node.stable_ptr(db))
9192 }
9193}
9194#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9195pub struct TypeClause<'db> {
9196 node: SyntaxNode<'db>,
9197}
9198impl<'db> TypeClause<'db> {
9199 pub const INDEX_COLON: usize = 0;
9200 pub const INDEX_TY: usize = 1;
9201 pub fn new_green(
9202 db: &'db dyn Database,
9203 colon: TerminalColonGreen<'db>,
9204 ty: ExprGreen<'db>,
9205 ) -> TypeClauseGreen<'db> {
9206 let children = [colon.0, ty.0];
9207 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9208 TypeClauseGreen(
9209 GreenNode {
9210 kind: SyntaxKind::TypeClause,
9211 details: GreenNodeDetails::Node { children: children.into(), width },
9212 }
9213 .intern(db),
9214 )
9215 }
9216}
9217impl<'db> TypeClause<'db> {
9218 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
9219 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
9220 }
9221 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9222 Expr::from_syntax_node(db, self.node.get_children(db)[1])
9223 }
9224}
9225#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9226pub struct TypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9227impl<'db> TypeClausePtr<'db> {}
9228impl<'db> TypedStablePtr<'db> for TypeClausePtr<'db> {
9229 type SyntaxNode = TypeClause<'db>;
9230 fn untyped(self) -> SyntaxStablePtrId<'db> {
9231 self.0
9232 }
9233 fn lookup(&self, db: &'db dyn Database) -> TypeClause<'db> {
9234 TypeClause::from_syntax_node(db, self.0.lookup(db))
9235 }
9236}
9237impl<'db> From<TypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9238 fn from(ptr: TypeClausePtr<'db>) -> Self {
9239 ptr.untyped()
9240 }
9241}
9242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9243pub struct TypeClauseGreen<'db>(pub GreenId<'db>);
9244impl<'db> TypedSyntaxNode<'db> for TypeClause<'db> {
9245 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TypeClause);
9246 type StablePtr = TypeClausePtr<'db>;
9247 type Green = TypeClauseGreen<'db>;
9248 fn missing(db: &'db dyn Database) -> Self::Green {
9249 TypeClauseGreen(
9250 GreenNode {
9251 kind: SyntaxKind::TypeClause,
9252 details: GreenNodeDetails::Node {
9253 children: [TerminalColon::missing(db).0, Expr::missing(db).0].into(),
9254 width: TextWidth::default(),
9255 },
9256 }
9257 .intern(db),
9258 )
9259 }
9260 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9261 let kind = node.kind(db);
9262 assert_eq!(
9263 kind,
9264 SyntaxKind::TypeClause,
9265 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9266 kind,
9267 SyntaxKind::TypeClause
9268 );
9269 Self { node }
9270 }
9271 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9272 let kind = node.kind(db);
9273 if kind == SyntaxKind::TypeClause { Some(Self::from_syntax_node(db, node)) } else { None }
9274 }
9275 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9276 self.node
9277 }
9278 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9279 TypeClausePtr(self.node.stable_ptr(db))
9280 }
9281}
9282#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9283pub enum OptionTypeClause<'db> {
9284 Empty(OptionTypeClauseEmpty<'db>),
9285 TypeClause(TypeClause<'db>),
9286}
9287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9288pub struct OptionTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9289impl<'db> TypedStablePtr<'db> for OptionTypeClausePtr<'db> {
9290 type SyntaxNode = OptionTypeClause<'db>;
9291 fn untyped(self) -> SyntaxStablePtrId<'db> {
9292 self.0
9293 }
9294 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9295 OptionTypeClause::from_syntax_node(db, self.0.lookup(db))
9296 }
9297}
9298impl<'db> From<OptionTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9299 fn from(ptr: OptionTypeClausePtr<'db>) -> Self {
9300 ptr.untyped()
9301 }
9302}
9303impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for OptionTypeClausePtr<'db> {
9304 fn from(value: OptionTypeClauseEmptyPtr<'db>) -> Self {
9305 Self(value.0)
9306 }
9307}
9308impl<'db> From<TypeClausePtr<'db>> for OptionTypeClausePtr<'db> {
9309 fn from(value: TypeClausePtr<'db>) -> Self {
9310 Self(value.0)
9311 }
9312}
9313impl<'db> From<OptionTypeClauseEmptyGreen<'db>> for OptionTypeClauseGreen<'db> {
9314 fn from(value: OptionTypeClauseEmptyGreen<'db>) -> Self {
9315 Self(value.0)
9316 }
9317}
9318impl<'db> From<TypeClauseGreen<'db>> for OptionTypeClauseGreen<'db> {
9319 fn from(value: TypeClauseGreen<'db>) -> Self {
9320 Self(value.0)
9321 }
9322}
9323#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9324pub struct OptionTypeClauseGreen<'db>(pub GreenId<'db>);
9325impl<'db> TypedSyntaxNode<'db> for OptionTypeClause<'db> {
9326 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9327 type StablePtr = OptionTypeClausePtr<'db>;
9328 type Green = OptionTypeClauseGreen<'db>;
9329 fn missing(db: &'db dyn Database) -> Self::Green {
9330 panic!("No missing variant.");
9331 }
9332 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9333 let kind = node.kind(db);
9334 match kind {
9335 SyntaxKind::OptionTypeClauseEmpty => {
9336 OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node))
9337 }
9338 SyntaxKind::TypeClause => {
9339 OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node))
9340 }
9341 _ => panic!(
9342 "Unexpected syntax kind {:?} when constructing {}.",
9343 kind, "OptionTypeClause"
9344 ),
9345 }
9346 }
9347 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9348 let kind = node.kind(db);
9349 match kind {
9350 SyntaxKind::OptionTypeClauseEmpty => {
9351 Some(OptionTypeClause::Empty(OptionTypeClauseEmpty::from_syntax_node(db, node)))
9352 }
9353 SyntaxKind::TypeClause => {
9354 Some(OptionTypeClause::TypeClause(TypeClause::from_syntax_node(db, node)))
9355 }
9356 _ => None,
9357 }
9358 }
9359 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9360 match self {
9361 OptionTypeClause::Empty(x) => x.as_syntax_node(),
9362 OptionTypeClause::TypeClause(x) => x.as_syntax_node(),
9363 }
9364 }
9365 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9366 OptionTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9367 }
9368}
9369impl<'db> OptionTypeClause<'db> {
9370 pub fn is_variant(kind: SyntaxKind) -> bool {
9372 matches!(kind, SyntaxKind::OptionTypeClauseEmpty | SyntaxKind::TypeClause)
9373 }
9374}
9375#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9376pub struct OptionTypeClauseEmpty<'db> {
9377 node: SyntaxNode<'db>,
9378}
9379impl<'db> OptionTypeClauseEmpty<'db> {
9380 pub fn new_green(db: &'db dyn Database) -> OptionTypeClauseEmptyGreen<'db> {
9381 let children = [];
9382 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9383 OptionTypeClauseEmptyGreen(
9384 GreenNode {
9385 kind: SyntaxKind::OptionTypeClauseEmpty,
9386 details: GreenNodeDetails::Node { children: children.into(), width },
9387 }
9388 .intern(db),
9389 )
9390 }
9391}
9392impl<'db> OptionTypeClauseEmpty<'db> {}
9393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9394pub struct OptionTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9395impl<'db> OptionTypeClauseEmptyPtr<'db> {}
9396impl<'db> TypedStablePtr<'db> for OptionTypeClauseEmptyPtr<'db> {
9397 type SyntaxNode = OptionTypeClauseEmpty<'db>;
9398 fn untyped(self) -> SyntaxStablePtrId<'db> {
9399 self.0
9400 }
9401 fn lookup(&self, db: &'db dyn Database) -> OptionTypeClauseEmpty<'db> {
9402 OptionTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9403 }
9404}
9405impl<'db> From<OptionTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9406 fn from(ptr: OptionTypeClauseEmptyPtr<'db>) -> Self {
9407 ptr.untyped()
9408 }
9409}
9410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9411pub struct OptionTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9412impl<'db> TypedSyntaxNode<'db> for OptionTypeClauseEmpty<'db> {
9413 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTypeClauseEmpty);
9414 type StablePtr = OptionTypeClauseEmptyPtr<'db>;
9415 type Green = OptionTypeClauseEmptyGreen<'db>;
9416 fn missing(db: &'db dyn Database) -> Self::Green {
9417 OptionTypeClauseEmptyGreen(
9418 GreenNode {
9419 kind: SyntaxKind::OptionTypeClauseEmpty,
9420 details: GreenNodeDetails::Node {
9421 children: [].into(),
9422 width: TextWidth::default(),
9423 },
9424 }
9425 .intern(db),
9426 )
9427 }
9428 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9429 let kind = node.kind(db);
9430 assert_eq!(
9431 kind,
9432 SyntaxKind::OptionTypeClauseEmpty,
9433 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9434 kind,
9435 SyntaxKind::OptionTypeClauseEmpty
9436 );
9437 Self { node }
9438 }
9439 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9440 let kind = node.kind(db);
9441 if kind == SyntaxKind::OptionTypeClauseEmpty {
9442 Some(Self::from_syntax_node(db, node))
9443 } else {
9444 None
9445 }
9446 }
9447 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9448 self.node
9449 }
9450 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9451 OptionTypeClauseEmptyPtr(self.node.stable_ptr(db))
9452 }
9453}
9454#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9455pub struct ReturnTypeClause<'db> {
9456 node: SyntaxNode<'db>,
9457}
9458impl<'db> ReturnTypeClause<'db> {
9459 pub const INDEX_ARROW: usize = 0;
9460 pub const INDEX_TY: usize = 1;
9461 pub fn new_green(
9462 db: &'db dyn Database,
9463 arrow: TerminalArrowGreen<'db>,
9464 ty: ExprGreen<'db>,
9465 ) -> ReturnTypeClauseGreen<'db> {
9466 let children = [arrow.0, ty.0];
9467 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9468 ReturnTypeClauseGreen(
9469 GreenNode {
9470 kind: SyntaxKind::ReturnTypeClause,
9471 details: GreenNodeDetails::Node { children: children.into(), width },
9472 }
9473 .intern(db),
9474 )
9475 }
9476}
9477impl<'db> ReturnTypeClause<'db> {
9478 pub fn arrow(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
9479 TerminalArrow::from_syntax_node(db, self.node.get_children(db)[0])
9480 }
9481 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
9482 Expr::from_syntax_node(db, self.node.get_children(db)[1])
9483 }
9484}
9485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9486pub struct ReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9487impl<'db> ReturnTypeClausePtr<'db> {}
9488impl<'db> TypedStablePtr<'db> for ReturnTypeClausePtr<'db> {
9489 type SyntaxNode = ReturnTypeClause<'db>;
9490 fn untyped(self) -> SyntaxStablePtrId<'db> {
9491 self.0
9492 }
9493 fn lookup(&self, db: &'db dyn Database) -> ReturnTypeClause<'db> {
9494 ReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9495 }
9496}
9497impl<'db> From<ReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9498 fn from(ptr: ReturnTypeClausePtr<'db>) -> Self {
9499 ptr.untyped()
9500 }
9501}
9502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9503pub struct ReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9504impl<'db> TypedSyntaxNode<'db> for ReturnTypeClause<'db> {
9505 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ReturnTypeClause);
9506 type StablePtr = ReturnTypeClausePtr<'db>;
9507 type Green = ReturnTypeClauseGreen<'db>;
9508 fn missing(db: &'db dyn Database) -> Self::Green {
9509 ReturnTypeClauseGreen(
9510 GreenNode {
9511 kind: SyntaxKind::ReturnTypeClause,
9512 details: GreenNodeDetails::Node {
9513 children: [TerminalArrow::missing(db).0, Expr::missing(db).0].into(),
9514 width: TextWidth::default(),
9515 },
9516 }
9517 .intern(db),
9518 )
9519 }
9520 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9521 let kind = node.kind(db);
9522 assert_eq!(
9523 kind,
9524 SyntaxKind::ReturnTypeClause,
9525 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9526 kind,
9527 SyntaxKind::ReturnTypeClause
9528 );
9529 Self { node }
9530 }
9531 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9532 let kind = node.kind(db);
9533 if kind == SyntaxKind::ReturnTypeClause {
9534 Some(Self::from_syntax_node(db, node))
9535 } else {
9536 None
9537 }
9538 }
9539 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9540 self.node
9541 }
9542 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9543 ReturnTypeClausePtr(self.node.stable_ptr(db))
9544 }
9545}
9546#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9547pub enum OptionReturnTypeClause<'db> {
9548 Empty(OptionReturnTypeClauseEmpty<'db>),
9549 ReturnTypeClause(ReturnTypeClause<'db>),
9550}
9551#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9552pub struct OptionReturnTypeClausePtr<'db>(pub SyntaxStablePtrId<'db>);
9553impl<'db> TypedStablePtr<'db> for OptionReturnTypeClausePtr<'db> {
9554 type SyntaxNode = OptionReturnTypeClause<'db>;
9555 fn untyped(self) -> SyntaxStablePtrId<'db> {
9556 self.0
9557 }
9558 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9559 OptionReturnTypeClause::from_syntax_node(db, self.0.lookup(db))
9560 }
9561}
9562impl<'db> From<OptionReturnTypeClausePtr<'db>> for SyntaxStablePtrId<'db> {
9563 fn from(ptr: OptionReturnTypeClausePtr<'db>) -> Self {
9564 ptr.untyped()
9565 }
9566}
9567impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for OptionReturnTypeClausePtr<'db> {
9568 fn from(value: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9569 Self(value.0)
9570 }
9571}
9572impl<'db> From<ReturnTypeClausePtr<'db>> for OptionReturnTypeClausePtr<'db> {
9573 fn from(value: ReturnTypeClausePtr<'db>) -> Self {
9574 Self(value.0)
9575 }
9576}
9577impl<'db> From<OptionReturnTypeClauseEmptyGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9578 fn from(value: OptionReturnTypeClauseEmptyGreen<'db>) -> Self {
9579 Self(value.0)
9580 }
9581}
9582impl<'db> From<ReturnTypeClauseGreen<'db>> for OptionReturnTypeClauseGreen<'db> {
9583 fn from(value: ReturnTypeClauseGreen<'db>) -> Self {
9584 Self(value.0)
9585 }
9586}
9587#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9588pub struct OptionReturnTypeClauseGreen<'db>(pub GreenId<'db>);
9589impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClause<'db> {
9590 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9591 type StablePtr = OptionReturnTypeClausePtr<'db>;
9592 type Green = OptionReturnTypeClauseGreen<'db>;
9593 fn missing(db: &'db dyn Database) -> Self::Green {
9594 panic!("No missing variant.");
9595 }
9596 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9597 let kind = node.kind(db);
9598 match kind {
9599 SyntaxKind::OptionReturnTypeClauseEmpty => OptionReturnTypeClause::Empty(
9600 OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9601 ),
9602 SyntaxKind::ReturnTypeClause => OptionReturnTypeClause::ReturnTypeClause(
9603 ReturnTypeClause::from_syntax_node(db, node),
9604 ),
9605 _ => panic!(
9606 "Unexpected syntax kind {:?} when constructing {}.",
9607 kind, "OptionReturnTypeClause"
9608 ),
9609 }
9610 }
9611 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9612 let kind = node.kind(db);
9613 match kind {
9614 SyntaxKind::OptionReturnTypeClauseEmpty => Some(OptionReturnTypeClause::Empty(
9615 OptionReturnTypeClauseEmpty::from_syntax_node(db, node),
9616 )),
9617 SyntaxKind::ReturnTypeClause => Some(OptionReturnTypeClause::ReturnTypeClause(
9618 ReturnTypeClause::from_syntax_node(db, node),
9619 )),
9620 _ => None,
9621 }
9622 }
9623 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9624 match self {
9625 OptionReturnTypeClause::Empty(x) => x.as_syntax_node(),
9626 OptionReturnTypeClause::ReturnTypeClause(x) => x.as_syntax_node(),
9627 }
9628 }
9629 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9630 OptionReturnTypeClausePtr(self.as_syntax_node().stable_ptr(db))
9631 }
9632}
9633impl<'db> OptionReturnTypeClause<'db> {
9634 pub fn is_variant(kind: SyntaxKind) -> bool {
9636 matches!(kind, SyntaxKind::OptionReturnTypeClauseEmpty | SyntaxKind::ReturnTypeClause)
9637 }
9638}
9639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9640pub struct OptionReturnTypeClauseEmpty<'db> {
9641 node: SyntaxNode<'db>,
9642}
9643impl<'db> OptionReturnTypeClauseEmpty<'db> {
9644 pub fn new_green(db: &'db dyn Database) -> OptionReturnTypeClauseEmptyGreen<'db> {
9645 let children = [];
9646 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9647 OptionReturnTypeClauseEmptyGreen(
9648 GreenNode {
9649 kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9650 details: GreenNodeDetails::Node { children: children.into(), width },
9651 }
9652 .intern(db),
9653 )
9654 }
9655}
9656impl<'db> OptionReturnTypeClauseEmpty<'db> {}
9657#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9658pub struct OptionReturnTypeClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
9659impl<'db> OptionReturnTypeClauseEmptyPtr<'db> {}
9660impl<'db> TypedStablePtr<'db> for OptionReturnTypeClauseEmptyPtr<'db> {
9661 type SyntaxNode = OptionReturnTypeClauseEmpty<'db>;
9662 fn untyped(self) -> SyntaxStablePtrId<'db> {
9663 self.0
9664 }
9665 fn lookup(&self, db: &'db dyn Database) -> OptionReturnTypeClauseEmpty<'db> {
9666 OptionReturnTypeClauseEmpty::from_syntax_node(db, self.0.lookup(db))
9667 }
9668}
9669impl<'db> From<OptionReturnTypeClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
9670 fn from(ptr: OptionReturnTypeClauseEmptyPtr<'db>) -> Self {
9671 ptr.untyped()
9672 }
9673}
9674#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9675pub struct OptionReturnTypeClauseEmptyGreen<'db>(pub GreenId<'db>);
9676impl<'db> TypedSyntaxNode<'db> for OptionReturnTypeClauseEmpty<'db> {
9677 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionReturnTypeClauseEmpty);
9678 type StablePtr = OptionReturnTypeClauseEmptyPtr<'db>;
9679 type Green = OptionReturnTypeClauseEmptyGreen<'db>;
9680 fn missing(db: &'db dyn Database) -> Self::Green {
9681 OptionReturnTypeClauseEmptyGreen(
9682 GreenNode {
9683 kind: SyntaxKind::OptionReturnTypeClauseEmpty,
9684 details: GreenNodeDetails::Node {
9685 children: [].into(),
9686 width: TextWidth::default(),
9687 },
9688 }
9689 .intern(db),
9690 )
9691 }
9692 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9693 let kind = node.kind(db);
9694 assert_eq!(
9695 kind,
9696 SyntaxKind::OptionReturnTypeClauseEmpty,
9697 "Unexpected SyntaxKind {:?}. Expected {:?}.",
9698 kind,
9699 SyntaxKind::OptionReturnTypeClauseEmpty
9700 );
9701 Self { node }
9702 }
9703 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9704 let kind = node.kind(db);
9705 if kind == SyntaxKind::OptionReturnTypeClauseEmpty {
9706 Some(Self::from_syntax_node(db, node))
9707 } else {
9708 None
9709 }
9710 }
9711 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9712 self.node
9713 }
9714 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9715 OptionReturnTypeClauseEmptyPtr(self.node.stable_ptr(db))
9716 }
9717}
9718#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9719pub enum Statement<'db> {
9720 Let(StatementLet<'db>),
9721 Expr(StatementExpr<'db>),
9722 Continue(StatementContinue<'db>),
9723 Return(StatementReturn<'db>),
9724 Break(StatementBreak<'db>),
9725 Item(StatementItem<'db>),
9726 Missing(StatementMissing<'db>),
9727}
9728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9729pub struct StatementPtr<'db>(pub SyntaxStablePtrId<'db>);
9730impl<'db> TypedStablePtr<'db> for StatementPtr<'db> {
9731 type SyntaxNode = Statement<'db>;
9732 fn untyped(self) -> SyntaxStablePtrId<'db> {
9733 self.0
9734 }
9735 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
9736 Statement::from_syntax_node(db, self.0.lookup(db))
9737 }
9738}
9739impl<'db> From<StatementPtr<'db>> for SyntaxStablePtrId<'db> {
9740 fn from(ptr: StatementPtr<'db>) -> Self {
9741 ptr.untyped()
9742 }
9743}
9744impl<'db> From<StatementLetPtr<'db>> for StatementPtr<'db> {
9745 fn from(value: StatementLetPtr<'db>) -> Self {
9746 Self(value.0)
9747 }
9748}
9749impl<'db> From<StatementExprPtr<'db>> for StatementPtr<'db> {
9750 fn from(value: StatementExprPtr<'db>) -> Self {
9751 Self(value.0)
9752 }
9753}
9754impl<'db> From<StatementContinuePtr<'db>> for StatementPtr<'db> {
9755 fn from(value: StatementContinuePtr<'db>) -> Self {
9756 Self(value.0)
9757 }
9758}
9759impl<'db> From<StatementReturnPtr<'db>> for StatementPtr<'db> {
9760 fn from(value: StatementReturnPtr<'db>) -> Self {
9761 Self(value.0)
9762 }
9763}
9764impl<'db> From<StatementBreakPtr<'db>> for StatementPtr<'db> {
9765 fn from(value: StatementBreakPtr<'db>) -> Self {
9766 Self(value.0)
9767 }
9768}
9769impl<'db> From<StatementItemPtr<'db>> for StatementPtr<'db> {
9770 fn from(value: StatementItemPtr<'db>) -> Self {
9771 Self(value.0)
9772 }
9773}
9774impl<'db> From<StatementMissingPtr<'db>> for StatementPtr<'db> {
9775 fn from(value: StatementMissingPtr<'db>) -> Self {
9776 Self(value.0)
9777 }
9778}
9779impl<'db> From<StatementLetGreen<'db>> for StatementGreen<'db> {
9780 fn from(value: StatementLetGreen<'db>) -> Self {
9781 Self(value.0)
9782 }
9783}
9784impl<'db> From<StatementExprGreen<'db>> for StatementGreen<'db> {
9785 fn from(value: StatementExprGreen<'db>) -> Self {
9786 Self(value.0)
9787 }
9788}
9789impl<'db> From<StatementContinueGreen<'db>> for StatementGreen<'db> {
9790 fn from(value: StatementContinueGreen<'db>) -> Self {
9791 Self(value.0)
9792 }
9793}
9794impl<'db> From<StatementReturnGreen<'db>> for StatementGreen<'db> {
9795 fn from(value: StatementReturnGreen<'db>) -> Self {
9796 Self(value.0)
9797 }
9798}
9799impl<'db> From<StatementBreakGreen<'db>> for StatementGreen<'db> {
9800 fn from(value: StatementBreakGreen<'db>) -> Self {
9801 Self(value.0)
9802 }
9803}
9804impl<'db> From<StatementItemGreen<'db>> for StatementGreen<'db> {
9805 fn from(value: StatementItemGreen<'db>) -> Self {
9806 Self(value.0)
9807 }
9808}
9809impl<'db> From<StatementMissingGreen<'db>> for StatementGreen<'db> {
9810 fn from(value: StatementMissingGreen<'db>) -> Self {
9811 Self(value.0)
9812 }
9813}
9814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9815pub struct StatementGreen<'db>(pub GreenId<'db>);
9816impl<'db> TypedSyntaxNode<'db> for Statement<'db> {
9817 const OPTIONAL_KIND: Option<SyntaxKind> = None;
9818 type StablePtr = StatementPtr<'db>;
9819 type Green = StatementGreen<'db>;
9820 fn missing(db: &'db dyn Database) -> Self::Green {
9821 StatementGreen(StatementMissing::missing(db).0)
9822 }
9823 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9824 let kind = node.kind(db);
9825 match kind {
9826 SyntaxKind::StatementLet => Statement::Let(StatementLet::from_syntax_node(db, node)),
9827 SyntaxKind::StatementExpr => Statement::Expr(StatementExpr::from_syntax_node(db, node)),
9828 SyntaxKind::StatementContinue => {
9829 Statement::Continue(StatementContinue::from_syntax_node(db, node))
9830 }
9831 SyntaxKind::StatementReturn => {
9832 Statement::Return(StatementReturn::from_syntax_node(db, node))
9833 }
9834 SyntaxKind::StatementBreak => {
9835 Statement::Break(StatementBreak::from_syntax_node(db, node))
9836 }
9837 SyntaxKind::StatementItem => Statement::Item(StatementItem::from_syntax_node(db, node)),
9838 SyntaxKind::StatementMissing => {
9839 Statement::Missing(StatementMissing::from_syntax_node(db, node))
9840 }
9841 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Statement"),
9842 }
9843 }
9844 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9845 let kind = node.kind(db);
9846 match kind {
9847 SyntaxKind::StatementLet => {
9848 Some(Statement::Let(StatementLet::from_syntax_node(db, node)))
9849 }
9850 SyntaxKind::StatementExpr => {
9851 Some(Statement::Expr(StatementExpr::from_syntax_node(db, node)))
9852 }
9853 SyntaxKind::StatementContinue => {
9854 Some(Statement::Continue(StatementContinue::from_syntax_node(db, node)))
9855 }
9856 SyntaxKind::StatementReturn => {
9857 Some(Statement::Return(StatementReturn::from_syntax_node(db, node)))
9858 }
9859 SyntaxKind::StatementBreak => {
9860 Some(Statement::Break(StatementBreak::from_syntax_node(db, node)))
9861 }
9862 SyntaxKind::StatementItem => {
9863 Some(Statement::Item(StatementItem::from_syntax_node(db, node)))
9864 }
9865 SyntaxKind::StatementMissing => {
9866 Some(Statement::Missing(StatementMissing::from_syntax_node(db, node)))
9867 }
9868 _ => None,
9869 }
9870 }
9871 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9872 match self {
9873 Statement::Let(x) => x.as_syntax_node(),
9874 Statement::Expr(x) => x.as_syntax_node(),
9875 Statement::Continue(x) => x.as_syntax_node(),
9876 Statement::Return(x) => x.as_syntax_node(),
9877 Statement::Break(x) => x.as_syntax_node(),
9878 Statement::Item(x) => x.as_syntax_node(),
9879 Statement::Missing(x) => x.as_syntax_node(),
9880 }
9881 }
9882 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9883 StatementPtr(self.as_syntax_node().stable_ptr(db))
9884 }
9885}
9886impl<'db> Statement<'db> {
9887 pub fn is_variant(kind: SyntaxKind) -> bool {
9889 matches!(
9890 kind,
9891 SyntaxKind::StatementLet
9892 | SyntaxKind::StatementExpr
9893 | SyntaxKind::StatementContinue
9894 | SyntaxKind::StatementReturn
9895 | SyntaxKind::StatementBreak
9896 | SyntaxKind::StatementItem
9897 | SyntaxKind::StatementMissing
9898 )
9899 }
9900}
9901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9902pub struct StatementList<'db>(ElementList<'db, Statement<'db>, 1>);
9903impl<'db> Deref for StatementList<'db> {
9904 type Target = ElementList<'db, Statement<'db>, 1>;
9905 fn deref(&self) -> &Self::Target {
9906 &self.0
9907 }
9908}
9909impl<'db> StatementList<'db> {
9910 pub fn new_green(
9911 db: &'db dyn Database,
9912 children: &[StatementGreen<'db>],
9913 ) -> StatementListGreen<'db> {
9914 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
9915 StatementListGreen(
9916 GreenNode {
9917 kind: SyntaxKind::StatementList,
9918 details: GreenNodeDetails::Node {
9919 children: children.iter().map(|x| x.0).collect(),
9920 width,
9921 },
9922 }
9923 .intern(db),
9924 )
9925 }
9926}
9927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9928pub struct StatementListPtr<'db>(pub SyntaxStablePtrId<'db>);
9929impl<'db> TypedStablePtr<'db> for StatementListPtr<'db> {
9930 type SyntaxNode = StatementList<'db>;
9931 fn untyped(self) -> SyntaxStablePtrId<'db> {
9932 self.0
9933 }
9934 fn lookup(&self, db: &'db dyn Database) -> StatementList<'db> {
9935 StatementList::from_syntax_node(db, self.0.lookup(db))
9936 }
9937}
9938impl<'db> From<StatementListPtr<'db>> for SyntaxStablePtrId<'db> {
9939 fn from(ptr: StatementListPtr<'db>) -> Self {
9940 ptr.untyped()
9941 }
9942}
9943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9944pub struct StatementListGreen<'db>(pub GreenId<'db>);
9945impl<'db> TypedSyntaxNode<'db> for StatementList<'db> {
9946 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementList);
9947 type StablePtr = StatementListPtr<'db>;
9948 type Green = StatementListGreen<'db>;
9949 fn missing(db: &'db dyn Database) -> Self::Green {
9950 StatementListGreen(
9951 GreenNode {
9952 kind: SyntaxKind::StatementList,
9953 details: GreenNodeDetails::Node {
9954 children: [].into(),
9955 width: TextWidth::default(),
9956 },
9957 }
9958 .intern(db),
9959 )
9960 }
9961 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
9962 Self(ElementList::new(node))
9963 }
9964 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
9965 if node.kind(db) == SyntaxKind::StatementList {
9966 Some(Self(ElementList::new(node)))
9967 } else {
9968 None
9969 }
9970 }
9971 fn as_syntax_node(&self) -> SyntaxNode<'db> {
9972 self.node
9973 }
9974 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
9975 StatementListPtr(self.node.stable_ptr(db))
9976 }
9977}
9978#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
9979pub struct StatementMissing<'db> {
9980 node: SyntaxNode<'db>,
9981}
9982impl<'db> StatementMissing<'db> {
9983 pub fn new_green(db: &'db dyn Database) -> StatementMissingGreen<'db> {
9984 let children = [];
9985 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
9986 StatementMissingGreen(
9987 GreenNode {
9988 kind: SyntaxKind::StatementMissing,
9989 details: GreenNodeDetails::Node { children: children.into(), width },
9990 }
9991 .intern(db),
9992 )
9993 }
9994}
9995impl<'db> StatementMissing<'db> {}
9996#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
9997pub struct StatementMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
9998impl<'db> StatementMissingPtr<'db> {}
9999impl<'db> TypedStablePtr<'db> for StatementMissingPtr<'db> {
10000 type SyntaxNode = StatementMissing<'db>;
10001 fn untyped(self) -> SyntaxStablePtrId<'db> {
10002 self.0
10003 }
10004 fn lookup(&self, db: &'db dyn Database) -> StatementMissing<'db> {
10005 StatementMissing::from_syntax_node(db, self.0.lookup(db))
10006 }
10007}
10008impl<'db> From<StatementMissingPtr<'db>> for SyntaxStablePtrId<'db> {
10009 fn from(ptr: StatementMissingPtr<'db>) -> Self {
10010 ptr.untyped()
10011 }
10012}
10013#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10014pub struct StatementMissingGreen<'db>(pub GreenId<'db>);
10015impl<'db> TypedSyntaxNode<'db> for StatementMissing<'db> {
10016 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementMissing);
10017 type StablePtr = StatementMissingPtr<'db>;
10018 type Green = StatementMissingGreen<'db>;
10019 fn missing(db: &'db dyn Database) -> Self::Green {
10020 StatementMissingGreen(
10021 GreenNode {
10022 kind: SyntaxKind::StatementMissing,
10023 details: GreenNodeDetails::Node {
10024 children: [].into(),
10025 width: TextWidth::default(),
10026 },
10027 }
10028 .intern(db),
10029 )
10030 }
10031 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10032 let kind = node.kind(db);
10033 assert_eq!(
10034 kind,
10035 SyntaxKind::StatementMissing,
10036 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10037 kind,
10038 SyntaxKind::StatementMissing
10039 );
10040 Self { node }
10041 }
10042 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10043 let kind = node.kind(db);
10044 if kind == SyntaxKind::StatementMissing {
10045 Some(Self::from_syntax_node(db, node))
10046 } else {
10047 None
10048 }
10049 }
10050 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10051 self.node
10052 }
10053 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10054 StatementMissingPtr(self.node.stable_ptr(db))
10055 }
10056}
10057#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10058pub struct StatementLet<'db> {
10059 node: SyntaxNode<'db>,
10060}
10061impl<'db> StatementLet<'db> {
10062 pub const INDEX_ATTRIBUTES: usize = 0;
10063 pub const INDEX_LET_KW: usize = 1;
10064 pub const INDEX_PATTERN: usize = 2;
10065 pub const INDEX_TYPE_CLAUSE: usize = 3;
10066 pub const INDEX_EQ: usize = 4;
10067 pub const INDEX_RHS: usize = 5;
10068 pub const INDEX_LET_ELSE_CLAUSE: usize = 6;
10069 pub const INDEX_SEMICOLON: usize = 7;
10070 pub fn new_green(
10071 db: &'db dyn Database,
10072 attributes: AttributeListGreen<'db>,
10073 let_kw: TerminalLetGreen<'db>,
10074 pattern: PatternGreen<'db>,
10075 type_clause: OptionTypeClauseGreen<'db>,
10076 eq: TerminalEqGreen<'db>,
10077 rhs: ExprGreen<'db>,
10078 let_else_clause: OptionLetElseClauseGreen<'db>,
10079 semicolon: TerminalSemicolonGreen<'db>,
10080 ) -> StatementLetGreen<'db> {
10081 let children = [
10082 attributes.0,
10083 let_kw.0,
10084 pattern.0,
10085 type_clause.0,
10086 eq.0,
10087 rhs.0,
10088 let_else_clause.0,
10089 semicolon.0,
10090 ];
10091 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10092 StatementLetGreen(
10093 GreenNode {
10094 kind: SyntaxKind::StatementLet,
10095 details: GreenNodeDetails::Node { children: children.into(), width },
10096 }
10097 .intern(db),
10098 )
10099 }
10100}
10101impl<'db> StatementLet<'db> {
10102 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10103 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10104 }
10105 pub fn let_kw(&self, db: &'db dyn Database) -> TerminalLet<'db> {
10106 TerminalLet::from_syntax_node(db, self.node.get_children(db)[1])
10107 }
10108 pub fn pattern(&self, db: &'db dyn Database) -> Pattern<'db> {
10109 Pattern::from_syntax_node(db, self.node.get_children(db)[2])
10110 }
10111 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
10112 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
10113 }
10114 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
10115 TerminalEq::from_syntax_node(db, self.node.get_children(db)[4])
10116 }
10117 pub fn rhs(&self, db: &'db dyn Database) -> Expr<'db> {
10118 Expr::from_syntax_node(db, self.node.get_children(db)[5])
10119 }
10120 pub fn let_else_clause(&self, db: &'db dyn Database) -> OptionLetElseClause<'db> {
10121 OptionLetElseClause::from_syntax_node(db, self.node.get_children(db)[6])
10122 }
10123 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10124 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
10125 }
10126}
10127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10128pub struct StatementLetPtr<'db>(pub SyntaxStablePtrId<'db>);
10129impl<'db> StatementLetPtr<'db> {
10130 pub fn pattern_green(self, db: &'db dyn Database) -> PatternGreen<'db> {
10131 PatternGreen(self.0.0.key_fields(db)[0])
10132 }
10133}
10134impl<'db> TypedStablePtr<'db> for StatementLetPtr<'db> {
10135 type SyntaxNode = StatementLet<'db>;
10136 fn untyped(self) -> SyntaxStablePtrId<'db> {
10137 self.0
10138 }
10139 fn lookup(&self, db: &'db dyn Database) -> StatementLet<'db> {
10140 StatementLet::from_syntax_node(db, self.0.lookup(db))
10141 }
10142}
10143impl<'db> From<StatementLetPtr<'db>> for SyntaxStablePtrId<'db> {
10144 fn from(ptr: StatementLetPtr<'db>) -> Self {
10145 ptr.untyped()
10146 }
10147}
10148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10149pub struct StatementLetGreen<'db>(pub GreenId<'db>);
10150impl<'db> TypedSyntaxNode<'db> for StatementLet<'db> {
10151 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementLet);
10152 type StablePtr = StatementLetPtr<'db>;
10153 type Green = StatementLetGreen<'db>;
10154 fn missing(db: &'db dyn Database) -> Self::Green {
10155 StatementLetGreen(
10156 GreenNode {
10157 kind: SyntaxKind::StatementLet,
10158 details: GreenNodeDetails::Node {
10159 children: [
10160 AttributeList::missing(db).0,
10161 TerminalLet::missing(db).0,
10162 Pattern::missing(db).0,
10163 OptionTypeClause::missing(db).0,
10164 TerminalEq::missing(db).0,
10165 Expr::missing(db).0,
10166 OptionLetElseClause::missing(db).0,
10167 TerminalSemicolon::missing(db).0,
10168 ]
10169 .into(),
10170 width: TextWidth::default(),
10171 },
10172 }
10173 .intern(db),
10174 )
10175 }
10176 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10177 let kind = node.kind(db);
10178 assert_eq!(
10179 kind,
10180 SyntaxKind::StatementLet,
10181 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10182 kind,
10183 SyntaxKind::StatementLet
10184 );
10185 Self { node }
10186 }
10187 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10188 let kind = node.kind(db);
10189 if kind == SyntaxKind::StatementLet { Some(Self::from_syntax_node(db, node)) } else { None }
10190 }
10191 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10192 self.node
10193 }
10194 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10195 StatementLetPtr(self.node.stable_ptr(db))
10196 }
10197}
10198#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10199pub struct LetElseClause<'db> {
10200 node: SyntaxNode<'db>,
10201}
10202impl<'db> LetElseClause<'db> {
10203 pub const INDEX_ELSE_KW: usize = 0;
10204 pub const INDEX_ELSE_BLOCK: usize = 1;
10205 pub fn new_green(
10206 db: &'db dyn Database,
10207 else_kw: TerminalElseGreen<'db>,
10208 else_block: ExprBlockGreen<'db>,
10209 ) -> LetElseClauseGreen<'db> {
10210 let children = [else_kw.0, else_block.0];
10211 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10212 LetElseClauseGreen(
10213 GreenNode {
10214 kind: SyntaxKind::LetElseClause,
10215 details: GreenNodeDetails::Node { children: children.into(), width },
10216 }
10217 .intern(db),
10218 )
10219 }
10220}
10221impl<'db> LetElseClause<'db> {
10222 pub fn else_kw(&self, db: &'db dyn Database) -> TerminalElse<'db> {
10223 TerminalElse::from_syntax_node(db, self.node.get_children(db)[0])
10224 }
10225 pub fn else_block(&self, db: &'db dyn Database) -> ExprBlock<'db> {
10226 ExprBlock::from_syntax_node(db, self.node.get_children(db)[1])
10227 }
10228}
10229#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10230pub struct LetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10231impl<'db> LetElseClausePtr<'db> {}
10232impl<'db> TypedStablePtr<'db> for LetElseClausePtr<'db> {
10233 type SyntaxNode = LetElseClause<'db>;
10234 fn untyped(self) -> SyntaxStablePtrId<'db> {
10235 self.0
10236 }
10237 fn lookup(&self, db: &'db dyn Database) -> LetElseClause<'db> {
10238 LetElseClause::from_syntax_node(db, self.0.lookup(db))
10239 }
10240}
10241impl<'db> From<LetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10242 fn from(ptr: LetElseClausePtr<'db>) -> Self {
10243 ptr.untyped()
10244 }
10245}
10246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10247pub struct LetElseClauseGreen<'db>(pub GreenId<'db>);
10248impl<'db> TypedSyntaxNode<'db> for LetElseClause<'db> {
10249 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LetElseClause);
10250 type StablePtr = LetElseClausePtr<'db>;
10251 type Green = LetElseClauseGreen<'db>;
10252 fn missing(db: &'db dyn Database) -> Self::Green {
10253 LetElseClauseGreen(
10254 GreenNode {
10255 kind: SyntaxKind::LetElseClause,
10256 details: GreenNodeDetails::Node {
10257 children: [TerminalElse::missing(db).0, ExprBlock::missing(db).0].into(),
10258 width: TextWidth::default(),
10259 },
10260 }
10261 .intern(db),
10262 )
10263 }
10264 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10265 let kind = node.kind(db);
10266 assert_eq!(
10267 kind,
10268 SyntaxKind::LetElseClause,
10269 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10270 kind,
10271 SyntaxKind::LetElseClause
10272 );
10273 Self { node }
10274 }
10275 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10276 let kind = node.kind(db);
10277 if kind == SyntaxKind::LetElseClause {
10278 Some(Self::from_syntax_node(db, node))
10279 } else {
10280 None
10281 }
10282 }
10283 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10284 self.node
10285 }
10286 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10287 LetElseClausePtr(self.node.stable_ptr(db))
10288 }
10289}
10290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10291pub enum OptionLetElseClause<'db> {
10292 Empty(OptionLetElseClauseEmpty<'db>),
10293 LetElseClause(LetElseClause<'db>),
10294}
10295#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10296pub struct OptionLetElseClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10297impl<'db> TypedStablePtr<'db> for OptionLetElseClausePtr<'db> {
10298 type SyntaxNode = OptionLetElseClause<'db>;
10299 fn untyped(self) -> SyntaxStablePtrId<'db> {
10300 self.0
10301 }
10302 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10303 OptionLetElseClause::from_syntax_node(db, self.0.lookup(db))
10304 }
10305}
10306impl<'db> From<OptionLetElseClausePtr<'db>> for SyntaxStablePtrId<'db> {
10307 fn from(ptr: OptionLetElseClausePtr<'db>) -> Self {
10308 ptr.untyped()
10309 }
10310}
10311impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for OptionLetElseClausePtr<'db> {
10312 fn from(value: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10313 Self(value.0)
10314 }
10315}
10316impl<'db> From<LetElseClausePtr<'db>> for OptionLetElseClausePtr<'db> {
10317 fn from(value: LetElseClausePtr<'db>) -> Self {
10318 Self(value.0)
10319 }
10320}
10321impl<'db> From<OptionLetElseClauseEmptyGreen<'db>> for OptionLetElseClauseGreen<'db> {
10322 fn from(value: OptionLetElseClauseEmptyGreen<'db>) -> Self {
10323 Self(value.0)
10324 }
10325}
10326impl<'db> From<LetElseClauseGreen<'db>> for OptionLetElseClauseGreen<'db> {
10327 fn from(value: LetElseClauseGreen<'db>) -> Self {
10328 Self(value.0)
10329 }
10330}
10331#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10332pub struct OptionLetElseClauseGreen<'db>(pub GreenId<'db>);
10333impl<'db> TypedSyntaxNode<'db> for OptionLetElseClause<'db> {
10334 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10335 type StablePtr = OptionLetElseClausePtr<'db>;
10336 type Green = OptionLetElseClauseGreen<'db>;
10337 fn missing(db: &'db dyn Database) -> Self::Green {
10338 panic!("No missing variant.");
10339 }
10340 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10341 let kind = node.kind(db);
10342 match kind {
10343 SyntaxKind::OptionLetElseClauseEmpty => {
10344 OptionLetElseClause::Empty(OptionLetElseClauseEmpty::from_syntax_node(db, node))
10345 }
10346 SyntaxKind::LetElseClause => {
10347 OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node))
10348 }
10349 _ => panic!(
10350 "Unexpected syntax kind {:?} when constructing {}.",
10351 kind, "OptionLetElseClause"
10352 ),
10353 }
10354 }
10355 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10356 let kind = node.kind(db);
10357 match kind {
10358 SyntaxKind::OptionLetElseClauseEmpty => Some(OptionLetElseClause::Empty(
10359 OptionLetElseClauseEmpty::from_syntax_node(db, node),
10360 )),
10361 SyntaxKind::LetElseClause => {
10362 Some(OptionLetElseClause::LetElseClause(LetElseClause::from_syntax_node(db, node)))
10363 }
10364 _ => None,
10365 }
10366 }
10367 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10368 match self {
10369 OptionLetElseClause::Empty(x) => x.as_syntax_node(),
10370 OptionLetElseClause::LetElseClause(x) => x.as_syntax_node(),
10371 }
10372 }
10373 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10374 OptionLetElseClausePtr(self.as_syntax_node().stable_ptr(db))
10375 }
10376}
10377impl<'db> OptionLetElseClause<'db> {
10378 pub fn is_variant(kind: SyntaxKind) -> bool {
10380 matches!(kind, SyntaxKind::OptionLetElseClauseEmpty | SyntaxKind::LetElseClause)
10381 }
10382}
10383#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10384pub struct OptionLetElseClauseEmpty<'db> {
10385 node: SyntaxNode<'db>,
10386}
10387impl<'db> OptionLetElseClauseEmpty<'db> {
10388 pub fn new_green(db: &'db dyn Database) -> OptionLetElseClauseEmptyGreen<'db> {
10389 let children = [];
10390 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10391 OptionLetElseClauseEmptyGreen(
10392 GreenNode {
10393 kind: SyntaxKind::OptionLetElseClauseEmpty,
10394 details: GreenNodeDetails::Node { children: children.into(), width },
10395 }
10396 .intern(db),
10397 )
10398 }
10399}
10400impl<'db> OptionLetElseClauseEmpty<'db> {}
10401#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10402pub struct OptionLetElseClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10403impl<'db> OptionLetElseClauseEmptyPtr<'db> {}
10404impl<'db> TypedStablePtr<'db> for OptionLetElseClauseEmptyPtr<'db> {
10405 type SyntaxNode = OptionLetElseClauseEmpty<'db>;
10406 fn untyped(self) -> SyntaxStablePtrId<'db> {
10407 self.0
10408 }
10409 fn lookup(&self, db: &'db dyn Database) -> OptionLetElseClauseEmpty<'db> {
10410 OptionLetElseClauseEmpty::from_syntax_node(db, self.0.lookup(db))
10411 }
10412}
10413impl<'db> From<OptionLetElseClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10414 fn from(ptr: OptionLetElseClauseEmptyPtr<'db>) -> Self {
10415 ptr.untyped()
10416 }
10417}
10418#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10419pub struct OptionLetElseClauseEmptyGreen<'db>(pub GreenId<'db>);
10420impl<'db> TypedSyntaxNode<'db> for OptionLetElseClauseEmpty<'db> {
10421 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionLetElseClauseEmpty);
10422 type StablePtr = OptionLetElseClauseEmptyPtr<'db>;
10423 type Green = OptionLetElseClauseEmptyGreen<'db>;
10424 fn missing(db: &'db dyn Database) -> Self::Green {
10425 OptionLetElseClauseEmptyGreen(
10426 GreenNode {
10427 kind: SyntaxKind::OptionLetElseClauseEmpty,
10428 details: GreenNodeDetails::Node {
10429 children: [].into(),
10430 width: TextWidth::default(),
10431 },
10432 }
10433 .intern(db),
10434 )
10435 }
10436 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10437 let kind = node.kind(db);
10438 assert_eq!(
10439 kind,
10440 SyntaxKind::OptionLetElseClauseEmpty,
10441 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10442 kind,
10443 SyntaxKind::OptionLetElseClauseEmpty
10444 );
10445 Self { node }
10446 }
10447 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10448 let kind = node.kind(db);
10449 if kind == SyntaxKind::OptionLetElseClauseEmpty {
10450 Some(Self::from_syntax_node(db, node))
10451 } else {
10452 None
10453 }
10454 }
10455 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10456 self.node
10457 }
10458 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10459 OptionLetElseClauseEmptyPtr(self.node.stable_ptr(db))
10460 }
10461}
10462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10463pub enum OptionTerminalSemicolon<'db> {
10464 Empty(OptionTerminalSemicolonEmpty<'db>),
10465 TerminalSemicolon(TerminalSemicolon<'db>),
10466}
10467#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10468pub struct OptionTerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
10469impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonPtr<'db> {
10470 type SyntaxNode = OptionTerminalSemicolon<'db>;
10471 fn untyped(self) -> SyntaxStablePtrId<'db> {
10472 self.0
10473 }
10474 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10475 OptionTerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
10476 }
10477}
10478impl<'db> From<OptionTerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
10479 fn from(ptr: OptionTerminalSemicolonPtr<'db>) -> Self {
10480 ptr.untyped()
10481 }
10482}
10483impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10484 fn from(value: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10485 Self(value.0)
10486 }
10487}
10488impl<'db> From<TerminalSemicolonPtr<'db>> for OptionTerminalSemicolonPtr<'db> {
10489 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
10490 Self(value.0)
10491 }
10492}
10493impl<'db> From<OptionTerminalSemicolonEmptyGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10494 fn from(value: OptionTerminalSemicolonEmptyGreen<'db>) -> Self {
10495 Self(value.0)
10496 }
10497}
10498impl<'db> From<TerminalSemicolonGreen<'db>> for OptionTerminalSemicolonGreen<'db> {
10499 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
10500 Self(value.0)
10501 }
10502}
10503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10504pub struct OptionTerminalSemicolonGreen<'db>(pub GreenId<'db>);
10505impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolon<'db> {
10506 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10507 type StablePtr = OptionTerminalSemicolonPtr<'db>;
10508 type Green = OptionTerminalSemicolonGreen<'db>;
10509 fn missing(db: &'db dyn Database) -> Self::Green {
10510 panic!("No missing variant.");
10511 }
10512 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10513 let kind = node.kind(db);
10514 match kind {
10515 SyntaxKind::OptionTerminalSemicolonEmpty => OptionTerminalSemicolon::Empty(
10516 OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10517 ),
10518 SyntaxKind::TerminalSemicolon => OptionTerminalSemicolon::TerminalSemicolon(
10519 TerminalSemicolon::from_syntax_node(db, node),
10520 ),
10521 _ => panic!(
10522 "Unexpected syntax kind {:?} when constructing {}.",
10523 kind, "OptionTerminalSemicolon"
10524 ),
10525 }
10526 }
10527 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10528 let kind = node.kind(db);
10529 match kind {
10530 SyntaxKind::OptionTerminalSemicolonEmpty => Some(OptionTerminalSemicolon::Empty(
10531 OptionTerminalSemicolonEmpty::from_syntax_node(db, node),
10532 )),
10533 SyntaxKind::TerminalSemicolon => Some(OptionTerminalSemicolon::TerminalSemicolon(
10534 TerminalSemicolon::from_syntax_node(db, node),
10535 )),
10536 _ => None,
10537 }
10538 }
10539 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10540 match self {
10541 OptionTerminalSemicolon::Empty(x) => x.as_syntax_node(),
10542 OptionTerminalSemicolon::TerminalSemicolon(x) => x.as_syntax_node(),
10543 }
10544 }
10545 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10546 OptionTerminalSemicolonPtr(self.as_syntax_node().stable_ptr(db))
10547 }
10548}
10549impl<'db> OptionTerminalSemicolon<'db> {
10550 pub fn is_variant(kind: SyntaxKind) -> bool {
10552 matches!(kind, SyntaxKind::OptionTerminalSemicolonEmpty | SyntaxKind::TerminalSemicolon)
10553 }
10554}
10555#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10556pub struct OptionTerminalSemicolonEmpty<'db> {
10557 node: SyntaxNode<'db>,
10558}
10559impl<'db> OptionTerminalSemicolonEmpty<'db> {
10560 pub fn new_green(db: &'db dyn Database) -> OptionTerminalSemicolonEmptyGreen<'db> {
10561 let children = [];
10562 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10563 OptionTerminalSemicolonEmptyGreen(
10564 GreenNode {
10565 kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10566 details: GreenNodeDetails::Node { children: children.into(), width },
10567 }
10568 .intern(db),
10569 )
10570 }
10571}
10572impl<'db> OptionTerminalSemicolonEmpty<'db> {}
10573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10574pub struct OptionTerminalSemicolonEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
10575impl<'db> OptionTerminalSemicolonEmptyPtr<'db> {}
10576impl<'db> TypedStablePtr<'db> for OptionTerminalSemicolonEmptyPtr<'db> {
10577 type SyntaxNode = OptionTerminalSemicolonEmpty<'db>;
10578 fn untyped(self) -> SyntaxStablePtrId<'db> {
10579 self.0
10580 }
10581 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalSemicolonEmpty<'db> {
10582 OptionTerminalSemicolonEmpty::from_syntax_node(db, self.0.lookup(db))
10583 }
10584}
10585impl<'db> From<OptionTerminalSemicolonEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
10586 fn from(ptr: OptionTerminalSemicolonEmptyPtr<'db>) -> Self {
10587 ptr.untyped()
10588 }
10589}
10590#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10591pub struct OptionTerminalSemicolonEmptyGreen<'db>(pub GreenId<'db>);
10592impl<'db> TypedSyntaxNode<'db> for OptionTerminalSemicolonEmpty<'db> {
10593 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalSemicolonEmpty);
10594 type StablePtr = OptionTerminalSemicolonEmptyPtr<'db>;
10595 type Green = OptionTerminalSemicolonEmptyGreen<'db>;
10596 fn missing(db: &'db dyn Database) -> Self::Green {
10597 OptionTerminalSemicolonEmptyGreen(
10598 GreenNode {
10599 kind: SyntaxKind::OptionTerminalSemicolonEmpty,
10600 details: GreenNodeDetails::Node {
10601 children: [].into(),
10602 width: TextWidth::default(),
10603 },
10604 }
10605 .intern(db),
10606 )
10607 }
10608 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10609 let kind = node.kind(db);
10610 assert_eq!(
10611 kind,
10612 SyntaxKind::OptionTerminalSemicolonEmpty,
10613 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10614 kind,
10615 SyntaxKind::OptionTerminalSemicolonEmpty
10616 );
10617 Self { node }
10618 }
10619 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10620 let kind = node.kind(db);
10621 if kind == SyntaxKind::OptionTerminalSemicolonEmpty {
10622 Some(Self::from_syntax_node(db, node))
10623 } else {
10624 None
10625 }
10626 }
10627 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10628 self.node
10629 }
10630 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10631 OptionTerminalSemicolonEmptyPtr(self.node.stable_ptr(db))
10632 }
10633}
10634#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10635pub struct StatementExpr<'db> {
10636 node: SyntaxNode<'db>,
10637}
10638impl<'db> StatementExpr<'db> {
10639 pub const INDEX_ATTRIBUTES: usize = 0;
10640 pub const INDEX_EXPR: usize = 1;
10641 pub const INDEX_SEMICOLON: usize = 2;
10642 pub fn new_green(
10643 db: &'db dyn Database,
10644 attributes: AttributeListGreen<'db>,
10645 expr: ExprGreen<'db>,
10646 semicolon: OptionTerminalSemicolonGreen<'db>,
10647 ) -> StatementExprGreen<'db> {
10648 let children = [attributes.0, expr.0, semicolon.0];
10649 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10650 StatementExprGreen(
10651 GreenNode {
10652 kind: SyntaxKind::StatementExpr,
10653 details: GreenNodeDetails::Node { children: children.into(), width },
10654 }
10655 .intern(db),
10656 )
10657 }
10658}
10659impl<'db> StatementExpr<'db> {
10660 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10661 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10662 }
10663 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10664 Expr::from_syntax_node(db, self.node.get_children(db)[1])
10665 }
10666 pub fn semicolon(&self, db: &'db dyn Database) -> OptionTerminalSemicolon<'db> {
10667 OptionTerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10668 }
10669}
10670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10671pub struct StatementExprPtr<'db>(pub SyntaxStablePtrId<'db>);
10672impl<'db> StatementExprPtr<'db> {}
10673impl<'db> TypedStablePtr<'db> for StatementExprPtr<'db> {
10674 type SyntaxNode = StatementExpr<'db>;
10675 fn untyped(self) -> SyntaxStablePtrId<'db> {
10676 self.0
10677 }
10678 fn lookup(&self, db: &'db dyn Database) -> StatementExpr<'db> {
10679 StatementExpr::from_syntax_node(db, self.0.lookup(db))
10680 }
10681}
10682impl<'db> From<StatementExprPtr<'db>> for SyntaxStablePtrId<'db> {
10683 fn from(ptr: StatementExprPtr<'db>) -> Self {
10684 ptr.untyped()
10685 }
10686}
10687#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10688pub struct StatementExprGreen<'db>(pub GreenId<'db>);
10689impl<'db> TypedSyntaxNode<'db> for StatementExpr<'db> {
10690 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementExpr);
10691 type StablePtr = StatementExprPtr<'db>;
10692 type Green = StatementExprGreen<'db>;
10693 fn missing(db: &'db dyn Database) -> Self::Green {
10694 StatementExprGreen(
10695 GreenNode {
10696 kind: SyntaxKind::StatementExpr,
10697 details: GreenNodeDetails::Node {
10698 children: [
10699 AttributeList::missing(db).0,
10700 Expr::missing(db).0,
10701 OptionTerminalSemicolon::missing(db).0,
10702 ]
10703 .into(),
10704 width: TextWidth::default(),
10705 },
10706 }
10707 .intern(db),
10708 )
10709 }
10710 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10711 let kind = node.kind(db);
10712 assert_eq!(
10713 kind,
10714 SyntaxKind::StatementExpr,
10715 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10716 kind,
10717 SyntaxKind::StatementExpr
10718 );
10719 Self { node }
10720 }
10721 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10722 let kind = node.kind(db);
10723 if kind == SyntaxKind::StatementExpr {
10724 Some(Self::from_syntax_node(db, node))
10725 } else {
10726 None
10727 }
10728 }
10729 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10730 self.node
10731 }
10732 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10733 StatementExprPtr(self.node.stable_ptr(db))
10734 }
10735}
10736#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10737pub struct StatementContinue<'db> {
10738 node: SyntaxNode<'db>,
10739}
10740impl<'db> StatementContinue<'db> {
10741 pub const INDEX_ATTRIBUTES: usize = 0;
10742 pub const INDEX_CONTINUE_KW: usize = 1;
10743 pub const INDEX_SEMICOLON: usize = 2;
10744 pub fn new_green(
10745 db: &'db dyn Database,
10746 attributes: AttributeListGreen<'db>,
10747 continue_kw: TerminalContinueGreen<'db>,
10748 semicolon: TerminalSemicolonGreen<'db>,
10749 ) -> StatementContinueGreen<'db> {
10750 let children = [attributes.0, continue_kw.0, semicolon.0];
10751 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10752 StatementContinueGreen(
10753 GreenNode {
10754 kind: SyntaxKind::StatementContinue,
10755 details: GreenNodeDetails::Node { children: children.into(), width },
10756 }
10757 .intern(db),
10758 )
10759 }
10760}
10761impl<'db> StatementContinue<'db> {
10762 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
10763 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
10764 }
10765 pub fn continue_kw(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
10766 TerminalContinue::from_syntax_node(db, self.node.get_children(db)[1])
10767 }
10768 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
10769 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[2])
10770 }
10771}
10772#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10773pub struct StatementContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
10774impl<'db> StatementContinuePtr<'db> {}
10775impl<'db> TypedStablePtr<'db> for StatementContinuePtr<'db> {
10776 type SyntaxNode = StatementContinue<'db>;
10777 fn untyped(self) -> SyntaxStablePtrId<'db> {
10778 self.0
10779 }
10780 fn lookup(&self, db: &'db dyn Database) -> StatementContinue<'db> {
10781 StatementContinue::from_syntax_node(db, self.0.lookup(db))
10782 }
10783}
10784impl<'db> From<StatementContinuePtr<'db>> for SyntaxStablePtrId<'db> {
10785 fn from(ptr: StatementContinuePtr<'db>) -> Self {
10786 ptr.untyped()
10787 }
10788}
10789#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10790pub struct StatementContinueGreen<'db>(pub GreenId<'db>);
10791impl<'db> TypedSyntaxNode<'db> for StatementContinue<'db> {
10792 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementContinue);
10793 type StablePtr = StatementContinuePtr<'db>;
10794 type Green = StatementContinueGreen<'db>;
10795 fn missing(db: &'db dyn Database) -> Self::Green {
10796 StatementContinueGreen(
10797 GreenNode {
10798 kind: SyntaxKind::StatementContinue,
10799 details: GreenNodeDetails::Node {
10800 children: [
10801 AttributeList::missing(db).0,
10802 TerminalContinue::missing(db).0,
10803 TerminalSemicolon::missing(db).0,
10804 ]
10805 .into(),
10806 width: TextWidth::default(),
10807 },
10808 }
10809 .intern(db),
10810 )
10811 }
10812 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10813 let kind = node.kind(db);
10814 assert_eq!(
10815 kind,
10816 SyntaxKind::StatementContinue,
10817 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10818 kind,
10819 SyntaxKind::StatementContinue
10820 );
10821 Self { node }
10822 }
10823 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10824 let kind = node.kind(db);
10825 if kind == SyntaxKind::StatementContinue {
10826 Some(Self::from_syntax_node(db, node))
10827 } else {
10828 None
10829 }
10830 }
10831 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10832 self.node
10833 }
10834 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10835 StatementContinuePtr(self.node.stable_ptr(db))
10836 }
10837}
10838#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10839pub struct ExprClause<'db> {
10840 node: SyntaxNode<'db>,
10841}
10842impl<'db> ExprClause<'db> {
10843 pub const INDEX_EXPR: usize = 0;
10844 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> ExprClauseGreen<'db> {
10845 let children = [expr.0];
10846 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
10847 ExprClauseGreen(
10848 GreenNode {
10849 kind: SyntaxKind::ExprClause,
10850 details: GreenNodeDetails::Node { children: children.into(), width },
10851 }
10852 .intern(db),
10853 )
10854 }
10855}
10856impl<'db> ExprClause<'db> {
10857 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
10858 Expr::from_syntax_node(db, self.node.get_children(db)[0])
10859 }
10860}
10861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10862pub struct ExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10863impl<'db> ExprClausePtr<'db> {}
10864impl<'db> TypedStablePtr<'db> for ExprClausePtr<'db> {
10865 type SyntaxNode = ExprClause<'db>;
10866 fn untyped(self) -> SyntaxStablePtrId<'db> {
10867 self.0
10868 }
10869 fn lookup(&self, db: &'db dyn Database) -> ExprClause<'db> {
10870 ExprClause::from_syntax_node(db, self.0.lookup(db))
10871 }
10872}
10873impl<'db> From<ExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10874 fn from(ptr: ExprClausePtr<'db>) -> Self {
10875 ptr.untyped()
10876 }
10877}
10878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10879pub struct ExprClauseGreen<'db>(pub GreenId<'db>);
10880impl<'db> TypedSyntaxNode<'db> for ExprClause<'db> {
10881 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprClause);
10882 type StablePtr = ExprClausePtr<'db>;
10883 type Green = ExprClauseGreen<'db>;
10884 fn missing(db: &'db dyn Database) -> Self::Green {
10885 ExprClauseGreen(
10886 GreenNode {
10887 kind: SyntaxKind::ExprClause,
10888 details: GreenNodeDetails::Node {
10889 children: [Expr::missing(db).0].into(),
10890 width: TextWidth::default(),
10891 },
10892 }
10893 .intern(db),
10894 )
10895 }
10896 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10897 let kind = node.kind(db);
10898 assert_eq!(
10899 kind,
10900 SyntaxKind::ExprClause,
10901 "Unexpected SyntaxKind {:?}. Expected {:?}.",
10902 kind,
10903 SyntaxKind::ExprClause
10904 );
10905 Self { node }
10906 }
10907 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10908 let kind = node.kind(db);
10909 if kind == SyntaxKind::ExprClause { Some(Self::from_syntax_node(db, node)) } else { None }
10910 }
10911 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10912 self.node
10913 }
10914 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
10915 ExprClausePtr(self.node.stable_ptr(db))
10916 }
10917}
10918#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
10919pub enum OptionExprClause<'db> {
10920 Empty(OptionExprClauseEmpty<'db>),
10921 ExprClause(ExprClause<'db>),
10922}
10923#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10924pub struct OptionExprClausePtr<'db>(pub SyntaxStablePtrId<'db>);
10925impl<'db> TypedStablePtr<'db> for OptionExprClausePtr<'db> {
10926 type SyntaxNode = OptionExprClause<'db>;
10927 fn untyped(self) -> SyntaxStablePtrId<'db> {
10928 self.0
10929 }
10930 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
10931 OptionExprClause::from_syntax_node(db, self.0.lookup(db))
10932 }
10933}
10934impl<'db> From<OptionExprClausePtr<'db>> for SyntaxStablePtrId<'db> {
10935 fn from(ptr: OptionExprClausePtr<'db>) -> Self {
10936 ptr.untyped()
10937 }
10938}
10939impl<'db> From<OptionExprClauseEmptyPtr<'db>> for OptionExprClausePtr<'db> {
10940 fn from(value: OptionExprClauseEmptyPtr<'db>) -> Self {
10941 Self(value.0)
10942 }
10943}
10944impl<'db> From<ExprClausePtr<'db>> for OptionExprClausePtr<'db> {
10945 fn from(value: ExprClausePtr<'db>) -> Self {
10946 Self(value.0)
10947 }
10948}
10949impl<'db> From<OptionExprClauseEmptyGreen<'db>> for OptionExprClauseGreen<'db> {
10950 fn from(value: OptionExprClauseEmptyGreen<'db>) -> Self {
10951 Self(value.0)
10952 }
10953}
10954impl<'db> From<ExprClauseGreen<'db>> for OptionExprClauseGreen<'db> {
10955 fn from(value: ExprClauseGreen<'db>) -> Self {
10956 Self(value.0)
10957 }
10958}
10959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
10960pub struct OptionExprClauseGreen<'db>(pub GreenId<'db>);
10961impl<'db> TypedSyntaxNode<'db> for OptionExprClause<'db> {
10962 const OPTIONAL_KIND: Option<SyntaxKind> = None;
10963 type StablePtr = OptionExprClausePtr<'db>;
10964 type Green = OptionExprClauseGreen<'db>;
10965 fn missing(db: &'db dyn Database) -> Self::Green {
10966 panic!("No missing variant.");
10967 }
10968 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
10969 let kind = node.kind(db);
10970 match kind {
10971 SyntaxKind::OptionExprClauseEmpty => {
10972 OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node))
10973 }
10974 SyntaxKind::ExprClause => {
10975 OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node))
10976 }
10977 _ => panic!(
10978 "Unexpected syntax kind {:?} when constructing {}.",
10979 kind, "OptionExprClause"
10980 ),
10981 }
10982 }
10983 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
10984 let kind = node.kind(db);
10985 match kind {
10986 SyntaxKind::OptionExprClauseEmpty => {
10987 Some(OptionExprClause::Empty(OptionExprClauseEmpty::from_syntax_node(db, node)))
10988 }
10989 SyntaxKind::ExprClause => {
10990 Some(OptionExprClause::ExprClause(ExprClause::from_syntax_node(db, node)))
10991 }
10992 _ => None,
10993 }
10994 }
10995 fn as_syntax_node(&self) -> SyntaxNode<'db> {
10996 match self {
10997 OptionExprClause::Empty(x) => x.as_syntax_node(),
10998 OptionExprClause::ExprClause(x) => x.as_syntax_node(),
10999 }
11000 }
11001 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11002 OptionExprClausePtr(self.as_syntax_node().stable_ptr(db))
11003 }
11004}
11005impl<'db> OptionExprClause<'db> {
11006 pub fn is_variant(kind: SyntaxKind) -> bool {
11008 matches!(kind, SyntaxKind::OptionExprClauseEmpty | SyntaxKind::ExprClause)
11009 }
11010}
11011#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11012pub struct OptionExprClauseEmpty<'db> {
11013 node: SyntaxNode<'db>,
11014}
11015impl<'db> OptionExprClauseEmpty<'db> {
11016 pub fn new_green(db: &'db dyn Database) -> OptionExprClauseEmptyGreen<'db> {
11017 let children = [];
11018 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11019 OptionExprClauseEmptyGreen(
11020 GreenNode {
11021 kind: SyntaxKind::OptionExprClauseEmpty,
11022 details: GreenNodeDetails::Node { children: children.into(), width },
11023 }
11024 .intern(db),
11025 )
11026 }
11027}
11028impl<'db> OptionExprClauseEmpty<'db> {}
11029#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11030pub struct OptionExprClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
11031impl<'db> OptionExprClauseEmptyPtr<'db> {}
11032impl<'db> TypedStablePtr<'db> for OptionExprClauseEmptyPtr<'db> {
11033 type SyntaxNode = OptionExprClauseEmpty<'db>;
11034 fn untyped(self) -> SyntaxStablePtrId<'db> {
11035 self.0
11036 }
11037 fn lookup(&self, db: &'db dyn Database) -> OptionExprClauseEmpty<'db> {
11038 OptionExprClauseEmpty::from_syntax_node(db, self.0.lookup(db))
11039 }
11040}
11041impl<'db> From<OptionExprClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
11042 fn from(ptr: OptionExprClauseEmptyPtr<'db>) -> Self {
11043 ptr.untyped()
11044 }
11045}
11046#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11047pub struct OptionExprClauseEmptyGreen<'db>(pub GreenId<'db>);
11048impl<'db> TypedSyntaxNode<'db> for OptionExprClauseEmpty<'db> {
11049 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionExprClauseEmpty);
11050 type StablePtr = OptionExprClauseEmptyPtr<'db>;
11051 type Green = OptionExprClauseEmptyGreen<'db>;
11052 fn missing(db: &'db dyn Database) -> Self::Green {
11053 OptionExprClauseEmptyGreen(
11054 GreenNode {
11055 kind: SyntaxKind::OptionExprClauseEmpty,
11056 details: GreenNodeDetails::Node {
11057 children: [].into(),
11058 width: TextWidth::default(),
11059 },
11060 }
11061 .intern(db),
11062 )
11063 }
11064 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11065 let kind = node.kind(db);
11066 assert_eq!(
11067 kind,
11068 SyntaxKind::OptionExprClauseEmpty,
11069 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11070 kind,
11071 SyntaxKind::OptionExprClauseEmpty
11072 );
11073 Self { node }
11074 }
11075 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11076 let kind = node.kind(db);
11077 if kind == SyntaxKind::OptionExprClauseEmpty {
11078 Some(Self::from_syntax_node(db, node))
11079 } else {
11080 None
11081 }
11082 }
11083 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11084 self.node
11085 }
11086 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11087 OptionExprClauseEmptyPtr(self.node.stable_ptr(db))
11088 }
11089}
11090#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11091pub struct StatementReturn<'db> {
11092 node: SyntaxNode<'db>,
11093}
11094impl<'db> StatementReturn<'db> {
11095 pub const INDEX_ATTRIBUTES: usize = 0;
11096 pub const INDEX_RETURN_KW: usize = 1;
11097 pub const INDEX_EXPR_CLAUSE: usize = 2;
11098 pub const INDEX_SEMICOLON: usize = 3;
11099 pub fn new_green(
11100 db: &'db dyn Database,
11101 attributes: AttributeListGreen<'db>,
11102 return_kw: TerminalReturnGreen<'db>,
11103 expr_clause: OptionExprClauseGreen<'db>,
11104 semicolon: TerminalSemicolonGreen<'db>,
11105 ) -> StatementReturnGreen<'db> {
11106 let children = [attributes.0, return_kw.0, expr_clause.0, semicolon.0];
11107 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11108 StatementReturnGreen(
11109 GreenNode {
11110 kind: SyntaxKind::StatementReturn,
11111 details: GreenNodeDetails::Node { children: children.into(), width },
11112 }
11113 .intern(db),
11114 )
11115 }
11116}
11117impl<'db> StatementReturn<'db> {
11118 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11119 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11120 }
11121 pub fn return_kw(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
11122 TerminalReturn::from_syntax_node(db, self.node.get_children(db)[1])
11123 }
11124 pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11125 OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11126 }
11127 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11128 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11129 }
11130}
11131#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11132pub struct StatementReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
11133impl<'db> StatementReturnPtr<'db> {}
11134impl<'db> TypedStablePtr<'db> for StatementReturnPtr<'db> {
11135 type SyntaxNode = StatementReturn<'db>;
11136 fn untyped(self) -> SyntaxStablePtrId<'db> {
11137 self.0
11138 }
11139 fn lookup(&self, db: &'db dyn Database) -> StatementReturn<'db> {
11140 StatementReturn::from_syntax_node(db, self.0.lookup(db))
11141 }
11142}
11143impl<'db> From<StatementReturnPtr<'db>> for SyntaxStablePtrId<'db> {
11144 fn from(ptr: StatementReturnPtr<'db>) -> Self {
11145 ptr.untyped()
11146 }
11147}
11148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11149pub struct StatementReturnGreen<'db>(pub GreenId<'db>);
11150impl<'db> TypedSyntaxNode<'db> for StatementReturn<'db> {
11151 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementReturn);
11152 type StablePtr = StatementReturnPtr<'db>;
11153 type Green = StatementReturnGreen<'db>;
11154 fn missing(db: &'db dyn Database) -> Self::Green {
11155 StatementReturnGreen(
11156 GreenNode {
11157 kind: SyntaxKind::StatementReturn,
11158 details: GreenNodeDetails::Node {
11159 children: [
11160 AttributeList::missing(db).0,
11161 TerminalReturn::missing(db).0,
11162 OptionExprClause::missing(db).0,
11163 TerminalSemicolon::missing(db).0,
11164 ]
11165 .into(),
11166 width: TextWidth::default(),
11167 },
11168 }
11169 .intern(db),
11170 )
11171 }
11172 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11173 let kind = node.kind(db);
11174 assert_eq!(
11175 kind,
11176 SyntaxKind::StatementReturn,
11177 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11178 kind,
11179 SyntaxKind::StatementReturn
11180 );
11181 Self { node }
11182 }
11183 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11184 let kind = node.kind(db);
11185 if kind == SyntaxKind::StatementReturn {
11186 Some(Self::from_syntax_node(db, node))
11187 } else {
11188 None
11189 }
11190 }
11191 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11192 self.node
11193 }
11194 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11195 StatementReturnPtr(self.node.stable_ptr(db))
11196 }
11197}
11198#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11199pub struct StatementBreak<'db> {
11200 node: SyntaxNode<'db>,
11201}
11202impl<'db> StatementBreak<'db> {
11203 pub const INDEX_ATTRIBUTES: usize = 0;
11204 pub const INDEX_BREAK_KW: usize = 1;
11205 pub const INDEX_EXPR_CLAUSE: usize = 2;
11206 pub const INDEX_SEMICOLON: usize = 3;
11207 pub fn new_green(
11208 db: &'db dyn Database,
11209 attributes: AttributeListGreen<'db>,
11210 break_kw: TerminalBreakGreen<'db>,
11211 expr_clause: OptionExprClauseGreen<'db>,
11212 semicolon: TerminalSemicolonGreen<'db>,
11213 ) -> StatementBreakGreen<'db> {
11214 let children = [attributes.0, break_kw.0, expr_clause.0, semicolon.0];
11215 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11216 StatementBreakGreen(
11217 GreenNode {
11218 kind: SyntaxKind::StatementBreak,
11219 details: GreenNodeDetails::Node { children: children.into(), width },
11220 }
11221 .intern(db),
11222 )
11223 }
11224}
11225impl<'db> StatementBreak<'db> {
11226 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
11227 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
11228 }
11229 pub fn break_kw(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
11230 TerminalBreak::from_syntax_node(db, self.node.get_children(db)[1])
11231 }
11232 pub fn expr_clause(&self, db: &'db dyn Database) -> OptionExprClause<'db> {
11233 OptionExprClause::from_syntax_node(db, self.node.get_children(db)[2])
11234 }
11235 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
11236 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
11237 }
11238}
11239#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11240pub struct StatementBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
11241impl<'db> StatementBreakPtr<'db> {}
11242impl<'db> TypedStablePtr<'db> for StatementBreakPtr<'db> {
11243 type SyntaxNode = StatementBreak<'db>;
11244 fn untyped(self) -> SyntaxStablePtrId<'db> {
11245 self.0
11246 }
11247 fn lookup(&self, db: &'db dyn Database) -> StatementBreak<'db> {
11248 StatementBreak::from_syntax_node(db, self.0.lookup(db))
11249 }
11250}
11251impl<'db> From<StatementBreakPtr<'db>> for SyntaxStablePtrId<'db> {
11252 fn from(ptr: StatementBreakPtr<'db>) -> Self {
11253 ptr.untyped()
11254 }
11255}
11256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11257pub struct StatementBreakGreen<'db>(pub GreenId<'db>);
11258impl<'db> TypedSyntaxNode<'db> for StatementBreak<'db> {
11259 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementBreak);
11260 type StablePtr = StatementBreakPtr<'db>;
11261 type Green = StatementBreakGreen<'db>;
11262 fn missing(db: &'db dyn Database) -> Self::Green {
11263 StatementBreakGreen(
11264 GreenNode {
11265 kind: SyntaxKind::StatementBreak,
11266 details: GreenNodeDetails::Node {
11267 children: [
11268 AttributeList::missing(db).0,
11269 TerminalBreak::missing(db).0,
11270 OptionExprClause::missing(db).0,
11271 TerminalSemicolon::missing(db).0,
11272 ]
11273 .into(),
11274 width: TextWidth::default(),
11275 },
11276 }
11277 .intern(db),
11278 )
11279 }
11280 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11281 let kind = node.kind(db);
11282 assert_eq!(
11283 kind,
11284 SyntaxKind::StatementBreak,
11285 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11286 kind,
11287 SyntaxKind::StatementBreak
11288 );
11289 Self { node }
11290 }
11291 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11292 let kind = node.kind(db);
11293 if kind == SyntaxKind::StatementBreak {
11294 Some(Self::from_syntax_node(db, node))
11295 } else {
11296 None
11297 }
11298 }
11299 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11300 self.node
11301 }
11302 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11303 StatementBreakPtr(self.node.stable_ptr(db))
11304 }
11305}
11306#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11307pub struct StatementItem<'db> {
11308 node: SyntaxNode<'db>,
11309}
11310impl<'db> StatementItem<'db> {
11311 pub const INDEX_ITEM: usize = 0;
11312 pub fn new_green(db: &'db dyn Database, item: ModuleItemGreen<'db>) -> StatementItemGreen<'db> {
11313 let children = [item.0];
11314 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11315 StatementItemGreen(
11316 GreenNode {
11317 kind: SyntaxKind::StatementItem,
11318 details: GreenNodeDetails::Node { children: children.into(), width },
11319 }
11320 .intern(db),
11321 )
11322 }
11323}
11324impl<'db> StatementItem<'db> {
11325 pub fn item(&self, db: &'db dyn Database) -> ModuleItem<'db> {
11326 ModuleItem::from_syntax_node(db, self.node.get_children(db)[0])
11327 }
11328}
11329#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11330pub struct StatementItemPtr<'db>(pub SyntaxStablePtrId<'db>);
11331impl<'db> StatementItemPtr<'db> {}
11332impl<'db> TypedStablePtr<'db> for StatementItemPtr<'db> {
11333 type SyntaxNode = StatementItem<'db>;
11334 fn untyped(self) -> SyntaxStablePtrId<'db> {
11335 self.0
11336 }
11337 fn lookup(&self, db: &'db dyn Database) -> StatementItem<'db> {
11338 StatementItem::from_syntax_node(db, self.0.lookup(db))
11339 }
11340}
11341impl<'db> From<StatementItemPtr<'db>> for SyntaxStablePtrId<'db> {
11342 fn from(ptr: StatementItemPtr<'db>) -> Self {
11343 ptr.untyped()
11344 }
11345}
11346#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11347pub struct StatementItemGreen<'db>(pub GreenId<'db>);
11348impl<'db> TypedSyntaxNode<'db> for StatementItem<'db> {
11349 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::StatementItem);
11350 type StablePtr = StatementItemPtr<'db>;
11351 type Green = StatementItemGreen<'db>;
11352 fn missing(db: &'db dyn Database) -> Self::Green {
11353 StatementItemGreen(
11354 GreenNode {
11355 kind: SyntaxKind::StatementItem,
11356 details: GreenNodeDetails::Node {
11357 children: [ModuleItem::missing(db).0].into(),
11358 width: TextWidth::default(),
11359 },
11360 }
11361 .intern(db),
11362 )
11363 }
11364 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11365 let kind = node.kind(db);
11366 assert_eq!(
11367 kind,
11368 SyntaxKind::StatementItem,
11369 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11370 kind,
11371 SyntaxKind::StatementItem
11372 );
11373 Self { node }
11374 }
11375 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11376 let kind = node.kind(db);
11377 if kind == SyntaxKind::StatementItem {
11378 Some(Self::from_syntax_node(db, node))
11379 } else {
11380 None
11381 }
11382 }
11383 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11384 self.node
11385 }
11386 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11387 StatementItemPtr(self.node.stable_ptr(db))
11388 }
11389}
11390#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11391pub struct Param<'db> {
11392 node: SyntaxNode<'db>,
11393}
11394impl<'db> Param<'db> {
11395 pub const INDEX_MODIFIERS: usize = 0;
11396 pub const INDEX_NAME: usize = 1;
11397 pub const INDEX_TYPE_CLAUSE: usize = 2;
11398 pub fn new_green(
11399 db: &'db dyn Database,
11400 modifiers: ModifierListGreen<'db>,
11401 name: TerminalIdentifierGreen<'db>,
11402 type_clause: OptionTypeClauseGreen<'db>,
11403 ) -> ParamGreen<'db> {
11404 let children = [modifiers.0, name.0, type_clause.0];
11405 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11406 ParamGreen(
11407 GreenNode {
11408 kind: SyntaxKind::Param,
11409 details: GreenNodeDetails::Node { children: children.into(), width },
11410 }
11411 .intern(db),
11412 )
11413 }
11414}
11415impl<'db> Param<'db> {
11416 pub fn modifiers(&self, db: &'db dyn Database) -> ModifierList<'db> {
11417 ModifierList::from_syntax_node(db, self.node.get_children(db)[0])
11418 }
11419 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
11420 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
11421 }
11422 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
11423 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
11424 }
11425}
11426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11427pub struct ParamPtr<'db>(pub SyntaxStablePtrId<'db>);
11428impl<'db> ParamPtr<'db> {
11429 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
11430 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
11431 }
11432}
11433impl<'db> TypedStablePtr<'db> for ParamPtr<'db> {
11434 type SyntaxNode = Param<'db>;
11435 fn untyped(self) -> SyntaxStablePtrId<'db> {
11436 self.0
11437 }
11438 fn lookup(&self, db: &'db dyn Database) -> Param<'db> {
11439 Param::from_syntax_node(db, self.0.lookup(db))
11440 }
11441}
11442impl<'db> From<ParamPtr<'db>> for SyntaxStablePtrId<'db> {
11443 fn from(ptr: ParamPtr<'db>) -> Self {
11444 ptr.untyped()
11445 }
11446}
11447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11448pub struct ParamGreen<'db>(pub GreenId<'db>);
11449impl<'db> TypedSyntaxNode<'db> for Param<'db> {
11450 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Param);
11451 type StablePtr = ParamPtr<'db>;
11452 type Green = ParamGreen<'db>;
11453 fn missing(db: &'db dyn Database) -> Self::Green {
11454 ParamGreen(
11455 GreenNode {
11456 kind: SyntaxKind::Param,
11457 details: GreenNodeDetails::Node {
11458 children: [
11459 ModifierList::missing(db).0,
11460 TerminalIdentifier::missing(db).0,
11461 OptionTypeClause::missing(db).0,
11462 ]
11463 .into(),
11464 width: TextWidth::default(),
11465 },
11466 }
11467 .intern(db),
11468 )
11469 }
11470 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11471 let kind = node.kind(db);
11472 assert_eq!(
11473 kind,
11474 SyntaxKind::Param,
11475 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11476 kind,
11477 SyntaxKind::Param
11478 );
11479 Self { node }
11480 }
11481 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11482 let kind = node.kind(db);
11483 if kind == SyntaxKind::Param { Some(Self::from_syntax_node(db, node)) } else { None }
11484 }
11485 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11486 self.node
11487 }
11488 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11489 ParamPtr(self.node.stable_ptr(db))
11490 }
11491}
11492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11493pub struct ModifierList<'db>(ElementList<'db, Modifier<'db>, 1>);
11494impl<'db> Deref for ModifierList<'db> {
11495 type Target = ElementList<'db, Modifier<'db>, 1>;
11496 fn deref(&self) -> &Self::Target {
11497 &self.0
11498 }
11499}
11500impl<'db> ModifierList<'db> {
11501 pub fn new_green(
11502 db: &'db dyn Database,
11503 children: &[ModifierGreen<'db>],
11504 ) -> ModifierListGreen<'db> {
11505 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
11506 ModifierListGreen(
11507 GreenNode {
11508 kind: SyntaxKind::ModifierList,
11509 details: GreenNodeDetails::Node {
11510 children: children.iter().map(|x| x.0).collect(),
11511 width,
11512 },
11513 }
11514 .intern(db),
11515 )
11516 }
11517}
11518#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11519pub struct ModifierListPtr<'db>(pub SyntaxStablePtrId<'db>);
11520impl<'db> TypedStablePtr<'db> for ModifierListPtr<'db> {
11521 type SyntaxNode = ModifierList<'db>;
11522 fn untyped(self) -> SyntaxStablePtrId<'db> {
11523 self.0
11524 }
11525 fn lookup(&self, db: &'db dyn Database) -> ModifierList<'db> {
11526 ModifierList::from_syntax_node(db, self.0.lookup(db))
11527 }
11528}
11529impl<'db> From<ModifierListPtr<'db>> for SyntaxStablePtrId<'db> {
11530 fn from(ptr: ModifierListPtr<'db>) -> Self {
11531 ptr.untyped()
11532 }
11533}
11534#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11535pub struct ModifierListGreen<'db>(pub GreenId<'db>);
11536impl<'db> TypedSyntaxNode<'db> for ModifierList<'db> {
11537 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModifierList);
11538 type StablePtr = ModifierListPtr<'db>;
11539 type Green = ModifierListGreen<'db>;
11540 fn missing(db: &'db dyn Database) -> Self::Green {
11541 ModifierListGreen(
11542 GreenNode {
11543 kind: SyntaxKind::ModifierList,
11544 details: GreenNodeDetails::Node {
11545 children: [].into(),
11546 width: TextWidth::default(),
11547 },
11548 }
11549 .intern(db),
11550 )
11551 }
11552 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11553 Self(ElementList::new(node))
11554 }
11555 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11556 if node.kind(db) == SyntaxKind::ModifierList {
11557 Some(Self(ElementList::new(node)))
11558 } else {
11559 None
11560 }
11561 }
11562 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11563 self.node
11564 }
11565 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11566 ModifierListPtr(self.node.stable_ptr(db))
11567 }
11568}
11569#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11570pub enum Modifier<'db> {
11571 Ref(TerminalRef<'db>),
11572 Mut(TerminalMut<'db>),
11573}
11574#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11575pub struct ModifierPtr<'db>(pub SyntaxStablePtrId<'db>);
11576impl<'db> TypedStablePtr<'db> for ModifierPtr<'db> {
11577 type SyntaxNode = Modifier<'db>;
11578 fn untyped(self) -> SyntaxStablePtrId<'db> {
11579 self.0
11580 }
11581 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11582 Modifier::from_syntax_node(db, self.0.lookup(db))
11583 }
11584}
11585impl<'db> From<ModifierPtr<'db>> for SyntaxStablePtrId<'db> {
11586 fn from(ptr: ModifierPtr<'db>) -> Self {
11587 ptr.untyped()
11588 }
11589}
11590impl<'db> From<TerminalRefPtr<'db>> for ModifierPtr<'db> {
11591 fn from(value: TerminalRefPtr<'db>) -> Self {
11592 Self(value.0)
11593 }
11594}
11595impl<'db> From<TerminalMutPtr<'db>> for ModifierPtr<'db> {
11596 fn from(value: TerminalMutPtr<'db>) -> Self {
11597 Self(value.0)
11598 }
11599}
11600impl<'db> From<TerminalRefGreen<'db>> for ModifierGreen<'db> {
11601 fn from(value: TerminalRefGreen<'db>) -> Self {
11602 Self(value.0)
11603 }
11604}
11605impl<'db> From<TerminalMutGreen<'db>> for ModifierGreen<'db> {
11606 fn from(value: TerminalMutGreen<'db>) -> Self {
11607 Self(value.0)
11608 }
11609}
11610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11611pub struct ModifierGreen<'db>(pub GreenId<'db>);
11612impl<'db> TypedSyntaxNode<'db> for Modifier<'db> {
11613 const OPTIONAL_KIND: Option<SyntaxKind> = None;
11614 type StablePtr = ModifierPtr<'db>;
11615 type Green = ModifierGreen<'db>;
11616 fn missing(db: &'db dyn Database) -> Self::Green {
11617 panic!("No missing variant.");
11618 }
11619 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11620 let kind = node.kind(db);
11621 match kind {
11622 SyntaxKind::TerminalRef => Modifier::Ref(TerminalRef::from_syntax_node(db, node)),
11623 SyntaxKind::TerminalMut => Modifier::Mut(TerminalMut::from_syntax_node(db, node)),
11624 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Modifier"),
11625 }
11626 }
11627 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11628 let kind = node.kind(db);
11629 match kind {
11630 SyntaxKind::TerminalRef => Some(Modifier::Ref(TerminalRef::from_syntax_node(db, node))),
11631 SyntaxKind::TerminalMut => Some(Modifier::Mut(TerminalMut::from_syntax_node(db, node))),
11632 _ => None,
11633 }
11634 }
11635 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11636 match self {
11637 Modifier::Ref(x) => x.as_syntax_node(),
11638 Modifier::Mut(x) => x.as_syntax_node(),
11639 }
11640 }
11641 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11642 ModifierPtr(self.as_syntax_node().stable_ptr(db))
11643 }
11644}
11645impl<'db> Modifier<'db> {
11646 pub fn is_variant(kind: SyntaxKind) -> bool {
11648 matches!(kind, SyntaxKind::TerminalRef | SyntaxKind::TerminalMut)
11649 }
11650}
11651#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11652pub struct ParamList<'db>(ElementList<'db, Param<'db>, 2>);
11653impl<'db> Deref for ParamList<'db> {
11654 type Target = ElementList<'db, Param<'db>, 2>;
11655 fn deref(&self) -> &Self::Target {
11656 &self.0
11657 }
11658}
11659impl<'db> ParamList<'db> {
11660 pub fn new_green(
11661 db: &'db dyn Database,
11662 children: &[ParamListElementOrSeparatorGreen<'db>],
11663 ) -> ParamListGreen<'db> {
11664 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11665 ParamListGreen(
11666 GreenNode {
11667 kind: SyntaxKind::ParamList,
11668 details: GreenNodeDetails::Node {
11669 children: children.iter().map(|x| x.id()).collect(),
11670 width,
11671 },
11672 }
11673 .intern(db),
11674 )
11675 }
11676}
11677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11678pub struct ParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
11679impl<'db> TypedStablePtr<'db> for ParamListPtr<'db> {
11680 type SyntaxNode = ParamList<'db>;
11681 fn untyped(self) -> SyntaxStablePtrId<'db> {
11682 self.0
11683 }
11684 fn lookup(&self, db: &'db dyn Database) -> ParamList<'db> {
11685 ParamList::from_syntax_node(db, self.0.lookup(db))
11686 }
11687}
11688impl<'db> From<ParamListPtr<'db>> for SyntaxStablePtrId<'db> {
11689 fn from(ptr: ParamListPtr<'db>) -> Self {
11690 ptr.untyped()
11691 }
11692}
11693#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11694pub enum ParamListElementOrSeparatorGreen<'db> {
11695 Separator(TerminalCommaGreen<'db>),
11696 Element(ParamGreen<'db>),
11697}
11698impl<'db> From<TerminalCommaGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11699 fn from(value: TerminalCommaGreen<'db>) -> Self {
11700 ParamListElementOrSeparatorGreen::Separator(value)
11701 }
11702}
11703impl<'db> From<ParamGreen<'db>> for ParamListElementOrSeparatorGreen<'db> {
11704 fn from(value: ParamGreen<'db>) -> Self {
11705 ParamListElementOrSeparatorGreen::Element(value)
11706 }
11707}
11708impl<'db> ParamListElementOrSeparatorGreen<'db> {
11709 fn id(&self) -> GreenId<'db> {
11710 match self {
11711 ParamListElementOrSeparatorGreen::Separator(green) => green.0,
11712 ParamListElementOrSeparatorGreen::Element(green) => green.0,
11713 }
11714 }
11715}
11716#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11717pub struct ParamListGreen<'db>(pub GreenId<'db>);
11718impl<'db> TypedSyntaxNode<'db> for ParamList<'db> {
11719 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamList);
11720 type StablePtr = ParamListPtr<'db>;
11721 type Green = ParamListGreen<'db>;
11722 fn missing(db: &'db dyn Database) -> Self::Green {
11723 ParamListGreen(
11724 GreenNode {
11725 kind: SyntaxKind::ParamList,
11726 details: GreenNodeDetails::Node {
11727 children: [].into(),
11728 width: TextWidth::default(),
11729 },
11730 }
11731 .intern(db),
11732 )
11733 }
11734 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11735 Self(ElementList::new(node))
11736 }
11737 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11738 if node.kind(db) == SyntaxKind::ParamList {
11739 Some(Self(ElementList::new(node)))
11740 } else {
11741 None
11742 }
11743 }
11744 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11745 self.node
11746 }
11747 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11748 ParamListPtr(self.node.stable_ptr(db))
11749 }
11750}
11751#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11752pub struct ImplicitsClause<'db> {
11753 node: SyntaxNode<'db>,
11754}
11755impl<'db> ImplicitsClause<'db> {
11756 pub const INDEX_IMPLICITS_KW: usize = 0;
11757 pub const INDEX_LPAREN: usize = 1;
11758 pub const INDEX_IMPLICITS: usize = 2;
11759 pub const INDEX_RPAREN: usize = 3;
11760 pub fn new_green(
11761 db: &'db dyn Database,
11762 implicits_kw: TerminalImplicitsGreen<'db>,
11763 lparen: TerminalLParenGreen<'db>,
11764 implicits: ImplicitsListGreen<'db>,
11765 rparen: TerminalRParenGreen<'db>,
11766 ) -> ImplicitsClauseGreen<'db> {
11767 let children = [implicits_kw.0, lparen.0, implicits.0, rparen.0];
11768 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
11769 ImplicitsClauseGreen(
11770 GreenNode {
11771 kind: SyntaxKind::ImplicitsClause,
11772 details: GreenNodeDetails::Node { children: children.into(), width },
11773 }
11774 .intern(db),
11775 )
11776 }
11777}
11778impl<'db> ImplicitsClause<'db> {
11779 pub fn implicits_kw(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
11780 TerminalImplicits::from_syntax_node(db, self.node.get_children(db)[0])
11781 }
11782 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
11783 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
11784 }
11785 pub fn implicits(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11786 ImplicitsList::from_syntax_node(db, self.node.get_children(db)[2])
11787 }
11788 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
11789 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
11790 }
11791}
11792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11793pub struct ImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11794impl<'db> ImplicitsClausePtr<'db> {}
11795impl<'db> TypedStablePtr<'db> for ImplicitsClausePtr<'db> {
11796 type SyntaxNode = ImplicitsClause<'db>;
11797 fn untyped(self) -> SyntaxStablePtrId<'db> {
11798 self.0
11799 }
11800 fn lookup(&self, db: &'db dyn Database) -> ImplicitsClause<'db> {
11801 ImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11802 }
11803}
11804impl<'db> From<ImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11805 fn from(ptr: ImplicitsClausePtr<'db>) -> Self {
11806 ptr.untyped()
11807 }
11808}
11809#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11810pub struct ImplicitsClauseGreen<'db>(pub GreenId<'db>);
11811impl<'db> TypedSyntaxNode<'db> for ImplicitsClause<'db> {
11812 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsClause);
11813 type StablePtr = ImplicitsClausePtr<'db>;
11814 type Green = ImplicitsClauseGreen<'db>;
11815 fn missing(db: &'db dyn Database) -> Self::Green {
11816 ImplicitsClauseGreen(
11817 GreenNode {
11818 kind: SyntaxKind::ImplicitsClause,
11819 details: GreenNodeDetails::Node {
11820 children: [
11821 TerminalImplicits::missing(db).0,
11822 TerminalLParen::missing(db).0,
11823 ImplicitsList::missing(db).0,
11824 TerminalRParen::missing(db).0,
11825 ]
11826 .into(),
11827 width: TextWidth::default(),
11828 },
11829 }
11830 .intern(db),
11831 )
11832 }
11833 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11834 let kind = node.kind(db);
11835 assert_eq!(
11836 kind,
11837 SyntaxKind::ImplicitsClause,
11838 "Unexpected SyntaxKind {:?}. Expected {:?}.",
11839 kind,
11840 SyntaxKind::ImplicitsClause
11841 );
11842 Self { node }
11843 }
11844 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11845 let kind = node.kind(db);
11846 if kind == SyntaxKind::ImplicitsClause {
11847 Some(Self::from_syntax_node(db, node))
11848 } else {
11849 None
11850 }
11851 }
11852 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11853 self.node
11854 }
11855 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11856 ImplicitsClausePtr(self.node.stable_ptr(db))
11857 }
11858}
11859#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11860pub struct ImplicitsList<'db>(ElementList<'db, ExprPath<'db>, 2>);
11861impl<'db> Deref for ImplicitsList<'db> {
11862 type Target = ElementList<'db, ExprPath<'db>, 2>;
11863 fn deref(&self) -> &Self::Target {
11864 &self.0
11865 }
11866}
11867impl<'db> ImplicitsList<'db> {
11868 pub fn new_green(
11869 db: &'db dyn Database,
11870 children: &[ImplicitsListElementOrSeparatorGreen<'db>],
11871 ) -> ImplicitsListGreen<'db> {
11872 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
11873 ImplicitsListGreen(
11874 GreenNode {
11875 kind: SyntaxKind::ImplicitsList,
11876 details: GreenNodeDetails::Node {
11877 children: children.iter().map(|x| x.id()).collect(),
11878 width,
11879 },
11880 }
11881 .intern(db),
11882 )
11883 }
11884}
11885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11886pub struct ImplicitsListPtr<'db>(pub SyntaxStablePtrId<'db>);
11887impl<'db> TypedStablePtr<'db> for ImplicitsListPtr<'db> {
11888 type SyntaxNode = ImplicitsList<'db>;
11889 fn untyped(self) -> SyntaxStablePtrId<'db> {
11890 self.0
11891 }
11892 fn lookup(&self, db: &'db dyn Database) -> ImplicitsList<'db> {
11893 ImplicitsList::from_syntax_node(db, self.0.lookup(db))
11894 }
11895}
11896impl<'db> From<ImplicitsListPtr<'db>> for SyntaxStablePtrId<'db> {
11897 fn from(ptr: ImplicitsListPtr<'db>) -> Self {
11898 ptr.untyped()
11899 }
11900}
11901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11902pub enum ImplicitsListElementOrSeparatorGreen<'db> {
11903 Separator(TerminalCommaGreen<'db>),
11904 Element(ExprPathGreen<'db>),
11905}
11906impl<'db> From<TerminalCommaGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11907 fn from(value: TerminalCommaGreen<'db>) -> Self {
11908 ImplicitsListElementOrSeparatorGreen::Separator(value)
11909 }
11910}
11911impl<'db> From<ExprPathGreen<'db>> for ImplicitsListElementOrSeparatorGreen<'db> {
11912 fn from(value: ExprPathGreen<'db>) -> Self {
11913 ImplicitsListElementOrSeparatorGreen::Element(value)
11914 }
11915}
11916impl<'db> ImplicitsListElementOrSeparatorGreen<'db> {
11917 fn id(&self) -> GreenId<'db> {
11918 match self {
11919 ImplicitsListElementOrSeparatorGreen::Separator(green) => green.0,
11920 ImplicitsListElementOrSeparatorGreen::Element(green) => green.0,
11921 }
11922 }
11923}
11924#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11925pub struct ImplicitsListGreen<'db>(pub GreenId<'db>);
11926impl<'db> TypedSyntaxNode<'db> for ImplicitsList<'db> {
11927 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplicitsList);
11928 type StablePtr = ImplicitsListPtr<'db>;
11929 type Green = ImplicitsListGreen<'db>;
11930 fn missing(db: &'db dyn Database) -> Self::Green {
11931 ImplicitsListGreen(
11932 GreenNode {
11933 kind: SyntaxKind::ImplicitsList,
11934 details: GreenNodeDetails::Node {
11935 children: [].into(),
11936 width: TextWidth::default(),
11937 },
11938 }
11939 .intern(db),
11940 )
11941 }
11942 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
11943 Self(ElementList::new(node))
11944 }
11945 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
11946 if node.kind(db) == SyntaxKind::ImplicitsList {
11947 Some(Self(ElementList::new(node)))
11948 } else {
11949 None
11950 }
11951 }
11952 fn as_syntax_node(&self) -> SyntaxNode<'db> {
11953 self.node
11954 }
11955 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
11956 ImplicitsListPtr(self.node.stable_ptr(db))
11957 }
11958}
11959#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
11960pub enum OptionImplicitsClause<'db> {
11961 Empty(OptionImplicitsClauseEmpty<'db>),
11962 ImplicitsClause(ImplicitsClause<'db>),
11963}
11964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
11965pub struct OptionImplicitsClausePtr<'db>(pub SyntaxStablePtrId<'db>);
11966impl<'db> TypedStablePtr<'db> for OptionImplicitsClausePtr<'db> {
11967 type SyntaxNode = OptionImplicitsClause<'db>;
11968 fn untyped(self) -> SyntaxStablePtrId<'db> {
11969 self.0
11970 }
11971 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
11972 OptionImplicitsClause::from_syntax_node(db, self.0.lookup(db))
11973 }
11974}
11975impl<'db> From<OptionImplicitsClausePtr<'db>> for SyntaxStablePtrId<'db> {
11976 fn from(ptr: OptionImplicitsClausePtr<'db>) -> Self {
11977 ptr.untyped()
11978 }
11979}
11980impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for OptionImplicitsClausePtr<'db> {
11981 fn from(value: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
11982 Self(value.0)
11983 }
11984}
11985impl<'db> From<ImplicitsClausePtr<'db>> for OptionImplicitsClausePtr<'db> {
11986 fn from(value: ImplicitsClausePtr<'db>) -> Self {
11987 Self(value.0)
11988 }
11989}
11990impl<'db> From<OptionImplicitsClauseEmptyGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11991 fn from(value: OptionImplicitsClauseEmptyGreen<'db>) -> Self {
11992 Self(value.0)
11993 }
11994}
11995impl<'db> From<ImplicitsClauseGreen<'db>> for OptionImplicitsClauseGreen<'db> {
11996 fn from(value: ImplicitsClauseGreen<'db>) -> Self {
11997 Self(value.0)
11998 }
11999}
12000#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12001pub struct OptionImplicitsClauseGreen<'db>(pub GreenId<'db>);
12002impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClause<'db> {
12003 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12004 type StablePtr = OptionImplicitsClausePtr<'db>;
12005 type Green = OptionImplicitsClauseGreen<'db>;
12006 fn missing(db: &'db dyn Database) -> Self::Green {
12007 panic!("No missing variant.");
12008 }
12009 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12010 let kind = node.kind(db);
12011 match kind {
12012 SyntaxKind::OptionImplicitsClauseEmpty => {
12013 OptionImplicitsClause::Empty(OptionImplicitsClauseEmpty::from_syntax_node(db, node))
12014 }
12015 SyntaxKind::ImplicitsClause => {
12016 OptionImplicitsClause::ImplicitsClause(ImplicitsClause::from_syntax_node(db, node))
12017 }
12018 _ => panic!(
12019 "Unexpected syntax kind {:?} when constructing {}.",
12020 kind, "OptionImplicitsClause"
12021 ),
12022 }
12023 }
12024 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12025 let kind = node.kind(db);
12026 match kind {
12027 SyntaxKind::OptionImplicitsClauseEmpty => Some(OptionImplicitsClause::Empty(
12028 OptionImplicitsClauseEmpty::from_syntax_node(db, node),
12029 )),
12030 SyntaxKind::ImplicitsClause => Some(OptionImplicitsClause::ImplicitsClause(
12031 ImplicitsClause::from_syntax_node(db, node),
12032 )),
12033 _ => None,
12034 }
12035 }
12036 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12037 match self {
12038 OptionImplicitsClause::Empty(x) => x.as_syntax_node(),
12039 OptionImplicitsClause::ImplicitsClause(x) => x.as_syntax_node(),
12040 }
12041 }
12042 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12043 OptionImplicitsClausePtr(self.as_syntax_node().stable_ptr(db))
12044 }
12045}
12046impl<'db> OptionImplicitsClause<'db> {
12047 pub fn is_variant(kind: SyntaxKind) -> bool {
12049 matches!(kind, SyntaxKind::OptionImplicitsClauseEmpty | SyntaxKind::ImplicitsClause)
12050 }
12051}
12052#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12053pub struct OptionImplicitsClauseEmpty<'db> {
12054 node: SyntaxNode<'db>,
12055}
12056impl<'db> OptionImplicitsClauseEmpty<'db> {
12057 pub fn new_green(db: &'db dyn Database) -> OptionImplicitsClauseEmptyGreen<'db> {
12058 let children = [];
12059 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12060 OptionImplicitsClauseEmptyGreen(
12061 GreenNode {
12062 kind: SyntaxKind::OptionImplicitsClauseEmpty,
12063 details: GreenNodeDetails::Node { children: children.into(), width },
12064 }
12065 .intern(db),
12066 )
12067 }
12068}
12069impl<'db> OptionImplicitsClauseEmpty<'db> {}
12070#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12071pub struct OptionImplicitsClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12072impl<'db> OptionImplicitsClauseEmptyPtr<'db> {}
12073impl<'db> TypedStablePtr<'db> for OptionImplicitsClauseEmptyPtr<'db> {
12074 type SyntaxNode = OptionImplicitsClauseEmpty<'db>;
12075 fn untyped(self) -> SyntaxStablePtrId<'db> {
12076 self.0
12077 }
12078 fn lookup(&self, db: &'db dyn Database) -> OptionImplicitsClauseEmpty<'db> {
12079 OptionImplicitsClauseEmpty::from_syntax_node(db, self.0.lookup(db))
12080 }
12081}
12082impl<'db> From<OptionImplicitsClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12083 fn from(ptr: OptionImplicitsClauseEmptyPtr<'db>) -> Self {
12084 ptr.untyped()
12085 }
12086}
12087#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12088pub struct OptionImplicitsClauseEmptyGreen<'db>(pub GreenId<'db>);
12089impl<'db> TypedSyntaxNode<'db> for OptionImplicitsClauseEmpty<'db> {
12090 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionImplicitsClauseEmpty);
12091 type StablePtr = OptionImplicitsClauseEmptyPtr<'db>;
12092 type Green = OptionImplicitsClauseEmptyGreen<'db>;
12093 fn missing(db: &'db dyn Database) -> Self::Green {
12094 OptionImplicitsClauseEmptyGreen(
12095 GreenNode {
12096 kind: SyntaxKind::OptionImplicitsClauseEmpty,
12097 details: GreenNodeDetails::Node {
12098 children: [].into(),
12099 width: TextWidth::default(),
12100 },
12101 }
12102 .intern(db),
12103 )
12104 }
12105 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12106 let kind = node.kind(db);
12107 assert_eq!(
12108 kind,
12109 SyntaxKind::OptionImplicitsClauseEmpty,
12110 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12111 kind,
12112 SyntaxKind::OptionImplicitsClauseEmpty
12113 );
12114 Self { node }
12115 }
12116 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12117 let kind = node.kind(db);
12118 if kind == SyntaxKind::OptionImplicitsClauseEmpty {
12119 Some(Self::from_syntax_node(db, node))
12120 } else {
12121 None
12122 }
12123 }
12124 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12125 self.node
12126 }
12127 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12128 OptionImplicitsClauseEmptyPtr(self.node.stable_ptr(db))
12129 }
12130}
12131#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12132pub enum OptionTerminalNoPanic<'db> {
12133 Empty(OptionTerminalNoPanicEmpty<'db>),
12134 TerminalNoPanic(TerminalNoPanic<'db>),
12135}
12136#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12137pub struct OptionTerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
12138impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicPtr<'db> {
12139 type SyntaxNode = OptionTerminalNoPanic<'db>;
12140 fn untyped(self) -> SyntaxStablePtrId<'db> {
12141 self.0
12142 }
12143 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12144 OptionTerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
12145 }
12146}
12147impl<'db> From<OptionTerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
12148 fn from(ptr: OptionTerminalNoPanicPtr<'db>) -> Self {
12149 ptr.untyped()
12150 }
12151}
12152impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12153 fn from(value: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12154 Self(value.0)
12155 }
12156}
12157impl<'db> From<TerminalNoPanicPtr<'db>> for OptionTerminalNoPanicPtr<'db> {
12158 fn from(value: TerminalNoPanicPtr<'db>) -> Self {
12159 Self(value.0)
12160 }
12161}
12162impl<'db> From<OptionTerminalNoPanicEmptyGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12163 fn from(value: OptionTerminalNoPanicEmptyGreen<'db>) -> Self {
12164 Self(value.0)
12165 }
12166}
12167impl<'db> From<TerminalNoPanicGreen<'db>> for OptionTerminalNoPanicGreen<'db> {
12168 fn from(value: TerminalNoPanicGreen<'db>) -> Self {
12169 Self(value.0)
12170 }
12171}
12172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12173pub struct OptionTerminalNoPanicGreen<'db>(pub GreenId<'db>);
12174impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanic<'db> {
12175 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12176 type StablePtr = OptionTerminalNoPanicPtr<'db>;
12177 type Green = OptionTerminalNoPanicGreen<'db>;
12178 fn missing(db: &'db dyn Database) -> Self::Green {
12179 panic!("No missing variant.");
12180 }
12181 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12182 let kind = node.kind(db);
12183 match kind {
12184 SyntaxKind::OptionTerminalNoPanicEmpty => {
12185 OptionTerminalNoPanic::Empty(OptionTerminalNoPanicEmpty::from_syntax_node(db, node))
12186 }
12187 SyntaxKind::TerminalNoPanic => {
12188 OptionTerminalNoPanic::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
12189 }
12190 _ => panic!(
12191 "Unexpected syntax kind {:?} when constructing {}.",
12192 kind, "OptionTerminalNoPanic"
12193 ),
12194 }
12195 }
12196 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12197 let kind = node.kind(db);
12198 match kind {
12199 SyntaxKind::OptionTerminalNoPanicEmpty => Some(OptionTerminalNoPanic::Empty(
12200 OptionTerminalNoPanicEmpty::from_syntax_node(db, node),
12201 )),
12202 SyntaxKind::TerminalNoPanic => Some(OptionTerminalNoPanic::TerminalNoPanic(
12203 TerminalNoPanic::from_syntax_node(db, node),
12204 )),
12205 _ => None,
12206 }
12207 }
12208 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12209 match self {
12210 OptionTerminalNoPanic::Empty(x) => x.as_syntax_node(),
12211 OptionTerminalNoPanic::TerminalNoPanic(x) => x.as_syntax_node(),
12212 }
12213 }
12214 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12215 OptionTerminalNoPanicPtr(self.as_syntax_node().stable_ptr(db))
12216 }
12217}
12218impl<'db> OptionTerminalNoPanic<'db> {
12219 pub fn is_variant(kind: SyntaxKind) -> bool {
12221 matches!(kind, SyntaxKind::OptionTerminalNoPanicEmpty | SyntaxKind::TerminalNoPanic)
12222 }
12223}
12224#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12225pub struct OptionTerminalNoPanicEmpty<'db> {
12226 node: SyntaxNode<'db>,
12227}
12228impl<'db> OptionTerminalNoPanicEmpty<'db> {
12229 pub fn new_green(db: &'db dyn Database) -> OptionTerminalNoPanicEmptyGreen<'db> {
12230 let children = [];
12231 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12232 OptionTerminalNoPanicEmptyGreen(
12233 GreenNode {
12234 kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12235 details: GreenNodeDetails::Node { children: children.into(), width },
12236 }
12237 .intern(db),
12238 )
12239 }
12240}
12241impl<'db> OptionTerminalNoPanicEmpty<'db> {}
12242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12243pub struct OptionTerminalNoPanicEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12244impl<'db> OptionTerminalNoPanicEmptyPtr<'db> {}
12245impl<'db> TypedStablePtr<'db> for OptionTerminalNoPanicEmptyPtr<'db> {
12246 type SyntaxNode = OptionTerminalNoPanicEmpty<'db>;
12247 fn untyped(self) -> SyntaxStablePtrId<'db> {
12248 self.0
12249 }
12250 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalNoPanicEmpty<'db> {
12251 OptionTerminalNoPanicEmpty::from_syntax_node(db, self.0.lookup(db))
12252 }
12253}
12254impl<'db> From<OptionTerminalNoPanicEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12255 fn from(ptr: OptionTerminalNoPanicEmptyPtr<'db>) -> Self {
12256 ptr.untyped()
12257 }
12258}
12259#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12260pub struct OptionTerminalNoPanicEmptyGreen<'db>(pub GreenId<'db>);
12261impl<'db> TypedSyntaxNode<'db> for OptionTerminalNoPanicEmpty<'db> {
12262 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalNoPanicEmpty);
12263 type StablePtr = OptionTerminalNoPanicEmptyPtr<'db>;
12264 type Green = OptionTerminalNoPanicEmptyGreen<'db>;
12265 fn missing(db: &'db dyn Database) -> Self::Green {
12266 OptionTerminalNoPanicEmptyGreen(
12267 GreenNode {
12268 kind: SyntaxKind::OptionTerminalNoPanicEmpty,
12269 details: GreenNodeDetails::Node {
12270 children: [].into(),
12271 width: TextWidth::default(),
12272 },
12273 }
12274 .intern(db),
12275 )
12276 }
12277 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12278 let kind = node.kind(db);
12279 assert_eq!(
12280 kind,
12281 SyntaxKind::OptionTerminalNoPanicEmpty,
12282 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12283 kind,
12284 SyntaxKind::OptionTerminalNoPanicEmpty
12285 );
12286 Self { node }
12287 }
12288 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12289 let kind = node.kind(db);
12290 if kind == SyntaxKind::OptionTerminalNoPanicEmpty {
12291 Some(Self::from_syntax_node(db, node))
12292 } else {
12293 None
12294 }
12295 }
12296 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12297 self.node
12298 }
12299 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12300 OptionTerminalNoPanicEmptyPtr(self.node.stable_ptr(db))
12301 }
12302}
12303#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12304pub enum OptionTerminalConst<'db> {
12305 Empty(OptionTerminalConstEmpty<'db>),
12306 TerminalConst(TerminalConst<'db>),
12307}
12308#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12309pub struct OptionTerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
12310impl<'db> TypedStablePtr<'db> for OptionTerminalConstPtr<'db> {
12311 type SyntaxNode = OptionTerminalConst<'db>;
12312 fn untyped(self) -> SyntaxStablePtrId<'db> {
12313 self.0
12314 }
12315 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
12316 OptionTerminalConst::from_syntax_node(db, self.0.lookup(db))
12317 }
12318}
12319impl<'db> From<OptionTerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
12320 fn from(ptr: OptionTerminalConstPtr<'db>) -> Self {
12321 ptr.untyped()
12322 }
12323}
12324impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for OptionTerminalConstPtr<'db> {
12325 fn from(value: OptionTerminalConstEmptyPtr<'db>) -> Self {
12326 Self(value.0)
12327 }
12328}
12329impl<'db> From<TerminalConstPtr<'db>> for OptionTerminalConstPtr<'db> {
12330 fn from(value: TerminalConstPtr<'db>) -> Self {
12331 Self(value.0)
12332 }
12333}
12334impl<'db> From<OptionTerminalConstEmptyGreen<'db>> for OptionTerminalConstGreen<'db> {
12335 fn from(value: OptionTerminalConstEmptyGreen<'db>) -> Self {
12336 Self(value.0)
12337 }
12338}
12339impl<'db> From<TerminalConstGreen<'db>> for OptionTerminalConstGreen<'db> {
12340 fn from(value: TerminalConstGreen<'db>) -> Self {
12341 Self(value.0)
12342 }
12343}
12344#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12345pub struct OptionTerminalConstGreen<'db>(pub GreenId<'db>);
12346impl<'db> TypedSyntaxNode<'db> for OptionTerminalConst<'db> {
12347 const OPTIONAL_KIND: Option<SyntaxKind> = None;
12348 type StablePtr = OptionTerminalConstPtr<'db>;
12349 type Green = OptionTerminalConstGreen<'db>;
12350 fn missing(db: &'db dyn Database) -> Self::Green {
12351 panic!("No missing variant.");
12352 }
12353 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12354 let kind = node.kind(db);
12355 match kind {
12356 SyntaxKind::OptionTerminalConstEmpty => {
12357 OptionTerminalConst::Empty(OptionTerminalConstEmpty::from_syntax_node(db, node))
12358 }
12359 SyntaxKind::TerminalConst => {
12360 OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node))
12361 }
12362 _ => panic!(
12363 "Unexpected syntax kind {:?} when constructing {}.",
12364 kind, "OptionTerminalConst"
12365 ),
12366 }
12367 }
12368 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12369 let kind = node.kind(db);
12370 match kind {
12371 SyntaxKind::OptionTerminalConstEmpty => Some(OptionTerminalConst::Empty(
12372 OptionTerminalConstEmpty::from_syntax_node(db, node),
12373 )),
12374 SyntaxKind::TerminalConst => {
12375 Some(OptionTerminalConst::TerminalConst(TerminalConst::from_syntax_node(db, node)))
12376 }
12377 _ => None,
12378 }
12379 }
12380 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12381 match self {
12382 OptionTerminalConst::Empty(x) => x.as_syntax_node(),
12383 OptionTerminalConst::TerminalConst(x) => x.as_syntax_node(),
12384 }
12385 }
12386 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12387 OptionTerminalConstPtr(self.as_syntax_node().stable_ptr(db))
12388 }
12389}
12390impl<'db> OptionTerminalConst<'db> {
12391 pub fn is_variant(kind: SyntaxKind) -> bool {
12393 matches!(kind, SyntaxKind::OptionTerminalConstEmpty | SyntaxKind::TerminalConst)
12394 }
12395}
12396#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12397pub struct OptionTerminalConstEmpty<'db> {
12398 node: SyntaxNode<'db>,
12399}
12400impl<'db> OptionTerminalConstEmpty<'db> {
12401 pub fn new_green(db: &'db dyn Database) -> OptionTerminalConstEmptyGreen<'db> {
12402 let children = [];
12403 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12404 OptionTerminalConstEmptyGreen(
12405 GreenNode {
12406 kind: SyntaxKind::OptionTerminalConstEmpty,
12407 details: GreenNodeDetails::Node { children: children.into(), width },
12408 }
12409 .intern(db),
12410 )
12411 }
12412}
12413impl<'db> OptionTerminalConstEmpty<'db> {}
12414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12415pub struct OptionTerminalConstEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
12416impl<'db> OptionTerminalConstEmptyPtr<'db> {}
12417impl<'db> TypedStablePtr<'db> for OptionTerminalConstEmptyPtr<'db> {
12418 type SyntaxNode = OptionTerminalConstEmpty<'db>;
12419 fn untyped(self) -> SyntaxStablePtrId<'db> {
12420 self.0
12421 }
12422 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalConstEmpty<'db> {
12423 OptionTerminalConstEmpty::from_syntax_node(db, self.0.lookup(db))
12424 }
12425}
12426impl<'db> From<OptionTerminalConstEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
12427 fn from(ptr: OptionTerminalConstEmptyPtr<'db>) -> Self {
12428 ptr.untyped()
12429 }
12430}
12431#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12432pub struct OptionTerminalConstEmptyGreen<'db>(pub GreenId<'db>);
12433impl<'db> TypedSyntaxNode<'db> for OptionTerminalConstEmpty<'db> {
12434 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalConstEmpty);
12435 type StablePtr = OptionTerminalConstEmptyPtr<'db>;
12436 type Green = OptionTerminalConstEmptyGreen<'db>;
12437 fn missing(db: &'db dyn Database) -> Self::Green {
12438 OptionTerminalConstEmptyGreen(
12439 GreenNode {
12440 kind: SyntaxKind::OptionTerminalConstEmpty,
12441 details: GreenNodeDetails::Node {
12442 children: [].into(),
12443 width: TextWidth::default(),
12444 },
12445 }
12446 .intern(db),
12447 )
12448 }
12449 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12450 let kind = node.kind(db);
12451 assert_eq!(
12452 kind,
12453 SyntaxKind::OptionTerminalConstEmpty,
12454 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12455 kind,
12456 SyntaxKind::OptionTerminalConstEmpty
12457 );
12458 Self { node }
12459 }
12460 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12461 let kind = node.kind(db);
12462 if kind == SyntaxKind::OptionTerminalConstEmpty {
12463 Some(Self::from_syntax_node(db, node))
12464 } else {
12465 None
12466 }
12467 }
12468 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12469 self.node
12470 }
12471 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12472 OptionTerminalConstEmptyPtr(self.node.stable_ptr(db))
12473 }
12474}
12475#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12476pub struct FunctionSignature<'db> {
12477 node: SyntaxNode<'db>,
12478}
12479impl<'db> FunctionSignature<'db> {
12480 pub const INDEX_LPAREN: usize = 0;
12481 pub const INDEX_PARAMETERS: usize = 1;
12482 pub const INDEX_RPAREN: usize = 2;
12483 pub const INDEX_RET_TY: usize = 3;
12484 pub const INDEX_IMPLICITS_CLAUSE: usize = 4;
12485 pub const INDEX_OPTIONAL_NO_PANIC: usize = 5;
12486 pub fn new_green(
12487 db: &'db dyn Database,
12488 lparen: TerminalLParenGreen<'db>,
12489 parameters: ParamListGreen<'db>,
12490 rparen: TerminalRParenGreen<'db>,
12491 ret_ty: OptionReturnTypeClauseGreen<'db>,
12492 implicits_clause: OptionImplicitsClauseGreen<'db>,
12493 optional_no_panic: OptionTerminalNoPanicGreen<'db>,
12494 ) -> FunctionSignatureGreen<'db> {
12495 let children =
12496 [lparen.0, parameters.0, rparen.0, ret_ty.0, implicits_clause.0, optional_no_panic.0];
12497 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12498 FunctionSignatureGreen(
12499 GreenNode {
12500 kind: SyntaxKind::FunctionSignature,
12501 details: GreenNodeDetails::Node { children: children.into(), width },
12502 }
12503 .intern(db),
12504 )
12505 }
12506}
12507impl<'db> FunctionSignature<'db> {
12508 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
12509 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
12510 }
12511 pub fn parameters(&self, db: &'db dyn Database) -> ParamList<'db> {
12512 ParamList::from_syntax_node(db, self.node.get_children(db)[1])
12513 }
12514 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
12515 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
12516 }
12517 pub fn ret_ty(&self, db: &'db dyn Database) -> OptionReturnTypeClause<'db> {
12518 OptionReturnTypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12519 }
12520 pub fn implicits_clause(&self, db: &'db dyn Database) -> OptionImplicitsClause<'db> {
12521 OptionImplicitsClause::from_syntax_node(db, self.node.get_children(db)[4])
12522 }
12523 pub fn optional_no_panic(&self, db: &'db dyn Database) -> OptionTerminalNoPanic<'db> {
12524 OptionTerminalNoPanic::from_syntax_node(db, self.node.get_children(db)[5])
12525 }
12526}
12527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12528pub struct FunctionSignaturePtr<'db>(pub SyntaxStablePtrId<'db>);
12529impl<'db> FunctionSignaturePtr<'db> {}
12530impl<'db> TypedStablePtr<'db> for FunctionSignaturePtr<'db> {
12531 type SyntaxNode = FunctionSignature<'db>;
12532 fn untyped(self) -> SyntaxStablePtrId<'db> {
12533 self.0
12534 }
12535 fn lookup(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
12536 FunctionSignature::from_syntax_node(db, self.0.lookup(db))
12537 }
12538}
12539impl<'db> From<FunctionSignaturePtr<'db>> for SyntaxStablePtrId<'db> {
12540 fn from(ptr: FunctionSignaturePtr<'db>) -> Self {
12541 ptr.untyped()
12542 }
12543}
12544#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12545pub struct FunctionSignatureGreen<'db>(pub GreenId<'db>);
12546impl<'db> TypedSyntaxNode<'db> for FunctionSignature<'db> {
12547 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionSignature);
12548 type StablePtr = FunctionSignaturePtr<'db>;
12549 type Green = FunctionSignatureGreen<'db>;
12550 fn missing(db: &'db dyn Database) -> Self::Green {
12551 FunctionSignatureGreen(
12552 GreenNode {
12553 kind: SyntaxKind::FunctionSignature,
12554 details: GreenNodeDetails::Node {
12555 children: [
12556 TerminalLParen::missing(db).0,
12557 ParamList::missing(db).0,
12558 TerminalRParen::missing(db).0,
12559 OptionReturnTypeClause::missing(db).0,
12560 OptionImplicitsClause::missing(db).0,
12561 OptionTerminalNoPanic::missing(db).0,
12562 ]
12563 .into(),
12564 width: TextWidth::default(),
12565 },
12566 }
12567 .intern(db),
12568 )
12569 }
12570 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12571 let kind = node.kind(db);
12572 assert_eq!(
12573 kind,
12574 SyntaxKind::FunctionSignature,
12575 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12576 kind,
12577 SyntaxKind::FunctionSignature
12578 );
12579 Self { node }
12580 }
12581 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12582 let kind = node.kind(db);
12583 if kind == SyntaxKind::FunctionSignature {
12584 Some(Self::from_syntax_node(db, node))
12585 } else {
12586 None
12587 }
12588 }
12589 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12590 self.node
12591 }
12592 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12593 FunctionSignaturePtr(self.node.stable_ptr(db))
12594 }
12595}
12596#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12597pub struct Member<'db> {
12598 node: SyntaxNode<'db>,
12599}
12600impl<'db> Member<'db> {
12601 pub const INDEX_ATTRIBUTES: usize = 0;
12602 pub const INDEX_VISIBILITY: usize = 1;
12603 pub const INDEX_NAME: usize = 2;
12604 pub const INDEX_TYPE_CLAUSE: usize = 3;
12605 pub fn new_green(
12606 db: &'db dyn Database,
12607 attributes: AttributeListGreen<'db>,
12608 visibility: VisibilityGreen<'db>,
12609 name: TerminalIdentifierGreen<'db>,
12610 type_clause: TypeClauseGreen<'db>,
12611 ) -> MemberGreen<'db> {
12612 let children = [attributes.0, visibility.0, name.0, type_clause.0];
12613 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12614 MemberGreen(
12615 GreenNode {
12616 kind: SyntaxKind::Member,
12617 details: GreenNodeDetails::Node { children: children.into(), width },
12618 }
12619 .intern(db),
12620 )
12621 }
12622}
12623impl<'db> Member<'db> {
12624 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12625 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12626 }
12627 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
12628 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
12629 }
12630 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12631 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
12632 }
12633 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
12634 TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
12635 }
12636}
12637#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12638pub struct MemberPtr<'db>(pub SyntaxStablePtrId<'db>);
12639impl<'db> MemberPtr<'db> {
12640 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12641 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12642 }
12643}
12644impl<'db> TypedStablePtr<'db> for MemberPtr<'db> {
12645 type SyntaxNode = Member<'db>;
12646 fn untyped(self) -> SyntaxStablePtrId<'db> {
12647 self.0
12648 }
12649 fn lookup(&self, db: &'db dyn Database) -> Member<'db> {
12650 Member::from_syntax_node(db, self.0.lookup(db))
12651 }
12652}
12653impl<'db> From<MemberPtr<'db>> for SyntaxStablePtrId<'db> {
12654 fn from(ptr: MemberPtr<'db>) -> Self {
12655 ptr.untyped()
12656 }
12657}
12658#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12659pub struct MemberGreen<'db>(pub GreenId<'db>);
12660impl<'db> TypedSyntaxNode<'db> for Member<'db> {
12661 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Member);
12662 type StablePtr = MemberPtr<'db>;
12663 type Green = MemberGreen<'db>;
12664 fn missing(db: &'db dyn Database) -> Self::Green {
12665 MemberGreen(
12666 GreenNode {
12667 kind: SyntaxKind::Member,
12668 details: GreenNodeDetails::Node {
12669 children: [
12670 AttributeList::missing(db).0,
12671 Visibility::missing(db).0,
12672 TerminalIdentifier::missing(db).0,
12673 TypeClause::missing(db).0,
12674 ]
12675 .into(),
12676 width: TextWidth::default(),
12677 },
12678 }
12679 .intern(db),
12680 )
12681 }
12682 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12683 let kind = node.kind(db);
12684 assert_eq!(
12685 kind,
12686 SyntaxKind::Member,
12687 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12688 kind,
12689 SyntaxKind::Member
12690 );
12691 Self { node }
12692 }
12693 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12694 let kind = node.kind(db);
12695 if kind == SyntaxKind::Member { Some(Self::from_syntax_node(db, node)) } else { None }
12696 }
12697 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12698 self.node
12699 }
12700 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12701 MemberPtr(self.node.stable_ptr(db))
12702 }
12703}
12704#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12705pub struct MemberList<'db>(ElementList<'db, Member<'db>, 2>);
12706impl<'db> Deref for MemberList<'db> {
12707 type Target = ElementList<'db, Member<'db>, 2>;
12708 fn deref(&self) -> &Self::Target {
12709 &self.0
12710 }
12711}
12712impl<'db> MemberList<'db> {
12713 pub fn new_green(
12714 db: &'db dyn Database,
12715 children: &[MemberListElementOrSeparatorGreen<'db>],
12716 ) -> MemberListGreen<'db> {
12717 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12718 MemberListGreen(
12719 GreenNode {
12720 kind: SyntaxKind::MemberList,
12721 details: GreenNodeDetails::Node {
12722 children: children.iter().map(|x| x.id()).collect(),
12723 width,
12724 },
12725 }
12726 .intern(db),
12727 )
12728 }
12729}
12730#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12731pub struct MemberListPtr<'db>(pub SyntaxStablePtrId<'db>);
12732impl<'db> TypedStablePtr<'db> for MemberListPtr<'db> {
12733 type SyntaxNode = MemberList<'db>;
12734 fn untyped(self) -> SyntaxStablePtrId<'db> {
12735 self.0
12736 }
12737 fn lookup(&self, db: &'db dyn Database) -> MemberList<'db> {
12738 MemberList::from_syntax_node(db, self.0.lookup(db))
12739 }
12740}
12741impl<'db> From<MemberListPtr<'db>> for SyntaxStablePtrId<'db> {
12742 fn from(ptr: MemberListPtr<'db>) -> Self {
12743 ptr.untyped()
12744 }
12745}
12746#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12747pub enum MemberListElementOrSeparatorGreen<'db> {
12748 Separator(TerminalCommaGreen<'db>),
12749 Element(MemberGreen<'db>),
12750}
12751impl<'db> From<TerminalCommaGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12752 fn from(value: TerminalCommaGreen<'db>) -> Self {
12753 MemberListElementOrSeparatorGreen::Separator(value)
12754 }
12755}
12756impl<'db> From<MemberGreen<'db>> for MemberListElementOrSeparatorGreen<'db> {
12757 fn from(value: MemberGreen<'db>) -> Self {
12758 MemberListElementOrSeparatorGreen::Element(value)
12759 }
12760}
12761impl<'db> MemberListElementOrSeparatorGreen<'db> {
12762 fn id(&self) -> GreenId<'db> {
12763 match self {
12764 MemberListElementOrSeparatorGreen::Separator(green) => green.0,
12765 MemberListElementOrSeparatorGreen::Element(green) => green.0,
12766 }
12767 }
12768}
12769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12770pub struct MemberListGreen<'db>(pub GreenId<'db>);
12771impl<'db> TypedSyntaxNode<'db> for MemberList<'db> {
12772 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MemberList);
12773 type StablePtr = MemberListPtr<'db>;
12774 type Green = MemberListGreen<'db>;
12775 fn missing(db: &'db dyn Database) -> Self::Green {
12776 MemberListGreen(
12777 GreenNode {
12778 kind: SyntaxKind::MemberList,
12779 details: GreenNodeDetails::Node {
12780 children: [].into(),
12781 width: TextWidth::default(),
12782 },
12783 }
12784 .intern(db),
12785 )
12786 }
12787 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12788 Self(ElementList::new(node))
12789 }
12790 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12791 if node.kind(db) == SyntaxKind::MemberList {
12792 Some(Self(ElementList::new(node)))
12793 } else {
12794 None
12795 }
12796 }
12797 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12798 self.node
12799 }
12800 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12801 MemberListPtr(self.node.stable_ptr(db))
12802 }
12803}
12804#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12805pub struct Variant<'db> {
12806 node: SyntaxNode<'db>,
12807}
12808impl<'db> Variant<'db> {
12809 pub const INDEX_ATTRIBUTES: usize = 0;
12810 pub const INDEX_NAME: usize = 1;
12811 pub const INDEX_TYPE_CLAUSE: usize = 2;
12812 pub fn new_green(
12813 db: &'db dyn Database,
12814 attributes: AttributeListGreen<'db>,
12815 name: TerminalIdentifierGreen<'db>,
12816 type_clause: OptionTypeClauseGreen<'db>,
12817 ) -> VariantGreen<'db> {
12818 let children = [attributes.0, name.0, type_clause.0];
12819 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
12820 VariantGreen(
12821 GreenNode {
12822 kind: SyntaxKind::Variant,
12823 details: GreenNodeDetails::Node { children: children.into(), width },
12824 }
12825 .intern(db),
12826 )
12827 }
12828}
12829impl<'db> Variant<'db> {
12830 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
12831 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
12832 }
12833 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
12834 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
12835 }
12836 pub fn type_clause(&self, db: &'db dyn Database) -> OptionTypeClause<'db> {
12837 OptionTypeClause::from_syntax_node(db, self.node.get_children(db)[2])
12838 }
12839}
12840#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12841pub struct VariantPtr<'db>(pub SyntaxStablePtrId<'db>);
12842impl<'db> VariantPtr<'db> {
12843 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
12844 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
12845 }
12846}
12847impl<'db> TypedStablePtr<'db> for VariantPtr<'db> {
12848 type SyntaxNode = Variant<'db>;
12849 fn untyped(self) -> SyntaxStablePtrId<'db> {
12850 self.0
12851 }
12852 fn lookup(&self, db: &'db dyn Database) -> Variant<'db> {
12853 Variant::from_syntax_node(db, self.0.lookup(db))
12854 }
12855}
12856impl<'db> From<VariantPtr<'db>> for SyntaxStablePtrId<'db> {
12857 fn from(ptr: VariantPtr<'db>) -> Self {
12858 ptr.untyped()
12859 }
12860}
12861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12862pub struct VariantGreen<'db>(pub GreenId<'db>);
12863impl<'db> TypedSyntaxNode<'db> for Variant<'db> {
12864 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Variant);
12865 type StablePtr = VariantPtr<'db>;
12866 type Green = VariantGreen<'db>;
12867 fn missing(db: &'db dyn Database) -> Self::Green {
12868 VariantGreen(
12869 GreenNode {
12870 kind: SyntaxKind::Variant,
12871 details: GreenNodeDetails::Node {
12872 children: [
12873 AttributeList::missing(db).0,
12874 TerminalIdentifier::missing(db).0,
12875 OptionTypeClause::missing(db).0,
12876 ]
12877 .into(),
12878 width: TextWidth::default(),
12879 },
12880 }
12881 .intern(db),
12882 )
12883 }
12884 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12885 let kind = node.kind(db);
12886 assert_eq!(
12887 kind,
12888 SyntaxKind::Variant,
12889 "Unexpected SyntaxKind {:?}. Expected {:?}.",
12890 kind,
12891 SyntaxKind::Variant
12892 );
12893 Self { node }
12894 }
12895 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12896 let kind = node.kind(db);
12897 if kind == SyntaxKind::Variant { Some(Self::from_syntax_node(db, node)) } else { None }
12898 }
12899 fn as_syntax_node(&self) -> SyntaxNode<'db> {
12900 self.node
12901 }
12902 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
12903 VariantPtr(self.node.stable_ptr(db))
12904 }
12905}
12906#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
12907pub struct VariantList<'db>(ElementList<'db, Variant<'db>, 2>);
12908impl<'db> Deref for VariantList<'db> {
12909 type Target = ElementList<'db, Variant<'db>, 2>;
12910 fn deref(&self) -> &Self::Target {
12911 &self.0
12912 }
12913}
12914impl<'db> VariantList<'db> {
12915 pub fn new_green(
12916 db: &'db dyn Database,
12917 children: &[VariantListElementOrSeparatorGreen<'db>],
12918 ) -> VariantListGreen<'db> {
12919 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
12920 VariantListGreen(
12921 GreenNode {
12922 kind: SyntaxKind::VariantList,
12923 details: GreenNodeDetails::Node {
12924 children: children.iter().map(|x| x.id()).collect(),
12925 width,
12926 },
12927 }
12928 .intern(db),
12929 )
12930 }
12931}
12932#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12933pub struct VariantListPtr<'db>(pub SyntaxStablePtrId<'db>);
12934impl<'db> TypedStablePtr<'db> for VariantListPtr<'db> {
12935 type SyntaxNode = VariantList<'db>;
12936 fn untyped(self) -> SyntaxStablePtrId<'db> {
12937 self.0
12938 }
12939 fn lookup(&self, db: &'db dyn Database) -> VariantList<'db> {
12940 VariantList::from_syntax_node(db, self.0.lookup(db))
12941 }
12942}
12943impl<'db> From<VariantListPtr<'db>> for SyntaxStablePtrId<'db> {
12944 fn from(ptr: VariantListPtr<'db>) -> Self {
12945 ptr.untyped()
12946 }
12947}
12948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12949pub enum VariantListElementOrSeparatorGreen<'db> {
12950 Separator(TerminalCommaGreen<'db>),
12951 Element(VariantGreen<'db>),
12952}
12953impl<'db> From<TerminalCommaGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12954 fn from(value: TerminalCommaGreen<'db>) -> Self {
12955 VariantListElementOrSeparatorGreen::Separator(value)
12956 }
12957}
12958impl<'db> From<VariantGreen<'db>> for VariantListElementOrSeparatorGreen<'db> {
12959 fn from(value: VariantGreen<'db>) -> Self {
12960 VariantListElementOrSeparatorGreen::Element(value)
12961 }
12962}
12963impl<'db> VariantListElementOrSeparatorGreen<'db> {
12964 fn id(&self) -> GreenId<'db> {
12965 match self {
12966 VariantListElementOrSeparatorGreen::Separator(green) => green.0,
12967 VariantListElementOrSeparatorGreen::Element(green) => green.0,
12968 }
12969 }
12970}
12971#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
12972pub struct VariantListGreen<'db>(pub GreenId<'db>);
12973impl<'db> TypedSyntaxNode<'db> for VariantList<'db> {
12974 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VariantList);
12975 type StablePtr = VariantListPtr<'db>;
12976 type Green = VariantListGreen<'db>;
12977 fn missing(db: &'db dyn Database) -> Self::Green {
12978 VariantListGreen(
12979 GreenNode {
12980 kind: SyntaxKind::VariantList,
12981 details: GreenNodeDetails::Node {
12982 children: [].into(),
12983 width: TextWidth::default(),
12984 },
12985 }
12986 .intern(db),
12987 )
12988 }
12989 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
12990 Self(ElementList::new(node))
12991 }
12992 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
12993 if node.kind(db) == SyntaxKind::VariantList {
12994 Some(Self(ElementList::new(node)))
12995 } else {
12996 None
12997 }
12998 }
12999 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13000 self.node
13001 }
13002 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13003 VariantListPtr(self.node.stable_ptr(db))
13004 }
13005}
13006#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13007pub enum ModuleItem<'db> {
13008 Constant(ItemConstant<'db>),
13009 Module(ItemModule<'db>),
13010 Use(ItemUse<'db>),
13011 FreeFunction(FunctionWithBody<'db>),
13012 ExternFunction(ItemExternFunction<'db>),
13013 ExternType(ItemExternType<'db>),
13014 Trait(ItemTrait<'db>),
13015 Impl(ItemImpl<'db>),
13016 ImplAlias(ItemImplAlias<'db>),
13017 Struct(ItemStruct<'db>),
13018 Enum(ItemEnum<'db>),
13019 TypeAlias(ItemTypeAlias<'db>),
13020 InlineMacro(ItemInlineMacro<'db>),
13021 MacroDeclaration(ItemMacroDeclaration<'db>),
13022 HeaderDoc(ItemHeaderDoc<'db>),
13023 Missing(ModuleItemMissing<'db>),
13024}
13025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13026pub struct ModuleItemPtr<'db>(pub SyntaxStablePtrId<'db>);
13027impl<'db> TypedStablePtr<'db> for ModuleItemPtr<'db> {
13028 type SyntaxNode = ModuleItem<'db>;
13029 fn untyped(self) -> SyntaxStablePtrId<'db> {
13030 self.0
13031 }
13032 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13033 ModuleItem::from_syntax_node(db, self.0.lookup(db))
13034 }
13035}
13036impl<'db> From<ModuleItemPtr<'db>> for SyntaxStablePtrId<'db> {
13037 fn from(ptr: ModuleItemPtr<'db>) -> Self {
13038 ptr.untyped()
13039 }
13040}
13041impl<'db> From<ItemConstantPtr<'db>> for ModuleItemPtr<'db> {
13042 fn from(value: ItemConstantPtr<'db>) -> Self {
13043 Self(value.0)
13044 }
13045}
13046impl<'db> From<ItemModulePtr<'db>> for ModuleItemPtr<'db> {
13047 fn from(value: ItemModulePtr<'db>) -> Self {
13048 Self(value.0)
13049 }
13050}
13051impl<'db> From<ItemUsePtr<'db>> for ModuleItemPtr<'db> {
13052 fn from(value: ItemUsePtr<'db>) -> Self {
13053 Self(value.0)
13054 }
13055}
13056impl<'db> From<FunctionWithBodyPtr<'db>> for ModuleItemPtr<'db> {
13057 fn from(value: FunctionWithBodyPtr<'db>) -> Self {
13058 Self(value.0)
13059 }
13060}
13061impl<'db> From<ItemExternFunctionPtr<'db>> for ModuleItemPtr<'db> {
13062 fn from(value: ItemExternFunctionPtr<'db>) -> Self {
13063 Self(value.0)
13064 }
13065}
13066impl<'db> From<ItemExternTypePtr<'db>> for ModuleItemPtr<'db> {
13067 fn from(value: ItemExternTypePtr<'db>) -> Self {
13068 Self(value.0)
13069 }
13070}
13071impl<'db> From<ItemTraitPtr<'db>> for ModuleItemPtr<'db> {
13072 fn from(value: ItemTraitPtr<'db>) -> Self {
13073 Self(value.0)
13074 }
13075}
13076impl<'db> From<ItemImplPtr<'db>> for ModuleItemPtr<'db> {
13077 fn from(value: ItemImplPtr<'db>) -> Self {
13078 Self(value.0)
13079 }
13080}
13081impl<'db> From<ItemImplAliasPtr<'db>> for ModuleItemPtr<'db> {
13082 fn from(value: ItemImplAliasPtr<'db>) -> Self {
13083 Self(value.0)
13084 }
13085}
13086impl<'db> From<ItemStructPtr<'db>> for ModuleItemPtr<'db> {
13087 fn from(value: ItemStructPtr<'db>) -> Self {
13088 Self(value.0)
13089 }
13090}
13091impl<'db> From<ItemEnumPtr<'db>> for ModuleItemPtr<'db> {
13092 fn from(value: ItemEnumPtr<'db>) -> Self {
13093 Self(value.0)
13094 }
13095}
13096impl<'db> From<ItemTypeAliasPtr<'db>> for ModuleItemPtr<'db> {
13097 fn from(value: ItemTypeAliasPtr<'db>) -> Self {
13098 Self(value.0)
13099 }
13100}
13101impl<'db> From<ItemInlineMacroPtr<'db>> for ModuleItemPtr<'db> {
13102 fn from(value: ItemInlineMacroPtr<'db>) -> Self {
13103 Self(value.0)
13104 }
13105}
13106impl<'db> From<ItemMacroDeclarationPtr<'db>> for ModuleItemPtr<'db> {
13107 fn from(value: ItemMacroDeclarationPtr<'db>) -> Self {
13108 Self(value.0)
13109 }
13110}
13111impl<'db> From<ItemHeaderDocPtr<'db>> for ModuleItemPtr<'db> {
13112 fn from(value: ItemHeaderDocPtr<'db>) -> Self {
13113 Self(value.0)
13114 }
13115}
13116impl<'db> From<ModuleItemMissingPtr<'db>> for ModuleItemPtr<'db> {
13117 fn from(value: ModuleItemMissingPtr<'db>) -> Self {
13118 Self(value.0)
13119 }
13120}
13121impl<'db> From<ItemConstantGreen<'db>> for ModuleItemGreen<'db> {
13122 fn from(value: ItemConstantGreen<'db>) -> Self {
13123 Self(value.0)
13124 }
13125}
13126impl<'db> From<ItemModuleGreen<'db>> for ModuleItemGreen<'db> {
13127 fn from(value: ItemModuleGreen<'db>) -> Self {
13128 Self(value.0)
13129 }
13130}
13131impl<'db> From<ItemUseGreen<'db>> for ModuleItemGreen<'db> {
13132 fn from(value: ItemUseGreen<'db>) -> Self {
13133 Self(value.0)
13134 }
13135}
13136impl<'db> From<FunctionWithBodyGreen<'db>> for ModuleItemGreen<'db> {
13137 fn from(value: FunctionWithBodyGreen<'db>) -> Self {
13138 Self(value.0)
13139 }
13140}
13141impl<'db> From<ItemExternFunctionGreen<'db>> for ModuleItemGreen<'db> {
13142 fn from(value: ItemExternFunctionGreen<'db>) -> Self {
13143 Self(value.0)
13144 }
13145}
13146impl<'db> From<ItemExternTypeGreen<'db>> for ModuleItemGreen<'db> {
13147 fn from(value: ItemExternTypeGreen<'db>) -> Self {
13148 Self(value.0)
13149 }
13150}
13151impl<'db> From<ItemTraitGreen<'db>> for ModuleItemGreen<'db> {
13152 fn from(value: ItemTraitGreen<'db>) -> Self {
13153 Self(value.0)
13154 }
13155}
13156impl<'db> From<ItemImplGreen<'db>> for ModuleItemGreen<'db> {
13157 fn from(value: ItemImplGreen<'db>) -> Self {
13158 Self(value.0)
13159 }
13160}
13161impl<'db> From<ItemImplAliasGreen<'db>> for ModuleItemGreen<'db> {
13162 fn from(value: ItemImplAliasGreen<'db>) -> Self {
13163 Self(value.0)
13164 }
13165}
13166impl<'db> From<ItemStructGreen<'db>> for ModuleItemGreen<'db> {
13167 fn from(value: ItemStructGreen<'db>) -> Self {
13168 Self(value.0)
13169 }
13170}
13171impl<'db> From<ItemEnumGreen<'db>> for ModuleItemGreen<'db> {
13172 fn from(value: ItemEnumGreen<'db>) -> Self {
13173 Self(value.0)
13174 }
13175}
13176impl<'db> From<ItemTypeAliasGreen<'db>> for ModuleItemGreen<'db> {
13177 fn from(value: ItemTypeAliasGreen<'db>) -> Self {
13178 Self(value.0)
13179 }
13180}
13181impl<'db> From<ItemInlineMacroGreen<'db>> for ModuleItemGreen<'db> {
13182 fn from(value: ItemInlineMacroGreen<'db>) -> Self {
13183 Self(value.0)
13184 }
13185}
13186impl<'db> From<ItemMacroDeclarationGreen<'db>> for ModuleItemGreen<'db> {
13187 fn from(value: ItemMacroDeclarationGreen<'db>) -> Self {
13188 Self(value.0)
13189 }
13190}
13191impl<'db> From<ItemHeaderDocGreen<'db>> for ModuleItemGreen<'db> {
13192 fn from(value: ItemHeaderDocGreen<'db>) -> Self {
13193 Self(value.0)
13194 }
13195}
13196impl<'db> From<ModuleItemMissingGreen<'db>> for ModuleItemGreen<'db> {
13197 fn from(value: ModuleItemMissingGreen<'db>) -> Self {
13198 Self(value.0)
13199 }
13200}
13201#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13202pub struct ModuleItemGreen<'db>(pub GreenId<'db>);
13203impl<'db> TypedSyntaxNode<'db> for ModuleItem<'db> {
13204 const OPTIONAL_KIND: Option<SyntaxKind> = None;
13205 type StablePtr = ModuleItemPtr<'db>;
13206 type Green = ModuleItemGreen<'db>;
13207 fn missing(db: &'db dyn Database) -> Self::Green {
13208 ModuleItemGreen(ModuleItemMissing::missing(db).0)
13209 }
13210 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13211 let kind = node.kind(db);
13212 match kind {
13213 SyntaxKind::ItemConstant => {
13214 ModuleItem::Constant(ItemConstant::from_syntax_node(db, node))
13215 }
13216 SyntaxKind::ItemModule => ModuleItem::Module(ItemModule::from_syntax_node(db, node)),
13217 SyntaxKind::ItemUse => ModuleItem::Use(ItemUse::from_syntax_node(db, node)),
13218 SyntaxKind::FunctionWithBody => {
13219 ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node))
13220 }
13221 SyntaxKind::ItemExternFunction => {
13222 ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
13223 }
13224 SyntaxKind::ItemExternType => {
13225 ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node))
13226 }
13227 SyntaxKind::ItemTrait => ModuleItem::Trait(ItemTrait::from_syntax_node(db, node)),
13228 SyntaxKind::ItemImpl => ModuleItem::Impl(ItemImpl::from_syntax_node(db, node)),
13229 SyntaxKind::ItemImplAlias => {
13230 ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node))
13231 }
13232 SyntaxKind::ItemStruct => ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)),
13233 SyntaxKind::ItemEnum => ModuleItem::Enum(ItemEnum::from_syntax_node(db, node)),
13234 SyntaxKind::ItemTypeAlias => {
13235 ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node))
13236 }
13237 SyntaxKind::ItemInlineMacro => {
13238 ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node))
13239 }
13240 SyntaxKind::ItemMacroDeclaration => {
13241 ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node))
13242 }
13243 SyntaxKind::ItemHeaderDoc => {
13244 ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node))
13245 }
13246 SyntaxKind::ModuleItemMissing => {
13247 ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node))
13248 }
13249 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ModuleItem"),
13250 }
13251 }
13252 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13253 let kind = node.kind(db);
13254 match kind {
13255 SyntaxKind::ItemConstant => {
13256 Some(ModuleItem::Constant(ItemConstant::from_syntax_node(db, node)))
13257 }
13258 SyntaxKind::ItemModule => {
13259 Some(ModuleItem::Module(ItemModule::from_syntax_node(db, node)))
13260 }
13261 SyntaxKind::ItemUse => Some(ModuleItem::Use(ItemUse::from_syntax_node(db, node))),
13262 SyntaxKind::FunctionWithBody => {
13263 Some(ModuleItem::FreeFunction(FunctionWithBody::from_syntax_node(db, node)))
13264 }
13265 SyntaxKind::ItemExternFunction => {
13266 Some(ModuleItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
13267 }
13268 SyntaxKind::ItemExternType => {
13269 Some(ModuleItem::ExternType(ItemExternType::from_syntax_node(db, node)))
13270 }
13271 SyntaxKind::ItemTrait => Some(ModuleItem::Trait(ItemTrait::from_syntax_node(db, node))),
13272 SyntaxKind::ItemImpl => Some(ModuleItem::Impl(ItemImpl::from_syntax_node(db, node))),
13273 SyntaxKind::ItemImplAlias => {
13274 Some(ModuleItem::ImplAlias(ItemImplAlias::from_syntax_node(db, node)))
13275 }
13276 SyntaxKind::ItemStruct => {
13277 Some(ModuleItem::Struct(ItemStruct::from_syntax_node(db, node)))
13278 }
13279 SyntaxKind::ItemEnum => Some(ModuleItem::Enum(ItemEnum::from_syntax_node(db, node))),
13280 SyntaxKind::ItemTypeAlias => {
13281 Some(ModuleItem::TypeAlias(ItemTypeAlias::from_syntax_node(db, node)))
13282 }
13283 SyntaxKind::ItemInlineMacro => {
13284 Some(ModuleItem::InlineMacro(ItemInlineMacro::from_syntax_node(db, node)))
13285 }
13286 SyntaxKind::ItemMacroDeclaration => {
13287 Some(ModuleItem::MacroDeclaration(ItemMacroDeclaration::from_syntax_node(db, node)))
13288 }
13289 SyntaxKind::ItemHeaderDoc => {
13290 Some(ModuleItem::HeaderDoc(ItemHeaderDoc::from_syntax_node(db, node)))
13291 }
13292 SyntaxKind::ModuleItemMissing => {
13293 Some(ModuleItem::Missing(ModuleItemMissing::from_syntax_node(db, node)))
13294 }
13295 _ => None,
13296 }
13297 }
13298 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13299 match self {
13300 ModuleItem::Constant(x) => x.as_syntax_node(),
13301 ModuleItem::Module(x) => x.as_syntax_node(),
13302 ModuleItem::Use(x) => x.as_syntax_node(),
13303 ModuleItem::FreeFunction(x) => x.as_syntax_node(),
13304 ModuleItem::ExternFunction(x) => x.as_syntax_node(),
13305 ModuleItem::ExternType(x) => x.as_syntax_node(),
13306 ModuleItem::Trait(x) => x.as_syntax_node(),
13307 ModuleItem::Impl(x) => x.as_syntax_node(),
13308 ModuleItem::ImplAlias(x) => x.as_syntax_node(),
13309 ModuleItem::Struct(x) => x.as_syntax_node(),
13310 ModuleItem::Enum(x) => x.as_syntax_node(),
13311 ModuleItem::TypeAlias(x) => x.as_syntax_node(),
13312 ModuleItem::InlineMacro(x) => x.as_syntax_node(),
13313 ModuleItem::MacroDeclaration(x) => x.as_syntax_node(),
13314 ModuleItem::HeaderDoc(x) => x.as_syntax_node(),
13315 ModuleItem::Missing(x) => x.as_syntax_node(),
13316 }
13317 }
13318 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13319 ModuleItemPtr(self.as_syntax_node().stable_ptr(db))
13320 }
13321}
13322impl<'db> ModuleItem<'db> {
13323 pub fn is_variant(kind: SyntaxKind) -> bool {
13325 matches!(
13326 kind,
13327 SyntaxKind::ItemConstant
13328 | SyntaxKind::ItemModule
13329 | SyntaxKind::ItemUse
13330 | SyntaxKind::FunctionWithBody
13331 | SyntaxKind::ItemExternFunction
13332 | SyntaxKind::ItemExternType
13333 | SyntaxKind::ItemTrait
13334 | SyntaxKind::ItemImpl
13335 | SyntaxKind::ItemImplAlias
13336 | SyntaxKind::ItemStruct
13337 | SyntaxKind::ItemEnum
13338 | SyntaxKind::ItemTypeAlias
13339 | SyntaxKind::ItemInlineMacro
13340 | SyntaxKind::ItemMacroDeclaration
13341 | SyntaxKind::ItemHeaderDoc
13342 | SyntaxKind::ModuleItemMissing
13343 )
13344 }
13345}
13346#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13347pub struct ModuleItemList<'db>(ElementList<'db, ModuleItem<'db>, 1>);
13348impl<'db> Deref for ModuleItemList<'db> {
13349 type Target = ElementList<'db, ModuleItem<'db>, 1>;
13350 fn deref(&self) -> &Self::Target {
13351 &self.0
13352 }
13353}
13354impl<'db> ModuleItemList<'db> {
13355 pub fn new_green(
13356 db: &'db dyn Database,
13357 children: &[ModuleItemGreen<'db>],
13358 ) -> ModuleItemListGreen<'db> {
13359 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13360 ModuleItemListGreen(
13361 GreenNode {
13362 kind: SyntaxKind::ModuleItemList,
13363 details: GreenNodeDetails::Node {
13364 children: children.iter().map(|x| x.0).collect(),
13365 width,
13366 },
13367 }
13368 .intern(db),
13369 )
13370 }
13371}
13372#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13373pub struct ModuleItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
13374impl<'db> TypedStablePtr<'db> for ModuleItemListPtr<'db> {
13375 type SyntaxNode = ModuleItemList<'db>;
13376 fn untyped(self) -> SyntaxStablePtrId<'db> {
13377 self.0
13378 }
13379 fn lookup(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
13380 ModuleItemList::from_syntax_node(db, self.0.lookup(db))
13381 }
13382}
13383impl<'db> From<ModuleItemListPtr<'db>> for SyntaxStablePtrId<'db> {
13384 fn from(ptr: ModuleItemListPtr<'db>) -> Self {
13385 ptr.untyped()
13386 }
13387}
13388#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13389pub struct ModuleItemListGreen<'db>(pub GreenId<'db>);
13390impl<'db> TypedSyntaxNode<'db> for ModuleItemList<'db> {
13391 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemList);
13392 type StablePtr = ModuleItemListPtr<'db>;
13393 type Green = ModuleItemListGreen<'db>;
13394 fn missing(db: &'db dyn Database) -> Self::Green {
13395 ModuleItemListGreen(
13396 GreenNode {
13397 kind: SyntaxKind::ModuleItemList,
13398 details: GreenNodeDetails::Node {
13399 children: [].into(),
13400 width: TextWidth::default(),
13401 },
13402 }
13403 .intern(db),
13404 )
13405 }
13406 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13407 Self(ElementList::new(node))
13408 }
13409 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13410 if node.kind(db) == SyntaxKind::ModuleItemList {
13411 Some(Self(ElementList::new(node)))
13412 } else {
13413 None
13414 }
13415 }
13416 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13417 self.node
13418 }
13419 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13420 ModuleItemListPtr(self.node.stable_ptr(db))
13421 }
13422}
13423#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13424pub struct ModuleItemMissing<'db> {
13425 node: SyntaxNode<'db>,
13426}
13427impl<'db> ModuleItemMissing<'db> {
13428 pub fn new_green(db: &'db dyn Database) -> ModuleItemMissingGreen<'db> {
13429 let children = [];
13430 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13431 ModuleItemMissingGreen(
13432 GreenNode {
13433 kind: SyntaxKind::ModuleItemMissing,
13434 details: GreenNodeDetails::Node { children: children.into(), width },
13435 }
13436 .intern(db),
13437 )
13438 }
13439}
13440impl<'db> ModuleItemMissing<'db> {}
13441#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13442pub struct ModuleItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
13443impl<'db> ModuleItemMissingPtr<'db> {}
13444impl<'db> TypedStablePtr<'db> for ModuleItemMissingPtr<'db> {
13445 type SyntaxNode = ModuleItemMissing<'db>;
13446 fn untyped(self) -> SyntaxStablePtrId<'db> {
13447 self.0
13448 }
13449 fn lookup(&self, db: &'db dyn Database) -> ModuleItemMissing<'db> {
13450 ModuleItemMissing::from_syntax_node(db, self.0.lookup(db))
13451 }
13452}
13453impl<'db> From<ModuleItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
13454 fn from(ptr: ModuleItemMissingPtr<'db>) -> Self {
13455 ptr.untyped()
13456 }
13457}
13458#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13459pub struct ModuleItemMissingGreen<'db>(pub GreenId<'db>);
13460impl<'db> TypedSyntaxNode<'db> for ModuleItemMissing<'db> {
13461 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleItemMissing);
13462 type StablePtr = ModuleItemMissingPtr<'db>;
13463 type Green = ModuleItemMissingGreen<'db>;
13464 fn missing(db: &'db dyn Database) -> Self::Green {
13465 ModuleItemMissingGreen(
13466 GreenNode {
13467 kind: SyntaxKind::ModuleItemMissing,
13468 details: GreenNodeDetails::Node {
13469 children: [].into(),
13470 width: TextWidth::default(),
13471 },
13472 }
13473 .intern(db),
13474 )
13475 }
13476 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13477 let kind = node.kind(db);
13478 assert_eq!(
13479 kind,
13480 SyntaxKind::ModuleItemMissing,
13481 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13482 kind,
13483 SyntaxKind::ModuleItemMissing
13484 );
13485 Self { node }
13486 }
13487 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13488 let kind = node.kind(db);
13489 if kind == SyntaxKind::ModuleItemMissing {
13490 Some(Self::from_syntax_node(db, node))
13491 } else {
13492 None
13493 }
13494 }
13495 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13496 self.node
13497 }
13498 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13499 ModuleItemMissingPtr(self.node.stable_ptr(db))
13500 }
13501}
13502#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13503pub struct Attribute<'db> {
13504 node: SyntaxNode<'db>,
13505}
13506impl<'db> Attribute<'db> {
13507 pub const INDEX_HASH: usize = 0;
13508 pub const INDEX_LBRACK: usize = 1;
13509 pub const INDEX_ATTR: usize = 2;
13510 pub const INDEX_ARGUMENTS: usize = 3;
13511 pub const INDEX_RBRACK: usize = 4;
13512 pub fn new_green(
13513 db: &'db dyn Database,
13514 hash: TerminalHashGreen<'db>,
13515 lbrack: TerminalLBrackGreen<'db>,
13516 attr: ExprPathGreen<'db>,
13517 arguments: OptionArgListParenthesizedGreen<'db>,
13518 rbrack: TerminalRBrackGreen<'db>,
13519 ) -> AttributeGreen<'db> {
13520 let children = [hash.0, lbrack.0, attr.0, arguments.0, rbrack.0];
13521 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13522 AttributeGreen(
13523 GreenNode {
13524 kind: SyntaxKind::Attribute,
13525 details: GreenNodeDetails::Node { children: children.into(), width },
13526 }
13527 .intern(db),
13528 )
13529 }
13530}
13531impl<'db> Attribute<'db> {
13532 pub fn hash(&self, db: &'db dyn Database) -> TerminalHash<'db> {
13533 TerminalHash::from_syntax_node(db, self.node.get_children(db)[0])
13534 }
13535 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
13536 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[1])
13537 }
13538 pub fn attr(&self, db: &'db dyn Database) -> ExprPath<'db> {
13539 ExprPath::from_syntax_node(db, self.node.get_children(db)[2])
13540 }
13541 pub fn arguments(&self, db: &'db dyn Database) -> OptionArgListParenthesized<'db> {
13542 OptionArgListParenthesized::from_syntax_node(db, self.node.get_children(db)[3])
13543 }
13544 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
13545 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[4])
13546 }
13547}
13548#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13549pub struct AttributePtr<'db>(pub SyntaxStablePtrId<'db>);
13550impl<'db> AttributePtr<'db> {}
13551impl<'db> TypedStablePtr<'db> for AttributePtr<'db> {
13552 type SyntaxNode = Attribute<'db>;
13553 fn untyped(self) -> SyntaxStablePtrId<'db> {
13554 self.0
13555 }
13556 fn lookup(&self, db: &'db dyn Database) -> Attribute<'db> {
13557 Attribute::from_syntax_node(db, self.0.lookup(db))
13558 }
13559}
13560impl<'db> From<AttributePtr<'db>> for SyntaxStablePtrId<'db> {
13561 fn from(ptr: AttributePtr<'db>) -> Self {
13562 ptr.untyped()
13563 }
13564}
13565#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13566pub struct AttributeGreen<'db>(pub GreenId<'db>);
13567impl<'db> TypedSyntaxNode<'db> for Attribute<'db> {
13568 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::Attribute);
13569 type StablePtr = AttributePtr<'db>;
13570 type Green = AttributeGreen<'db>;
13571 fn missing(db: &'db dyn Database) -> Self::Green {
13572 AttributeGreen(
13573 GreenNode {
13574 kind: SyntaxKind::Attribute,
13575 details: GreenNodeDetails::Node {
13576 children: [
13577 TerminalHash::missing(db).0,
13578 TerminalLBrack::missing(db).0,
13579 ExprPath::missing(db).0,
13580 OptionArgListParenthesized::missing(db).0,
13581 TerminalRBrack::missing(db).0,
13582 ]
13583 .into(),
13584 width: TextWidth::default(),
13585 },
13586 }
13587 .intern(db),
13588 )
13589 }
13590 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13591 let kind = node.kind(db);
13592 assert_eq!(
13593 kind,
13594 SyntaxKind::Attribute,
13595 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13596 kind,
13597 SyntaxKind::Attribute
13598 );
13599 Self { node }
13600 }
13601 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13602 let kind = node.kind(db);
13603 if kind == SyntaxKind::Attribute { Some(Self::from_syntax_node(db, node)) } else { None }
13604 }
13605 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13606 self.node
13607 }
13608 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13609 AttributePtr(self.node.stable_ptr(db))
13610 }
13611}
13612#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13613pub struct AttributeList<'db>(ElementList<'db, Attribute<'db>, 1>);
13614impl<'db> Deref for AttributeList<'db> {
13615 type Target = ElementList<'db, Attribute<'db>, 1>;
13616 fn deref(&self) -> &Self::Target {
13617 &self.0
13618 }
13619}
13620impl<'db> AttributeList<'db> {
13621 pub fn new_green(
13622 db: &'db dyn Database,
13623 children: &[AttributeGreen<'db>],
13624 ) -> AttributeListGreen<'db> {
13625 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
13626 AttributeListGreen(
13627 GreenNode {
13628 kind: SyntaxKind::AttributeList,
13629 details: GreenNodeDetails::Node {
13630 children: children.iter().map(|x| x.0).collect(),
13631 width,
13632 },
13633 }
13634 .intern(db),
13635 )
13636 }
13637}
13638#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13639pub struct AttributeListPtr<'db>(pub SyntaxStablePtrId<'db>);
13640impl<'db> TypedStablePtr<'db> for AttributeListPtr<'db> {
13641 type SyntaxNode = AttributeList<'db>;
13642 fn untyped(self) -> SyntaxStablePtrId<'db> {
13643 self.0
13644 }
13645 fn lookup(&self, db: &'db dyn Database) -> AttributeList<'db> {
13646 AttributeList::from_syntax_node(db, self.0.lookup(db))
13647 }
13648}
13649impl<'db> From<AttributeListPtr<'db>> for SyntaxStablePtrId<'db> {
13650 fn from(ptr: AttributeListPtr<'db>) -> Self {
13651 ptr.untyped()
13652 }
13653}
13654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13655pub struct AttributeListGreen<'db>(pub GreenId<'db>);
13656impl<'db> TypedSyntaxNode<'db> for AttributeList<'db> {
13657 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AttributeList);
13658 type StablePtr = AttributeListPtr<'db>;
13659 type Green = AttributeListGreen<'db>;
13660 fn missing(db: &'db dyn Database) -> Self::Green {
13661 AttributeListGreen(
13662 GreenNode {
13663 kind: SyntaxKind::AttributeList,
13664 details: GreenNodeDetails::Node {
13665 children: [].into(),
13666 width: TextWidth::default(),
13667 },
13668 }
13669 .intern(db),
13670 )
13671 }
13672 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13673 Self(ElementList::new(node))
13674 }
13675 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13676 if node.kind(db) == SyntaxKind::AttributeList {
13677 Some(Self(ElementList::new(node)))
13678 } else {
13679 None
13680 }
13681 }
13682 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13683 self.node
13684 }
13685 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13686 AttributeListPtr(self.node.stable_ptr(db))
13687 }
13688}
13689#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13690pub struct VisibilityDefault<'db> {
13691 node: SyntaxNode<'db>,
13692}
13693impl<'db> VisibilityDefault<'db> {
13694 pub fn new_green(db: &'db dyn Database) -> VisibilityDefaultGreen<'db> {
13695 let children = [];
13696 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13697 VisibilityDefaultGreen(
13698 GreenNode {
13699 kind: SyntaxKind::VisibilityDefault,
13700 details: GreenNodeDetails::Node { children: children.into(), width },
13701 }
13702 .intern(db),
13703 )
13704 }
13705}
13706impl<'db> VisibilityDefault<'db> {}
13707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13708pub struct VisibilityDefaultPtr<'db>(pub SyntaxStablePtrId<'db>);
13709impl<'db> VisibilityDefaultPtr<'db> {}
13710impl<'db> TypedStablePtr<'db> for VisibilityDefaultPtr<'db> {
13711 type SyntaxNode = VisibilityDefault<'db>;
13712 fn untyped(self) -> SyntaxStablePtrId<'db> {
13713 self.0
13714 }
13715 fn lookup(&self, db: &'db dyn Database) -> VisibilityDefault<'db> {
13716 VisibilityDefault::from_syntax_node(db, self.0.lookup(db))
13717 }
13718}
13719impl<'db> From<VisibilityDefaultPtr<'db>> for SyntaxStablePtrId<'db> {
13720 fn from(ptr: VisibilityDefaultPtr<'db>) -> Self {
13721 ptr.untyped()
13722 }
13723}
13724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13725pub struct VisibilityDefaultGreen<'db>(pub GreenId<'db>);
13726impl<'db> TypedSyntaxNode<'db> for VisibilityDefault<'db> {
13727 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityDefault);
13728 type StablePtr = VisibilityDefaultPtr<'db>;
13729 type Green = VisibilityDefaultGreen<'db>;
13730 fn missing(db: &'db dyn Database) -> Self::Green {
13731 VisibilityDefaultGreen(
13732 GreenNode {
13733 kind: SyntaxKind::VisibilityDefault,
13734 details: GreenNodeDetails::Node {
13735 children: [].into(),
13736 width: TextWidth::default(),
13737 },
13738 }
13739 .intern(db),
13740 )
13741 }
13742 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13743 let kind = node.kind(db);
13744 assert_eq!(
13745 kind,
13746 SyntaxKind::VisibilityDefault,
13747 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13748 kind,
13749 SyntaxKind::VisibilityDefault
13750 );
13751 Self { node }
13752 }
13753 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13754 let kind = node.kind(db);
13755 if kind == SyntaxKind::VisibilityDefault {
13756 Some(Self::from_syntax_node(db, node))
13757 } else {
13758 None
13759 }
13760 }
13761 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13762 self.node
13763 }
13764 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13765 VisibilityDefaultPtr(self.node.stable_ptr(db))
13766 }
13767}
13768#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13769pub struct VisibilityPubArgumentClause<'db> {
13770 node: SyntaxNode<'db>,
13771}
13772impl<'db> VisibilityPubArgumentClause<'db> {
13773 pub const INDEX_LPAREN: usize = 0;
13774 pub const INDEX_ARGUMENT: usize = 1;
13775 pub const INDEX_RPAREN: usize = 2;
13776 pub fn new_green(
13777 db: &'db dyn Database,
13778 lparen: TerminalLParenGreen<'db>,
13779 argument: TerminalIdentifierGreen<'db>,
13780 rparen: TerminalRParenGreen<'db>,
13781 ) -> VisibilityPubArgumentClauseGreen<'db> {
13782 let children = [lparen.0, argument.0, rparen.0];
13783 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13784 VisibilityPubArgumentClauseGreen(
13785 GreenNode {
13786 kind: SyntaxKind::VisibilityPubArgumentClause,
13787 details: GreenNodeDetails::Node { children: children.into(), width },
13788 }
13789 .intern(db),
13790 )
13791 }
13792}
13793impl<'db> VisibilityPubArgumentClause<'db> {
13794 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
13795 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
13796 }
13797 pub fn argument(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
13798 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
13799 }
13800 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
13801 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
13802 }
13803}
13804#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13805pub struct VisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13806impl<'db> VisibilityPubArgumentClausePtr<'db> {}
13807impl<'db> TypedStablePtr<'db> for VisibilityPubArgumentClausePtr<'db> {
13808 type SyntaxNode = VisibilityPubArgumentClause<'db>;
13809 fn untyped(self) -> SyntaxStablePtrId<'db> {
13810 self.0
13811 }
13812 fn lookup(&self, db: &'db dyn Database) -> VisibilityPubArgumentClause<'db> {
13813 VisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13814 }
13815}
13816impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13817 fn from(ptr: VisibilityPubArgumentClausePtr<'db>) -> Self {
13818 ptr.untyped()
13819 }
13820}
13821#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13822pub struct VisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13823impl<'db> TypedSyntaxNode<'db> for VisibilityPubArgumentClause<'db> {
13824 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPubArgumentClause);
13825 type StablePtr = VisibilityPubArgumentClausePtr<'db>;
13826 type Green = VisibilityPubArgumentClauseGreen<'db>;
13827 fn missing(db: &'db dyn Database) -> Self::Green {
13828 VisibilityPubArgumentClauseGreen(
13829 GreenNode {
13830 kind: SyntaxKind::VisibilityPubArgumentClause,
13831 details: GreenNodeDetails::Node {
13832 children: [
13833 TerminalLParen::missing(db).0,
13834 TerminalIdentifier::missing(db).0,
13835 TerminalRParen::missing(db).0,
13836 ]
13837 .into(),
13838 width: TextWidth::default(),
13839 },
13840 }
13841 .intern(db),
13842 )
13843 }
13844 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13845 let kind = node.kind(db);
13846 assert_eq!(
13847 kind,
13848 SyntaxKind::VisibilityPubArgumentClause,
13849 "Unexpected SyntaxKind {:?}. Expected {:?}.",
13850 kind,
13851 SyntaxKind::VisibilityPubArgumentClause
13852 );
13853 Self { node }
13854 }
13855 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13856 let kind = node.kind(db);
13857 if kind == SyntaxKind::VisibilityPubArgumentClause {
13858 Some(Self::from_syntax_node(db, node))
13859 } else {
13860 None
13861 }
13862 }
13863 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13864 self.node
13865 }
13866 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13867 VisibilityPubArgumentClausePtr(self.node.stable_ptr(db))
13868 }
13869}
13870#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13871pub enum OptionVisibilityPubArgumentClause<'db> {
13872 Empty(OptionVisibilityPubArgumentClauseEmpty<'db>),
13873 VisibilityPubArgumentClause(VisibilityPubArgumentClause<'db>),
13874}
13875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13876pub struct OptionVisibilityPubArgumentClausePtr<'db>(pub SyntaxStablePtrId<'db>);
13877impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClausePtr<'db> {
13878 type SyntaxNode = OptionVisibilityPubArgumentClause<'db>;
13879 fn untyped(self) -> SyntaxStablePtrId<'db> {
13880 self.0
13881 }
13882 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
13883 OptionVisibilityPubArgumentClause::from_syntax_node(db, self.0.lookup(db))
13884 }
13885}
13886impl<'db> From<OptionVisibilityPubArgumentClausePtr<'db>> for SyntaxStablePtrId<'db> {
13887 fn from(ptr: OptionVisibilityPubArgumentClausePtr<'db>) -> Self {
13888 ptr.untyped()
13889 }
13890}
13891impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>>
13892 for OptionVisibilityPubArgumentClausePtr<'db>
13893{
13894 fn from(value: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
13895 Self(value.0)
13896 }
13897}
13898impl<'db> From<VisibilityPubArgumentClausePtr<'db>> for OptionVisibilityPubArgumentClausePtr<'db> {
13899 fn from(value: VisibilityPubArgumentClausePtr<'db>) -> Self {
13900 Self(value.0)
13901 }
13902}
13903impl<'db> From<OptionVisibilityPubArgumentClauseEmptyGreen<'db>>
13904 for OptionVisibilityPubArgumentClauseGreen<'db>
13905{
13906 fn from(value: OptionVisibilityPubArgumentClauseEmptyGreen<'db>) -> Self {
13907 Self(value.0)
13908 }
13909}
13910impl<'db> From<VisibilityPubArgumentClauseGreen<'db>>
13911 for OptionVisibilityPubArgumentClauseGreen<'db>
13912{
13913 fn from(value: VisibilityPubArgumentClauseGreen<'db>) -> Self {
13914 Self(value.0)
13915 }
13916}
13917#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
13918pub struct OptionVisibilityPubArgumentClauseGreen<'db>(pub GreenId<'db>);
13919impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClause<'db> {
13920 const OPTIONAL_KIND: Option<SyntaxKind> = None;
13921 type StablePtr = OptionVisibilityPubArgumentClausePtr<'db>;
13922 type Green = OptionVisibilityPubArgumentClauseGreen<'db>;
13923 fn missing(db: &'db dyn Database) -> Self::Green {
13924 panic!("No missing variant.");
13925 }
13926 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
13927 let kind = node.kind(db);
13928 match kind {
13929 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13930 OptionVisibilityPubArgumentClause::Empty(
13931 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13932 )
13933 }
13934 SyntaxKind::VisibilityPubArgumentClause => {
13935 OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13936 VisibilityPubArgumentClause::from_syntax_node(db, node),
13937 )
13938 }
13939 _ => panic!(
13940 "Unexpected syntax kind {:?} when constructing {}.",
13941 kind, "OptionVisibilityPubArgumentClause"
13942 ),
13943 }
13944 }
13945 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
13946 let kind = node.kind(db);
13947 match kind {
13948 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty => {
13949 Some(OptionVisibilityPubArgumentClause::Empty(
13950 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, node),
13951 ))
13952 }
13953 SyntaxKind::VisibilityPubArgumentClause => {
13954 Some(OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(
13955 VisibilityPubArgumentClause::from_syntax_node(db, node),
13956 ))
13957 }
13958 _ => None,
13959 }
13960 }
13961 fn as_syntax_node(&self) -> SyntaxNode<'db> {
13962 match self {
13963 OptionVisibilityPubArgumentClause::Empty(x) => x.as_syntax_node(),
13964 OptionVisibilityPubArgumentClause::VisibilityPubArgumentClause(x) => x.as_syntax_node(),
13965 }
13966 }
13967 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
13968 OptionVisibilityPubArgumentClausePtr(self.as_syntax_node().stable_ptr(db))
13969 }
13970}
13971impl<'db> OptionVisibilityPubArgumentClause<'db> {
13972 pub fn is_variant(kind: SyntaxKind) -> bool {
13974 matches!(
13975 kind,
13976 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
13977 | SyntaxKind::VisibilityPubArgumentClause
13978 )
13979 }
13980}
13981#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
13982pub struct OptionVisibilityPubArgumentClauseEmpty<'db> {
13983 node: SyntaxNode<'db>,
13984}
13985impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {
13986 pub fn new_green(db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmptyGreen<'db> {
13987 let children = [];
13988 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
13989 OptionVisibilityPubArgumentClauseEmptyGreen(
13990 GreenNode {
13991 kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
13992 details: GreenNodeDetails::Node { children: children.into(), width },
13993 }
13994 .intern(db),
13995 )
13996 }
13997}
13998impl<'db> OptionVisibilityPubArgumentClauseEmpty<'db> {}
13999#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14000pub struct OptionVisibilityPubArgumentClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
14001impl<'db> OptionVisibilityPubArgumentClauseEmptyPtr<'db> {}
14002impl<'db> TypedStablePtr<'db> for OptionVisibilityPubArgumentClauseEmptyPtr<'db> {
14003 type SyntaxNode = OptionVisibilityPubArgumentClauseEmpty<'db>;
14004 fn untyped(self) -> SyntaxStablePtrId<'db> {
14005 self.0
14006 }
14007 fn lookup(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClauseEmpty<'db> {
14008 OptionVisibilityPubArgumentClauseEmpty::from_syntax_node(db, self.0.lookup(db))
14009 }
14010}
14011impl<'db> From<OptionVisibilityPubArgumentClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
14012 fn from(ptr: OptionVisibilityPubArgumentClauseEmptyPtr<'db>) -> Self {
14013 ptr.untyped()
14014 }
14015}
14016#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14017pub struct OptionVisibilityPubArgumentClauseEmptyGreen<'db>(pub GreenId<'db>);
14018impl<'db> TypedSyntaxNode<'db> for OptionVisibilityPubArgumentClauseEmpty<'db> {
14019 const OPTIONAL_KIND: Option<SyntaxKind> =
14020 Some(SyntaxKind::OptionVisibilityPubArgumentClauseEmpty);
14021 type StablePtr = OptionVisibilityPubArgumentClauseEmptyPtr<'db>;
14022 type Green = OptionVisibilityPubArgumentClauseEmptyGreen<'db>;
14023 fn missing(db: &'db dyn Database) -> Self::Green {
14024 OptionVisibilityPubArgumentClauseEmptyGreen(
14025 GreenNode {
14026 kind: SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14027 details: GreenNodeDetails::Node {
14028 children: [].into(),
14029 width: TextWidth::default(),
14030 },
14031 }
14032 .intern(db),
14033 )
14034 }
14035 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14036 let kind = node.kind(db);
14037 assert_eq!(
14038 kind,
14039 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty,
14040 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14041 kind,
14042 SyntaxKind::OptionVisibilityPubArgumentClauseEmpty
14043 );
14044 Self { node }
14045 }
14046 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14047 let kind = node.kind(db);
14048 if kind == SyntaxKind::OptionVisibilityPubArgumentClauseEmpty {
14049 Some(Self::from_syntax_node(db, node))
14050 } else {
14051 None
14052 }
14053 }
14054 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14055 self.node
14056 }
14057 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14058 OptionVisibilityPubArgumentClauseEmptyPtr(self.node.stable_ptr(db))
14059 }
14060}
14061#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14062pub struct VisibilityPub<'db> {
14063 node: SyntaxNode<'db>,
14064}
14065impl<'db> VisibilityPub<'db> {
14066 pub const INDEX_PUB_KW: usize = 0;
14067 pub const INDEX_ARGUMENT_CLAUSE: usize = 1;
14068 pub fn new_green(
14069 db: &'db dyn Database,
14070 pub_kw: TerminalPubGreen<'db>,
14071 argument_clause: OptionVisibilityPubArgumentClauseGreen<'db>,
14072 ) -> VisibilityPubGreen<'db> {
14073 let children = [pub_kw.0, argument_clause.0];
14074 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14075 VisibilityPubGreen(
14076 GreenNode {
14077 kind: SyntaxKind::VisibilityPub,
14078 details: GreenNodeDetails::Node { children: children.into(), width },
14079 }
14080 .intern(db),
14081 )
14082 }
14083}
14084impl<'db> VisibilityPub<'db> {
14085 pub fn pub_kw(&self, db: &'db dyn Database) -> TerminalPub<'db> {
14086 TerminalPub::from_syntax_node(db, self.node.get_children(db)[0])
14087 }
14088 pub fn argument_clause(&self, db: &'db dyn Database) -> OptionVisibilityPubArgumentClause<'db> {
14089 OptionVisibilityPubArgumentClause::from_syntax_node(db, self.node.get_children(db)[1])
14090 }
14091}
14092#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14093pub struct VisibilityPubPtr<'db>(pub SyntaxStablePtrId<'db>);
14094impl<'db> VisibilityPubPtr<'db> {}
14095impl<'db> TypedStablePtr<'db> for VisibilityPubPtr<'db> {
14096 type SyntaxNode = VisibilityPub<'db>;
14097 fn untyped(self) -> SyntaxStablePtrId<'db> {
14098 self.0
14099 }
14100 fn lookup(&self, db: &'db dyn Database) -> VisibilityPub<'db> {
14101 VisibilityPub::from_syntax_node(db, self.0.lookup(db))
14102 }
14103}
14104impl<'db> From<VisibilityPubPtr<'db>> for SyntaxStablePtrId<'db> {
14105 fn from(ptr: VisibilityPubPtr<'db>) -> Self {
14106 ptr.untyped()
14107 }
14108}
14109#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14110pub struct VisibilityPubGreen<'db>(pub GreenId<'db>);
14111impl<'db> TypedSyntaxNode<'db> for VisibilityPub<'db> {
14112 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::VisibilityPub);
14113 type StablePtr = VisibilityPubPtr<'db>;
14114 type Green = VisibilityPubGreen<'db>;
14115 fn missing(db: &'db dyn Database) -> Self::Green {
14116 VisibilityPubGreen(
14117 GreenNode {
14118 kind: SyntaxKind::VisibilityPub,
14119 details: GreenNodeDetails::Node {
14120 children: [
14121 TerminalPub::missing(db).0,
14122 OptionVisibilityPubArgumentClause::missing(db).0,
14123 ]
14124 .into(),
14125 width: TextWidth::default(),
14126 },
14127 }
14128 .intern(db),
14129 )
14130 }
14131 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14132 let kind = node.kind(db);
14133 assert_eq!(
14134 kind,
14135 SyntaxKind::VisibilityPub,
14136 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14137 kind,
14138 SyntaxKind::VisibilityPub
14139 );
14140 Self { node }
14141 }
14142 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14143 let kind = node.kind(db);
14144 if kind == SyntaxKind::VisibilityPub {
14145 Some(Self::from_syntax_node(db, node))
14146 } else {
14147 None
14148 }
14149 }
14150 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14151 self.node
14152 }
14153 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14154 VisibilityPubPtr(self.node.stable_ptr(db))
14155 }
14156}
14157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14158pub enum Visibility<'db> {
14159 Default(VisibilityDefault<'db>),
14160 Pub(VisibilityPub<'db>),
14161}
14162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14163pub struct VisibilityPtr<'db>(pub SyntaxStablePtrId<'db>);
14164impl<'db> TypedStablePtr<'db> for VisibilityPtr<'db> {
14165 type SyntaxNode = Visibility<'db>;
14166 fn untyped(self) -> SyntaxStablePtrId<'db> {
14167 self.0
14168 }
14169 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14170 Visibility::from_syntax_node(db, self.0.lookup(db))
14171 }
14172}
14173impl<'db> From<VisibilityPtr<'db>> for SyntaxStablePtrId<'db> {
14174 fn from(ptr: VisibilityPtr<'db>) -> Self {
14175 ptr.untyped()
14176 }
14177}
14178impl<'db> From<VisibilityDefaultPtr<'db>> for VisibilityPtr<'db> {
14179 fn from(value: VisibilityDefaultPtr<'db>) -> Self {
14180 Self(value.0)
14181 }
14182}
14183impl<'db> From<VisibilityPubPtr<'db>> for VisibilityPtr<'db> {
14184 fn from(value: VisibilityPubPtr<'db>) -> Self {
14185 Self(value.0)
14186 }
14187}
14188impl<'db> From<VisibilityDefaultGreen<'db>> for VisibilityGreen<'db> {
14189 fn from(value: VisibilityDefaultGreen<'db>) -> Self {
14190 Self(value.0)
14191 }
14192}
14193impl<'db> From<VisibilityPubGreen<'db>> for VisibilityGreen<'db> {
14194 fn from(value: VisibilityPubGreen<'db>) -> Self {
14195 Self(value.0)
14196 }
14197}
14198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14199pub struct VisibilityGreen<'db>(pub GreenId<'db>);
14200impl<'db> TypedSyntaxNode<'db> for Visibility<'db> {
14201 const OPTIONAL_KIND: Option<SyntaxKind> = None;
14202 type StablePtr = VisibilityPtr<'db>;
14203 type Green = VisibilityGreen<'db>;
14204 fn missing(db: &'db dyn Database) -> Self::Green {
14205 panic!("No missing variant.");
14206 }
14207 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14208 let kind = node.kind(db);
14209 match kind {
14210 SyntaxKind::VisibilityDefault => {
14211 Visibility::Default(VisibilityDefault::from_syntax_node(db, node))
14212 }
14213 SyntaxKind::VisibilityPub => Visibility::Pub(VisibilityPub::from_syntax_node(db, node)),
14214 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "Visibility"),
14215 }
14216 }
14217 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14218 let kind = node.kind(db);
14219 match kind {
14220 SyntaxKind::VisibilityDefault => {
14221 Some(Visibility::Default(VisibilityDefault::from_syntax_node(db, node)))
14222 }
14223 SyntaxKind::VisibilityPub => {
14224 Some(Visibility::Pub(VisibilityPub::from_syntax_node(db, node)))
14225 }
14226 _ => None,
14227 }
14228 }
14229 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14230 match self {
14231 Visibility::Default(x) => x.as_syntax_node(),
14232 Visibility::Pub(x) => x.as_syntax_node(),
14233 }
14234 }
14235 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14236 VisibilityPtr(self.as_syntax_node().stable_ptr(db))
14237 }
14238}
14239impl<'db> Visibility<'db> {
14240 pub fn is_variant(kind: SyntaxKind) -> bool {
14242 matches!(kind, SyntaxKind::VisibilityDefault | SyntaxKind::VisibilityPub)
14243 }
14244}
14245#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14246pub struct ItemModule<'db> {
14247 node: SyntaxNode<'db>,
14248}
14249impl<'db> ItemModule<'db> {
14250 pub const INDEX_ATTRIBUTES: usize = 0;
14251 pub const INDEX_VISIBILITY: usize = 1;
14252 pub const INDEX_MODULE_KW: usize = 2;
14253 pub const INDEX_NAME: usize = 3;
14254 pub const INDEX_BODY: usize = 4;
14255 pub fn new_green(
14256 db: &'db dyn Database,
14257 attributes: AttributeListGreen<'db>,
14258 visibility: VisibilityGreen<'db>,
14259 module_kw: TerminalModuleGreen<'db>,
14260 name: TerminalIdentifierGreen<'db>,
14261 body: MaybeModuleBodyGreen<'db>,
14262 ) -> ItemModuleGreen<'db> {
14263 let children = [attributes.0, visibility.0, module_kw.0, name.0, body.0];
14264 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14265 ItemModuleGreen(
14266 GreenNode {
14267 kind: SyntaxKind::ItemModule,
14268 details: GreenNodeDetails::Node { children: children.into(), width },
14269 }
14270 .intern(db),
14271 )
14272 }
14273}
14274impl<'db> ItemModule<'db> {
14275 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14276 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14277 }
14278 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14279 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14280 }
14281 pub fn module_kw(&self, db: &'db dyn Database) -> TerminalModule<'db> {
14282 TerminalModule::from_syntax_node(db, self.node.get_children(db)[2])
14283 }
14284 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14285 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14286 }
14287 pub fn body(&self, db: &'db dyn Database) -> MaybeModuleBody<'db> {
14288 MaybeModuleBody::from_syntax_node(db, self.node.get_children(db)[4])
14289 }
14290}
14291#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14292pub struct ItemModulePtr<'db>(pub SyntaxStablePtrId<'db>);
14293impl<'db> ItemModulePtr<'db> {
14294 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14295 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14296 }
14297}
14298impl<'db> TypedStablePtr<'db> for ItemModulePtr<'db> {
14299 type SyntaxNode = ItemModule<'db>;
14300 fn untyped(self) -> SyntaxStablePtrId<'db> {
14301 self.0
14302 }
14303 fn lookup(&self, db: &'db dyn Database) -> ItemModule<'db> {
14304 ItemModule::from_syntax_node(db, self.0.lookup(db))
14305 }
14306}
14307impl<'db> From<ItemModulePtr<'db>> for SyntaxStablePtrId<'db> {
14308 fn from(ptr: ItemModulePtr<'db>) -> Self {
14309 ptr.untyped()
14310 }
14311}
14312#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14313pub struct ItemModuleGreen<'db>(pub GreenId<'db>);
14314impl<'db> TypedSyntaxNode<'db> for ItemModule<'db> {
14315 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemModule);
14316 type StablePtr = ItemModulePtr<'db>;
14317 type Green = ItemModuleGreen<'db>;
14318 fn missing(db: &'db dyn Database) -> Self::Green {
14319 ItemModuleGreen(
14320 GreenNode {
14321 kind: SyntaxKind::ItemModule,
14322 details: GreenNodeDetails::Node {
14323 children: [
14324 AttributeList::missing(db).0,
14325 Visibility::missing(db).0,
14326 TerminalModule::missing(db).0,
14327 TerminalIdentifier::missing(db).0,
14328 MaybeModuleBody::missing(db).0,
14329 ]
14330 .into(),
14331 width: TextWidth::default(),
14332 },
14333 }
14334 .intern(db),
14335 )
14336 }
14337 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14338 let kind = node.kind(db);
14339 assert_eq!(
14340 kind,
14341 SyntaxKind::ItemModule,
14342 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14343 kind,
14344 SyntaxKind::ItemModule
14345 );
14346 Self { node }
14347 }
14348 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14349 let kind = node.kind(db);
14350 if kind == SyntaxKind::ItemModule { Some(Self::from_syntax_node(db, node)) } else { None }
14351 }
14352 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14353 self.node
14354 }
14355 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14356 ItemModulePtr(self.node.stable_ptr(db))
14357 }
14358}
14359#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14360pub enum MaybeModuleBody<'db> {
14361 Some(ModuleBody<'db>),
14362 None(TerminalSemicolon<'db>),
14363}
14364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14365pub struct MaybeModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14366impl<'db> TypedStablePtr<'db> for MaybeModuleBodyPtr<'db> {
14367 type SyntaxNode = MaybeModuleBody<'db>;
14368 fn untyped(self) -> SyntaxStablePtrId<'db> {
14369 self.0
14370 }
14371 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
14372 MaybeModuleBody::from_syntax_node(db, self.0.lookup(db))
14373 }
14374}
14375impl<'db> From<MaybeModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14376 fn from(ptr: MaybeModuleBodyPtr<'db>) -> Self {
14377 ptr.untyped()
14378 }
14379}
14380impl<'db> From<ModuleBodyPtr<'db>> for MaybeModuleBodyPtr<'db> {
14381 fn from(value: ModuleBodyPtr<'db>) -> Self {
14382 Self(value.0)
14383 }
14384}
14385impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeModuleBodyPtr<'db> {
14386 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
14387 Self(value.0)
14388 }
14389}
14390impl<'db> From<ModuleBodyGreen<'db>> for MaybeModuleBodyGreen<'db> {
14391 fn from(value: ModuleBodyGreen<'db>) -> Self {
14392 Self(value.0)
14393 }
14394}
14395impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeModuleBodyGreen<'db> {
14396 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
14397 Self(value.0)
14398 }
14399}
14400#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14401pub struct MaybeModuleBodyGreen<'db>(pub GreenId<'db>);
14402impl<'db> TypedSyntaxNode<'db> for MaybeModuleBody<'db> {
14403 const OPTIONAL_KIND: Option<SyntaxKind> = None;
14404 type StablePtr = MaybeModuleBodyPtr<'db>;
14405 type Green = MaybeModuleBodyGreen<'db>;
14406 fn missing(db: &'db dyn Database) -> Self::Green {
14407 panic!("No missing variant.");
14408 }
14409 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14410 let kind = node.kind(db);
14411 match kind {
14412 SyntaxKind::ModuleBody => MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)),
14413 SyntaxKind::TerminalSemicolon => {
14414 MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node))
14415 }
14416 _ => {
14417 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeModuleBody")
14418 }
14419 }
14420 }
14421 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14422 let kind = node.kind(db);
14423 match kind {
14424 SyntaxKind::ModuleBody => {
14425 Some(MaybeModuleBody::Some(ModuleBody::from_syntax_node(db, node)))
14426 }
14427 SyntaxKind::TerminalSemicolon => {
14428 Some(MaybeModuleBody::None(TerminalSemicolon::from_syntax_node(db, node)))
14429 }
14430 _ => None,
14431 }
14432 }
14433 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14434 match self {
14435 MaybeModuleBody::Some(x) => x.as_syntax_node(),
14436 MaybeModuleBody::None(x) => x.as_syntax_node(),
14437 }
14438 }
14439 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14440 MaybeModuleBodyPtr(self.as_syntax_node().stable_ptr(db))
14441 }
14442}
14443impl<'db> MaybeModuleBody<'db> {
14444 pub fn is_variant(kind: SyntaxKind) -> bool {
14446 matches!(kind, SyntaxKind::ModuleBody | SyntaxKind::TerminalSemicolon)
14447 }
14448}
14449#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14450pub struct ModuleBody<'db> {
14451 node: SyntaxNode<'db>,
14452}
14453impl<'db> ModuleBody<'db> {
14454 pub const INDEX_LBRACE: usize = 0;
14455 pub const INDEX_ITEMS: usize = 1;
14456 pub const INDEX_RBRACE: usize = 2;
14457 pub fn new_green(
14458 db: &'db dyn Database,
14459 lbrace: TerminalLBraceGreen<'db>,
14460 items: ModuleItemListGreen<'db>,
14461 rbrace: TerminalRBraceGreen<'db>,
14462 ) -> ModuleBodyGreen<'db> {
14463 let children = [lbrace.0, items.0, rbrace.0];
14464 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14465 ModuleBodyGreen(
14466 GreenNode {
14467 kind: SyntaxKind::ModuleBody,
14468 details: GreenNodeDetails::Node { children: children.into(), width },
14469 }
14470 .intern(db),
14471 )
14472 }
14473}
14474impl<'db> ModuleBody<'db> {
14475 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
14476 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
14477 }
14478 pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
14479 ModuleItemList::from_syntax_node(db, self.node.get_children(db)[1])
14480 }
14481 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
14482 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
14483 }
14484}
14485#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14486pub struct ModuleBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14487impl<'db> ModuleBodyPtr<'db> {}
14488impl<'db> TypedStablePtr<'db> for ModuleBodyPtr<'db> {
14489 type SyntaxNode = ModuleBody<'db>;
14490 fn untyped(self) -> SyntaxStablePtrId<'db> {
14491 self.0
14492 }
14493 fn lookup(&self, db: &'db dyn Database) -> ModuleBody<'db> {
14494 ModuleBody::from_syntax_node(db, self.0.lookup(db))
14495 }
14496}
14497impl<'db> From<ModuleBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14498 fn from(ptr: ModuleBodyPtr<'db>) -> Self {
14499 ptr.untyped()
14500 }
14501}
14502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14503pub struct ModuleBodyGreen<'db>(pub GreenId<'db>);
14504impl<'db> TypedSyntaxNode<'db> for ModuleBody<'db> {
14505 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ModuleBody);
14506 type StablePtr = ModuleBodyPtr<'db>;
14507 type Green = ModuleBodyGreen<'db>;
14508 fn missing(db: &'db dyn Database) -> Self::Green {
14509 ModuleBodyGreen(
14510 GreenNode {
14511 kind: SyntaxKind::ModuleBody,
14512 details: GreenNodeDetails::Node {
14513 children: [
14514 TerminalLBrace::missing(db).0,
14515 ModuleItemList::missing(db).0,
14516 TerminalRBrace::missing(db).0,
14517 ]
14518 .into(),
14519 width: TextWidth::default(),
14520 },
14521 }
14522 .intern(db),
14523 )
14524 }
14525 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14526 let kind = node.kind(db);
14527 assert_eq!(
14528 kind,
14529 SyntaxKind::ModuleBody,
14530 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14531 kind,
14532 SyntaxKind::ModuleBody
14533 );
14534 Self { node }
14535 }
14536 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14537 let kind = node.kind(db);
14538 if kind == SyntaxKind::ModuleBody { Some(Self::from_syntax_node(db, node)) } else { None }
14539 }
14540 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14541 self.node
14542 }
14543 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14544 ModuleBodyPtr(self.node.stable_ptr(db))
14545 }
14546}
14547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14548pub struct FunctionDeclaration<'db> {
14549 node: SyntaxNode<'db>,
14550}
14551impl<'db> FunctionDeclaration<'db> {
14552 pub const INDEX_OPTIONAL_CONST: usize = 0;
14553 pub const INDEX_FUNCTION_KW: usize = 1;
14554 pub const INDEX_NAME: usize = 2;
14555 pub const INDEX_GENERIC_PARAMS: usize = 3;
14556 pub const INDEX_SIGNATURE: usize = 4;
14557 pub fn new_green(
14558 db: &'db dyn Database,
14559 optional_const: OptionTerminalConstGreen<'db>,
14560 function_kw: TerminalFunctionGreen<'db>,
14561 name: TerminalIdentifierGreen<'db>,
14562 generic_params: OptionWrappedGenericParamListGreen<'db>,
14563 signature: FunctionSignatureGreen<'db>,
14564 ) -> FunctionDeclarationGreen<'db> {
14565 let children = [optional_const.0, function_kw.0, name.0, generic_params.0, signature.0];
14566 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14567 FunctionDeclarationGreen(
14568 GreenNode {
14569 kind: SyntaxKind::FunctionDeclaration,
14570 details: GreenNodeDetails::Node { children: children.into(), width },
14571 }
14572 .intern(db),
14573 )
14574 }
14575}
14576impl<'db> FunctionDeclaration<'db> {
14577 pub fn optional_const(&self, db: &'db dyn Database) -> OptionTerminalConst<'db> {
14578 OptionTerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
14579 }
14580 pub fn function_kw(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
14581 TerminalFunction::from_syntax_node(db, self.node.get_children(db)[1])
14582 }
14583 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14584 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
14585 }
14586 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
14587 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
14588 }
14589 pub fn signature(&self, db: &'db dyn Database) -> FunctionSignature<'db> {
14590 FunctionSignature::from_syntax_node(db, self.node.get_children(db)[4])
14591 }
14592}
14593#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14594pub struct FunctionDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
14595impl<'db> FunctionDeclarationPtr<'db> {
14596 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14597 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14598 }
14599}
14600impl<'db> TypedStablePtr<'db> for FunctionDeclarationPtr<'db> {
14601 type SyntaxNode = FunctionDeclaration<'db>;
14602 fn untyped(self) -> SyntaxStablePtrId<'db> {
14603 self.0
14604 }
14605 fn lookup(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14606 FunctionDeclaration::from_syntax_node(db, self.0.lookup(db))
14607 }
14608}
14609impl<'db> From<FunctionDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
14610 fn from(ptr: FunctionDeclarationPtr<'db>) -> Self {
14611 ptr.untyped()
14612 }
14613}
14614#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14615pub struct FunctionDeclarationGreen<'db>(pub GreenId<'db>);
14616impl<'db> TypedSyntaxNode<'db> for FunctionDeclaration<'db> {
14617 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionDeclaration);
14618 type StablePtr = FunctionDeclarationPtr<'db>;
14619 type Green = FunctionDeclarationGreen<'db>;
14620 fn missing(db: &'db dyn Database) -> Self::Green {
14621 FunctionDeclarationGreen(
14622 GreenNode {
14623 kind: SyntaxKind::FunctionDeclaration,
14624 details: GreenNodeDetails::Node {
14625 children: [
14626 OptionTerminalConst::missing(db).0,
14627 TerminalFunction::missing(db).0,
14628 TerminalIdentifier::missing(db).0,
14629 OptionWrappedGenericParamList::missing(db).0,
14630 FunctionSignature::missing(db).0,
14631 ]
14632 .into(),
14633 width: TextWidth::default(),
14634 },
14635 }
14636 .intern(db),
14637 )
14638 }
14639 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14640 let kind = node.kind(db);
14641 assert_eq!(
14642 kind,
14643 SyntaxKind::FunctionDeclaration,
14644 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14645 kind,
14646 SyntaxKind::FunctionDeclaration
14647 );
14648 Self { node }
14649 }
14650 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14651 let kind = node.kind(db);
14652 if kind == SyntaxKind::FunctionDeclaration {
14653 Some(Self::from_syntax_node(db, node))
14654 } else {
14655 None
14656 }
14657 }
14658 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14659 self.node
14660 }
14661 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14662 FunctionDeclarationPtr(self.node.stable_ptr(db))
14663 }
14664}
14665#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14666pub struct ItemConstant<'db> {
14667 node: SyntaxNode<'db>,
14668}
14669impl<'db> ItemConstant<'db> {
14670 pub const INDEX_ATTRIBUTES: usize = 0;
14671 pub const INDEX_VISIBILITY: usize = 1;
14672 pub const INDEX_CONST_KW: usize = 2;
14673 pub const INDEX_NAME: usize = 3;
14674 pub const INDEX_TYPE_CLAUSE: usize = 4;
14675 pub const INDEX_EQ: usize = 5;
14676 pub const INDEX_VALUE: usize = 6;
14677 pub const INDEX_SEMICOLON: usize = 7;
14678 pub fn new_green(
14679 db: &'db dyn Database,
14680 attributes: AttributeListGreen<'db>,
14681 visibility: VisibilityGreen<'db>,
14682 const_kw: TerminalConstGreen<'db>,
14683 name: TerminalIdentifierGreen<'db>,
14684 type_clause: TypeClauseGreen<'db>,
14685 eq: TerminalEqGreen<'db>,
14686 value: ExprGreen<'db>,
14687 semicolon: TerminalSemicolonGreen<'db>,
14688 ) -> ItemConstantGreen<'db> {
14689 let children = [
14690 attributes.0,
14691 visibility.0,
14692 const_kw.0,
14693 name.0,
14694 type_clause.0,
14695 eq.0,
14696 value.0,
14697 semicolon.0,
14698 ];
14699 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14700 ItemConstantGreen(
14701 GreenNode {
14702 kind: SyntaxKind::ItemConstant,
14703 details: GreenNodeDetails::Node { children: children.into(), width },
14704 }
14705 .intern(db),
14706 )
14707 }
14708}
14709impl<'db> ItemConstant<'db> {
14710 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14711 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14712 }
14713 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14714 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14715 }
14716 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
14717 TerminalConst::from_syntax_node(db, self.node.get_children(db)[2])
14718 }
14719 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
14720 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
14721 }
14722 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
14723 TypeClause::from_syntax_node(db, self.node.get_children(db)[4])
14724 }
14725 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
14726 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
14727 }
14728 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
14729 Expr::from_syntax_node(db, self.node.get_children(db)[6])
14730 }
14731 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14732 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
14733 }
14734}
14735#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14736pub struct ItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
14737impl<'db> ItemConstantPtr<'db> {
14738 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
14739 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
14740 }
14741}
14742impl<'db> TypedStablePtr<'db> for ItemConstantPtr<'db> {
14743 type SyntaxNode = ItemConstant<'db>;
14744 fn untyped(self) -> SyntaxStablePtrId<'db> {
14745 self.0
14746 }
14747 fn lookup(&self, db: &'db dyn Database) -> ItemConstant<'db> {
14748 ItemConstant::from_syntax_node(db, self.0.lookup(db))
14749 }
14750}
14751impl<'db> From<ItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
14752 fn from(ptr: ItemConstantPtr<'db>) -> Self {
14753 ptr.untyped()
14754 }
14755}
14756#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14757pub struct ItemConstantGreen<'db>(pub GreenId<'db>);
14758impl<'db> TypedSyntaxNode<'db> for ItemConstant<'db> {
14759 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemConstant);
14760 type StablePtr = ItemConstantPtr<'db>;
14761 type Green = ItemConstantGreen<'db>;
14762 fn missing(db: &'db dyn Database) -> Self::Green {
14763 ItemConstantGreen(
14764 GreenNode {
14765 kind: SyntaxKind::ItemConstant,
14766 details: GreenNodeDetails::Node {
14767 children: [
14768 AttributeList::missing(db).0,
14769 Visibility::missing(db).0,
14770 TerminalConst::missing(db).0,
14771 TerminalIdentifier::missing(db).0,
14772 TypeClause::missing(db).0,
14773 TerminalEq::missing(db).0,
14774 Expr::missing(db).0,
14775 TerminalSemicolon::missing(db).0,
14776 ]
14777 .into(),
14778 width: TextWidth::default(),
14779 },
14780 }
14781 .intern(db),
14782 )
14783 }
14784 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14785 let kind = node.kind(db);
14786 assert_eq!(
14787 kind,
14788 SyntaxKind::ItemConstant,
14789 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14790 kind,
14791 SyntaxKind::ItemConstant
14792 );
14793 Self { node }
14794 }
14795 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14796 let kind = node.kind(db);
14797 if kind == SyntaxKind::ItemConstant { Some(Self::from_syntax_node(db, node)) } else { None }
14798 }
14799 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14800 self.node
14801 }
14802 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14803 ItemConstantPtr(self.node.stable_ptr(db))
14804 }
14805}
14806#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14807pub struct FunctionWithBody<'db> {
14808 node: SyntaxNode<'db>,
14809}
14810impl<'db> FunctionWithBody<'db> {
14811 pub const INDEX_ATTRIBUTES: usize = 0;
14812 pub const INDEX_VISIBILITY: usize = 1;
14813 pub const INDEX_DECLARATION: usize = 2;
14814 pub const INDEX_BODY: usize = 3;
14815 pub fn new_green(
14816 db: &'db dyn Database,
14817 attributes: AttributeListGreen<'db>,
14818 visibility: VisibilityGreen<'db>,
14819 declaration: FunctionDeclarationGreen<'db>,
14820 body: ExprBlockGreen<'db>,
14821 ) -> FunctionWithBodyGreen<'db> {
14822 let children = [attributes.0, visibility.0, declaration.0, body.0];
14823 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14824 FunctionWithBodyGreen(
14825 GreenNode {
14826 kind: SyntaxKind::FunctionWithBody,
14827 details: GreenNodeDetails::Node { children: children.into(), width },
14828 }
14829 .intern(db),
14830 )
14831 }
14832}
14833impl<'db> FunctionWithBody<'db> {
14834 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14835 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14836 }
14837 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14838 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14839 }
14840 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14841 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[2])
14842 }
14843 pub fn body(&self, db: &'db dyn Database) -> ExprBlock<'db> {
14844 ExprBlock::from_syntax_node(db, self.node.get_children(db)[3])
14845 }
14846}
14847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14848pub struct FunctionWithBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
14849impl<'db> FunctionWithBodyPtr<'db> {
14850 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14851 FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14852 }
14853}
14854impl<'db> TypedStablePtr<'db> for FunctionWithBodyPtr<'db> {
14855 type SyntaxNode = FunctionWithBody<'db>;
14856 fn untyped(self) -> SyntaxStablePtrId<'db> {
14857 self.0
14858 }
14859 fn lookup(&self, db: &'db dyn Database) -> FunctionWithBody<'db> {
14860 FunctionWithBody::from_syntax_node(db, self.0.lookup(db))
14861 }
14862}
14863impl<'db> From<FunctionWithBodyPtr<'db>> for SyntaxStablePtrId<'db> {
14864 fn from(ptr: FunctionWithBodyPtr<'db>) -> Self {
14865 ptr.untyped()
14866 }
14867}
14868#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14869pub struct FunctionWithBodyGreen<'db>(pub GreenId<'db>);
14870impl<'db> TypedSyntaxNode<'db> for FunctionWithBody<'db> {
14871 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::FunctionWithBody);
14872 type StablePtr = FunctionWithBodyPtr<'db>;
14873 type Green = FunctionWithBodyGreen<'db>;
14874 fn missing(db: &'db dyn Database) -> Self::Green {
14875 FunctionWithBodyGreen(
14876 GreenNode {
14877 kind: SyntaxKind::FunctionWithBody,
14878 details: GreenNodeDetails::Node {
14879 children: [
14880 AttributeList::missing(db).0,
14881 Visibility::missing(db).0,
14882 FunctionDeclaration::missing(db).0,
14883 ExprBlock::missing(db).0,
14884 ]
14885 .into(),
14886 width: TextWidth::default(),
14887 },
14888 }
14889 .intern(db),
14890 )
14891 }
14892 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
14893 let kind = node.kind(db);
14894 assert_eq!(
14895 kind,
14896 SyntaxKind::FunctionWithBody,
14897 "Unexpected SyntaxKind {:?}. Expected {:?}.",
14898 kind,
14899 SyntaxKind::FunctionWithBody
14900 );
14901 Self { node }
14902 }
14903 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
14904 let kind = node.kind(db);
14905 if kind == SyntaxKind::FunctionWithBody {
14906 Some(Self::from_syntax_node(db, node))
14907 } else {
14908 None
14909 }
14910 }
14911 fn as_syntax_node(&self) -> SyntaxNode<'db> {
14912 self.node
14913 }
14914 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
14915 FunctionWithBodyPtr(self.node.stable_ptr(db))
14916 }
14917}
14918#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
14919pub struct ItemExternFunction<'db> {
14920 node: SyntaxNode<'db>,
14921}
14922impl<'db> ItemExternFunction<'db> {
14923 pub const INDEX_ATTRIBUTES: usize = 0;
14924 pub const INDEX_VISIBILITY: usize = 1;
14925 pub const INDEX_EXTERN_KW: usize = 2;
14926 pub const INDEX_DECLARATION: usize = 3;
14927 pub const INDEX_SEMICOLON: usize = 4;
14928 pub fn new_green(
14929 db: &'db dyn Database,
14930 attributes: AttributeListGreen<'db>,
14931 visibility: VisibilityGreen<'db>,
14932 extern_kw: TerminalExternGreen<'db>,
14933 declaration: FunctionDeclarationGreen<'db>,
14934 semicolon: TerminalSemicolonGreen<'db>,
14935 ) -> ItemExternFunctionGreen<'db> {
14936 let children = [attributes.0, visibility.0, extern_kw.0, declaration.0, semicolon.0];
14937 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
14938 ItemExternFunctionGreen(
14939 GreenNode {
14940 kind: SyntaxKind::ItemExternFunction,
14941 details: GreenNodeDetails::Node { children: children.into(), width },
14942 }
14943 .intern(db),
14944 )
14945 }
14946}
14947impl<'db> ItemExternFunction<'db> {
14948 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
14949 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
14950 }
14951 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
14952 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
14953 }
14954 pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
14955 TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
14956 }
14957 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
14958 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[3])
14959 }
14960 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
14961 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
14962 }
14963}
14964#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14965pub struct ItemExternFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
14966impl<'db> ItemExternFunctionPtr<'db> {
14967 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
14968 FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
14969 }
14970}
14971impl<'db> TypedStablePtr<'db> for ItemExternFunctionPtr<'db> {
14972 type SyntaxNode = ItemExternFunction<'db>;
14973 fn untyped(self) -> SyntaxStablePtrId<'db> {
14974 self.0
14975 }
14976 fn lookup(&self, db: &'db dyn Database) -> ItemExternFunction<'db> {
14977 ItemExternFunction::from_syntax_node(db, self.0.lookup(db))
14978 }
14979}
14980impl<'db> From<ItemExternFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
14981 fn from(ptr: ItemExternFunctionPtr<'db>) -> Self {
14982 ptr.untyped()
14983 }
14984}
14985#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
14986pub struct ItemExternFunctionGreen<'db>(pub GreenId<'db>);
14987impl<'db> TypedSyntaxNode<'db> for ItemExternFunction<'db> {
14988 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternFunction);
14989 type StablePtr = ItemExternFunctionPtr<'db>;
14990 type Green = ItemExternFunctionGreen<'db>;
14991 fn missing(db: &'db dyn Database) -> Self::Green {
14992 ItemExternFunctionGreen(
14993 GreenNode {
14994 kind: SyntaxKind::ItemExternFunction,
14995 details: GreenNodeDetails::Node {
14996 children: [
14997 AttributeList::missing(db).0,
14998 Visibility::missing(db).0,
14999 TerminalExtern::missing(db).0,
15000 FunctionDeclaration::missing(db).0,
15001 TerminalSemicolon::missing(db).0,
15002 ]
15003 .into(),
15004 width: TextWidth::default(),
15005 },
15006 }
15007 .intern(db),
15008 )
15009 }
15010 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15011 let kind = node.kind(db);
15012 assert_eq!(
15013 kind,
15014 SyntaxKind::ItemExternFunction,
15015 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15016 kind,
15017 SyntaxKind::ItemExternFunction
15018 );
15019 Self { node }
15020 }
15021 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15022 let kind = node.kind(db);
15023 if kind == SyntaxKind::ItemExternFunction {
15024 Some(Self::from_syntax_node(db, node))
15025 } else {
15026 None
15027 }
15028 }
15029 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15030 self.node
15031 }
15032 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15033 ItemExternFunctionPtr(self.node.stable_ptr(db))
15034 }
15035}
15036#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15037pub struct ItemExternType<'db> {
15038 node: SyntaxNode<'db>,
15039}
15040impl<'db> ItemExternType<'db> {
15041 pub const INDEX_ATTRIBUTES: usize = 0;
15042 pub const INDEX_VISIBILITY: usize = 1;
15043 pub const INDEX_EXTERN_KW: usize = 2;
15044 pub const INDEX_TYPE_KW: usize = 3;
15045 pub const INDEX_NAME: usize = 4;
15046 pub const INDEX_GENERIC_PARAMS: usize = 5;
15047 pub const INDEX_SEMICOLON: usize = 6;
15048 pub fn new_green(
15049 db: &'db dyn Database,
15050 attributes: AttributeListGreen<'db>,
15051 visibility: VisibilityGreen<'db>,
15052 extern_kw: TerminalExternGreen<'db>,
15053 type_kw: TerminalTypeGreen<'db>,
15054 name: TerminalIdentifierGreen<'db>,
15055 generic_params: OptionWrappedGenericParamListGreen<'db>,
15056 semicolon: TerminalSemicolonGreen<'db>,
15057 ) -> ItemExternTypeGreen<'db> {
15058 let children = [
15059 attributes.0,
15060 visibility.0,
15061 extern_kw.0,
15062 type_kw.0,
15063 name.0,
15064 generic_params.0,
15065 semicolon.0,
15066 ];
15067 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15068 ItemExternTypeGreen(
15069 GreenNode {
15070 kind: SyntaxKind::ItemExternType,
15071 details: GreenNodeDetails::Node { children: children.into(), width },
15072 }
15073 .intern(db),
15074 )
15075 }
15076}
15077impl<'db> ItemExternType<'db> {
15078 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15079 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15080 }
15081 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15082 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15083 }
15084 pub fn extern_kw(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
15085 TerminalExtern::from_syntax_node(db, self.node.get_children(db)[2])
15086 }
15087 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15088 TerminalType::from_syntax_node(db, self.node.get_children(db)[3])
15089 }
15090 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15091 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[4])
15092 }
15093 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15094 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[5])
15095 }
15096 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15097 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[6])
15098 }
15099}
15100#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15101pub struct ItemExternTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15102impl<'db> ItemExternTypePtr<'db> {
15103 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15104 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15105 }
15106}
15107impl<'db> TypedStablePtr<'db> for ItemExternTypePtr<'db> {
15108 type SyntaxNode = ItemExternType<'db>;
15109 fn untyped(self) -> SyntaxStablePtrId<'db> {
15110 self.0
15111 }
15112 fn lookup(&self, db: &'db dyn Database) -> ItemExternType<'db> {
15113 ItemExternType::from_syntax_node(db, self.0.lookup(db))
15114 }
15115}
15116impl<'db> From<ItemExternTypePtr<'db>> for SyntaxStablePtrId<'db> {
15117 fn from(ptr: ItemExternTypePtr<'db>) -> Self {
15118 ptr.untyped()
15119 }
15120}
15121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15122pub struct ItemExternTypeGreen<'db>(pub GreenId<'db>);
15123impl<'db> TypedSyntaxNode<'db> for ItemExternType<'db> {
15124 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemExternType);
15125 type StablePtr = ItemExternTypePtr<'db>;
15126 type Green = ItemExternTypeGreen<'db>;
15127 fn missing(db: &'db dyn Database) -> Self::Green {
15128 ItemExternTypeGreen(
15129 GreenNode {
15130 kind: SyntaxKind::ItemExternType,
15131 details: GreenNodeDetails::Node {
15132 children: [
15133 AttributeList::missing(db).0,
15134 Visibility::missing(db).0,
15135 TerminalExtern::missing(db).0,
15136 TerminalType::missing(db).0,
15137 TerminalIdentifier::missing(db).0,
15138 OptionWrappedGenericParamList::missing(db).0,
15139 TerminalSemicolon::missing(db).0,
15140 ]
15141 .into(),
15142 width: TextWidth::default(),
15143 },
15144 }
15145 .intern(db),
15146 )
15147 }
15148 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15149 let kind = node.kind(db);
15150 assert_eq!(
15151 kind,
15152 SyntaxKind::ItemExternType,
15153 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15154 kind,
15155 SyntaxKind::ItemExternType
15156 );
15157 Self { node }
15158 }
15159 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15160 let kind = node.kind(db);
15161 if kind == SyntaxKind::ItemExternType {
15162 Some(Self::from_syntax_node(db, node))
15163 } else {
15164 None
15165 }
15166 }
15167 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15168 self.node
15169 }
15170 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15171 ItemExternTypePtr(self.node.stable_ptr(db))
15172 }
15173}
15174#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15175pub struct ItemTrait<'db> {
15176 node: SyntaxNode<'db>,
15177}
15178impl<'db> ItemTrait<'db> {
15179 pub const INDEX_ATTRIBUTES: usize = 0;
15180 pub const INDEX_VISIBILITY: usize = 1;
15181 pub const INDEX_TRAIT_KW: usize = 2;
15182 pub const INDEX_NAME: usize = 3;
15183 pub const INDEX_GENERIC_PARAMS: usize = 4;
15184 pub const INDEX_BODY: usize = 5;
15185 pub fn new_green(
15186 db: &'db dyn Database,
15187 attributes: AttributeListGreen<'db>,
15188 visibility: VisibilityGreen<'db>,
15189 trait_kw: TerminalTraitGreen<'db>,
15190 name: TerminalIdentifierGreen<'db>,
15191 generic_params: OptionWrappedGenericParamListGreen<'db>,
15192 body: MaybeTraitBodyGreen<'db>,
15193 ) -> ItemTraitGreen<'db> {
15194 let children = [attributes.0, visibility.0, trait_kw.0, name.0, generic_params.0, body.0];
15195 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15196 ItemTraitGreen(
15197 GreenNode {
15198 kind: SyntaxKind::ItemTrait,
15199 details: GreenNodeDetails::Node { children: children.into(), width },
15200 }
15201 .intern(db),
15202 )
15203 }
15204}
15205impl<'db> ItemTrait<'db> {
15206 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15207 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15208 }
15209 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
15210 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
15211 }
15212 pub fn trait_kw(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
15213 TerminalTrait::from_syntax_node(db, self.node.get_children(db)[2])
15214 }
15215 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15216 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
15217 }
15218 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15219 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
15220 }
15221 pub fn body(&self, db: &'db dyn Database) -> MaybeTraitBody<'db> {
15222 MaybeTraitBody::from_syntax_node(db, self.node.get_children(db)[5])
15223 }
15224}
15225#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15226pub struct ItemTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
15227impl<'db> ItemTraitPtr<'db> {
15228 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15229 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15230 }
15231}
15232impl<'db> TypedStablePtr<'db> for ItemTraitPtr<'db> {
15233 type SyntaxNode = ItemTrait<'db>;
15234 fn untyped(self) -> SyntaxStablePtrId<'db> {
15235 self.0
15236 }
15237 fn lookup(&self, db: &'db dyn Database) -> ItemTrait<'db> {
15238 ItemTrait::from_syntax_node(db, self.0.lookup(db))
15239 }
15240}
15241impl<'db> From<ItemTraitPtr<'db>> for SyntaxStablePtrId<'db> {
15242 fn from(ptr: ItemTraitPtr<'db>) -> Self {
15243 ptr.untyped()
15244 }
15245}
15246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15247pub struct ItemTraitGreen<'db>(pub GreenId<'db>);
15248impl<'db> TypedSyntaxNode<'db> for ItemTrait<'db> {
15249 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTrait);
15250 type StablePtr = ItemTraitPtr<'db>;
15251 type Green = ItemTraitGreen<'db>;
15252 fn missing(db: &'db dyn Database) -> Self::Green {
15253 ItemTraitGreen(
15254 GreenNode {
15255 kind: SyntaxKind::ItemTrait,
15256 details: GreenNodeDetails::Node {
15257 children: [
15258 AttributeList::missing(db).0,
15259 Visibility::missing(db).0,
15260 TerminalTrait::missing(db).0,
15261 TerminalIdentifier::missing(db).0,
15262 OptionWrappedGenericParamList::missing(db).0,
15263 MaybeTraitBody::missing(db).0,
15264 ]
15265 .into(),
15266 width: TextWidth::default(),
15267 },
15268 }
15269 .intern(db),
15270 )
15271 }
15272 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15273 let kind = node.kind(db);
15274 assert_eq!(
15275 kind,
15276 SyntaxKind::ItemTrait,
15277 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15278 kind,
15279 SyntaxKind::ItemTrait
15280 );
15281 Self { node }
15282 }
15283 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15284 let kind = node.kind(db);
15285 if kind == SyntaxKind::ItemTrait { Some(Self::from_syntax_node(db, node)) } else { None }
15286 }
15287 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15288 self.node
15289 }
15290 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15291 ItemTraitPtr(self.node.stable_ptr(db))
15292 }
15293}
15294#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15295pub enum MaybeTraitBody<'db> {
15296 Some(TraitBody<'db>),
15297 None(TerminalSemicolon<'db>),
15298}
15299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15300pub struct MaybeTraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15301impl<'db> TypedStablePtr<'db> for MaybeTraitBodyPtr<'db> {
15302 type SyntaxNode = MaybeTraitBody<'db>;
15303 fn untyped(self) -> SyntaxStablePtrId<'db> {
15304 self.0
15305 }
15306 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15307 MaybeTraitBody::from_syntax_node(db, self.0.lookup(db))
15308 }
15309}
15310impl<'db> From<MaybeTraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15311 fn from(ptr: MaybeTraitBodyPtr<'db>) -> Self {
15312 ptr.untyped()
15313 }
15314}
15315impl<'db> From<TraitBodyPtr<'db>> for MaybeTraitBodyPtr<'db> {
15316 fn from(value: TraitBodyPtr<'db>) -> Self {
15317 Self(value.0)
15318 }
15319}
15320impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitBodyPtr<'db> {
15321 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
15322 Self(value.0)
15323 }
15324}
15325impl<'db> From<TraitBodyGreen<'db>> for MaybeTraitBodyGreen<'db> {
15326 fn from(value: TraitBodyGreen<'db>) -> Self {
15327 Self(value.0)
15328 }
15329}
15330impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitBodyGreen<'db> {
15331 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
15332 Self(value.0)
15333 }
15334}
15335#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15336pub struct MaybeTraitBodyGreen<'db>(pub GreenId<'db>);
15337impl<'db> TypedSyntaxNode<'db> for MaybeTraitBody<'db> {
15338 const OPTIONAL_KIND: Option<SyntaxKind> = None;
15339 type StablePtr = MaybeTraitBodyPtr<'db>;
15340 type Green = MaybeTraitBodyGreen<'db>;
15341 fn missing(db: &'db dyn Database) -> Self::Green {
15342 panic!("No missing variant.");
15343 }
15344 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15345 let kind = node.kind(db);
15346 match kind {
15347 SyntaxKind::TraitBody => MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)),
15348 SyntaxKind::TerminalSemicolon => {
15349 MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node))
15350 }
15351 _ => {
15352 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeTraitBody")
15353 }
15354 }
15355 }
15356 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15357 let kind = node.kind(db);
15358 match kind {
15359 SyntaxKind::TraitBody => {
15360 Some(MaybeTraitBody::Some(TraitBody::from_syntax_node(db, node)))
15361 }
15362 SyntaxKind::TerminalSemicolon => {
15363 Some(MaybeTraitBody::None(TerminalSemicolon::from_syntax_node(db, node)))
15364 }
15365 _ => None,
15366 }
15367 }
15368 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15369 match self {
15370 MaybeTraitBody::Some(x) => x.as_syntax_node(),
15371 MaybeTraitBody::None(x) => x.as_syntax_node(),
15372 }
15373 }
15374 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15375 MaybeTraitBodyPtr(self.as_syntax_node().stable_ptr(db))
15376 }
15377}
15378impl<'db> MaybeTraitBody<'db> {
15379 pub fn is_variant(kind: SyntaxKind) -> bool {
15381 matches!(kind, SyntaxKind::TraitBody | SyntaxKind::TerminalSemicolon)
15382 }
15383}
15384#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15385pub struct TraitBody<'db> {
15386 node: SyntaxNode<'db>,
15387}
15388impl<'db> TraitBody<'db> {
15389 pub const INDEX_LBRACE: usize = 0;
15390 pub const INDEX_ITEMS: usize = 1;
15391 pub const INDEX_RBRACE: usize = 2;
15392 pub fn new_green(
15393 db: &'db dyn Database,
15394 lbrace: TerminalLBraceGreen<'db>,
15395 items: TraitItemListGreen<'db>,
15396 rbrace: TerminalRBraceGreen<'db>,
15397 ) -> TraitBodyGreen<'db> {
15398 let children = [lbrace.0, items.0, rbrace.0];
15399 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15400 TraitBodyGreen(
15401 GreenNode {
15402 kind: SyntaxKind::TraitBody,
15403 details: GreenNodeDetails::Node { children: children.into(), width },
15404 }
15405 .intern(db),
15406 )
15407 }
15408}
15409impl<'db> TraitBody<'db> {
15410 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
15411 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
15412 }
15413 pub fn items(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15414 TraitItemList::from_syntax_node(db, self.node.get_children(db)[1])
15415 }
15416 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
15417 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
15418 }
15419}
15420#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15421pub struct TraitBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
15422impl<'db> TraitBodyPtr<'db> {}
15423impl<'db> TypedStablePtr<'db> for TraitBodyPtr<'db> {
15424 type SyntaxNode = TraitBody<'db>;
15425 fn untyped(self) -> SyntaxStablePtrId<'db> {
15426 self.0
15427 }
15428 fn lookup(&self, db: &'db dyn Database) -> TraitBody<'db> {
15429 TraitBody::from_syntax_node(db, self.0.lookup(db))
15430 }
15431}
15432impl<'db> From<TraitBodyPtr<'db>> for SyntaxStablePtrId<'db> {
15433 fn from(ptr: TraitBodyPtr<'db>) -> Self {
15434 ptr.untyped()
15435 }
15436}
15437#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15438pub struct TraitBodyGreen<'db>(pub GreenId<'db>);
15439impl<'db> TypedSyntaxNode<'db> for TraitBody<'db> {
15440 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitBody);
15441 type StablePtr = TraitBodyPtr<'db>;
15442 type Green = TraitBodyGreen<'db>;
15443 fn missing(db: &'db dyn Database) -> Self::Green {
15444 TraitBodyGreen(
15445 GreenNode {
15446 kind: SyntaxKind::TraitBody,
15447 details: GreenNodeDetails::Node {
15448 children: [
15449 TerminalLBrace::missing(db).0,
15450 TraitItemList::missing(db).0,
15451 TerminalRBrace::missing(db).0,
15452 ]
15453 .into(),
15454 width: TextWidth::default(),
15455 },
15456 }
15457 .intern(db),
15458 )
15459 }
15460 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15461 let kind = node.kind(db);
15462 assert_eq!(
15463 kind,
15464 SyntaxKind::TraitBody,
15465 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15466 kind,
15467 SyntaxKind::TraitBody
15468 );
15469 Self { node }
15470 }
15471 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15472 let kind = node.kind(db);
15473 if kind == SyntaxKind::TraitBody { Some(Self::from_syntax_node(db, node)) } else { None }
15474 }
15475 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15476 self.node
15477 }
15478 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15479 TraitBodyPtr(self.node.stable_ptr(db))
15480 }
15481}
15482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15483pub struct TraitItemList<'db>(ElementList<'db, TraitItem<'db>, 1>);
15484impl<'db> Deref for TraitItemList<'db> {
15485 type Target = ElementList<'db, TraitItem<'db>, 1>;
15486 fn deref(&self) -> &Self::Target {
15487 &self.0
15488 }
15489}
15490impl<'db> TraitItemList<'db> {
15491 pub fn new_green(
15492 db: &'db dyn Database,
15493 children: &[TraitItemGreen<'db>],
15494 ) -> TraitItemListGreen<'db> {
15495 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
15496 TraitItemListGreen(
15497 GreenNode {
15498 kind: SyntaxKind::TraitItemList,
15499 details: GreenNodeDetails::Node {
15500 children: children.iter().map(|x| x.0).collect(),
15501 width,
15502 },
15503 }
15504 .intern(db),
15505 )
15506 }
15507}
15508#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15509pub struct TraitItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
15510impl<'db> TypedStablePtr<'db> for TraitItemListPtr<'db> {
15511 type SyntaxNode = TraitItemList<'db>;
15512 fn untyped(self) -> SyntaxStablePtrId<'db> {
15513 self.0
15514 }
15515 fn lookup(&self, db: &'db dyn Database) -> TraitItemList<'db> {
15516 TraitItemList::from_syntax_node(db, self.0.lookup(db))
15517 }
15518}
15519impl<'db> From<TraitItemListPtr<'db>> for SyntaxStablePtrId<'db> {
15520 fn from(ptr: TraitItemListPtr<'db>) -> Self {
15521 ptr.untyped()
15522 }
15523}
15524#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15525pub struct TraitItemListGreen<'db>(pub GreenId<'db>);
15526impl<'db> TypedSyntaxNode<'db> for TraitItemList<'db> {
15527 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemList);
15528 type StablePtr = TraitItemListPtr<'db>;
15529 type Green = TraitItemListGreen<'db>;
15530 fn missing(db: &'db dyn Database) -> Self::Green {
15531 TraitItemListGreen(
15532 GreenNode {
15533 kind: SyntaxKind::TraitItemList,
15534 details: GreenNodeDetails::Node {
15535 children: [].into(),
15536 width: TextWidth::default(),
15537 },
15538 }
15539 .intern(db),
15540 )
15541 }
15542 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15543 Self(ElementList::new(node))
15544 }
15545 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15546 if node.kind(db) == SyntaxKind::TraitItemList {
15547 Some(Self(ElementList::new(node)))
15548 } else {
15549 None
15550 }
15551 }
15552 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15553 self.node
15554 }
15555 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15556 TraitItemListPtr(self.node.stable_ptr(db))
15557 }
15558}
15559#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15560pub enum TraitItem<'db> {
15561 Function(TraitItemFunction<'db>),
15562 Type(TraitItemType<'db>),
15563 Constant(TraitItemConstant<'db>),
15564 Impl(TraitItemImpl<'db>),
15565 Missing(TraitItemMissing<'db>),
15566}
15567#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15568pub struct TraitItemPtr<'db>(pub SyntaxStablePtrId<'db>);
15569impl<'db> TypedStablePtr<'db> for TraitItemPtr<'db> {
15570 type SyntaxNode = TraitItem<'db>;
15571 fn untyped(self) -> SyntaxStablePtrId<'db> {
15572 self.0
15573 }
15574 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
15575 TraitItem::from_syntax_node(db, self.0.lookup(db))
15576 }
15577}
15578impl<'db> From<TraitItemPtr<'db>> for SyntaxStablePtrId<'db> {
15579 fn from(ptr: TraitItemPtr<'db>) -> Self {
15580 ptr.untyped()
15581 }
15582}
15583impl<'db> From<TraitItemFunctionPtr<'db>> for TraitItemPtr<'db> {
15584 fn from(value: TraitItemFunctionPtr<'db>) -> Self {
15585 Self(value.0)
15586 }
15587}
15588impl<'db> From<TraitItemTypePtr<'db>> for TraitItemPtr<'db> {
15589 fn from(value: TraitItemTypePtr<'db>) -> Self {
15590 Self(value.0)
15591 }
15592}
15593impl<'db> From<TraitItemConstantPtr<'db>> for TraitItemPtr<'db> {
15594 fn from(value: TraitItemConstantPtr<'db>) -> Self {
15595 Self(value.0)
15596 }
15597}
15598impl<'db> From<TraitItemImplPtr<'db>> for TraitItemPtr<'db> {
15599 fn from(value: TraitItemImplPtr<'db>) -> Self {
15600 Self(value.0)
15601 }
15602}
15603impl<'db> From<TraitItemMissingPtr<'db>> for TraitItemPtr<'db> {
15604 fn from(value: TraitItemMissingPtr<'db>) -> Self {
15605 Self(value.0)
15606 }
15607}
15608impl<'db> From<TraitItemFunctionGreen<'db>> for TraitItemGreen<'db> {
15609 fn from(value: TraitItemFunctionGreen<'db>) -> Self {
15610 Self(value.0)
15611 }
15612}
15613impl<'db> From<TraitItemTypeGreen<'db>> for TraitItemGreen<'db> {
15614 fn from(value: TraitItemTypeGreen<'db>) -> Self {
15615 Self(value.0)
15616 }
15617}
15618impl<'db> From<TraitItemConstantGreen<'db>> for TraitItemGreen<'db> {
15619 fn from(value: TraitItemConstantGreen<'db>) -> Self {
15620 Self(value.0)
15621 }
15622}
15623impl<'db> From<TraitItemImplGreen<'db>> for TraitItemGreen<'db> {
15624 fn from(value: TraitItemImplGreen<'db>) -> Self {
15625 Self(value.0)
15626 }
15627}
15628impl<'db> From<TraitItemMissingGreen<'db>> for TraitItemGreen<'db> {
15629 fn from(value: TraitItemMissingGreen<'db>) -> Self {
15630 Self(value.0)
15631 }
15632}
15633#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15634pub struct TraitItemGreen<'db>(pub GreenId<'db>);
15635impl<'db> TypedSyntaxNode<'db> for TraitItem<'db> {
15636 const OPTIONAL_KIND: Option<SyntaxKind> = None;
15637 type StablePtr = TraitItemPtr<'db>;
15638 type Green = TraitItemGreen<'db>;
15639 fn missing(db: &'db dyn Database) -> Self::Green {
15640 TraitItemGreen(TraitItemMissing::missing(db).0)
15641 }
15642 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15643 let kind = node.kind(db);
15644 match kind {
15645 SyntaxKind::TraitItemFunction => {
15646 TraitItem::Function(TraitItemFunction::from_syntax_node(db, node))
15647 }
15648 SyntaxKind::TraitItemType => TraitItem::Type(TraitItemType::from_syntax_node(db, node)),
15649 SyntaxKind::TraitItemConstant => {
15650 TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node))
15651 }
15652 SyntaxKind::TraitItemImpl => TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)),
15653 SyntaxKind::TraitItemMissing => {
15654 TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node))
15655 }
15656 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TraitItem"),
15657 }
15658 }
15659 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15660 let kind = node.kind(db);
15661 match kind {
15662 SyntaxKind::TraitItemFunction => {
15663 Some(TraitItem::Function(TraitItemFunction::from_syntax_node(db, node)))
15664 }
15665 SyntaxKind::TraitItemType => {
15666 Some(TraitItem::Type(TraitItemType::from_syntax_node(db, node)))
15667 }
15668 SyntaxKind::TraitItemConstant => {
15669 Some(TraitItem::Constant(TraitItemConstant::from_syntax_node(db, node)))
15670 }
15671 SyntaxKind::TraitItemImpl => {
15672 Some(TraitItem::Impl(TraitItemImpl::from_syntax_node(db, node)))
15673 }
15674 SyntaxKind::TraitItemMissing => {
15675 Some(TraitItem::Missing(TraitItemMissing::from_syntax_node(db, node)))
15676 }
15677 _ => None,
15678 }
15679 }
15680 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15681 match self {
15682 TraitItem::Function(x) => x.as_syntax_node(),
15683 TraitItem::Type(x) => x.as_syntax_node(),
15684 TraitItem::Constant(x) => x.as_syntax_node(),
15685 TraitItem::Impl(x) => x.as_syntax_node(),
15686 TraitItem::Missing(x) => x.as_syntax_node(),
15687 }
15688 }
15689 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15690 TraitItemPtr(self.as_syntax_node().stable_ptr(db))
15691 }
15692}
15693impl<'db> TraitItem<'db> {
15694 pub fn is_variant(kind: SyntaxKind) -> bool {
15696 matches!(
15697 kind,
15698 SyntaxKind::TraitItemFunction
15699 | SyntaxKind::TraitItemType
15700 | SyntaxKind::TraitItemConstant
15701 | SyntaxKind::TraitItemImpl
15702 | SyntaxKind::TraitItemMissing
15703 )
15704 }
15705}
15706#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15707pub struct TraitItemMissing<'db> {
15708 node: SyntaxNode<'db>,
15709}
15710impl<'db> TraitItemMissing<'db> {
15711 pub fn new_green(db: &'db dyn Database) -> TraitItemMissingGreen<'db> {
15712 let children = [];
15713 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15714 TraitItemMissingGreen(
15715 GreenNode {
15716 kind: SyntaxKind::TraitItemMissing,
15717 details: GreenNodeDetails::Node { children: children.into(), width },
15718 }
15719 .intern(db),
15720 )
15721 }
15722}
15723impl<'db> TraitItemMissing<'db> {}
15724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15725pub struct TraitItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
15726impl<'db> TraitItemMissingPtr<'db> {}
15727impl<'db> TypedStablePtr<'db> for TraitItemMissingPtr<'db> {
15728 type SyntaxNode = TraitItemMissing<'db>;
15729 fn untyped(self) -> SyntaxStablePtrId<'db> {
15730 self.0
15731 }
15732 fn lookup(&self, db: &'db dyn Database) -> TraitItemMissing<'db> {
15733 TraitItemMissing::from_syntax_node(db, self.0.lookup(db))
15734 }
15735}
15736impl<'db> From<TraitItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
15737 fn from(ptr: TraitItemMissingPtr<'db>) -> Self {
15738 ptr.untyped()
15739 }
15740}
15741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15742pub struct TraitItemMissingGreen<'db>(pub GreenId<'db>);
15743impl<'db> TypedSyntaxNode<'db> for TraitItemMissing<'db> {
15744 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemMissing);
15745 type StablePtr = TraitItemMissingPtr<'db>;
15746 type Green = TraitItemMissingGreen<'db>;
15747 fn missing(db: &'db dyn Database) -> Self::Green {
15748 TraitItemMissingGreen(
15749 GreenNode {
15750 kind: SyntaxKind::TraitItemMissing,
15751 details: GreenNodeDetails::Node {
15752 children: [].into(),
15753 width: TextWidth::default(),
15754 },
15755 }
15756 .intern(db),
15757 )
15758 }
15759 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15760 let kind = node.kind(db);
15761 assert_eq!(
15762 kind,
15763 SyntaxKind::TraitItemMissing,
15764 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15765 kind,
15766 SyntaxKind::TraitItemMissing
15767 );
15768 Self { node }
15769 }
15770 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15771 let kind = node.kind(db);
15772 if kind == SyntaxKind::TraitItemMissing {
15773 Some(Self::from_syntax_node(db, node))
15774 } else {
15775 None
15776 }
15777 }
15778 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15779 self.node
15780 }
15781 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15782 TraitItemMissingPtr(self.node.stable_ptr(db))
15783 }
15784}
15785#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15786pub struct TraitItemFunction<'db> {
15787 node: SyntaxNode<'db>,
15788}
15789impl<'db> TraitItemFunction<'db> {
15790 pub const INDEX_ATTRIBUTES: usize = 0;
15791 pub const INDEX_DECLARATION: usize = 1;
15792 pub const INDEX_BODY: usize = 2;
15793 pub fn new_green(
15794 db: &'db dyn Database,
15795 attributes: AttributeListGreen<'db>,
15796 declaration: FunctionDeclarationGreen<'db>,
15797 body: MaybeTraitFunctionBodyGreen<'db>,
15798 ) -> TraitItemFunctionGreen<'db> {
15799 let children = [attributes.0, declaration.0, body.0];
15800 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15801 TraitItemFunctionGreen(
15802 GreenNode {
15803 kind: SyntaxKind::TraitItemFunction,
15804 details: GreenNodeDetails::Node { children: children.into(), width },
15805 }
15806 .intern(db),
15807 )
15808 }
15809}
15810impl<'db> TraitItemFunction<'db> {
15811 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15812 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15813 }
15814 pub fn declaration(&self, db: &'db dyn Database) -> FunctionDeclaration<'db> {
15815 FunctionDeclaration::from_syntax_node(db, self.node.get_children(db)[1])
15816 }
15817 pub fn body(&self, db: &'db dyn Database) -> MaybeTraitFunctionBody<'db> {
15818 MaybeTraitFunctionBody::from_syntax_node(db, self.node.get_children(db)[2])
15819 }
15820}
15821#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15822pub struct TraitItemFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
15823impl<'db> TraitItemFunctionPtr<'db> {
15824 pub fn declaration_green(self, db: &'db dyn Database) -> FunctionDeclarationGreen<'db> {
15825 FunctionDeclarationGreen(self.0.0.key_fields(db)[0])
15826 }
15827}
15828impl<'db> TypedStablePtr<'db> for TraitItemFunctionPtr<'db> {
15829 type SyntaxNode = TraitItemFunction<'db>;
15830 fn untyped(self) -> SyntaxStablePtrId<'db> {
15831 self.0
15832 }
15833 fn lookup(&self, db: &'db dyn Database) -> TraitItemFunction<'db> {
15834 TraitItemFunction::from_syntax_node(db, self.0.lookup(db))
15835 }
15836}
15837impl<'db> From<TraitItemFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
15838 fn from(ptr: TraitItemFunctionPtr<'db>) -> Self {
15839 ptr.untyped()
15840 }
15841}
15842#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15843pub struct TraitItemFunctionGreen<'db>(pub GreenId<'db>);
15844impl<'db> TypedSyntaxNode<'db> for TraitItemFunction<'db> {
15845 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemFunction);
15846 type StablePtr = TraitItemFunctionPtr<'db>;
15847 type Green = TraitItemFunctionGreen<'db>;
15848 fn missing(db: &'db dyn Database) -> Self::Green {
15849 TraitItemFunctionGreen(
15850 GreenNode {
15851 kind: SyntaxKind::TraitItemFunction,
15852 details: GreenNodeDetails::Node {
15853 children: [
15854 AttributeList::missing(db).0,
15855 FunctionDeclaration::missing(db).0,
15856 MaybeTraitFunctionBody::missing(db).0,
15857 ]
15858 .into(),
15859 width: TextWidth::default(),
15860 },
15861 }
15862 .intern(db),
15863 )
15864 }
15865 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15866 let kind = node.kind(db);
15867 assert_eq!(
15868 kind,
15869 SyntaxKind::TraitItemFunction,
15870 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15871 kind,
15872 SyntaxKind::TraitItemFunction
15873 );
15874 Self { node }
15875 }
15876 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15877 let kind = node.kind(db);
15878 if kind == SyntaxKind::TraitItemFunction {
15879 Some(Self::from_syntax_node(db, node))
15880 } else {
15881 None
15882 }
15883 }
15884 fn as_syntax_node(&self) -> SyntaxNode<'db> {
15885 self.node
15886 }
15887 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
15888 TraitItemFunctionPtr(self.node.stable_ptr(db))
15889 }
15890}
15891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
15892pub struct TraitItemType<'db> {
15893 node: SyntaxNode<'db>,
15894}
15895impl<'db> TraitItemType<'db> {
15896 pub const INDEX_ATTRIBUTES: usize = 0;
15897 pub const INDEX_TYPE_KW: usize = 1;
15898 pub const INDEX_NAME: usize = 2;
15899 pub const INDEX_GENERIC_PARAMS: usize = 3;
15900 pub const INDEX_SEMICOLON: usize = 4;
15901 pub fn new_green(
15902 db: &'db dyn Database,
15903 attributes: AttributeListGreen<'db>,
15904 type_kw: TerminalTypeGreen<'db>,
15905 name: TerminalIdentifierGreen<'db>,
15906 generic_params: OptionWrappedGenericParamListGreen<'db>,
15907 semicolon: TerminalSemicolonGreen<'db>,
15908 ) -> TraitItemTypeGreen<'db> {
15909 let children = [attributes.0, type_kw.0, name.0, generic_params.0, semicolon.0];
15910 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
15911 TraitItemTypeGreen(
15912 GreenNode {
15913 kind: SyntaxKind::TraitItemType,
15914 details: GreenNodeDetails::Node { children: children.into(), width },
15915 }
15916 .intern(db),
15917 )
15918 }
15919}
15920impl<'db> TraitItemType<'db> {
15921 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
15922 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
15923 }
15924 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
15925 TerminalType::from_syntax_node(db, self.node.get_children(db)[1])
15926 }
15927 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
15928 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
15929 }
15930 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
15931 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[3])
15932 }
15933 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
15934 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
15935 }
15936}
15937#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15938pub struct TraitItemTypePtr<'db>(pub SyntaxStablePtrId<'db>);
15939impl<'db> TraitItemTypePtr<'db> {
15940 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
15941 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
15942 }
15943}
15944impl<'db> TypedStablePtr<'db> for TraitItemTypePtr<'db> {
15945 type SyntaxNode = TraitItemType<'db>;
15946 fn untyped(self) -> SyntaxStablePtrId<'db> {
15947 self.0
15948 }
15949 fn lookup(&self, db: &'db dyn Database) -> TraitItemType<'db> {
15950 TraitItemType::from_syntax_node(db, self.0.lookup(db))
15951 }
15952}
15953impl<'db> From<TraitItemTypePtr<'db>> for SyntaxStablePtrId<'db> {
15954 fn from(ptr: TraitItemTypePtr<'db>) -> Self {
15955 ptr.untyped()
15956 }
15957}
15958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
15959pub struct TraitItemTypeGreen<'db>(pub GreenId<'db>);
15960impl<'db> TypedSyntaxNode<'db> for TraitItemType<'db> {
15961 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemType);
15962 type StablePtr = TraitItemTypePtr<'db>;
15963 type Green = TraitItemTypeGreen<'db>;
15964 fn missing(db: &'db dyn Database) -> Self::Green {
15965 TraitItemTypeGreen(
15966 GreenNode {
15967 kind: SyntaxKind::TraitItemType,
15968 details: GreenNodeDetails::Node {
15969 children: [
15970 AttributeList::missing(db).0,
15971 TerminalType::missing(db).0,
15972 TerminalIdentifier::missing(db).0,
15973 OptionWrappedGenericParamList::missing(db).0,
15974 TerminalSemicolon::missing(db).0,
15975 ]
15976 .into(),
15977 width: TextWidth::default(),
15978 },
15979 }
15980 .intern(db),
15981 )
15982 }
15983 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
15984 let kind = node.kind(db);
15985 assert_eq!(
15986 kind,
15987 SyntaxKind::TraitItemType,
15988 "Unexpected SyntaxKind {:?}. Expected {:?}.",
15989 kind,
15990 SyntaxKind::TraitItemType
15991 );
15992 Self { node }
15993 }
15994 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
15995 let kind = node.kind(db);
15996 if kind == SyntaxKind::TraitItemType {
15997 Some(Self::from_syntax_node(db, node))
15998 } else {
15999 None
16000 }
16001 }
16002 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16003 self.node
16004 }
16005 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16006 TraitItemTypePtr(self.node.stable_ptr(db))
16007 }
16008}
16009#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16010pub struct TraitItemConstant<'db> {
16011 node: SyntaxNode<'db>,
16012}
16013impl<'db> TraitItemConstant<'db> {
16014 pub const INDEX_ATTRIBUTES: usize = 0;
16015 pub const INDEX_CONST_KW: usize = 1;
16016 pub const INDEX_NAME: usize = 2;
16017 pub const INDEX_TYPE_CLAUSE: usize = 3;
16018 pub const INDEX_SEMICOLON: usize = 4;
16019 pub fn new_green(
16020 db: &'db dyn Database,
16021 attributes: AttributeListGreen<'db>,
16022 const_kw: TerminalConstGreen<'db>,
16023 name: TerminalIdentifierGreen<'db>,
16024 type_clause: TypeClauseGreen<'db>,
16025 semicolon: TerminalSemicolonGreen<'db>,
16026 ) -> TraitItemConstantGreen<'db> {
16027 let children = [attributes.0, const_kw.0, name.0, type_clause.0, semicolon.0];
16028 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16029 TraitItemConstantGreen(
16030 GreenNode {
16031 kind: SyntaxKind::TraitItemConstant,
16032 details: GreenNodeDetails::Node { children: children.into(), width },
16033 }
16034 .intern(db),
16035 )
16036 }
16037}
16038impl<'db> TraitItemConstant<'db> {
16039 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16040 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16041 }
16042 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
16043 TerminalConst::from_syntax_node(db, self.node.get_children(db)[1])
16044 }
16045 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16046 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16047 }
16048 pub fn type_clause(&self, db: &'db dyn Database) -> TypeClause<'db> {
16049 TypeClause::from_syntax_node(db, self.node.get_children(db)[3])
16050 }
16051 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16052 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
16053 }
16054}
16055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16056pub struct TraitItemConstantPtr<'db>(pub SyntaxStablePtrId<'db>);
16057impl<'db> TraitItemConstantPtr<'db> {
16058 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16059 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16060 }
16061}
16062impl<'db> TypedStablePtr<'db> for TraitItemConstantPtr<'db> {
16063 type SyntaxNode = TraitItemConstant<'db>;
16064 fn untyped(self) -> SyntaxStablePtrId<'db> {
16065 self.0
16066 }
16067 fn lookup(&self, db: &'db dyn Database) -> TraitItemConstant<'db> {
16068 TraitItemConstant::from_syntax_node(db, self.0.lookup(db))
16069 }
16070}
16071impl<'db> From<TraitItemConstantPtr<'db>> for SyntaxStablePtrId<'db> {
16072 fn from(ptr: TraitItemConstantPtr<'db>) -> Self {
16073 ptr.untyped()
16074 }
16075}
16076#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16077pub struct TraitItemConstantGreen<'db>(pub GreenId<'db>);
16078impl<'db> TypedSyntaxNode<'db> for TraitItemConstant<'db> {
16079 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemConstant);
16080 type StablePtr = TraitItemConstantPtr<'db>;
16081 type Green = TraitItemConstantGreen<'db>;
16082 fn missing(db: &'db dyn Database) -> Self::Green {
16083 TraitItemConstantGreen(
16084 GreenNode {
16085 kind: SyntaxKind::TraitItemConstant,
16086 details: GreenNodeDetails::Node {
16087 children: [
16088 AttributeList::missing(db).0,
16089 TerminalConst::missing(db).0,
16090 TerminalIdentifier::missing(db).0,
16091 TypeClause::missing(db).0,
16092 TerminalSemicolon::missing(db).0,
16093 ]
16094 .into(),
16095 width: TextWidth::default(),
16096 },
16097 }
16098 .intern(db),
16099 )
16100 }
16101 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16102 let kind = node.kind(db);
16103 assert_eq!(
16104 kind,
16105 SyntaxKind::TraitItemConstant,
16106 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16107 kind,
16108 SyntaxKind::TraitItemConstant
16109 );
16110 Self { node }
16111 }
16112 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16113 let kind = node.kind(db);
16114 if kind == SyntaxKind::TraitItemConstant {
16115 Some(Self::from_syntax_node(db, node))
16116 } else {
16117 None
16118 }
16119 }
16120 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16121 self.node
16122 }
16123 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16124 TraitItemConstantPtr(self.node.stable_ptr(db))
16125 }
16126}
16127#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16128pub struct TraitItemImpl<'db> {
16129 node: SyntaxNode<'db>,
16130}
16131impl<'db> TraitItemImpl<'db> {
16132 pub const INDEX_ATTRIBUTES: usize = 0;
16133 pub const INDEX_IMPL_KW: usize = 1;
16134 pub const INDEX_NAME: usize = 2;
16135 pub const INDEX_COLON: usize = 3;
16136 pub const INDEX_TRAIT_PATH: usize = 4;
16137 pub const INDEX_SEMICOLON: usize = 5;
16138 pub fn new_green(
16139 db: &'db dyn Database,
16140 attributes: AttributeListGreen<'db>,
16141 impl_kw: TerminalImplGreen<'db>,
16142 name: TerminalIdentifierGreen<'db>,
16143 colon: TerminalColonGreen<'db>,
16144 trait_path: ExprPathGreen<'db>,
16145 semicolon: TerminalSemicolonGreen<'db>,
16146 ) -> TraitItemImplGreen<'db> {
16147 let children = [attributes.0, impl_kw.0, name.0, colon.0, trait_path.0, semicolon.0];
16148 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16149 TraitItemImplGreen(
16150 GreenNode {
16151 kind: SyntaxKind::TraitItemImpl,
16152 details: GreenNodeDetails::Node { children: children.into(), width },
16153 }
16154 .intern(db),
16155 )
16156 }
16157}
16158impl<'db> TraitItemImpl<'db> {
16159 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16160 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16161 }
16162 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16163 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[1])
16164 }
16165 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16166 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[2])
16167 }
16168 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
16169 TerminalColon::from_syntax_node(db, self.node.get_children(db)[3])
16170 }
16171 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16172 ExprPath::from_syntax_node(db, self.node.get_children(db)[4])
16173 }
16174 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
16175 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
16176 }
16177}
16178#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16179pub struct TraitItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16180impl<'db> TraitItemImplPtr<'db> {
16181 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16182 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16183 }
16184}
16185impl<'db> TypedStablePtr<'db> for TraitItemImplPtr<'db> {
16186 type SyntaxNode = TraitItemImpl<'db>;
16187 fn untyped(self) -> SyntaxStablePtrId<'db> {
16188 self.0
16189 }
16190 fn lookup(&self, db: &'db dyn Database) -> TraitItemImpl<'db> {
16191 TraitItemImpl::from_syntax_node(db, self.0.lookup(db))
16192 }
16193}
16194impl<'db> From<TraitItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16195 fn from(ptr: TraitItemImplPtr<'db>) -> Self {
16196 ptr.untyped()
16197 }
16198}
16199#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16200pub struct TraitItemImplGreen<'db>(pub GreenId<'db>);
16201impl<'db> TypedSyntaxNode<'db> for TraitItemImpl<'db> {
16202 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TraitItemImpl);
16203 type StablePtr = TraitItemImplPtr<'db>;
16204 type Green = TraitItemImplGreen<'db>;
16205 fn missing(db: &'db dyn Database) -> Self::Green {
16206 TraitItemImplGreen(
16207 GreenNode {
16208 kind: SyntaxKind::TraitItemImpl,
16209 details: GreenNodeDetails::Node {
16210 children: [
16211 AttributeList::missing(db).0,
16212 TerminalImpl::missing(db).0,
16213 TerminalIdentifier::missing(db).0,
16214 TerminalColon::missing(db).0,
16215 ExprPath::missing(db).0,
16216 TerminalSemicolon::missing(db).0,
16217 ]
16218 .into(),
16219 width: TextWidth::default(),
16220 },
16221 }
16222 .intern(db),
16223 )
16224 }
16225 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16226 let kind = node.kind(db);
16227 assert_eq!(
16228 kind,
16229 SyntaxKind::TraitItemImpl,
16230 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16231 kind,
16232 SyntaxKind::TraitItemImpl
16233 );
16234 Self { node }
16235 }
16236 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16237 let kind = node.kind(db);
16238 if kind == SyntaxKind::TraitItemImpl {
16239 Some(Self::from_syntax_node(db, node))
16240 } else {
16241 None
16242 }
16243 }
16244 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16245 self.node
16246 }
16247 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16248 TraitItemImplPtr(self.node.stable_ptr(db))
16249 }
16250}
16251#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16252pub enum MaybeTraitFunctionBody<'db> {
16253 Some(ExprBlock<'db>),
16254 None(TerminalSemicolon<'db>),
16255}
16256#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16257pub struct MaybeTraitFunctionBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16258impl<'db> TypedStablePtr<'db> for MaybeTraitFunctionBodyPtr<'db> {
16259 type SyntaxNode = MaybeTraitFunctionBody<'db>;
16260 fn untyped(self) -> SyntaxStablePtrId<'db> {
16261 self.0
16262 }
16263 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16264 MaybeTraitFunctionBody::from_syntax_node(db, self.0.lookup(db))
16265 }
16266}
16267impl<'db> From<MaybeTraitFunctionBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16268 fn from(ptr: MaybeTraitFunctionBodyPtr<'db>) -> Self {
16269 ptr.untyped()
16270 }
16271}
16272impl<'db> From<ExprBlockPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16273 fn from(value: ExprBlockPtr<'db>) -> Self {
16274 Self(value.0)
16275 }
16276}
16277impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeTraitFunctionBodyPtr<'db> {
16278 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16279 Self(value.0)
16280 }
16281}
16282impl<'db> From<ExprBlockGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16283 fn from(value: ExprBlockGreen<'db>) -> Self {
16284 Self(value.0)
16285 }
16286}
16287impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeTraitFunctionBodyGreen<'db> {
16288 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16289 Self(value.0)
16290 }
16291}
16292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16293pub struct MaybeTraitFunctionBodyGreen<'db>(pub GreenId<'db>);
16294impl<'db> TypedSyntaxNode<'db> for MaybeTraitFunctionBody<'db> {
16295 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16296 type StablePtr = MaybeTraitFunctionBodyPtr<'db>;
16297 type Green = MaybeTraitFunctionBodyGreen<'db>;
16298 fn missing(db: &'db dyn Database) -> Self::Green {
16299 panic!("No missing variant.");
16300 }
16301 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16302 let kind = node.kind(db);
16303 match kind {
16304 SyntaxKind::ExprBlock => {
16305 MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node))
16306 }
16307 SyntaxKind::TerminalSemicolon => {
16308 MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node))
16309 }
16310 _ => panic!(
16311 "Unexpected syntax kind {:?} when constructing {}.",
16312 kind, "MaybeTraitFunctionBody"
16313 ),
16314 }
16315 }
16316 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16317 let kind = node.kind(db);
16318 match kind {
16319 SyntaxKind::ExprBlock => {
16320 Some(MaybeTraitFunctionBody::Some(ExprBlock::from_syntax_node(db, node)))
16321 }
16322 SyntaxKind::TerminalSemicolon => {
16323 Some(MaybeTraitFunctionBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16324 }
16325 _ => None,
16326 }
16327 }
16328 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16329 match self {
16330 MaybeTraitFunctionBody::Some(x) => x.as_syntax_node(),
16331 MaybeTraitFunctionBody::None(x) => x.as_syntax_node(),
16332 }
16333 }
16334 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16335 MaybeTraitFunctionBodyPtr(self.as_syntax_node().stable_ptr(db))
16336 }
16337}
16338impl<'db> MaybeTraitFunctionBody<'db> {
16339 pub fn is_variant(kind: SyntaxKind) -> bool {
16341 matches!(kind, SyntaxKind::ExprBlock | SyntaxKind::TerminalSemicolon)
16342 }
16343}
16344#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16345pub struct ItemImpl<'db> {
16346 node: SyntaxNode<'db>,
16347}
16348impl<'db> ItemImpl<'db> {
16349 pub const INDEX_ATTRIBUTES: usize = 0;
16350 pub const INDEX_VISIBILITY: usize = 1;
16351 pub const INDEX_IMPL_KW: usize = 2;
16352 pub const INDEX_NAME: usize = 3;
16353 pub const INDEX_GENERIC_PARAMS: usize = 4;
16354 pub const INDEX_OF_KW: usize = 5;
16355 pub const INDEX_TRAIT_PATH: usize = 6;
16356 pub const INDEX_BODY: usize = 7;
16357 pub fn new_green(
16358 db: &'db dyn Database,
16359 attributes: AttributeListGreen<'db>,
16360 visibility: VisibilityGreen<'db>,
16361 impl_kw: TerminalImplGreen<'db>,
16362 name: TerminalIdentifierGreen<'db>,
16363 generic_params: OptionWrappedGenericParamListGreen<'db>,
16364 of_kw: TerminalOfGreen<'db>,
16365 trait_path: ExprPathGreen<'db>,
16366 body: MaybeImplBodyGreen<'db>,
16367 ) -> ItemImplGreen<'db> {
16368 let children = [
16369 attributes.0,
16370 visibility.0,
16371 impl_kw.0,
16372 name.0,
16373 generic_params.0,
16374 of_kw.0,
16375 trait_path.0,
16376 body.0,
16377 ];
16378 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16379 ItemImplGreen(
16380 GreenNode {
16381 kind: SyntaxKind::ItemImpl,
16382 details: GreenNodeDetails::Node { children: children.into(), width },
16383 }
16384 .intern(db),
16385 )
16386 }
16387}
16388impl<'db> ItemImpl<'db> {
16389 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
16390 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
16391 }
16392 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
16393 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
16394 }
16395 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
16396 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
16397 }
16398 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
16399 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
16400 }
16401 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
16402 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
16403 }
16404 pub fn of_kw(&self, db: &'db dyn Database) -> TerminalOf<'db> {
16405 TerminalOf::from_syntax_node(db, self.node.get_children(db)[5])
16406 }
16407 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
16408 ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
16409 }
16410 pub fn body(&self, db: &'db dyn Database) -> MaybeImplBody<'db> {
16411 MaybeImplBody::from_syntax_node(db, self.node.get_children(db)[7])
16412 }
16413}
16414#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16415pub struct ItemImplPtr<'db>(pub SyntaxStablePtrId<'db>);
16416impl<'db> ItemImplPtr<'db> {
16417 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
16418 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
16419 }
16420}
16421impl<'db> TypedStablePtr<'db> for ItemImplPtr<'db> {
16422 type SyntaxNode = ItemImpl<'db>;
16423 fn untyped(self) -> SyntaxStablePtrId<'db> {
16424 self.0
16425 }
16426 fn lookup(&self, db: &'db dyn Database) -> ItemImpl<'db> {
16427 ItemImpl::from_syntax_node(db, self.0.lookup(db))
16428 }
16429}
16430impl<'db> From<ItemImplPtr<'db>> for SyntaxStablePtrId<'db> {
16431 fn from(ptr: ItemImplPtr<'db>) -> Self {
16432 ptr.untyped()
16433 }
16434}
16435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16436pub struct ItemImplGreen<'db>(pub GreenId<'db>);
16437impl<'db> TypedSyntaxNode<'db> for ItemImpl<'db> {
16438 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImpl);
16439 type StablePtr = ItemImplPtr<'db>;
16440 type Green = ItemImplGreen<'db>;
16441 fn missing(db: &'db dyn Database) -> Self::Green {
16442 ItemImplGreen(
16443 GreenNode {
16444 kind: SyntaxKind::ItemImpl,
16445 details: GreenNodeDetails::Node {
16446 children: [
16447 AttributeList::missing(db).0,
16448 Visibility::missing(db).0,
16449 TerminalImpl::missing(db).0,
16450 TerminalIdentifier::missing(db).0,
16451 OptionWrappedGenericParamList::missing(db).0,
16452 TerminalOf::missing(db).0,
16453 ExprPath::missing(db).0,
16454 MaybeImplBody::missing(db).0,
16455 ]
16456 .into(),
16457 width: TextWidth::default(),
16458 },
16459 }
16460 .intern(db),
16461 )
16462 }
16463 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16464 let kind = node.kind(db);
16465 assert_eq!(
16466 kind,
16467 SyntaxKind::ItemImpl,
16468 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16469 kind,
16470 SyntaxKind::ItemImpl
16471 );
16472 Self { node }
16473 }
16474 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16475 let kind = node.kind(db);
16476 if kind == SyntaxKind::ItemImpl { Some(Self::from_syntax_node(db, node)) } else { None }
16477 }
16478 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16479 self.node
16480 }
16481 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16482 ItemImplPtr(self.node.stable_ptr(db))
16483 }
16484}
16485#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16486pub struct ItemHeaderDoc<'db> {
16487 node: SyntaxNode<'db>,
16488}
16489impl<'db> ItemHeaderDoc<'db> {
16490 pub const INDEX_EMPTY: usize = 0;
16491 pub fn new_green(
16492 db: &'db dyn Database,
16493 empty: TerminalEmptyGreen<'db>,
16494 ) -> ItemHeaderDocGreen<'db> {
16495 let children = [empty.0];
16496 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16497 ItemHeaderDocGreen(
16498 GreenNode {
16499 kind: SyntaxKind::ItemHeaderDoc,
16500 details: GreenNodeDetails::Node { children: children.into(), width },
16501 }
16502 .intern(db),
16503 )
16504 }
16505}
16506impl<'db> ItemHeaderDoc<'db> {
16507 pub fn empty(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
16508 TerminalEmpty::from_syntax_node(db, self.node.get_children(db)[0])
16509 }
16510}
16511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16512pub struct ItemHeaderDocPtr<'db>(pub SyntaxStablePtrId<'db>);
16513impl<'db> ItemHeaderDocPtr<'db> {}
16514impl<'db> TypedStablePtr<'db> for ItemHeaderDocPtr<'db> {
16515 type SyntaxNode = ItemHeaderDoc<'db>;
16516 fn untyped(self) -> SyntaxStablePtrId<'db> {
16517 self.0
16518 }
16519 fn lookup(&self, db: &'db dyn Database) -> ItemHeaderDoc<'db> {
16520 ItemHeaderDoc::from_syntax_node(db, self.0.lookup(db))
16521 }
16522}
16523impl<'db> From<ItemHeaderDocPtr<'db>> for SyntaxStablePtrId<'db> {
16524 fn from(ptr: ItemHeaderDocPtr<'db>) -> Self {
16525 ptr.untyped()
16526 }
16527}
16528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16529pub struct ItemHeaderDocGreen<'db>(pub GreenId<'db>);
16530impl<'db> TypedSyntaxNode<'db> for ItemHeaderDoc<'db> {
16531 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemHeaderDoc);
16532 type StablePtr = ItemHeaderDocPtr<'db>;
16533 type Green = ItemHeaderDocGreen<'db>;
16534 fn missing(db: &'db dyn Database) -> Self::Green {
16535 ItemHeaderDocGreen(
16536 GreenNode {
16537 kind: SyntaxKind::ItemHeaderDoc,
16538 details: GreenNodeDetails::Node {
16539 children: [TerminalEmpty::missing(db).0].into(),
16540 width: TextWidth::default(),
16541 },
16542 }
16543 .intern(db),
16544 )
16545 }
16546 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16547 let kind = node.kind(db);
16548 assert_eq!(
16549 kind,
16550 SyntaxKind::ItemHeaderDoc,
16551 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16552 kind,
16553 SyntaxKind::ItemHeaderDoc
16554 );
16555 Self { node }
16556 }
16557 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16558 let kind = node.kind(db);
16559 if kind == SyntaxKind::ItemHeaderDoc {
16560 Some(Self::from_syntax_node(db, node))
16561 } else {
16562 None
16563 }
16564 }
16565 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16566 self.node
16567 }
16568 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16569 ItemHeaderDocPtr(self.node.stable_ptr(db))
16570 }
16571}
16572#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16573pub enum MaybeImplBody<'db> {
16574 Some(ImplBody<'db>),
16575 None(TerminalSemicolon<'db>),
16576}
16577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16578pub struct MaybeImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16579impl<'db> TypedStablePtr<'db> for MaybeImplBodyPtr<'db> {
16580 type SyntaxNode = MaybeImplBody<'db>;
16581 fn untyped(self) -> SyntaxStablePtrId<'db> {
16582 self.0
16583 }
16584 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16585 MaybeImplBody::from_syntax_node(db, self.0.lookup(db))
16586 }
16587}
16588impl<'db> From<MaybeImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16589 fn from(ptr: MaybeImplBodyPtr<'db>) -> Self {
16590 ptr.untyped()
16591 }
16592}
16593impl<'db> From<ImplBodyPtr<'db>> for MaybeImplBodyPtr<'db> {
16594 fn from(value: ImplBodyPtr<'db>) -> Self {
16595 Self(value.0)
16596 }
16597}
16598impl<'db> From<TerminalSemicolonPtr<'db>> for MaybeImplBodyPtr<'db> {
16599 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
16600 Self(value.0)
16601 }
16602}
16603impl<'db> From<ImplBodyGreen<'db>> for MaybeImplBodyGreen<'db> {
16604 fn from(value: ImplBodyGreen<'db>) -> Self {
16605 Self(value.0)
16606 }
16607}
16608impl<'db> From<TerminalSemicolonGreen<'db>> for MaybeImplBodyGreen<'db> {
16609 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
16610 Self(value.0)
16611 }
16612}
16613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16614pub struct MaybeImplBodyGreen<'db>(pub GreenId<'db>);
16615impl<'db> TypedSyntaxNode<'db> for MaybeImplBody<'db> {
16616 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16617 type StablePtr = MaybeImplBodyPtr<'db>;
16618 type Green = MaybeImplBodyGreen<'db>;
16619 fn missing(db: &'db dyn Database) -> Self::Green {
16620 panic!("No missing variant.");
16621 }
16622 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16623 let kind = node.kind(db);
16624 match kind {
16625 SyntaxKind::ImplBody => MaybeImplBody::Some(ImplBody::from_syntax_node(db, node)),
16626 SyntaxKind::TerminalSemicolon => {
16627 MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node))
16628 }
16629 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MaybeImplBody"),
16630 }
16631 }
16632 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16633 let kind = node.kind(db);
16634 match kind {
16635 SyntaxKind::ImplBody => Some(MaybeImplBody::Some(ImplBody::from_syntax_node(db, node))),
16636 SyntaxKind::TerminalSemicolon => {
16637 Some(MaybeImplBody::None(TerminalSemicolon::from_syntax_node(db, node)))
16638 }
16639 _ => None,
16640 }
16641 }
16642 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16643 match self {
16644 MaybeImplBody::Some(x) => x.as_syntax_node(),
16645 MaybeImplBody::None(x) => x.as_syntax_node(),
16646 }
16647 }
16648 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16649 MaybeImplBodyPtr(self.as_syntax_node().stable_ptr(db))
16650 }
16651}
16652impl<'db> MaybeImplBody<'db> {
16653 pub fn is_variant(kind: SyntaxKind) -> bool {
16655 matches!(kind, SyntaxKind::ImplBody | SyntaxKind::TerminalSemicolon)
16656 }
16657}
16658#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16659pub struct ImplBody<'db> {
16660 node: SyntaxNode<'db>,
16661}
16662impl<'db> ImplBody<'db> {
16663 pub const INDEX_LBRACE: usize = 0;
16664 pub const INDEX_ITEMS: usize = 1;
16665 pub const INDEX_RBRACE: usize = 2;
16666 pub fn new_green(
16667 db: &'db dyn Database,
16668 lbrace: TerminalLBraceGreen<'db>,
16669 items: ImplItemListGreen<'db>,
16670 rbrace: TerminalRBraceGreen<'db>,
16671 ) -> ImplBodyGreen<'db> {
16672 let children = [lbrace.0, items.0, rbrace.0];
16673 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
16674 ImplBodyGreen(
16675 GreenNode {
16676 kind: SyntaxKind::ImplBody,
16677 details: GreenNodeDetails::Node { children: children.into(), width },
16678 }
16679 .intern(db),
16680 )
16681 }
16682}
16683impl<'db> ImplBody<'db> {
16684 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
16685 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
16686 }
16687 pub fn items(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16688 ImplItemList::from_syntax_node(db, self.node.get_children(db)[1])
16689 }
16690 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
16691 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
16692 }
16693}
16694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16695pub struct ImplBodyPtr<'db>(pub SyntaxStablePtrId<'db>);
16696impl<'db> ImplBodyPtr<'db> {}
16697impl<'db> TypedStablePtr<'db> for ImplBodyPtr<'db> {
16698 type SyntaxNode = ImplBody<'db>;
16699 fn untyped(self) -> SyntaxStablePtrId<'db> {
16700 self.0
16701 }
16702 fn lookup(&self, db: &'db dyn Database) -> ImplBody<'db> {
16703 ImplBody::from_syntax_node(db, self.0.lookup(db))
16704 }
16705}
16706impl<'db> From<ImplBodyPtr<'db>> for SyntaxStablePtrId<'db> {
16707 fn from(ptr: ImplBodyPtr<'db>) -> Self {
16708 ptr.untyped()
16709 }
16710}
16711#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16712pub struct ImplBodyGreen<'db>(pub GreenId<'db>);
16713impl<'db> TypedSyntaxNode<'db> for ImplBody<'db> {
16714 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplBody);
16715 type StablePtr = ImplBodyPtr<'db>;
16716 type Green = ImplBodyGreen<'db>;
16717 fn missing(db: &'db dyn Database) -> Self::Green {
16718 ImplBodyGreen(
16719 GreenNode {
16720 kind: SyntaxKind::ImplBody,
16721 details: GreenNodeDetails::Node {
16722 children: [
16723 TerminalLBrace::missing(db).0,
16724 ImplItemList::missing(db).0,
16725 TerminalRBrace::missing(db).0,
16726 ]
16727 .into(),
16728 width: TextWidth::default(),
16729 },
16730 }
16731 .intern(db),
16732 )
16733 }
16734 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16735 let kind = node.kind(db);
16736 assert_eq!(
16737 kind,
16738 SyntaxKind::ImplBody,
16739 "Unexpected SyntaxKind {:?}. Expected {:?}.",
16740 kind,
16741 SyntaxKind::ImplBody
16742 );
16743 Self { node }
16744 }
16745 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16746 let kind = node.kind(db);
16747 if kind == SyntaxKind::ImplBody { Some(Self::from_syntax_node(db, node)) } else { None }
16748 }
16749 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16750 self.node
16751 }
16752 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16753 ImplBodyPtr(self.node.stable_ptr(db))
16754 }
16755}
16756#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16757pub struct ImplItemList<'db>(ElementList<'db, ImplItem<'db>, 1>);
16758impl<'db> Deref for ImplItemList<'db> {
16759 type Target = ElementList<'db, ImplItem<'db>, 1>;
16760 fn deref(&self) -> &Self::Target {
16761 &self.0
16762 }
16763}
16764impl<'db> ImplItemList<'db> {
16765 pub fn new_green(
16766 db: &'db dyn Database,
16767 children: &[ImplItemGreen<'db>],
16768 ) -> ImplItemListGreen<'db> {
16769 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
16770 ImplItemListGreen(
16771 GreenNode {
16772 kind: SyntaxKind::ImplItemList,
16773 details: GreenNodeDetails::Node {
16774 children: children.iter().map(|x| x.0).collect(),
16775 width,
16776 },
16777 }
16778 .intern(db),
16779 )
16780 }
16781}
16782#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16783pub struct ImplItemListPtr<'db>(pub SyntaxStablePtrId<'db>);
16784impl<'db> TypedStablePtr<'db> for ImplItemListPtr<'db> {
16785 type SyntaxNode = ImplItemList<'db>;
16786 fn untyped(self) -> SyntaxStablePtrId<'db> {
16787 self.0
16788 }
16789 fn lookup(&self, db: &'db dyn Database) -> ImplItemList<'db> {
16790 ImplItemList::from_syntax_node(db, self.0.lookup(db))
16791 }
16792}
16793impl<'db> From<ImplItemListPtr<'db>> for SyntaxStablePtrId<'db> {
16794 fn from(ptr: ImplItemListPtr<'db>) -> Self {
16795 ptr.untyped()
16796 }
16797}
16798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16799pub struct ImplItemListGreen<'db>(pub GreenId<'db>);
16800impl<'db> TypedSyntaxNode<'db> for ImplItemList<'db> {
16801 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemList);
16802 type StablePtr = ImplItemListPtr<'db>;
16803 type Green = ImplItemListGreen<'db>;
16804 fn missing(db: &'db dyn Database) -> Self::Green {
16805 ImplItemListGreen(
16806 GreenNode {
16807 kind: SyntaxKind::ImplItemList,
16808 details: GreenNodeDetails::Node {
16809 children: [].into(),
16810 width: TextWidth::default(),
16811 },
16812 }
16813 .intern(db),
16814 )
16815 }
16816 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16817 Self(ElementList::new(node))
16818 }
16819 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
16820 if node.kind(db) == SyntaxKind::ImplItemList {
16821 Some(Self(ElementList::new(node)))
16822 } else {
16823 None
16824 }
16825 }
16826 fn as_syntax_node(&self) -> SyntaxNode<'db> {
16827 self.node
16828 }
16829 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
16830 ImplItemListPtr(self.node.stable_ptr(db))
16831 }
16832}
16833#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
16834pub enum ImplItem<'db> {
16835 Function(FunctionWithBody<'db>),
16836 Type(ItemTypeAlias<'db>),
16837 Constant(ItemConstant<'db>),
16838 Impl(ItemImplAlias<'db>),
16839 Module(ItemModule<'db>),
16840 Use(ItemUse<'db>),
16841 ExternFunction(ItemExternFunction<'db>),
16842 ExternType(ItemExternType<'db>),
16843 Trait(ItemTrait<'db>),
16844 Struct(ItemStruct<'db>),
16845 Enum(ItemEnum<'db>),
16846 Missing(ImplItemMissing<'db>),
16847}
16848#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16849pub struct ImplItemPtr<'db>(pub SyntaxStablePtrId<'db>);
16850impl<'db> TypedStablePtr<'db> for ImplItemPtr<'db> {
16851 type SyntaxNode = ImplItem<'db>;
16852 fn untyped(self) -> SyntaxStablePtrId<'db> {
16853 self.0
16854 }
16855 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
16856 ImplItem::from_syntax_node(db, self.0.lookup(db))
16857 }
16858}
16859impl<'db> From<ImplItemPtr<'db>> for SyntaxStablePtrId<'db> {
16860 fn from(ptr: ImplItemPtr<'db>) -> Self {
16861 ptr.untyped()
16862 }
16863}
16864impl<'db> From<FunctionWithBodyPtr<'db>> for ImplItemPtr<'db> {
16865 fn from(value: FunctionWithBodyPtr<'db>) -> Self {
16866 Self(value.0)
16867 }
16868}
16869impl<'db> From<ItemTypeAliasPtr<'db>> for ImplItemPtr<'db> {
16870 fn from(value: ItemTypeAliasPtr<'db>) -> Self {
16871 Self(value.0)
16872 }
16873}
16874impl<'db> From<ItemConstantPtr<'db>> for ImplItemPtr<'db> {
16875 fn from(value: ItemConstantPtr<'db>) -> Self {
16876 Self(value.0)
16877 }
16878}
16879impl<'db> From<ItemImplAliasPtr<'db>> for ImplItemPtr<'db> {
16880 fn from(value: ItemImplAliasPtr<'db>) -> Self {
16881 Self(value.0)
16882 }
16883}
16884impl<'db> From<ItemModulePtr<'db>> for ImplItemPtr<'db> {
16885 fn from(value: ItemModulePtr<'db>) -> Self {
16886 Self(value.0)
16887 }
16888}
16889impl<'db> From<ItemUsePtr<'db>> for ImplItemPtr<'db> {
16890 fn from(value: ItemUsePtr<'db>) -> Self {
16891 Self(value.0)
16892 }
16893}
16894impl<'db> From<ItemExternFunctionPtr<'db>> for ImplItemPtr<'db> {
16895 fn from(value: ItemExternFunctionPtr<'db>) -> Self {
16896 Self(value.0)
16897 }
16898}
16899impl<'db> From<ItemExternTypePtr<'db>> for ImplItemPtr<'db> {
16900 fn from(value: ItemExternTypePtr<'db>) -> Self {
16901 Self(value.0)
16902 }
16903}
16904impl<'db> From<ItemTraitPtr<'db>> for ImplItemPtr<'db> {
16905 fn from(value: ItemTraitPtr<'db>) -> Self {
16906 Self(value.0)
16907 }
16908}
16909impl<'db> From<ItemStructPtr<'db>> for ImplItemPtr<'db> {
16910 fn from(value: ItemStructPtr<'db>) -> Self {
16911 Self(value.0)
16912 }
16913}
16914impl<'db> From<ItemEnumPtr<'db>> for ImplItemPtr<'db> {
16915 fn from(value: ItemEnumPtr<'db>) -> Self {
16916 Self(value.0)
16917 }
16918}
16919impl<'db> From<ImplItemMissingPtr<'db>> for ImplItemPtr<'db> {
16920 fn from(value: ImplItemMissingPtr<'db>) -> Self {
16921 Self(value.0)
16922 }
16923}
16924impl<'db> From<FunctionWithBodyGreen<'db>> for ImplItemGreen<'db> {
16925 fn from(value: FunctionWithBodyGreen<'db>) -> Self {
16926 Self(value.0)
16927 }
16928}
16929impl<'db> From<ItemTypeAliasGreen<'db>> for ImplItemGreen<'db> {
16930 fn from(value: ItemTypeAliasGreen<'db>) -> Self {
16931 Self(value.0)
16932 }
16933}
16934impl<'db> From<ItemConstantGreen<'db>> for ImplItemGreen<'db> {
16935 fn from(value: ItemConstantGreen<'db>) -> Self {
16936 Self(value.0)
16937 }
16938}
16939impl<'db> From<ItemImplAliasGreen<'db>> for ImplItemGreen<'db> {
16940 fn from(value: ItemImplAliasGreen<'db>) -> Self {
16941 Self(value.0)
16942 }
16943}
16944impl<'db> From<ItemModuleGreen<'db>> for ImplItemGreen<'db> {
16945 fn from(value: ItemModuleGreen<'db>) -> Self {
16946 Self(value.0)
16947 }
16948}
16949impl<'db> From<ItemUseGreen<'db>> for ImplItemGreen<'db> {
16950 fn from(value: ItemUseGreen<'db>) -> Self {
16951 Self(value.0)
16952 }
16953}
16954impl<'db> From<ItemExternFunctionGreen<'db>> for ImplItemGreen<'db> {
16955 fn from(value: ItemExternFunctionGreen<'db>) -> Self {
16956 Self(value.0)
16957 }
16958}
16959impl<'db> From<ItemExternTypeGreen<'db>> for ImplItemGreen<'db> {
16960 fn from(value: ItemExternTypeGreen<'db>) -> Self {
16961 Self(value.0)
16962 }
16963}
16964impl<'db> From<ItemTraitGreen<'db>> for ImplItemGreen<'db> {
16965 fn from(value: ItemTraitGreen<'db>) -> Self {
16966 Self(value.0)
16967 }
16968}
16969impl<'db> From<ItemStructGreen<'db>> for ImplItemGreen<'db> {
16970 fn from(value: ItemStructGreen<'db>) -> Self {
16971 Self(value.0)
16972 }
16973}
16974impl<'db> From<ItemEnumGreen<'db>> for ImplItemGreen<'db> {
16975 fn from(value: ItemEnumGreen<'db>) -> Self {
16976 Self(value.0)
16977 }
16978}
16979impl<'db> From<ImplItemMissingGreen<'db>> for ImplItemGreen<'db> {
16980 fn from(value: ImplItemMissingGreen<'db>) -> Self {
16981 Self(value.0)
16982 }
16983}
16984#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
16985pub struct ImplItemGreen<'db>(pub GreenId<'db>);
16986impl<'db> TypedSyntaxNode<'db> for ImplItem<'db> {
16987 const OPTIONAL_KIND: Option<SyntaxKind> = None;
16988 type StablePtr = ImplItemPtr<'db>;
16989 type Green = ImplItemGreen<'db>;
16990 fn missing(db: &'db dyn Database) -> Self::Green {
16991 ImplItemGreen(ImplItemMissing::missing(db).0)
16992 }
16993 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
16994 let kind = node.kind(db);
16995 match kind {
16996 SyntaxKind::FunctionWithBody => {
16997 ImplItem::Function(FunctionWithBody::from_syntax_node(db, node))
16998 }
16999 SyntaxKind::ItemTypeAlias => ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)),
17000 SyntaxKind::ItemConstant => {
17001 ImplItem::Constant(ItemConstant::from_syntax_node(db, node))
17002 }
17003 SyntaxKind::ItemImplAlias => ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)),
17004 SyntaxKind::ItemModule => ImplItem::Module(ItemModule::from_syntax_node(db, node)),
17005 SyntaxKind::ItemUse => ImplItem::Use(ItemUse::from_syntax_node(db, node)),
17006 SyntaxKind::ItemExternFunction => {
17007 ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node))
17008 }
17009 SyntaxKind::ItemExternType => {
17010 ImplItem::ExternType(ItemExternType::from_syntax_node(db, node))
17011 }
17012 SyntaxKind::ItemTrait => ImplItem::Trait(ItemTrait::from_syntax_node(db, node)),
17013 SyntaxKind::ItemStruct => ImplItem::Struct(ItemStruct::from_syntax_node(db, node)),
17014 SyntaxKind::ItemEnum => ImplItem::Enum(ItemEnum::from_syntax_node(db, node)),
17015 SyntaxKind::ImplItemMissing => {
17016 ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node))
17017 }
17018 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "ImplItem"),
17019 }
17020 }
17021 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17022 let kind = node.kind(db);
17023 match kind {
17024 SyntaxKind::FunctionWithBody => {
17025 Some(ImplItem::Function(FunctionWithBody::from_syntax_node(db, node)))
17026 }
17027 SyntaxKind::ItemTypeAlias => {
17028 Some(ImplItem::Type(ItemTypeAlias::from_syntax_node(db, node)))
17029 }
17030 SyntaxKind::ItemConstant => {
17031 Some(ImplItem::Constant(ItemConstant::from_syntax_node(db, node)))
17032 }
17033 SyntaxKind::ItemImplAlias => {
17034 Some(ImplItem::Impl(ItemImplAlias::from_syntax_node(db, node)))
17035 }
17036 SyntaxKind::ItemModule => {
17037 Some(ImplItem::Module(ItemModule::from_syntax_node(db, node)))
17038 }
17039 SyntaxKind::ItemUse => Some(ImplItem::Use(ItemUse::from_syntax_node(db, node))),
17040 SyntaxKind::ItemExternFunction => {
17041 Some(ImplItem::ExternFunction(ItemExternFunction::from_syntax_node(db, node)))
17042 }
17043 SyntaxKind::ItemExternType => {
17044 Some(ImplItem::ExternType(ItemExternType::from_syntax_node(db, node)))
17045 }
17046 SyntaxKind::ItemTrait => Some(ImplItem::Trait(ItemTrait::from_syntax_node(db, node))),
17047 SyntaxKind::ItemStruct => {
17048 Some(ImplItem::Struct(ItemStruct::from_syntax_node(db, node)))
17049 }
17050 SyntaxKind::ItemEnum => Some(ImplItem::Enum(ItemEnum::from_syntax_node(db, node))),
17051 SyntaxKind::ImplItemMissing => {
17052 Some(ImplItem::Missing(ImplItemMissing::from_syntax_node(db, node)))
17053 }
17054 _ => None,
17055 }
17056 }
17057 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17058 match self {
17059 ImplItem::Function(x) => x.as_syntax_node(),
17060 ImplItem::Type(x) => x.as_syntax_node(),
17061 ImplItem::Constant(x) => x.as_syntax_node(),
17062 ImplItem::Impl(x) => x.as_syntax_node(),
17063 ImplItem::Module(x) => x.as_syntax_node(),
17064 ImplItem::Use(x) => x.as_syntax_node(),
17065 ImplItem::ExternFunction(x) => x.as_syntax_node(),
17066 ImplItem::ExternType(x) => x.as_syntax_node(),
17067 ImplItem::Trait(x) => x.as_syntax_node(),
17068 ImplItem::Struct(x) => x.as_syntax_node(),
17069 ImplItem::Enum(x) => x.as_syntax_node(),
17070 ImplItem::Missing(x) => x.as_syntax_node(),
17071 }
17072 }
17073 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17074 ImplItemPtr(self.as_syntax_node().stable_ptr(db))
17075 }
17076}
17077impl<'db> ImplItem<'db> {
17078 pub fn is_variant(kind: SyntaxKind) -> bool {
17080 matches!(
17081 kind,
17082 SyntaxKind::FunctionWithBody
17083 | SyntaxKind::ItemTypeAlias
17084 | SyntaxKind::ItemConstant
17085 | SyntaxKind::ItemImplAlias
17086 | SyntaxKind::ItemModule
17087 | SyntaxKind::ItemUse
17088 | SyntaxKind::ItemExternFunction
17089 | SyntaxKind::ItemExternType
17090 | SyntaxKind::ItemTrait
17091 | SyntaxKind::ItemStruct
17092 | SyntaxKind::ItemEnum
17093 | SyntaxKind::ImplItemMissing
17094 )
17095 }
17096}
17097#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17098pub struct ImplItemMissing<'db> {
17099 node: SyntaxNode<'db>,
17100}
17101impl<'db> ImplItemMissing<'db> {
17102 pub fn new_green(db: &'db dyn Database) -> ImplItemMissingGreen<'db> {
17103 let children = [];
17104 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17105 ImplItemMissingGreen(
17106 GreenNode {
17107 kind: SyntaxKind::ImplItemMissing,
17108 details: GreenNodeDetails::Node { children: children.into(), width },
17109 }
17110 .intern(db),
17111 )
17112 }
17113}
17114impl<'db> ImplItemMissing<'db> {}
17115#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17116pub struct ImplItemMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
17117impl<'db> ImplItemMissingPtr<'db> {}
17118impl<'db> TypedStablePtr<'db> for ImplItemMissingPtr<'db> {
17119 type SyntaxNode = ImplItemMissing<'db>;
17120 fn untyped(self) -> SyntaxStablePtrId<'db> {
17121 self.0
17122 }
17123 fn lookup(&self, db: &'db dyn Database) -> ImplItemMissing<'db> {
17124 ImplItemMissing::from_syntax_node(db, self.0.lookup(db))
17125 }
17126}
17127impl<'db> From<ImplItemMissingPtr<'db>> for SyntaxStablePtrId<'db> {
17128 fn from(ptr: ImplItemMissingPtr<'db>) -> Self {
17129 ptr.untyped()
17130 }
17131}
17132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17133pub struct ImplItemMissingGreen<'db>(pub GreenId<'db>);
17134impl<'db> TypedSyntaxNode<'db> for ImplItemMissing<'db> {
17135 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ImplItemMissing);
17136 type StablePtr = ImplItemMissingPtr<'db>;
17137 type Green = ImplItemMissingGreen<'db>;
17138 fn missing(db: &'db dyn Database) -> Self::Green {
17139 ImplItemMissingGreen(
17140 GreenNode {
17141 kind: SyntaxKind::ImplItemMissing,
17142 details: GreenNodeDetails::Node {
17143 children: [].into(),
17144 width: TextWidth::default(),
17145 },
17146 }
17147 .intern(db),
17148 )
17149 }
17150 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17151 let kind = node.kind(db);
17152 assert_eq!(
17153 kind,
17154 SyntaxKind::ImplItemMissing,
17155 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17156 kind,
17157 SyntaxKind::ImplItemMissing
17158 );
17159 Self { node }
17160 }
17161 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17162 let kind = node.kind(db);
17163 if kind == SyntaxKind::ImplItemMissing {
17164 Some(Self::from_syntax_node(db, node))
17165 } else {
17166 None
17167 }
17168 }
17169 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17170 self.node
17171 }
17172 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17173 ImplItemMissingPtr(self.node.stable_ptr(db))
17174 }
17175}
17176#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17177pub struct ItemImplAlias<'db> {
17178 node: SyntaxNode<'db>,
17179}
17180impl<'db> ItemImplAlias<'db> {
17181 pub const INDEX_ATTRIBUTES: usize = 0;
17182 pub const INDEX_VISIBILITY: usize = 1;
17183 pub const INDEX_IMPL_KW: usize = 2;
17184 pub const INDEX_NAME: usize = 3;
17185 pub const INDEX_GENERIC_PARAMS: usize = 4;
17186 pub const INDEX_EQ: usize = 5;
17187 pub const INDEX_IMPL_PATH: usize = 6;
17188 pub const INDEX_SEMICOLON: usize = 7;
17189 pub fn new_green(
17190 db: &'db dyn Database,
17191 attributes: AttributeListGreen<'db>,
17192 visibility: VisibilityGreen<'db>,
17193 impl_kw: TerminalImplGreen<'db>,
17194 name: TerminalIdentifierGreen<'db>,
17195 generic_params: OptionWrappedGenericParamListGreen<'db>,
17196 eq: TerminalEqGreen<'db>,
17197 impl_path: ExprPathGreen<'db>,
17198 semicolon: TerminalSemicolonGreen<'db>,
17199 ) -> ItemImplAliasGreen<'db> {
17200 let children = [
17201 attributes.0,
17202 visibility.0,
17203 impl_kw.0,
17204 name.0,
17205 generic_params.0,
17206 eq.0,
17207 impl_path.0,
17208 semicolon.0,
17209 ];
17210 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17211 ItemImplAliasGreen(
17212 GreenNode {
17213 kind: SyntaxKind::ItemImplAlias,
17214 details: GreenNodeDetails::Node { children: children.into(), width },
17215 }
17216 .intern(db),
17217 )
17218 }
17219}
17220impl<'db> ItemImplAlias<'db> {
17221 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17222 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17223 }
17224 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17225 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17226 }
17227 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
17228 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[2])
17229 }
17230 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17231 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17232 }
17233 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17234 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17235 }
17236 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17237 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17238 }
17239 pub fn impl_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
17240 ExprPath::from_syntax_node(db, self.node.get_children(db)[6])
17241 }
17242 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17243 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17244 }
17245}
17246#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17247pub struct ItemImplAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17248impl<'db> ItemImplAliasPtr<'db> {
17249 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17250 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17251 }
17252}
17253impl<'db> TypedStablePtr<'db> for ItemImplAliasPtr<'db> {
17254 type SyntaxNode = ItemImplAlias<'db>;
17255 fn untyped(self) -> SyntaxStablePtrId<'db> {
17256 self.0
17257 }
17258 fn lookup(&self, db: &'db dyn Database) -> ItemImplAlias<'db> {
17259 ItemImplAlias::from_syntax_node(db, self.0.lookup(db))
17260 }
17261}
17262impl<'db> From<ItemImplAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17263 fn from(ptr: ItemImplAliasPtr<'db>) -> Self {
17264 ptr.untyped()
17265 }
17266}
17267#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17268pub struct ItemImplAliasGreen<'db>(pub GreenId<'db>);
17269impl<'db> TypedSyntaxNode<'db> for ItemImplAlias<'db> {
17270 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemImplAlias);
17271 type StablePtr = ItemImplAliasPtr<'db>;
17272 type Green = ItemImplAliasGreen<'db>;
17273 fn missing(db: &'db dyn Database) -> Self::Green {
17274 ItemImplAliasGreen(
17275 GreenNode {
17276 kind: SyntaxKind::ItemImplAlias,
17277 details: GreenNodeDetails::Node {
17278 children: [
17279 AttributeList::missing(db).0,
17280 Visibility::missing(db).0,
17281 TerminalImpl::missing(db).0,
17282 TerminalIdentifier::missing(db).0,
17283 OptionWrappedGenericParamList::missing(db).0,
17284 TerminalEq::missing(db).0,
17285 ExprPath::missing(db).0,
17286 TerminalSemicolon::missing(db).0,
17287 ]
17288 .into(),
17289 width: TextWidth::default(),
17290 },
17291 }
17292 .intern(db),
17293 )
17294 }
17295 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17296 let kind = node.kind(db);
17297 assert_eq!(
17298 kind,
17299 SyntaxKind::ItemImplAlias,
17300 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17301 kind,
17302 SyntaxKind::ItemImplAlias
17303 );
17304 Self { node }
17305 }
17306 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17307 let kind = node.kind(db);
17308 if kind == SyntaxKind::ItemImplAlias {
17309 Some(Self::from_syntax_node(db, node))
17310 } else {
17311 None
17312 }
17313 }
17314 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17315 self.node
17316 }
17317 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17318 ItemImplAliasPtr(self.node.stable_ptr(db))
17319 }
17320}
17321#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17322pub struct ItemStruct<'db> {
17323 node: SyntaxNode<'db>,
17324}
17325impl<'db> ItemStruct<'db> {
17326 pub const INDEX_ATTRIBUTES: usize = 0;
17327 pub const INDEX_VISIBILITY: usize = 1;
17328 pub const INDEX_STRUCT_KW: usize = 2;
17329 pub const INDEX_NAME: usize = 3;
17330 pub const INDEX_GENERIC_PARAMS: usize = 4;
17331 pub const INDEX_LBRACE: usize = 5;
17332 pub const INDEX_MEMBERS: usize = 6;
17333 pub const INDEX_RBRACE: usize = 7;
17334 pub fn new_green(
17335 db: &'db dyn Database,
17336 attributes: AttributeListGreen<'db>,
17337 visibility: VisibilityGreen<'db>,
17338 struct_kw: TerminalStructGreen<'db>,
17339 name: TerminalIdentifierGreen<'db>,
17340 generic_params: OptionWrappedGenericParamListGreen<'db>,
17341 lbrace: TerminalLBraceGreen<'db>,
17342 members: MemberListGreen<'db>,
17343 rbrace: TerminalRBraceGreen<'db>,
17344 ) -> ItemStructGreen<'db> {
17345 let children = [
17346 attributes.0,
17347 visibility.0,
17348 struct_kw.0,
17349 name.0,
17350 generic_params.0,
17351 lbrace.0,
17352 members.0,
17353 rbrace.0,
17354 ];
17355 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17356 ItemStructGreen(
17357 GreenNode {
17358 kind: SyntaxKind::ItemStruct,
17359 details: GreenNodeDetails::Node { children: children.into(), width },
17360 }
17361 .intern(db),
17362 )
17363 }
17364}
17365impl<'db> ItemStruct<'db> {
17366 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17367 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17368 }
17369 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17370 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17371 }
17372 pub fn struct_kw(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
17373 TerminalStruct::from_syntax_node(db, self.node.get_children(db)[2])
17374 }
17375 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17376 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17377 }
17378 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17379 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17380 }
17381 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17382 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17383 }
17384 pub fn members(&self, db: &'db dyn Database) -> MemberList<'db> {
17385 MemberList::from_syntax_node(db, self.node.get_children(db)[6])
17386 }
17387 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17388 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17389 }
17390}
17391#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17392pub struct ItemStructPtr<'db>(pub SyntaxStablePtrId<'db>);
17393impl<'db> ItemStructPtr<'db> {
17394 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17395 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17396 }
17397}
17398impl<'db> TypedStablePtr<'db> for ItemStructPtr<'db> {
17399 type SyntaxNode = ItemStruct<'db>;
17400 fn untyped(self) -> SyntaxStablePtrId<'db> {
17401 self.0
17402 }
17403 fn lookup(&self, db: &'db dyn Database) -> ItemStruct<'db> {
17404 ItemStruct::from_syntax_node(db, self.0.lookup(db))
17405 }
17406}
17407impl<'db> From<ItemStructPtr<'db>> for SyntaxStablePtrId<'db> {
17408 fn from(ptr: ItemStructPtr<'db>) -> Self {
17409 ptr.untyped()
17410 }
17411}
17412#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17413pub struct ItemStructGreen<'db>(pub GreenId<'db>);
17414impl<'db> TypedSyntaxNode<'db> for ItemStruct<'db> {
17415 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemStruct);
17416 type StablePtr = ItemStructPtr<'db>;
17417 type Green = ItemStructGreen<'db>;
17418 fn missing(db: &'db dyn Database) -> Self::Green {
17419 ItemStructGreen(
17420 GreenNode {
17421 kind: SyntaxKind::ItemStruct,
17422 details: GreenNodeDetails::Node {
17423 children: [
17424 AttributeList::missing(db).0,
17425 Visibility::missing(db).0,
17426 TerminalStruct::missing(db).0,
17427 TerminalIdentifier::missing(db).0,
17428 OptionWrappedGenericParamList::missing(db).0,
17429 TerminalLBrace::missing(db).0,
17430 MemberList::missing(db).0,
17431 TerminalRBrace::missing(db).0,
17432 ]
17433 .into(),
17434 width: TextWidth::default(),
17435 },
17436 }
17437 .intern(db),
17438 )
17439 }
17440 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17441 let kind = node.kind(db);
17442 assert_eq!(
17443 kind,
17444 SyntaxKind::ItemStruct,
17445 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17446 kind,
17447 SyntaxKind::ItemStruct
17448 );
17449 Self { node }
17450 }
17451 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17452 let kind = node.kind(db);
17453 if kind == SyntaxKind::ItemStruct { Some(Self::from_syntax_node(db, node)) } else { None }
17454 }
17455 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17456 self.node
17457 }
17458 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17459 ItemStructPtr(self.node.stable_ptr(db))
17460 }
17461}
17462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17463pub struct ItemEnum<'db> {
17464 node: SyntaxNode<'db>,
17465}
17466impl<'db> ItemEnum<'db> {
17467 pub const INDEX_ATTRIBUTES: usize = 0;
17468 pub const INDEX_VISIBILITY: usize = 1;
17469 pub const INDEX_ENUM_KW: usize = 2;
17470 pub const INDEX_NAME: usize = 3;
17471 pub const INDEX_GENERIC_PARAMS: usize = 4;
17472 pub const INDEX_LBRACE: usize = 5;
17473 pub const INDEX_VARIANTS: usize = 6;
17474 pub const INDEX_RBRACE: usize = 7;
17475 pub fn new_green(
17476 db: &'db dyn Database,
17477 attributes: AttributeListGreen<'db>,
17478 visibility: VisibilityGreen<'db>,
17479 enum_kw: TerminalEnumGreen<'db>,
17480 name: TerminalIdentifierGreen<'db>,
17481 generic_params: OptionWrappedGenericParamListGreen<'db>,
17482 lbrace: TerminalLBraceGreen<'db>,
17483 variants: VariantListGreen<'db>,
17484 rbrace: TerminalRBraceGreen<'db>,
17485 ) -> ItemEnumGreen<'db> {
17486 let children = [
17487 attributes.0,
17488 visibility.0,
17489 enum_kw.0,
17490 name.0,
17491 generic_params.0,
17492 lbrace.0,
17493 variants.0,
17494 rbrace.0,
17495 ];
17496 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17497 ItemEnumGreen(
17498 GreenNode {
17499 kind: SyntaxKind::ItemEnum,
17500 details: GreenNodeDetails::Node { children: children.into(), width },
17501 }
17502 .intern(db),
17503 )
17504 }
17505}
17506impl<'db> ItemEnum<'db> {
17507 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17508 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17509 }
17510 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17511 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17512 }
17513 pub fn enum_kw(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
17514 TerminalEnum::from_syntax_node(db, self.node.get_children(db)[2])
17515 }
17516 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17517 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17518 }
17519 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17520 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17521 }
17522 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
17523 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[5])
17524 }
17525 pub fn variants(&self, db: &'db dyn Database) -> VariantList<'db> {
17526 VariantList::from_syntax_node(db, self.node.get_children(db)[6])
17527 }
17528 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
17529 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[7])
17530 }
17531}
17532#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17533pub struct ItemEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
17534impl<'db> ItemEnumPtr<'db> {
17535 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17536 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17537 }
17538}
17539impl<'db> TypedStablePtr<'db> for ItemEnumPtr<'db> {
17540 type SyntaxNode = ItemEnum<'db>;
17541 fn untyped(self) -> SyntaxStablePtrId<'db> {
17542 self.0
17543 }
17544 fn lookup(&self, db: &'db dyn Database) -> ItemEnum<'db> {
17545 ItemEnum::from_syntax_node(db, self.0.lookup(db))
17546 }
17547}
17548impl<'db> From<ItemEnumPtr<'db>> for SyntaxStablePtrId<'db> {
17549 fn from(ptr: ItemEnumPtr<'db>) -> Self {
17550 ptr.untyped()
17551 }
17552}
17553#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17554pub struct ItemEnumGreen<'db>(pub GreenId<'db>);
17555impl<'db> TypedSyntaxNode<'db> for ItemEnum<'db> {
17556 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemEnum);
17557 type StablePtr = ItemEnumPtr<'db>;
17558 type Green = ItemEnumGreen<'db>;
17559 fn missing(db: &'db dyn Database) -> Self::Green {
17560 ItemEnumGreen(
17561 GreenNode {
17562 kind: SyntaxKind::ItemEnum,
17563 details: GreenNodeDetails::Node {
17564 children: [
17565 AttributeList::missing(db).0,
17566 Visibility::missing(db).0,
17567 TerminalEnum::missing(db).0,
17568 TerminalIdentifier::missing(db).0,
17569 OptionWrappedGenericParamList::missing(db).0,
17570 TerminalLBrace::missing(db).0,
17571 VariantList::missing(db).0,
17572 TerminalRBrace::missing(db).0,
17573 ]
17574 .into(),
17575 width: TextWidth::default(),
17576 },
17577 }
17578 .intern(db),
17579 )
17580 }
17581 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17582 let kind = node.kind(db);
17583 assert_eq!(
17584 kind,
17585 SyntaxKind::ItemEnum,
17586 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17587 kind,
17588 SyntaxKind::ItemEnum
17589 );
17590 Self { node }
17591 }
17592 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17593 let kind = node.kind(db);
17594 if kind == SyntaxKind::ItemEnum { Some(Self::from_syntax_node(db, node)) } else { None }
17595 }
17596 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17597 self.node
17598 }
17599 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17600 ItemEnumPtr(self.node.stable_ptr(db))
17601 }
17602}
17603#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17604pub struct ItemTypeAlias<'db> {
17605 node: SyntaxNode<'db>,
17606}
17607impl<'db> ItemTypeAlias<'db> {
17608 pub const INDEX_ATTRIBUTES: usize = 0;
17609 pub const INDEX_VISIBILITY: usize = 1;
17610 pub const INDEX_TYPE_KW: usize = 2;
17611 pub const INDEX_NAME: usize = 3;
17612 pub const INDEX_GENERIC_PARAMS: usize = 4;
17613 pub const INDEX_EQ: usize = 5;
17614 pub const INDEX_TY: usize = 6;
17615 pub const INDEX_SEMICOLON: usize = 7;
17616 pub fn new_green(
17617 db: &'db dyn Database,
17618 attributes: AttributeListGreen<'db>,
17619 visibility: VisibilityGreen<'db>,
17620 type_kw: TerminalTypeGreen<'db>,
17621 name: TerminalIdentifierGreen<'db>,
17622 generic_params: OptionWrappedGenericParamListGreen<'db>,
17623 eq: TerminalEqGreen<'db>,
17624 ty: ExprGreen<'db>,
17625 semicolon: TerminalSemicolonGreen<'db>,
17626 ) -> ItemTypeAliasGreen<'db> {
17627 let children = [
17628 attributes.0,
17629 visibility.0,
17630 type_kw.0,
17631 name.0,
17632 generic_params.0,
17633 eq.0,
17634 ty.0,
17635 semicolon.0,
17636 ];
17637 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17638 ItemTypeAliasGreen(
17639 GreenNode {
17640 kind: SyntaxKind::ItemTypeAlias,
17641 details: GreenNodeDetails::Node { children: children.into(), width },
17642 }
17643 .intern(db),
17644 )
17645 }
17646}
17647impl<'db> ItemTypeAlias<'db> {
17648 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17649 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17650 }
17651 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17652 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17653 }
17654 pub fn type_kw(&self, db: &'db dyn Database) -> TerminalType<'db> {
17655 TerminalType::from_syntax_node(db, self.node.get_children(db)[2])
17656 }
17657 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
17658 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
17659 }
17660 pub fn generic_params(&self, db: &'db dyn Database) -> OptionWrappedGenericParamList<'db> {
17661 OptionWrappedGenericParamList::from_syntax_node(db, self.node.get_children(db)[4])
17662 }
17663 pub fn eq(&self, db: &'db dyn Database) -> TerminalEq<'db> {
17664 TerminalEq::from_syntax_node(db, self.node.get_children(db)[5])
17665 }
17666 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
17667 Expr::from_syntax_node(db, self.node.get_children(db)[6])
17668 }
17669 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17670 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[7])
17671 }
17672}
17673#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17674pub struct ItemTypeAliasPtr<'db>(pub SyntaxStablePtrId<'db>);
17675impl<'db> ItemTypeAliasPtr<'db> {
17676 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
17677 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
17678 }
17679}
17680impl<'db> TypedStablePtr<'db> for ItemTypeAliasPtr<'db> {
17681 type SyntaxNode = ItemTypeAlias<'db>;
17682 fn untyped(self) -> SyntaxStablePtrId<'db> {
17683 self.0
17684 }
17685 fn lookup(&self, db: &'db dyn Database) -> ItemTypeAlias<'db> {
17686 ItemTypeAlias::from_syntax_node(db, self.0.lookup(db))
17687 }
17688}
17689impl<'db> From<ItemTypeAliasPtr<'db>> for SyntaxStablePtrId<'db> {
17690 fn from(ptr: ItemTypeAliasPtr<'db>) -> Self {
17691 ptr.untyped()
17692 }
17693}
17694#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17695pub struct ItemTypeAliasGreen<'db>(pub GreenId<'db>);
17696impl<'db> TypedSyntaxNode<'db> for ItemTypeAlias<'db> {
17697 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemTypeAlias);
17698 type StablePtr = ItemTypeAliasPtr<'db>;
17699 type Green = ItemTypeAliasGreen<'db>;
17700 fn missing(db: &'db dyn Database) -> Self::Green {
17701 ItemTypeAliasGreen(
17702 GreenNode {
17703 kind: SyntaxKind::ItemTypeAlias,
17704 details: GreenNodeDetails::Node {
17705 children: [
17706 AttributeList::missing(db).0,
17707 Visibility::missing(db).0,
17708 TerminalType::missing(db).0,
17709 TerminalIdentifier::missing(db).0,
17710 OptionWrappedGenericParamList::missing(db).0,
17711 TerminalEq::missing(db).0,
17712 Expr::missing(db).0,
17713 TerminalSemicolon::missing(db).0,
17714 ]
17715 .into(),
17716 width: TextWidth::default(),
17717 },
17718 }
17719 .intern(db),
17720 )
17721 }
17722 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17723 let kind = node.kind(db);
17724 assert_eq!(
17725 kind,
17726 SyntaxKind::ItemTypeAlias,
17727 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17728 kind,
17729 SyntaxKind::ItemTypeAlias
17730 );
17731 Self { node }
17732 }
17733 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17734 let kind = node.kind(db);
17735 if kind == SyntaxKind::ItemTypeAlias {
17736 Some(Self::from_syntax_node(db, node))
17737 } else {
17738 None
17739 }
17740 }
17741 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17742 self.node
17743 }
17744 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17745 ItemTypeAliasPtr(self.node.stable_ptr(db))
17746 }
17747}
17748#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17749pub struct ItemUse<'db> {
17750 node: SyntaxNode<'db>,
17751}
17752impl<'db> ItemUse<'db> {
17753 pub const INDEX_ATTRIBUTES: usize = 0;
17754 pub const INDEX_VISIBILITY: usize = 1;
17755 pub const INDEX_USE_KW: usize = 2;
17756 pub const INDEX_DOLLAR: usize = 3;
17757 pub const INDEX_USE_PATH: usize = 4;
17758 pub const INDEX_SEMICOLON: usize = 5;
17759 pub fn new_green(
17760 db: &'db dyn Database,
17761 attributes: AttributeListGreen<'db>,
17762 visibility: VisibilityGreen<'db>,
17763 use_kw: TerminalUseGreen<'db>,
17764 dollar: OptionTerminalDollarGreen<'db>,
17765 use_path: UsePathGreen<'db>,
17766 semicolon: TerminalSemicolonGreen<'db>,
17767 ) -> ItemUseGreen<'db> {
17768 let children = [attributes.0, visibility.0, use_kw.0, dollar.0, use_path.0, semicolon.0];
17769 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
17770 ItemUseGreen(
17771 GreenNode {
17772 kind: SyntaxKind::ItemUse,
17773 details: GreenNodeDetails::Node { children: children.into(), width },
17774 }
17775 .intern(db),
17776 )
17777 }
17778}
17779impl<'db> ItemUse<'db> {
17780 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
17781 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
17782 }
17783 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
17784 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
17785 }
17786 pub fn use_kw(&self, db: &'db dyn Database) -> TerminalUse<'db> {
17787 TerminalUse::from_syntax_node(db, self.node.get_children(db)[2])
17788 }
17789 pub fn dollar(&self, db: &'db dyn Database) -> OptionTerminalDollar<'db> {
17790 OptionTerminalDollar::from_syntax_node(db, self.node.get_children(db)[3])
17791 }
17792 pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
17793 UsePath::from_syntax_node(db, self.node.get_children(db)[4])
17794 }
17795 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
17796 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[5])
17797 }
17798}
17799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17800pub struct ItemUsePtr<'db>(pub SyntaxStablePtrId<'db>);
17801impl<'db> ItemUsePtr<'db> {
17802 pub fn use_path_green(self, db: &'db dyn Database) -> UsePathGreen<'db> {
17803 UsePathGreen(self.0.0.key_fields(db)[0])
17804 }
17805}
17806impl<'db> TypedStablePtr<'db> for ItemUsePtr<'db> {
17807 type SyntaxNode = ItemUse<'db>;
17808 fn untyped(self) -> SyntaxStablePtrId<'db> {
17809 self.0
17810 }
17811 fn lookup(&self, db: &'db dyn Database) -> ItemUse<'db> {
17812 ItemUse::from_syntax_node(db, self.0.lookup(db))
17813 }
17814}
17815impl<'db> From<ItemUsePtr<'db>> for SyntaxStablePtrId<'db> {
17816 fn from(ptr: ItemUsePtr<'db>) -> Self {
17817 ptr.untyped()
17818 }
17819}
17820#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17821pub struct ItemUseGreen<'db>(pub GreenId<'db>);
17822impl<'db> TypedSyntaxNode<'db> for ItemUse<'db> {
17823 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemUse);
17824 type StablePtr = ItemUsePtr<'db>;
17825 type Green = ItemUseGreen<'db>;
17826 fn missing(db: &'db dyn Database) -> Self::Green {
17827 ItemUseGreen(
17828 GreenNode {
17829 kind: SyntaxKind::ItemUse,
17830 details: GreenNodeDetails::Node {
17831 children: [
17832 AttributeList::missing(db).0,
17833 Visibility::missing(db).0,
17834 TerminalUse::missing(db).0,
17835 OptionTerminalDollar::missing(db).0,
17836 UsePath::missing(db).0,
17837 TerminalSemicolon::missing(db).0,
17838 ]
17839 .into(),
17840 width: TextWidth::default(),
17841 },
17842 }
17843 .intern(db),
17844 )
17845 }
17846 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17847 let kind = node.kind(db);
17848 assert_eq!(
17849 kind,
17850 SyntaxKind::ItemUse,
17851 "Unexpected SyntaxKind {:?}. Expected {:?}.",
17852 kind,
17853 SyntaxKind::ItemUse
17854 );
17855 Self { node }
17856 }
17857 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17858 let kind = node.kind(db);
17859 if kind == SyntaxKind::ItemUse { Some(Self::from_syntax_node(db, node)) } else { None }
17860 }
17861 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17862 self.node
17863 }
17864 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17865 ItemUsePtr(self.node.stable_ptr(db))
17866 }
17867}
17868#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17869pub enum UsePath<'db> {
17870 Leaf(UsePathLeaf<'db>),
17871 Single(UsePathSingle<'db>),
17872 Multi(UsePathMulti<'db>),
17873 Star(UsePathStar<'db>),
17874}
17875#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17876pub struct UsePathPtr<'db>(pub SyntaxStablePtrId<'db>);
17877impl<'db> TypedStablePtr<'db> for UsePathPtr<'db> {
17878 type SyntaxNode = UsePath<'db>;
17879 fn untyped(self) -> SyntaxStablePtrId<'db> {
17880 self.0
17881 }
17882 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
17883 UsePath::from_syntax_node(db, self.0.lookup(db))
17884 }
17885}
17886impl<'db> From<UsePathPtr<'db>> for SyntaxStablePtrId<'db> {
17887 fn from(ptr: UsePathPtr<'db>) -> Self {
17888 ptr.untyped()
17889 }
17890}
17891impl<'db> From<UsePathLeafPtr<'db>> for UsePathPtr<'db> {
17892 fn from(value: UsePathLeafPtr<'db>) -> Self {
17893 Self(value.0)
17894 }
17895}
17896impl<'db> From<UsePathSinglePtr<'db>> for UsePathPtr<'db> {
17897 fn from(value: UsePathSinglePtr<'db>) -> Self {
17898 Self(value.0)
17899 }
17900}
17901impl<'db> From<UsePathMultiPtr<'db>> for UsePathPtr<'db> {
17902 fn from(value: UsePathMultiPtr<'db>) -> Self {
17903 Self(value.0)
17904 }
17905}
17906impl<'db> From<UsePathStarPtr<'db>> for UsePathPtr<'db> {
17907 fn from(value: UsePathStarPtr<'db>) -> Self {
17908 Self(value.0)
17909 }
17910}
17911impl<'db> From<UsePathLeafGreen<'db>> for UsePathGreen<'db> {
17912 fn from(value: UsePathLeafGreen<'db>) -> Self {
17913 Self(value.0)
17914 }
17915}
17916impl<'db> From<UsePathSingleGreen<'db>> for UsePathGreen<'db> {
17917 fn from(value: UsePathSingleGreen<'db>) -> Self {
17918 Self(value.0)
17919 }
17920}
17921impl<'db> From<UsePathMultiGreen<'db>> for UsePathGreen<'db> {
17922 fn from(value: UsePathMultiGreen<'db>) -> Self {
17923 Self(value.0)
17924 }
17925}
17926impl<'db> From<UsePathStarGreen<'db>> for UsePathGreen<'db> {
17927 fn from(value: UsePathStarGreen<'db>) -> Self {
17928 Self(value.0)
17929 }
17930}
17931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
17932pub struct UsePathGreen<'db>(pub GreenId<'db>);
17933impl<'db> TypedSyntaxNode<'db> for UsePath<'db> {
17934 const OPTIONAL_KIND: Option<SyntaxKind> = None;
17935 type StablePtr = UsePathPtr<'db>;
17936 type Green = UsePathGreen<'db>;
17937 fn missing(db: &'db dyn Database) -> Self::Green {
17938 panic!("No missing variant.");
17939 }
17940 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
17941 let kind = node.kind(db);
17942 match kind {
17943 SyntaxKind::UsePathLeaf => UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node)),
17944 SyntaxKind::UsePathSingle => UsePath::Single(UsePathSingle::from_syntax_node(db, node)),
17945 SyntaxKind::UsePathMulti => UsePath::Multi(UsePathMulti::from_syntax_node(db, node)),
17946 SyntaxKind::UsePathStar => UsePath::Star(UsePathStar::from_syntax_node(db, node)),
17947 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "UsePath"),
17948 }
17949 }
17950 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
17951 let kind = node.kind(db);
17952 match kind {
17953 SyntaxKind::UsePathLeaf => Some(UsePath::Leaf(UsePathLeaf::from_syntax_node(db, node))),
17954 SyntaxKind::UsePathSingle => {
17955 Some(UsePath::Single(UsePathSingle::from_syntax_node(db, node)))
17956 }
17957 SyntaxKind::UsePathMulti => {
17958 Some(UsePath::Multi(UsePathMulti::from_syntax_node(db, node)))
17959 }
17960 SyntaxKind::UsePathStar => Some(UsePath::Star(UsePathStar::from_syntax_node(db, node))),
17961 _ => None,
17962 }
17963 }
17964 fn as_syntax_node(&self) -> SyntaxNode<'db> {
17965 match self {
17966 UsePath::Leaf(x) => x.as_syntax_node(),
17967 UsePath::Single(x) => x.as_syntax_node(),
17968 UsePath::Multi(x) => x.as_syntax_node(),
17969 UsePath::Star(x) => x.as_syntax_node(),
17970 }
17971 }
17972 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
17973 UsePathPtr(self.as_syntax_node().stable_ptr(db))
17974 }
17975}
17976impl<'db> UsePath<'db> {
17977 pub fn is_variant(kind: SyntaxKind) -> bool {
17979 matches!(
17980 kind,
17981 SyntaxKind::UsePathLeaf
17982 | SyntaxKind::UsePathSingle
17983 | SyntaxKind::UsePathMulti
17984 | SyntaxKind::UsePathStar
17985 )
17986 }
17987}
17988#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
17989pub struct UsePathLeaf<'db> {
17990 node: SyntaxNode<'db>,
17991}
17992impl<'db> UsePathLeaf<'db> {
17993 pub const INDEX_IDENT: usize = 0;
17994 pub const INDEX_ALIAS_CLAUSE: usize = 1;
17995 pub fn new_green(
17996 db: &'db dyn Database,
17997 ident: PathSegmentGreen<'db>,
17998 alias_clause: OptionAliasClauseGreen<'db>,
17999 ) -> UsePathLeafGreen<'db> {
18000 let children = [ident.0, alias_clause.0];
18001 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18002 UsePathLeafGreen(
18003 GreenNode {
18004 kind: SyntaxKind::UsePathLeaf,
18005 details: GreenNodeDetails::Node { children: children.into(), width },
18006 }
18007 .intern(db),
18008 )
18009 }
18010}
18011impl<'db> UsePathLeaf<'db> {
18012 pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18013 PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18014 }
18015 pub fn alias_clause(&self, db: &'db dyn Database) -> OptionAliasClause<'db> {
18016 OptionAliasClause::from_syntax_node(db, self.node.get_children(db)[1])
18017 }
18018}
18019#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18020pub struct UsePathLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
18021impl<'db> UsePathLeafPtr<'db> {
18022 pub fn ident_green(self, db: &'db dyn Database) -> PathSegmentGreen<'db> {
18023 PathSegmentGreen(self.0.0.key_fields(db)[0])
18024 }
18025 pub fn alias_clause_green(self, db: &'db dyn Database) -> OptionAliasClauseGreen<'db> {
18026 OptionAliasClauseGreen(self.0.0.key_fields(db)[1])
18027 }
18028}
18029impl<'db> TypedStablePtr<'db> for UsePathLeafPtr<'db> {
18030 type SyntaxNode = UsePathLeaf<'db>;
18031 fn untyped(self) -> SyntaxStablePtrId<'db> {
18032 self.0
18033 }
18034 fn lookup(&self, db: &'db dyn Database) -> UsePathLeaf<'db> {
18035 UsePathLeaf::from_syntax_node(db, self.0.lookup(db))
18036 }
18037}
18038impl<'db> From<UsePathLeafPtr<'db>> for SyntaxStablePtrId<'db> {
18039 fn from(ptr: UsePathLeafPtr<'db>) -> Self {
18040 ptr.untyped()
18041 }
18042}
18043#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18044pub struct UsePathLeafGreen<'db>(pub GreenId<'db>);
18045impl<'db> TypedSyntaxNode<'db> for UsePathLeaf<'db> {
18046 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathLeaf);
18047 type StablePtr = UsePathLeafPtr<'db>;
18048 type Green = UsePathLeafGreen<'db>;
18049 fn missing(db: &'db dyn Database) -> Self::Green {
18050 UsePathLeafGreen(
18051 GreenNode {
18052 kind: SyntaxKind::UsePathLeaf,
18053 details: GreenNodeDetails::Node {
18054 children: [PathSegment::missing(db).0, OptionAliasClause::missing(db).0].into(),
18055 width: TextWidth::default(),
18056 },
18057 }
18058 .intern(db),
18059 )
18060 }
18061 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18062 let kind = node.kind(db);
18063 assert_eq!(
18064 kind,
18065 SyntaxKind::UsePathLeaf,
18066 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18067 kind,
18068 SyntaxKind::UsePathLeaf
18069 );
18070 Self { node }
18071 }
18072 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18073 let kind = node.kind(db);
18074 if kind == SyntaxKind::UsePathLeaf { Some(Self::from_syntax_node(db, node)) } else { None }
18075 }
18076 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18077 self.node
18078 }
18079 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18080 UsePathLeafPtr(self.node.stable_ptr(db))
18081 }
18082}
18083#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18084pub struct UsePathSingle<'db> {
18085 node: SyntaxNode<'db>,
18086}
18087impl<'db> UsePathSingle<'db> {
18088 pub const INDEX_IDENT: usize = 0;
18089 pub const INDEX_COLON_COLON: usize = 1;
18090 pub const INDEX_USE_PATH: usize = 2;
18091 pub fn new_green(
18092 db: &'db dyn Database,
18093 ident: PathSegmentGreen<'db>,
18094 colon_colon: TerminalColonColonGreen<'db>,
18095 use_path: UsePathGreen<'db>,
18096 ) -> UsePathSingleGreen<'db> {
18097 let children = [ident.0, colon_colon.0, use_path.0];
18098 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18099 UsePathSingleGreen(
18100 GreenNode {
18101 kind: SyntaxKind::UsePathSingle,
18102 details: GreenNodeDetails::Node { children: children.into(), width },
18103 }
18104 .intern(db),
18105 )
18106 }
18107}
18108impl<'db> UsePathSingle<'db> {
18109 pub fn ident(&self, db: &'db dyn Database) -> PathSegment<'db> {
18110 PathSegment::from_syntax_node(db, self.node.get_children(db)[0])
18111 }
18112 pub fn colon_colon(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
18113 TerminalColonColon::from_syntax_node(db, self.node.get_children(db)[1])
18114 }
18115 pub fn use_path(&self, db: &'db dyn Database) -> UsePath<'db> {
18116 UsePath::from_syntax_node(db, self.node.get_children(db)[2])
18117 }
18118}
18119#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18120pub struct UsePathSinglePtr<'db>(pub SyntaxStablePtrId<'db>);
18121impl<'db> UsePathSinglePtr<'db> {}
18122impl<'db> TypedStablePtr<'db> for UsePathSinglePtr<'db> {
18123 type SyntaxNode = UsePathSingle<'db>;
18124 fn untyped(self) -> SyntaxStablePtrId<'db> {
18125 self.0
18126 }
18127 fn lookup(&self, db: &'db dyn Database) -> UsePathSingle<'db> {
18128 UsePathSingle::from_syntax_node(db, self.0.lookup(db))
18129 }
18130}
18131impl<'db> From<UsePathSinglePtr<'db>> for SyntaxStablePtrId<'db> {
18132 fn from(ptr: UsePathSinglePtr<'db>) -> Self {
18133 ptr.untyped()
18134 }
18135}
18136#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18137pub struct UsePathSingleGreen<'db>(pub GreenId<'db>);
18138impl<'db> TypedSyntaxNode<'db> for UsePathSingle<'db> {
18139 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathSingle);
18140 type StablePtr = UsePathSinglePtr<'db>;
18141 type Green = UsePathSingleGreen<'db>;
18142 fn missing(db: &'db dyn Database) -> Self::Green {
18143 UsePathSingleGreen(
18144 GreenNode {
18145 kind: SyntaxKind::UsePathSingle,
18146 details: GreenNodeDetails::Node {
18147 children: [
18148 PathSegment::missing(db).0,
18149 TerminalColonColon::missing(db).0,
18150 UsePath::missing(db).0,
18151 ]
18152 .into(),
18153 width: TextWidth::default(),
18154 },
18155 }
18156 .intern(db),
18157 )
18158 }
18159 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18160 let kind = node.kind(db);
18161 assert_eq!(
18162 kind,
18163 SyntaxKind::UsePathSingle,
18164 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18165 kind,
18166 SyntaxKind::UsePathSingle
18167 );
18168 Self { node }
18169 }
18170 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18171 let kind = node.kind(db);
18172 if kind == SyntaxKind::UsePathSingle {
18173 Some(Self::from_syntax_node(db, node))
18174 } else {
18175 None
18176 }
18177 }
18178 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18179 self.node
18180 }
18181 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18182 UsePathSinglePtr(self.node.stable_ptr(db))
18183 }
18184}
18185#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18186pub struct UsePathMulti<'db> {
18187 node: SyntaxNode<'db>,
18188}
18189impl<'db> UsePathMulti<'db> {
18190 pub const INDEX_LBRACE: usize = 0;
18191 pub const INDEX_USE_PATHS: usize = 1;
18192 pub const INDEX_RBRACE: usize = 2;
18193 pub fn new_green(
18194 db: &'db dyn Database,
18195 lbrace: TerminalLBraceGreen<'db>,
18196 use_paths: UsePathListGreen<'db>,
18197 rbrace: TerminalRBraceGreen<'db>,
18198 ) -> UsePathMultiGreen<'db> {
18199 let children = [lbrace.0, use_paths.0, rbrace.0];
18200 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18201 UsePathMultiGreen(
18202 GreenNode {
18203 kind: SyntaxKind::UsePathMulti,
18204 details: GreenNodeDetails::Node { children: children.into(), width },
18205 }
18206 .intern(db),
18207 )
18208 }
18209}
18210impl<'db> UsePathMulti<'db> {
18211 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
18212 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
18213 }
18214 pub fn use_paths(&self, db: &'db dyn Database) -> UsePathList<'db> {
18215 UsePathList::from_syntax_node(db, self.node.get_children(db)[1])
18216 }
18217 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
18218 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
18219 }
18220}
18221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18222pub struct UsePathMultiPtr<'db>(pub SyntaxStablePtrId<'db>);
18223impl<'db> UsePathMultiPtr<'db> {}
18224impl<'db> TypedStablePtr<'db> for UsePathMultiPtr<'db> {
18225 type SyntaxNode = UsePathMulti<'db>;
18226 fn untyped(self) -> SyntaxStablePtrId<'db> {
18227 self.0
18228 }
18229 fn lookup(&self, db: &'db dyn Database) -> UsePathMulti<'db> {
18230 UsePathMulti::from_syntax_node(db, self.0.lookup(db))
18231 }
18232}
18233impl<'db> From<UsePathMultiPtr<'db>> for SyntaxStablePtrId<'db> {
18234 fn from(ptr: UsePathMultiPtr<'db>) -> Self {
18235 ptr.untyped()
18236 }
18237}
18238#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18239pub struct UsePathMultiGreen<'db>(pub GreenId<'db>);
18240impl<'db> TypedSyntaxNode<'db> for UsePathMulti<'db> {
18241 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathMulti);
18242 type StablePtr = UsePathMultiPtr<'db>;
18243 type Green = UsePathMultiGreen<'db>;
18244 fn missing(db: &'db dyn Database) -> Self::Green {
18245 UsePathMultiGreen(
18246 GreenNode {
18247 kind: SyntaxKind::UsePathMulti,
18248 details: GreenNodeDetails::Node {
18249 children: [
18250 TerminalLBrace::missing(db).0,
18251 UsePathList::missing(db).0,
18252 TerminalRBrace::missing(db).0,
18253 ]
18254 .into(),
18255 width: TextWidth::default(),
18256 },
18257 }
18258 .intern(db),
18259 )
18260 }
18261 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18262 let kind = node.kind(db);
18263 assert_eq!(
18264 kind,
18265 SyntaxKind::UsePathMulti,
18266 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18267 kind,
18268 SyntaxKind::UsePathMulti
18269 );
18270 Self { node }
18271 }
18272 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18273 let kind = node.kind(db);
18274 if kind == SyntaxKind::UsePathMulti { Some(Self::from_syntax_node(db, node)) } else { None }
18275 }
18276 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18277 self.node
18278 }
18279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18280 UsePathMultiPtr(self.node.stable_ptr(db))
18281 }
18282}
18283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18284pub struct UsePathStar<'db> {
18285 node: SyntaxNode<'db>,
18286}
18287impl<'db> UsePathStar<'db> {
18288 pub const INDEX_STAR: usize = 0;
18289 pub fn new_green(db: &'db dyn Database, star: TerminalMulGreen<'db>) -> UsePathStarGreen<'db> {
18290 let children = [star.0];
18291 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18292 UsePathStarGreen(
18293 GreenNode {
18294 kind: SyntaxKind::UsePathStar,
18295 details: GreenNodeDetails::Node { children: children.into(), width },
18296 }
18297 .intern(db),
18298 )
18299 }
18300}
18301impl<'db> UsePathStar<'db> {
18302 pub fn star(&self, db: &'db dyn Database) -> TerminalMul<'db> {
18303 TerminalMul::from_syntax_node(db, self.node.get_children(db)[0])
18304 }
18305}
18306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18307pub struct UsePathStarPtr<'db>(pub SyntaxStablePtrId<'db>);
18308impl<'db> UsePathStarPtr<'db> {}
18309impl<'db> TypedStablePtr<'db> for UsePathStarPtr<'db> {
18310 type SyntaxNode = UsePathStar<'db>;
18311 fn untyped(self) -> SyntaxStablePtrId<'db> {
18312 self.0
18313 }
18314 fn lookup(&self, db: &'db dyn Database) -> UsePathStar<'db> {
18315 UsePathStar::from_syntax_node(db, self.0.lookup(db))
18316 }
18317}
18318impl<'db> From<UsePathStarPtr<'db>> for SyntaxStablePtrId<'db> {
18319 fn from(ptr: UsePathStarPtr<'db>) -> Self {
18320 ptr.untyped()
18321 }
18322}
18323#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18324pub struct UsePathStarGreen<'db>(pub GreenId<'db>);
18325impl<'db> TypedSyntaxNode<'db> for UsePathStar<'db> {
18326 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathStar);
18327 type StablePtr = UsePathStarPtr<'db>;
18328 type Green = UsePathStarGreen<'db>;
18329 fn missing(db: &'db dyn Database) -> Self::Green {
18330 UsePathStarGreen(
18331 GreenNode {
18332 kind: SyntaxKind::UsePathStar,
18333 details: GreenNodeDetails::Node {
18334 children: [TerminalMul::missing(db).0].into(),
18335 width: TextWidth::default(),
18336 },
18337 }
18338 .intern(db),
18339 )
18340 }
18341 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18342 let kind = node.kind(db);
18343 assert_eq!(
18344 kind,
18345 SyntaxKind::UsePathStar,
18346 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18347 kind,
18348 SyntaxKind::UsePathStar
18349 );
18350 Self { node }
18351 }
18352 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18353 let kind = node.kind(db);
18354 if kind == SyntaxKind::UsePathStar { Some(Self::from_syntax_node(db, node)) } else { None }
18355 }
18356 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18357 self.node
18358 }
18359 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18360 UsePathStarPtr(self.node.stable_ptr(db))
18361 }
18362}
18363#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18364pub struct UsePathList<'db>(ElementList<'db, UsePath<'db>, 2>);
18365impl<'db> Deref for UsePathList<'db> {
18366 type Target = ElementList<'db, UsePath<'db>, 2>;
18367 fn deref(&self) -> &Self::Target {
18368 &self.0
18369 }
18370}
18371impl<'db> UsePathList<'db> {
18372 pub fn new_green(
18373 db: &'db dyn Database,
18374 children: &[UsePathListElementOrSeparatorGreen<'db>],
18375 ) -> UsePathListGreen<'db> {
18376 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
18377 UsePathListGreen(
18378 GreenNode {
18379 kind: SyntaxKind::UsePathList,
18380 details: GreenNodeDetails::Node {
18381 children: children.iter().map(|x| x.id()).collect(),
18382 width,
18383 },
18384 }
18385 .intern(db),
18386 )
18387 }
18388}
18389#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18390pub struct UsePathListPtr<'db>(pub SyntaxStablePtrId<'db>);
18391impl<'db> TypedStablePtr<'db> for UsePathListPtr<'db> {
18392 type SyntaxNode = UsePathList<'db>;
18393 fn untyped(self) -> SyntaxStablePtrId<'db> {
18394 self.0
18395 }
18396 fn lookup(&self, db: &'db dyn Database) -> UsePathList<'db> {
18397 UsePathList::from_syntax_node(db, self.0.lookup(db))
18398 }
18399}
18400impl<'db> From<UsePathListPtr<'db>> for SyntaxStablePtrId<'db> {
18401 fn from(ptr: UsePathListPtr<'db>) -> Self {
18402 ptr.untyped()
18403 }
18404}
18405#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18406pub enum UsePathListElementOrSeparatorGreen<'db> {
18407 Separator(TerminalCommaGreen<'db>),
18408 Element(UsePathGreen<'db>),
18409}
18410impl<'db> From<TerminalCommaGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18411 fn from(value: TerminalCommaGreen<'db>) -> Self {
18412 UsePathListElementOrSeparatorGreen::Separator(value)
18413 }
18414}
18415impl<'db> From<UsePathGreen<'db>> for UsePathListElementOrSeparatorGreen<'db> {
18416 fn from(value: UsePathGreen<'db>) -> Self {
18417 UsePathListElementOrSeparatorGreen::Element(value)
18418 }
18419}
18420impl<'db> UsePathListElementOrSeparatorGreen<'db> {
18421 fn id(&self) -> GreenId<'db> {
18422 match self {
18423 UsePathListElementOrSeparatorGreen::Separator(green) => green.0,
18424 UsePathListElementOrSeparatorGreen::Element(green) => green.0,
18425 }
18426 }
18427}
18428#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18429pub struct UsePathListGreen<'db>(pub GreenId<'db>);
18430impl<'db> TypedSyntaxNode<'db> for UsePathList<'db> {
18431 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::UsePathList);
18432 type StablePtr = UsePathListPtr<'db>;
18433 type Green = UsePathListGreen<'db>;
18434 fn missing(db: &'db dyn Database) -> Self::Green {
18435 UsePathListGreen(
18436 GreenNode {
18437 kind: SyntaxKind::UsePathList,
18438 details: GreenNodeDetails::Node {
18439 children: [].into(),
18440 width: TextWidth::default(),
18441 },
18442 }
18443 .intern(db),
18444 )
18445 }
18446 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18447 Self(ElementList::new(node))
18448 }
18449 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18450 if node.kind(db) == SyntaxKind::UsePathList {
18451 Some(Self(ElementList::new(node)))
18452 } else {
18453 None
18454 }
18455 }
18456 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18457 self.node
18458 }
18459 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18460 UsePathListPtr(self.node.stable_ptr(db))
18461 }
18462}
18463#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18464pub struct AliasClause<'db> {
18465 node: SyntaxNode<'db>,
18466}
18467impl<'db> AliasClause<'db> {
18468 pub const INDEX_AS_KW: usize = 0;
18469 pub const INDEX_ALIAS: usize = 1;
18470 pub fn new_green(
18471 db: &'db dyn Database,
18472 as_kw: TerminalAsGreen<'db>,
18473 alias: TerminalIdentifierGreen<'db>,
18474 ) -> AliasClauseGreen<'db> {
18475 let children = [as_kw.0, alias.0];
18476 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18477 AliasClauseGreen(
18478 GreenNode {
18479 kind: SyntaxKind::AliasClause,
18480 details: GreenNodeDetails::Node { children: children.into(), width },
18481 }
18482 .intern(db),
18483 )
18484 }
18485}
18486impl<'db> AliasClause<'db> {
18487 pub fn as_kw(&self, db: &'db dyn Database) -> TerminalAs<'db> {
18488 TerminalAs::from_syntax_node(db, self.node.get_children(db)[0])
18489 }
18490 pub fn alias(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18491 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
18492 }
18493}
18494#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18495pub struct AliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18496impl<'db> AliasClausePtr<'db> {
18497 pub fn alias_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
18498 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
18499 }
18500}
18501impl<'db> TypedStablePtr<'db> for AliasClausePtr<'db> {
18502 type SyntaxNode = AliasClause<'db>;
18503 fn untyped(self) -> SyntaxStablePtrId<'db> {
18504 self.0
18505 }
18506 fn lookup(&self, db: &'db dyn Database) -> AliasClause<'db> {
18507 AliasClause::from_syntax_node(db, self.0.lookup(db))
18508 }
18509}
18510impl<'db> From<AliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18511 fn from(ptr: AliasClausePtr<'db>) -> Self {
18512 ptr.untyped()
18513 }
18514}
18515#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18516pub struct AliasClauseGreen<'db>(pub GreenId<'db>);
18517impl<'db> TypedSyntaxNode<'db> for AliasClause<'db> {
18518 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AliasClause);
18519 type StablePtr = AliasClausePtr<'db>;
18520 type Green = AliasClauseGreen<'db>;
18521 fn missing(db: &'db dyn Database) -> Self::Green {
18522 AliasClauseGreen(
18523 GreenNode {
18524 kind: SyntaxKind::AliasClause,
18525 details: GreenNodeDetails::Node {
18526 children: [TerminalAs::missing(db).0, TerminalIdentifier::missing(db).0].into(),
18527 width: TextWidth::default(),
18528 },
18529 }
18530 .intern(db),
18531 )
18532 }
18533 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18534 let kind = node.kind(db);
18535 assert_eq!(
18536 kind,
18537 SyntaxKind::AliasClause,
18538 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18539 kind,
18540 SyntaxKind::AliasClause
18541 );
18542 Self { node }
18543 }
18544 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18545 let kind = node.kind(db);
18546 if kind == SyntaxKind::AliasClause { Some(Self::from_syntax_node(db, node)) } else { None }
18547 }
18548 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18549 self.node
18550 }
18551 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18552 AliasClausePtr(self.node.stable_ptr(db))
18553 }
18554}
18555#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18556pub enum OptionAliasClause<'db> {
18557 Empty(OptionAliasClauseEmpty<'db>),
18558 AliasClause(AliasClause<'db>),
18559}
18560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18561pub struct OptionAliasClausePtr<'db>(pub SyntaxStablePtrId<'db>);
18562impl<'db> TypedStablePtr<'db> for OptionAliasClausePtr<'db> {
18563 type SyntaxNode = OptionAliasClause<'db>;
18564 fn untyped(self) -> SyntaxStablePtrId<'db> {
18565 self.0
18566 }
18567 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18568 OptionAliasClause::from_syntax_node(db, self.0.lookup(db))
18569 }
18570}
18571impl<'db> From<OptionAliasClausePtr<'db>> for SyntaxStablePtrId<'db> {
18572 fn from(ptr: OptionAliasClausePtr<'db>) -> Self {
18573 ptr.untyped()
18574 }
18575}
18576impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for OptionAliasClausePtr<'db> {
18577 fn from(value: OptionAliasClauseEmptyPtr<'db>) -> Self {
18578 Self(value.0)
18579 }
18580}
18581impl<'db> From<AliasClausePtr<'db>> for OptionAliasClausePtr<'db> {
18582 fn from(value: AliasClausePtr<'db>) -> Self {
18583 Self(value.0)
18584 }
18585}
18586impl<'db> From<OptionAliasClauseEmptyGreen<'db>> for OptionAliasClauseGreen<'db> {
18587 fn from(value: OptionAliasClauseEmptyGreen<'db>) -> Self {
18588 Self(value.0)
18589 }
18590}
18591impl<'db> From<AliasClauseGreen<'db>> for OptionAliasClauseGreen<'db> {
18592 fn from(value: AliasClauseGreen<'db>) -> Self {
18593 Self(value.0)
18594 }
18595}
18596#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18597pub struct OptionAliasClauseGreen<'db>(pub GreenId<'db>);
18598impl<'db> TypedSyntaxNode<'db> for OptionAliasClause<'db> {
18599 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18600 type StablePtr = OptionAliasClausePtr<'db>;
18601 type Green = OptionAliasClauseGreen<'db>;
18602 fn missing(db: &'db dyn Database) -> Self::Green {
18603 panic!("No missing variant.");
18604 }
18605 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18606 let kind = node.kind(db);
18607 match kind {
18608 SyntaxKind::OptionAliasClauseEmpty => {
18609 OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node))
18610 }
18611 SyntaxKind::AliasClause => {
18612 OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node))
18613 }
18614 _ => panic!(
18615 "Unexpected syntax kind {:?} when constructing {}.",
18616 kind, "OptionAliasClause"
18617 ),
18618 }
18619 }
18620 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18621 let kind = node.kind(db);
18622 match kind {
18623 SyntaxKind::OptionAliasClauseEmpty => {
18624 Some(OptionAliasClause::Empty(OptionAliasClauseEmpty::from_syntax_node(db, node)))
18625 }
18626 SyntaxKind::AliasClause => {
18627 Some(OptionAliasClause::AliasClause(AliasClause::from_syntax_node(db, node)))
18628 }
18629 _ => None,
18630 }
18631 }
18632 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18633 match self {
18634 OptionAliasClause::Empty(x) => x.as_syntax_node(),
18635 OptionAliasClause::AliasClause(x) => x.as_syntax_node(),
18636 }
18637 }
18638 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18639 OptionAliasClausePtr(self.as_syntax_node().stable_ptr(db))
18640 }
18641}
18642impl<'db> OptionAliasClause<'db> {
18643 pub fn is_variant(kind: SyntaxKind) -> bool {
18645 matches!(kind, SyntaxKind::OptionAliasClauseEmpty | SyntaxKind::AliasClause)
18646 }
18647}
18648#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18649pub struct OptionAliasClauseEmpty<'db> {
18650 node: SyntaxNode<'db>,
18651}
18652impl<'db> OptionAliasClauseEmpty<'db> {
18653 pub fn new_green(db: &'db dyn Database) -> OptionAliasClauseEmptyGreen<'db> {
18654 let children = [];
18655 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18656 OptionAliasClauseEmptyGreen(
18657 GreenNode {
18658 kind: SyntaxKind::OptionAliasClauseEmpty,
18659 details: GreenNodeDetails::Node { children: children.into(), width },
18660 }
18661 .intern(db),
18662 )
18663 }
18664}
18665impl<'db> OptionAliasClauseEmpty<'db> {}
18666#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18667pub struct OptionAliasClauseEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
18668impl<'db> OptionAliasClauseEmptyPtr<'db> {}
18669impl<'db> TypedStablePtr<'db> for OptionAliasClauseEmptyPtr<'db> {
18670 type SyntaxNode = OptionAliasClauseEmpty<'db>;
18671 fn untyped(self) -> SyntaxStablePtrId<'db> {
18672 self.0
18673 }
18674 fn lookup(&self, db: &'db dyn Database) -> OptionAliasClauseEmpty<'db> {
18675 OptionAliasClauseEmpty::from_syntax_node(db, self.0.lookup(db))
18676 }
18677}
18678impl<'db> From<OptionAliasClauseEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
18679 fn from(ptr: OptionAliasClauseEmptyPtr<'db>) -> Self {
18680 ptr.untyped()
18681 }
18682}
18683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18684pub struct OptionAliasClauseEmptyGreen<'db>(pub GreenId<'db>);
18685impl<'db> TypedSyntaxNode<'db> for OptionAliasClauseEmpty<'db> {
18686 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionAliasClauseEmpty);
18687 type StablePtr = OptionAliasClauseEmptyPtr<'db>;
18688 type Green = OptionAliasClauseEmptyGreen<'db>;
18689 fn missing(db: &'db dyn Database) -> Self::Green {
18690 OptionAliasClauseEmptyGreen(
18691 GreenNode {
18692 kind: SyntaxKind::OptionAliasClauseEmpty,
18693 details: GreenNodeDetails::Node {
18694 children: [].into(),
18695 width: TextWidth::default(),
18696 },
18697 }
18698 .intern(db),
18699 )
18700 }
18701 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18702 let kind = node.kind(db);
18703 assert_eq!(
18704 kind,
18705 SyntaxKind::OptionAliasClauseEmpty,
18706 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18707 kind,
18708 SyntaxKind::OptionAliasClauseEmpty
18709 );
18710 Self { node }
18711 }
18712 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18713 let kind = node.kind(db);
18714 if kind == SyntaxKind::OptionAliasClauseEmpty {
18715 Some(Self::from_syntax_node(db, node))
18716 } else {
18717 None
18718 }
18719 }
18720 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18721 self.node
18722 }
18723 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18724 OptionAliasClauseEmptyPtr(self.node.stable_ptr(db))
18725 }
18726}
18727#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18728pub enum GenericArg<'db> {
18729 Unnamed(GenericArgUnnamed<'db>),
18730 Named(GenericArgNamed<'db>),
18731}
18732#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18733pub struct GenericArgPtr<'db>(pub SyntaxStablePtrId<'db>);
18734impl<'db> TypedStablePtr<'db> for GenericArgPtr<'db> {
18735 type SyntaxNode = GenericArg<'db>;
18736 fn untyped(self) -> SyntaxStablePtrId<'db> {
18737 self.0
18738 }
18739 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
18740 GenericArg::from_syntax_node(db, self.0.lookup(db))
18741 }
18742}
18743impl<'db> From<GenericArgPtr<'db>> for SyntaxStablePtrId<'db> {
18744 fn from(ptr: GenericArgPtr<'db>) -> Self {
18745 ptr.untyped()
18746 }
18747}
18748impl<'db> From<GenericArgUnnamedPtr<'db>> for GenericArgPtr<'db> {
18749 fn from(value: GenericArgUnnamedPtr<'db>) -> Self {
18750 Self(value.0)
18751 }
18752}
18753impl<'db> From<GenericArgNamedPtr<'db>> for GenericArgPtr<'db> {
18754 fn from(value: GenericArgNamedPtr<'db>) -> Self {
18755 Self(value.0)
18756 }
18757}
18758impl<'db> From<GenericArgUnnamedGreen<'db>> for GenericArgGreen<'db> {
18759 fn from(value: GenericArgUnnamedGreen<'db>) -> Self {
18760 Self(value.0)
18761 }
18762}
18763impl<'db> From<GenericArgNamedGreen<'db>> for GenericArgGreen<'db> {
18764 fn from(value: GenericArgNamedGreen<'db>) -> Self {
18765 Self(value.0)
18766 }
18767}
18768#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18769pub struct GenericArgGreen<'db>(pub GreenId<'db>);
18770impl<'db> TypedSyntaxNode<'db> for GenericArg<'db> {
18771 const OPTIONAL_KIND: Option<SyntaxKind> = None;
18772 type StablePtr = GenericArgPtr<'db>;
18773 type Green = GenericArgGreen<'db>;
18774 fn missing(db: &'db dyn Database) -> Self::Green {
18775 panic!("No missing variant.");
18776 }
18777 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18778 let kind = node.kind(db);
18779 match kind {
18780 SyntaxKind::GenericArgUnnamed => {
18781 GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node))
18782 }
18783 SyntaxKind::GenericArgNamed => {
18784 GenericArg::Named(GenericArgNamed::from_syntax_node(db, node))
18785 }
18786 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArg"),
18787 }
18788 }
18789 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18790 let kind = node.kind(db);
18791 match kind {
18792 SyntaxKind::GenericArgUnnamed => {
18793 Some(GenericArg::Unnamed(GenericArgUnnamed::from_syntax_node(db, node)))
18794 }
18795 SyntaxKind::GenericArgNamed => {
18796 Some(GenericArg::Named(GenericArgNamed::from_syntax_node(db, node)))
18797 }
18798 _ => None,
18799 }
18800 }
18801 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18802 match self {
18803 GenericArg::Unnamed(x) => x.as_syntax_node(),
18804 GenericArg::Named(x) => x.as_syntax_node(),
18805 }
18806 }
18807 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18808 GenericArgPtr(self.as_syntax_node().stable_ptr(db))
18809 }
18810}
18811impl<'db> GenericArg<'db> {
18812 pub fn is_variant(kind: SyntaxKind) -> bool {
18814 matches!(kind, SyntaxKind::GenericArgUnnamed | SyntaxKind::GenericArgNamed)
18815 }
18816}
18817#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18818pub struct GenericArgNamed<'db> {
18819 node: SyntaxNode<'db>,
18820}
18821impl<'db> GenericArgNamed<'db> {
18822 pub const INDEX_NAME: usize = 0;
18823 pub const INDEX_COLON: usize = 1;
18824 pub const INDEX_VALUE: usize = 2;
18825 pub fn new_green(
18826 db: &'db dyn Database,
18827 name: TerminalIdentifierGreen<'db>,
18828 colon: TerminalColonGreen<'db>,
18829 value: GenericArgValueGreen<'db>,
18830 ) -> GenericArgNamedGreen<'db> {
18831 let children = [name.0, colon.0, value.0];
18832 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18833 GenericArgNamedGreen(
18834 GreenNode {
18835 kind: SyntaxKind::GenericArgNamed,
18836 details: GreenNodeDetails::Node { children: children.into(), width },
18837 }
18838 .intern(db),
18839 )
18840 }
18841}
18842impl<'db> GenericArgNamed<'db> {
18843 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
18844 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
18845 }
18846 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
18847 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
18848 }
18849 pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
18850 GenericArgValue::from_syntax_node(db, self.node.get_children(db)[2])
18851 }
18852}
18853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18854pub struct GenericArgNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18855impl<'db> GenericArgNamedPtr<'db> {}
18856impl<'db> TypedStablePtr<'db> for GenericArgNamedPtr<'db> {
18857 type SyntaxNode = GenericArgNamed<'db>;
18858 fn untyped(self) -> SyntaxStablePtrId<'db> {
18859 self.0
18860 }
18861 fn lookup(&self, db: &'db dyn Database) -> GenericArgNamed<'db> {
18862 GenericArgNamed::from_syntax_node(db, self.0.lookup(db))
18863 }
18864}
18865impl<'db> From<GenericArgNamedPtr<'db>> for SyntaxStablePtrId<'db> {
18866 fn from(ptr: GenericArgNamedPtr<'db>) -> Self {
18867 ptr.untyped()
18868 }
18869}
18870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18871pub struct GenericArgNamedGreen<'db>(pub GreenId<'db>);
18872impl<'db> TypedSyntaxNode<'db> for GenericArgNamed<'db> {
18873 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgNamed);
18874 type StablePtr = GenericArgNamedPtr<'db>;
18875 type Green = GenericArgNamedGreen<'db>;
18876 fn missing(db: &'db dyn Database) -> Self::Green {
18877 GenericArgNamedGreen(
18878 GreenNode {
18879 kind: SyntaxKind::GenericArgNamed,
18880 details: GreenNodeDetails::Node {
18881 children: [
18882 TerminalIdentifier::missing(db).0,
18883 TerminalColon::missing(db).0,
18884 GenericArgValue::missing(db).0,
18885 ]
18886 .into(),
18887 width: TextWidth::default(),
18888 },
18889 }
18890 .intern(db),
18891 )
18892 }
18893 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18894 let kind = node.kind(db);
18895 assert_eq!(
18896 kind,
18897 SyntaxKind::GenericArgNamed,
18898 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18899 kind,
18900 SyntaxKind::GenericArgNamed
18901 );
18902 Self { node }
18903 }
18904 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18905 let kind = node.kind(db);
18906 if kind == SyntaxKind::GenericArgNamed {
18907 Some(Self::from_syntax_node(db, node))
18908 } else {
18909 None
18910 }
18911 }
18912 fn as_syntax_node(&self) -> SyntaxNode<'db> {
18913 self.node
18914 }
18915 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
18916 GenericArgNamedPtr(self.node.stable_ptr(db))
18917 }
18918}
18919#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
18920pub struct GenericArgUnnamed<'db> {
18921 node: SyntaxNode<'db>,
18922}
18923impl<'db> GenericArgUnnamed<'db> {
18924 pub const INDEX_VALUE: usize = 0;
18925 pub fn new_green(
18926 db: &'db dyn Database,
18927 value: GenericArgValueGreen<'db>,
18928 ) -> GenericArgUnnamedGreen<'db> {
18929 let children = [value.0];
18930 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
18931 GenericArgUnnamedGreen(
18932 GreenNode {
18933 kind: SyntaxKind::GenericArgUnnamed,
18934 details: GreenNodeDetails::Node { children: children.into(), width },
18935 }
18936 .intern(db),
18937 )
18938 }
18939}
18940impl<'db> GenericArgUnnamed<'db> {
18941 pub fn value(&self, db: &'db dyn Database) -> GenericArgValue<'db> {
18942 GenericArgValue::from_syntax_node(db, self.node.get_children(db)[0])
18943 }
18944}
18945#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18946pub struct GenericArgUnnamedPtr<'db>(pub SyntaxStablePtrId<'db>);
18947impl<'db> GenericArgUnnamedPtr<'db> {}
18948impl<'db> TypedStablePtr<'db> for GenericArgUnnamedPtr<'db> {
18949 type SyntaxNode = GenericArgUnnamed<'db>;
18950 fn untyped(self) -> SyntaxStablePtrId<'db> {
18951 self.0
18952 }
18953 fn lookup(&self, db: &'db dyn Database) -> GenericArgUnnamed<'db> {
18954 GenericArgUnnamed::from_syntax_node(db, self.0.lookup(db))
18955 }
18956}
18957impl<'db> From<GenericArgUnnamedPtr<'db>> for SyntaxStablePtrId<'db> {
18958 fn from(ptr: GenericArgUnnamedPtr<'db>) -> Self {
18959 ptr.untyped()
18960 }
18961}
18962#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
18963pub struct GenericArgUnnamedGreen<'db>(pub GreenId<'db>);
18964impl<'db> TypedSyntaxNode<'db> for GenericArgUnnamed<'db> {
18965 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgUnnamed);
18966 type StablePtr = GenericArgUnnamedPtr<'db>;
18967 type Green = GenericArgUnnamedGreen<'db>;
18968 fn missing(db: &'db dyn Database) -> Self::Green {
18969 GenericArgUnnamedGreen(
18970 GreenNode {
18971 kind: SyntaxKind::GenericArgUnnamed,
18972 details: GreenNodeDetails::Node {
18973 children: [GenericArgValue::missing(db).0].into(),
18974 width: TextWidth::default(),
18975 },
18976 }
18977 .intern(db),
18978 )
18979 }
18980 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
18981 let kind = node.kind(db);
18982 assert_eq!(
18983 kind,
18984 SyntaxKind::GenericArgUnnamed,
18985 "Unexpected SyntaxKind {:?}. Expected {:?}.",
18986 kind,
18987 SyntaxKind::GenericArgUnnamed
18988 );
18989 Self { node }
18990 }
18991 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
18992 let kind = node.kind(db);
18993 if kind == SyntaxKind::GenericArgUnnamed {
18994 Some(Self::from_syntax_node(db, node))
18995 } else {
18996 None
18997 }
18998 }
18999 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19000 self.node
19001 }
19002 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19003 GenericArgUnnamedPtr(self.node.stable_ptr(db))
19004 }
19005}
19006#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19007pub enum GenericArgValue<'db> {
19008 Expr(GenericArgValueExpr<'db>),
19009 Underscore(TerminalUnderscore<'db>),
19010}
19011#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19012pub struct GenericArgValuePtr<'db>(pub SyntaxStablePtrId<'db>);
19013impl<'db> TypedStablePtr<'db> for GenericArgValuePtr<'db> {
19014 type SyntaxNode = GenericArgValue<'db>;
19015 fn untyped(self) -> SyntaxStablePtrId<'db> {
19016 self.0
19017 }
19018 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19019 GenericArgValue::from_syntax_node(db, self.0.lookup(db))
19020 }
19021}
19022impl<'db> From<GenericArgValuePtr<'db>> for SyntaxStablePtrId<'db> {
19023 fn from(ptr: GenericArgValuePtr<'db>) -> Self {
19024 ptr.untyped()
19025 }
19026}
19027impl<'db> From<GenericArgValueExprPtr<'db>> for GenericArgValuePtr<'db> {
19028 fn from(value: GenericArgValueExprPtr<'db>) -> Self {
19029 Self(value.0)
19030 }
19031}
19032impl<'db> From<TerminalUnderscorePtr<'db>> for GenericArgValuePtr<'db> {
19033 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
19034 Self(value.0)
19035 }
19036}
19037impl<'db> From<GenericArgValueExprGreen<'db>> for GenericArgValueGreen<'db> {
19038 fn from(value: GenericArgValueExprGreen<'db>) -> Self {
19039 Self(value.0)
19040 }
19041}
19042impl<'db> From<TerminalUnderscoreGreen<'db>> for GenericArgValueGreen<'db> {
19043 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
19044 Self(value.0)
19045 }
19046}
19047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19048pub struct GenericArgValueGreen<'db>(pub GreenId<'db>);
19049impl<'db> TypedSyntaxNode<'db> for GenericArgValue<'db> {
19050 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19051 type StablePtr = GenericArgValuePtr<'db>;
19052 type Green = GenericArgValueGreen<'db>;
19053 fn missing(db: &'db dyn Database) -> Self::Green {
19054 panic!("No missing variant.");
19055 }
19056 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19057 let kind = node.kind(db);
19058 match kind {
19059 SyntaxKind::GenericArgValueExpr => {
19060 GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node))
19061 }
19062 SyntaxKind::TerminalUnderscore => {
19063 GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node))
19064 }
19065 _ => {
19066 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericArgValue")
19067 }
19068 }
19069 }
19070 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19071 let kind = node.kind(db);
19072 match kind {
19073 SyntaxKind::GenericArgValueExpr => {
19074 Some(GenericArgValue::Expr(GenericArgValueExpr::from_syntax_node(db, node)))
19075 }
19076 SyntaxKind::TerminalUnderscore => {
19077 Some(GenericArgValue::Underscore(TerminalUnderscore::from_syntax_node(db, node)))
19078 }
19079 _ => None,
19080 }
19081 }
19082 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19083 match self {
19084 GenericArgValue::Expr(x) => x.as_syntax_node(),
19085 GenericArgValue::Underscore(x) => x.as_syntax_node(),
19086 }
19087 }
19088 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19089 GenericArgValuePtr(self.as_syntax_node().stable_ptr(db))
19090 }
19091}
19092impl<'db> GenericArgValue<'db> {
19093 pub fn is_variant(kind: SyntaxKind) -> bool {
19095 matches!(kind, SyntaxKind::GenericArgValueExpr | SyntaxKind::TerminalUnderscore)
19096 }
19097}
19098#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19099pub struct GenericArgValueExpr<'db> {
19100 node: SyntaxNode<'db>,
19101}
19102impl<'db> GenericArgValueExpr<'db> {
19103 pub const INDEX_EXPR: usize = 0;
19104 pub fn new_green(db: &'db dyn Database, expr: ExprGreen<'db>) -> GenericArgValueExprGreen<'db> {
19105 let children = [expr.0];
19106 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19107 GenericArgValueExprGreen(
19108 GreenNode {
19109 kind: SyntaxKind::GenericArgValueExpr,
19110 details: GreenNodeDetails::Node { children: children.into(), width },
19111 }
19112 .intern(db),
19113 )
19114 }
19115}
19116impl<'db> GenericArgValueExpr<'db> {
19117 pub fn expr(&self, db: &'db dyn Database) -> Expr<'db> {
19118 Expr::from_syntax_node(db, self.node.get_children(db)[0])
19119 }
19120}
19121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19122pub struct GenericArgValueExprPtr<'db>(pub SyntaxStablePtrId<'db>);
19123impl<'db> GenericArgValueExprPtr<'db> {}
19124impl<'db> TypedStablePtr<'db> for GenericArgValueExprPtr<'db> {
19125 type SyntaxNode = GenericArgValueExpr<'db>;
19126 fn untyped(self) -> SyntaxStablePtrId<'db> {
19127 self.0
19128 }
19129 fn lookup(&self, db: &'db dyn Database) -> GenericArgValueExpr<'db> {
19130 GenericArgValueExpr::from_syntax_node(db, self.0.lookup(db))
19131 }
19132}
19133impl<'db> From<GenericArgValueExprPtr<'db>> for SyntaxStablePtrId<'db> {
19134 fn from(ptr: GenericArgValueExprPtr<'db>) -> Self {
19135 ptr.untyped()
19136 }
19137}
19138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19139pub struct GenericArgValueExprGreen<'db>(pub GreenId<'db>);
19140impl<'db> TypedSyntaxNode<'db> for GenericArgValueExpr<'db> {
19141 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgValueExpr);
19142 type StablePtr = GenericArgValueExprPtr<'db>;
19143 type Green = GenericArgValueExprGreen<'db>;
19144 fn missing(db: &'db dyn Database) -> Self::Green {
19145 GenericArgValueExprGreen(
19146 GreenNode {
19147 kind: SyntaxKind::GenericArgValueExpr,
19148 details: GreenNodeDetails::Node {
19149 children: [Expr::missing(db).0].into(),
19150 width: TextWidth::default(),
19151 },
19152 }
19153 .intern(db),
19154 )
19155 }
19156 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19157 let kind = node.kind(db);
19158 assert_eq!(
19159 kind,
19160 SyntaxKind::GenericArgValueExpr,
19161 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19162 kind,
19163 SyntaxKind::GenericArgValueExpr
19164 );
19165 Self { node }
19166 }
19167 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19168 let kind = node.kind(db);
19169 if kind == SyntaxKind::GenericArgValueExpr {
19170 Some(Self::from_syntax_node(db, node))
19171 } else {
19172 None
19173 }
19174 }
19175 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19176 self.node
19177 }
19178 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19179 GenericArgValueExprPtr(self.node.stable_ptr(db))
19180 }
19181}
19182#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19183pub struct GenericArgs<'db> {
19184 node: SyntaxNode<'db>,
19185}
19186impl<'db> GenericArgs<'db> {
19187 pub const INDEX_LANGLE: usize = 0;
19188 pub const INDEX_GENERIC_ARGS: usize = 1;
19189 pub const INDEX_RANGLE: usize = 2;
19190 pub fn new_green(
19191 db: &'db dyn Database,
19192 langle: TerminalLTGreen<'db>,
19193 generic_args: GenericArgListGreen<'db>,
19194 rangle: TerminalGTGreen<'db>,
19195 ) -> GenericArgsGreen<'db> {
19196 let children = [langle.0, generic_args.0, rangle.0];
19197 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19198 GenericArgsGreen(
19199 GreenNode {
19200 kind: SyntaxKind::GenericArgs,
19201 details: GreenNodeDetails::Node { children: children.into(), width },
19202 }
19203 .intern(db),
19204 )
19205 }
19206}
19207impl<'db> GenericArgs<'db> {
19208 pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
19209 TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
19210 }
19211 pub fn generic_args(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19212 GenericArgList::from_syntax_node(db, self.node.get_children(db)[1])
19213 }
19214 pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
19215 TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
19216 }
19217}
19218#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19219pub struct GenericArgsPtr<'db>(pub SyntaxStablePtrId<'db>);
19220impl<'db> GenericArgsPtr<'db> {}
19221impl<'db> TypedStablePtr<'db> for GenericArgsPtr<'db> {
19222 type SyntaxNode = GenericArgs<'db>;
19223 fn untyped(self) -> SyntaxStablePtrId<'db> {
19224 self.0
19225 }
19226 fn lookup(&self, db: &'db dyn Database) -> GenericArgs<'db> {
19227 GenericArgs::from_syntax_node(db, self.0.lookup(db))
19228 }
19229}
19230impl<'db> From<GenericArgsPtr<'db>> for SyntaxStablePtrId<'db> {
19231 fn from(ptr: GenericArgsPtr<'db>) -> Self {
19232 ptr.untyped()
19233 }
19234}
19235#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19236pub struct GenericArgsGreen<'db>(pub GreenId<'db>);
19237impl<'db> TypedSyntaxNode<'db> for GenericArgs<'db> {
19238 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgs);
19239 type StablePtr = GenericArgsPtr<'db>;
19240 type Green = GenericArgsGreen<'db>;
19241 fn missing(db: &'db dyn Database) -> Self::Green {
19242 GenericArgsGreen(
19243 GreenNode {
19244 kind: SyntaxKind::GenericArgs,
19245 details: GreenNodeDetails::Node {
19246 children: [
19247 TerminalLT::missing(db).0,
19248 GenericArgList::missing(db).0,
19249 TerminalGT::missing(db).0,
19250 ]
19251 .into(),
19252 width: TextWidth::default(),
19253 },
19254 }
19255 .intern(db),
19256 )
19257 }
19258 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19259 let kind = node.kind(db);
19260 assert_eq!(
19261 kind,
19262 SyntaxKind::GenericArgs,
19263 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19264 kind,
19265 SyntaxKind::GenericArgs
19266 );
19267 Self { node }
19268 }
19269 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19270 let kind = node.kind(db);
19271 if kind == SyntaxKind::GenericArgs { Some(Self::from_syntax_node(db, node)) } else { None }
19272 }
19273 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19274 self.node
19275 }
19276 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19277 GenericArgsPtr(self.node.stable_ptr(db))
19278 }
19279}
19280#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19281pub struct GenericArgList<'db>(ElementList<'db, GenericArg<'db>, 2>);
19282impl<'db> Deref for GenericArgList<'db> {
19283 type Target = ElementList<'db, GenericArg<'db>, 2>;
19284 fn deref(&self) -> &Self::Target {
19285 &self.0
19286 }
19287}
19288impl<'db> GenericArgList<'db> {
19289 pub fn new_green(
19290 db: &'db dyn Database,
19291 children: &[GenericArgListElementOrSeparatorGreen<'db>],
19292 ) -> GenericArgListGreen<'db> {
19293 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19294 GenericArgListGreen(
19295 GreenNode {
19296 kind: SyntaxKind::GenericArgList,
19297 details: GreenNodeDetails::Node {
19298 children: children.iter().map(|x| x.id()).collect(),
19299 width,
19300 },
19301 }
19302 .intern(db),
19303 )
19304 }
19305}
19306#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19307pub struct GenericArgListPtr<'db>(pub SyntaxStablePtrId<'db>);
19308impl<'db> TypedStablePtr<'db> for GenericArgListPtr<'db> {
19309 type SyntaxNode = GenericArgList<'db>;
19310 fn untyped(self) -> SyntaxStablePtrId<'db> {
19311 self.0
19312 }
19313 fn lookup(&self, db: &'db dyn Database) -> GenericArgList<'db> {
19314 GenericArgList::from_syntax_node(db, self.0.lookup(db))
19315 }
19316}
19317impl<'db> From<GenericArgListPtr<'db>> for SyntaxStablePtrId<'db> {
19318 fn from(ptr: GenericArgListPtr<'db>) -> Self {
19319 ptr.untyped()
19320 }
19321}
19322#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19323pub enum GenericArgListElementOrSeparatorGreen<'db> {
19324 Separator(TerminalCommaGreen<'db>),
19325 Element(GenericArgGreen<'db>),
19326}
19327impl<'db> From<TerminalCommaGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19328 fn from(value: TerminalCommaGreen<'db>) -> Self {
19329 GenericArgListElementOrSeparatorGreen::Separator(value)
19330 }
19331}
19332impl<'db> From<GenericArgGreen<'db>> for GenericArgListElementOrSeparatorGreen<'db> {
19333 fn from(value: GenericArgGreen<'db>) -> Self {
19334 GenericArgListElementOrSeparatorGreen::Element(value)
19335 }
19336}
19337impl<'db> GenericArgListElementOrSeparatorGreen<'db> {
19338 fn id(&self) -> GreenId<'db> {
19339 match self {
19340 GenericArgListElementOrSeparatorGreen::Separator(green) => green.0,
19341 GenericArgListElementOrSeparatorGreen::Element(green) => green.0,
19342 }
19343 }
19344}
19345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19346pub struct GenericArgListGreen<'db>(pub GreenId<'db>);
19347impl<'db> TypedSyntaxNode<'db> for GenericArgList<'db> {
19348 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericArgList);
19349 type StablePtr = GenericArgListPtr<'db>;
19350 type Green = GenericArgListGreen<'db>;
19351 fn missing(db: &'db dyn Database) -> Self::Green {
19352 GenericArgListGreen(
19353 GreenNode {
19354 kind: SyntaxKind::GenericArgList,
19355 details: GreenNodeDetails::Node {
19356 children: [].into(),
19357 width: TextWidth::default(),
19358 },
19359 }
19360 .intern(db),
19361 )
19362 }
19363 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19364 Self(ElementList::new(node))
19365 }
19366 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19367 if node.kind(db) == SyntaxKind::GenericArgList {
19368 Some(Self(ElementList::new(node)))
19369 } else {
19370 None
19371 }
19372 }
19373 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19374 self.node
19375 }
19376 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19377 GenericArgListPtr(self.node.stable_ptr(db))
19378 }
19379}
19380#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19381pub struct AssociatedItemConstraint<'db> {
19382 node: SyntaxNode<'db>,
19383}
19384impl<'db> AssociatedItemConstraint<'db> {
19385 pub const INDEX_ITEM: usize = 0;
19386 pub const INDEX_COLON: usize = 1;
19387 pub const INDEX_VALUE: usize = 2;
19388 pub fn new_green(
19389 db: &'db dyn Database,
19390 item: TerminalIdentifierGreen<'db>,
19391 colon: TerminalColonGreen<'db>,
19392 value: ExprGreen<'db>,
19393 ) -> AssociatedItemConstraintGreen<'db> {
19394 let children = [item.0, colon.0, value.0];
19395 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19396 AssociatedItemConstraintGreen(
19397 GreenNode {
19398 kind: SyntaxKind::AssociatedItemConstraint,
19399 details: GreenNodeDetails::Node { children: children.into(), width },
19400 }
19401 .intern(db),
19402 )
19403 }
19404}
19405impl<'db> AssociatedItemConstraint<'db> {
19406 pub fn item(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
19407 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
19408 }
19409 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
19410 TerminalColon::from_syntax_node(db, self.node.get_children(db)[1])
19411 }
19412 pub fn value(&self, db: &'db dyn Database) -> Expr<'db> {
19413 Expr::from_syntax_node(db, self.node.get_children(db)[2])
19414 }
19415}
19416#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19417pub struct AssociatedItemConstraintPtr<'db>(pub SyntaxStablePtrId<'db>);
19418impl<'db> AssociatedItemConstraintPtr<'db> {}
19419impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintPtr<'db> {
19420 type SyntaxNode = AssociatedItemConstraint<'db>;
19421 fn untyped(self) -> SyntaxStablePtrId<'db> {
19422 self.0
19423 }
19424 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraint<'db> {
19425 AssociatedItemConstraint::from_syntax_node(db, self.0.lookup(db))
19426 }
19427}
19428impl<'db> From<AssociatedItemConstraintPtr<'db>> for SyntaxStablePtrId<'db> {
19429 fn from(ptr: AssociatedItemConstraintPtr<'db>) -> Self {
19430 ptr.untyped()
19431 }
19432}
19433#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19434pub struct AssociatedItemConstraintGreen<'db>(pub GreenId<'db>);
19435impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraint<'db> {
19436 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraint);
19437 type StablePtr = AssociatedItemConstraintPtr<'db>;
19438 type Green = AssociatedItemConstraintGreen<'db>;
19439 fn missing(db: &'db dyn Database) -> Self::Green {
19440 AssociatedItemConstraintGreen(
19441 GreenNode {
19442 kind: SyntaxKind::AssociatedItemConstraint,
19443 details: GreenNodeDetails::Node {
19444 children: [
19445 TerminalIdentifier::missing(db).0,
19446 TerminalColon::missing(db).0,
19447 Expr::missing(db).0,
19448 ]
19449 .into(),
19450 width: TextWidth::default(),
19451 },
19452 }
19453 .intern(db),
19454 )
19455 }
19456 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19457 let kind = node.kind(db);
19458 assert_eq!(
19459 kind,
19460 SyntaxKind::AssociatedItemConstraint,
19461 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19462 kind,
19463 SyntaxKind::AssociatedItemConstraint
19464 );
19465 Self { node }
19466 }
19467 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19468 let kind = node.kind(db);
19469 if kind == SyntaxKind::AssociatedItemConstraint {
19470 Some(Self::from_syntax_node(db, node))
19471 } else {
19472 None
19473 }
19474 }
19475 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19476 self.node
19477 }
19478 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19479 AssociatedItemConstraintPtr(self.node.stable_ptr(db))
19480 }
19481}
19482#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19483pub struct AssociatedItemConstraints<'db> {
19484 node: SyntaxNode<'db>,
19485}
19486impl<'db> AssociatedItemConstraints<'db> {
19487 pub const INDEX_LBRACK: usize = 0;
19488 pub const INDEX_ASSOCIATED_ITEM_CONSTRAINTS: usize = 1;
19489 pub const INDEX_RBRACK: usize = 2;
19490 pub fn new_green(
19491 db: &'db dyn Database,
19492 lbrack: TerminalLBrackGreen<'db>,
19493 associated_item_constraints: AssociatedItemConstraintListGreen<'db>,
19494 rbrack: TerminalRBrackGreen<'db>,
19495 ) -> AssociatedItemConstraintsGreen<'db> {
19496 let children = [lbrack.0, associated_item_constraints.0, rbrack.0];
19497 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19498 AssociatedItemConstraintsGreen(
19499 GreenNode {
19500 kind: SyntaxKind::AssociatedItemConstraints,
19501 details: GreenNodeDetails::Node { children: children.into(), width },
19502 }
19503 .intern(db),
19504 )
19505 }
19506}
19507impl<'db> AssociatedItemConstraints<'db> {
19508 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
19509 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
19510 }
19511 pub fn associated_item_constraints(
19512 &self,
19513 db: &'db dyn Database,
19514 ) -> AssociatedItemConstraintList<'db> {
19515 AssociatedItemConstraintList::from_syntax_node(db, self.node.get_children(db)[1])
19516 }
19517 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
19518 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
19519 }
19520}
19521#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19522pub struct AssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19523impl<'db> AssociatedItemConstraintsPtr<'db> {}
19524impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintsPtr<'db> {
19525 type SyntaxNode = AssociatedItemConstraints<'db>;
19526 fn untyped(self) -> SyntaxStablePtrId<'db> {
19527 self.0
19528 }
19529 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraints<'db> {
19530 AssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19531 }
19532}
19533impl<'db> From<AssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19534 fn from(ptr: AssociatedItemConstraintsPtr<'db>) -> Self {
19535 ptr.untyped()
19536 }
19537}
19538#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19539pub struct AssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19540impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraints<'db> {
19541 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraints);
19542 type StablePtr = AssociatedItemConstraintsPtr<'db>;
19543 type Green = AssociatedItemConstraintsGreen<'db>;
19544 fn missing(db: &'db dyn Database) -> Self::Green {
19545 AssociatedItemConstraintsGreen(
19546 GreenNode {
19547 kind: SyntaxKind::AssociatedItemConstraints,
19548 details: GreenNodeDetails::Node {
19549 children: [
19550 TerminalLBrack::missing(db).0,
19551 AssociatedItemConstraintList::missing(db).0,
19552 TerminalRBrack::missing(db).0,
19553 ]
19554 .into(),
19555 width: TextWidth::default(),
19556 },
19557 }
19558 .intern(db),
19559 )
19560 }
19561 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19562 let kind = node.kind(db);
19563 assert_eq!(
19564 kind,
19565 SyntaxKind::AssociatedItemConstraints,
19566 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19567 kind,
19568 SyntaxKind::AssociatedItemConstraints
19569 );
19570 Self { node }
19571 }
19572 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19573 let kind = node.kind(db);
19574 if kind == SyntaxKind::AssociatedItemConstraints {
19575 Some(Self::from_syntax_node(db, node))
19576 } else {
19577 None
19578 }
19579 }
19580 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19581 self.node
19582 }
19583 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19584 AssociatedItemConstraintsPtr(self.node.stable_ptr(db))
19585 }
19586}
19587#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19588pub struct AssociatedItemConstraintList<'db>(ElementList<'db, AssociatedItemConstraint<'db>, 2>);
19589impl<'db> Deref for AssociatedItemConstraintList<'db> {
19590 type Target = ElementList<'db, AssociatedItemConstraint<'db>, 2>;
19591 fn deref(&self) -> &Self::Target {
19592 &self.0
19593 }
19594}
19595impl<'db> AssociatedItemConstraintList<'db> {
19596 pub fn new_green(
19597 db: &'db dyn Database,
19598 children: &[AssociatedItemConstraintListElementOrSeparatorGreen<'db>],
19599 ) -> AssociatedItemConstraintListGreen<'db> {
19600 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
19601 AssociatedItemConstraintListGreen(
19602 GreenNode {
19603 kind: SyntaxKind::AssociatedItemConstraintList,
19604 details: GreenNodeDetails::Node {
19605 children: children.iter().map(|x| x.id()).collect(),
19606 width,
19607 },
19608 }
19609 .intern(db),
19610 )
19611 }
19612}
19613#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19614pub struct AssociatedItemConstraintListPtr<'db>(pub SyntaxStablePtrId<'db>);
19615impl<'db> TypedStablePtr<'db> for AssociatedItemConstraintListPtr<'db> {
19616 type SyntaxNode = AssociatedItemConstraintList<'db>;
19617 fn untyped(self) -> SyntaxStablePtrId<'db> {
19618 self.0
19619 }
19620 fn lookup(&self, db: &'db dyn Database) -> AssociatedItemConstraintList<'db> {
19621 AssociatedItemConstraintList::from_syntax_node(db, self.0.lookup(db))
19622 }
19623}
19624impl<'db> From<AssociatedItemConstraintListPtr<'db>> for SyntaxStablePtrId<'db> {
19625 fn from(ptr: AssociatedItemConstraintListPtr<'db>) -> Self {
19626 ptr.untyped()
19627 }
19628}
19629#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19630pub enum AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19631 Separator(TerminalCommaGreen<'db>),
19632 Element(AssociatedItemConstraintGreen<'db>),
19633}
19634impl<'db> From<TerminalCommaGreen<'db>>
19635 for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19636{
19637 fn from(value: TerminalCommaGreen<'db>) -> Self {
19638 AssociatedItemConstraintListElementOrSeparatorGreen::Separator(value)
19639 }
19640}
19641impl<'db> From<AssociatedItemConstraintGreen<'db>>
19642 for AssociatedItemConstraintListElementOrSeparatorGreen<'db>
19643{
19644 fn from(value: AssociatedItemConstraintGreen<'db>) -> Self {
19645 AssociatedItemConstraintListElementOrSeparatorGreen::Element(value)
19646 }
19647}
19648impl<'db> AssociatedItemConstraintListElementOrSeparatorGreen<'db> {
19649 fn id(&self) -> GreenId<'db> {
19650 match self {
19651 AssociatedItemConstraintListElementOrSeparatorGreen::Separator(green) => green.0,
19652 AssociatedItemConstraintListElementOrSeparatorGreen::Element(green) => green.0,
19653 }
19654 }
19655}
19656#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19657pub struct AssociatedItemConstraintListGreen<'db>(pub GreenId<'db>);
19658impl<'db> TypedSyntaxNode<'db> for AssociatedItemConstraintList<'db> {
19659 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::AssociatedItemConstraintList);
19660 type StablePtr = AssociatedItemConstraintListPtr<'db>;
19661 type Green = AssociatedItemConstraintListGreen<'db>;
19662 fn missing(db: &'db dyn Database) -> Self::Green {
19663 AssociatedItemConstraintListGreen(
19664 GreenNode {
19665 kind: SyntaxKind::AssociatedItemConstraintList,
19666 details: GreenNodeDetails::Node {
19667 children: [].into(),
19668 width: TextWidth::default(),
19669 },
19670 }
19671 .intern(db),
19672 )
19673 }
19674 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19675 Self(ElementList::new(node))
19676 }
19677 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19678 if node.kind(db) == SyntaxKind::AssociatedItemConstraintList {
19679 Some(Self(ElementList::new(node)))
19680 } else {
19681 None
19682 }
19683 }
19684 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19685 self.node
19686 }
19687 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19688 AssociatedItemConstraintListPtr(self.node.stable_ptr(db))
19689 }
19690}
19691#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19692pub enum OptionAssociatedItemConstraints<'db> {
19693 Empty(OptionAssociatedItemConstraintsEmpty<'db>),
19694 AssociatedItemConstraints(AssociatedItemConstraints<'db>),
19695}
19696#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19697pub struct OptionAssociatedItemConstraintsPtr<'db>(pub SyntaxStablePtrId<'db>);
19698impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsPtr<'db> {
19699 type SyntaxNode = OptionAssociatedItemConstraints<'db>;
19700 fn untyped(self) -> SyntaxStablePtrId<'db> {
19701 self.0
19702 }
19703 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19704 OptionAssociatedItemConstraints::from_syntax_node(db, self.0.lookup(db))
19705 }
19706}
19707impl<'db> From<OptionAssociatedItemConstraintsPtr<'db>> for SyntaxStablePtrId<'db> {
19708 fn from(ptr: OptionAssociatedItemConstraintsPtr<'db>) -> Self {
19709 ptr.untyped()
19710 }
19711}
19712impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>>
19713 for OptionAssociatedItemConstraintsPtr<'db>
19714{
19715 fn from(value: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19716 Self(value.0)
19717 }
19718}
19719impl<'db> From<AssociatedItemConstraintsPtr<'db>> for OptionAssociatedItemConstraintsPtr<'db> {
19720 fn from(value: AssociatedItemConstraintsPtr<'db>) -> Self {
19721 Self(value.0)
19722 }
19723}
19724impl<'db> From<OptionAssociatedItemConstraintsEmptyGreen<'db>>
19725 for OptionAssociatedItemConstraintsGreen<'db>
19726{
19727 fn from(value: OptionAssociatedItemConstraintsEmptyGreen<'db>) -> Self {
19728 Self(value.0)
19729 }
19730}
19731impl<'db> From<AssociatedItemConstraintsGreen<'db>> for OptionAssociatedItemConstraintsGreen<'db> {
19732 fn from(value: AssociatedItemConstraintsGreen<'db>) -> Self {
19733 Self(value.0)
19734 }
19735}
19736#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19737pub struct OptionAssociatedItemConstraintsGreen<'db>(pub GreenId<'db>);
19738impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraints<'db> {
19739 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19740 type StablePtr = OptionAssociatedItemConstraintsPtr<'db>;
19741 type Green = OptionAssociatedItemConstraintsGreen<'db>;
19742 fn missing(db: &'db dyn Database) -> Self::Green {
19743 panic!("No missing variant.");
19744 }
19745 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19746 let kind = node.kind(db);
19747 match kind {
19748 SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19749 OptionAssociatedItemConstraints::Empty(
19750 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19751 )
19752 }
19753 SyntaxKind::AssociatedItemConstraints => {
19754 OptionAssociatedItemConstraints::AssociatedItemConstraints(
19755 AssociatedItemConstraints::from_syntax_node(db, node),
19756 )
19757 }
19758 _ => panic!(
19759 "Unexpected syntax kind {:?} when constructing {}.",
19760 kind, "OptionAssociatedItemConstraints"
19761 ),
19762 }
19763 }
19764 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19765 let kind = node.kind(db);
19766 match kind {
19767 SyntaxKind::OptionAssociatedItemConstraintsEmpty => {
19768 Some(OptionAssociatedItemConstraints::Empty(
19769 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, node),
19770 ))
19771 }
19772 SyntaxKind::AssociatedItemConstraints => {
19773 Some(OptionAssociatedItemConstraints::AssociatedItemConstraints(
19774 AssociatedItemConstraints::from_syntax_node(db, node),
19775 ))
19776 }
19777 _ => None,
19778 }
19779 }
19780 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19781 match self {
19782 OptionAssociatedItemConstraints::Empty(x) => x.as_syntax_node(),
19783 OptionAssociatedItemConstraints::AssociatedItemConstraints(x) => x.as_syntax_node(),
19784 }
19785 }
19786 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19787 OptionAssociatedItemConstraintsPtr(self.as_syntax_node().stable_ptr(db))
19788 }
19789}
19790impl<'db> OptionAssociatedItemConstraints<'db> {
19791 pub fn is_variant(kind: SyntaxKind) -> bool {
19793 matches!(
19794 kind,
19795 SyntaxKind::OptionAssociatedItemConstraintsEmpty
19796 | SyntaxKind::AssociatedItemConstraints
19797 )
19798 }
19799}
19800#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19801pub struct OptionAssociatedItemConstraintsEmpty<'db> {
19802 node: SyntaxNode<'db>,
19803}
19804impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {
19805 pub fn new_green(db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmptyGreen<'db> {
19806 let children = [];
19807 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19808 OptionAssociatedItemConstraintsEmptyGreen(
19809 GreenNode {
19810 kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19811 details: GreenNodeDetails::Node { children: children.into(), width },
19812 }
19813 .intern(db),
19814 )
19815 }
19816}
19817impl<'db> OptionAssociatedItemConstraintsEmpty<'db> {}
19818#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19819pub struct OptionAssociatedItemConstraintsEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
19820impl<'db> OptionAssociatedItemConstraintsEmptyPtr<'db> {}
19821impl<'db> TypedStablePtr<'db> for OptionAssociatedItemConstraintsEmptyPtr<'db> {
19822 type SyntaxNode = OptionAssociatedItemConstraintsEmpty<'db>;
19823 fn untyped(self) -> SyntaxStablePtrId<'db> {
19824 self.0
19825 }
19826 fn lookup(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraintsEmpty<'db> {
19827 OptionAssociatedItemConstraintsEmpty::from_syntax_node(db, self.0.lookup(db))
19828 }
19829}
19830impl<'db> From<OptionAssociatedItemConstraintsEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
19831 fn from(ptr: OptionAssociatedItemConstraintsEmptyPtr<'db>) -> Self {
19832 ptr.untyped()
19833 }
19834}
19835#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19836pub struct OptionAssociatedItemConstraintsEmptyGreen<'db>(pub GreenId<'db>);
19837impl<'db> TypedSyntaxNode<'db> for OptionAssociatedItemConstraintsEmpty<'db> {
19838 const OPTIONAL_KIND: Option<SyntaxKind> =
19839 Some(SyntaxKind::OptionAssociatedItemConstraintsEmpty);
19840 type StablePtr = OptionAssociatedItemConstraintsEmptyPtr<'db>;
19841 type Green = OptionAssociatedItemConstraintsEmptyGreen<'db>;
19842 fn missing(db: &'db dyn Database) -> Self::Green {
19843 OptionAssociatedItemConstraintsEmptyGreen(
19844 GreenNode {
19845 kind: SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19846 details: GreenNodeDetails::Node {
19847 children: [].into(),
19848 width: TextWidth::default(),
19849 },
19850 }
19851 .intern(db),
19852 )
19853 }
19854 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19855 let kind = node.kind(db);
19856 assert_eq!(
19857 kind,
19858 SyntaxKind::OptionAssociatedItemConstraintsEmpty,
19859 "Unexpected SyntaxKind {:?}. Expected {:?}.",
19860 kind,
19861 SyntaxKind::OptionAssociatedItemConstraintsEmpty
19862 );
19863 Self { node }
19864 }
19865 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19866 let kind = node.kind(db);
19867 if kind == SyntaxKind::OptionAssociatedItemConstraintsEmpty {
19868 Some(Self::from_syntax_node(db, node))
19869 } else {
19870 None
19871 }
19872 }
19873 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19874 self.node
19875 }
19876 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19877 OptionAssociatedItemConstraintsEmptyPtr(self.node.stable_ptr(db))
19878 }
19879}
19880#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19881pub enum OptionWrappedGenericParamList<'db> {
19882 Empty(OptionWrappedGenericParamListEmpty<'db>),
19883 WrappedGenericParamList(WrappedGenericParamList<'db>),
19884}
19885#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19886pub struct OptionWrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
19887impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListPtr<'db> {
19888 type SyntaxNode = OptionWrappedGenericParamList<'db>;
19889 fn untyped(self) -> SyntaxStablePtrId<'db> {
19890 self.0
19891 }
19892 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
19893 OptionWrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
19894 }
19895}
19896impl<'db> From<OptionWrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
19897 fn from(ptr: OptionWrappedGenericParamListPtr<'db>) -> Self {
19898 ptr.untyped()
19899 }
19900}
19901impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>>
19902 for OptionWrappedGenericParamListPtr<'db>
19903{
19904 fn from(value: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
19905 Self(value.0)
19906 }
19907}
19908impl<'db> From<WrappedGenericParamListPtr<'db>> for OptionWrappedGenericParamListPtr<'db> {
19909 fn from(value: WrappedGenericParamListPtr<'db>) -> Self {
19910 Self(value.0)
19911 }
19912}
19913impl<'db> From<OptionWrappedGenericParamListEmptyGreen<'db>>
19914 for OptionWrappedGenericParamListGreen<'db>
19915{
19916 fn from(value: OptionWrappedGenericParamListEmptyGreen<'db>) -> Self {
19917 Self(value.0)
19918 }
19919}
19920impl<'db> From<WrappedGenericParamListGreen<'db>> for OptionWrappedGenericParamListGreen<'db> {
19921 fn from(value: WrappedGenericParamListGreen<'db>) -> Self {
19922 Self(value.0)
19923 }
19924}
19925#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
19926pub struct OptionWrappedGenericParamListGreen<'db>(pub GreenId<'db>);
19927impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamList<'db> {
19928 const OPTIONAL_KIND: Option<SyntaxKind> = None;
19929 type StablePtr = OptionWrappedGenericParamListPtr<'db>;
19930 type Green = OptionWrappedGenericParamListGreen<'db>;
19931 fn missing(db: &'db dyn Database) -> Self::Green {
19932 panic!("No missing variant.");
19933 }
19934 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
19935 let kind = node.kind(db);
19936 match kind {
19937 SyntaxKind::OptionWrappedGenericParamListEmpty => OptionWrappedGenericParamList::Empty(
19938 OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19939 ),
19940 SyntaxKind::WrappedGenericParamList => {
19941 OptionWrappedGenericParamList::WrappedGenericParamList(
19942 WrappedGenericParamList::from_syntax_node(db, node),
19943 )
19944 }
19945 _ => panic!(
19946 "Unexpected syntax kind {:?} when constructing {}.",
19947 kind, "OptionWrappedGenericParamList"
19948 ),
19949 }
19950 }
19951 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
19952 let kind = node.kind(db);
19953 match kind {
19954 SyntaxKind::OptionWrappedGenericParamListEmpty => {
19955 Some(OptionWrappedGenericParamList::Empty(
19956 OptionWrappedGenericParamListEmpty::from_syntax_node(db, node),
19957 ))
19958 }
19959 SyntaxKind::WrappedGenericParamList => {
19960 Some(OptionWrappedGenericParamList::WrappedGenericParamList(
19961 WrappedGenericParamList::from_syntax_node(db, node),
19962 ))
19963 }
19964 _ => None,
19965 }
19966 }
19967 fn as_syntax_node(&self) -> SyntaxNode<'db> {
19968 match self {
19969 OptionWrappedGenericParamList::Empty(x) => x.as_syntax_node(),
19970 OptionWrappedGenericParamList::WrappedGenericParamList(x) => x.as_syntax_node(),
19971 }
19972 }
19973 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
19974 OptionWrappedGenericParamListPtr(self.as_syntax_node().stable_ptr(db))
19975 }
19976}
19977impl<'db> OptionWrappedGenericParamList<'db> {
19978 pub fn is_variant(kind: SyntaxKind) -> bool {
19980 matches!(
19981 kind,
19982 SyntaxKind::OptionWrappedGenericParamListEmpty | SyntaxKind::WrappedGenericParamList
19983 )
19984 }
19985}
19986#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
19987pub struct OptionWrappedGenericParamListEmpty<'db> {
19988 node: SyntaxNode<'db>,
19989}
19990impl<'db> OptionWrappedGenericParamListEmpty<'db> {
19991 pub fn new_green(db: &'db dyn Database) -> OptionWrappedGenericParamListEmptyGreen<'db> {
19992 let children = [];
19993 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
19994 OptionWrappedGenericParamListEmptyGreen(
19995 GreenNode {
19996 kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
19997 details: GreenNodeDetails::Node { children: children.into(), width },
19998 }
19999 .intern(db),
20000 )
20001 }
20002}
20003impl<'db> OptionWrappedGenericParamListEmpty<'db> {}
20004#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20005pub struct OptionWrappedGenericParamListEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
20006impl<'db> OptionWrappedGenericParamListEmptyPtr<'db> {}
20007impl<'db> TypedStablePtr<'db> for OptionWrappedGenericParamListEmptyPtr<'db> {
20008 type SyntaxNode = OptionWrappedGenericParamListEmpty<'db>;
20009 fn untyped(self) -> SyntaxStablePtrId<'db> {
20010 self.0
20011 }
20012 fn lookup(&self, db: &'db dyn Database) -> OptionWrappedGenericParamListEmpty<'db> {
20013 OptionWrappedGenericParamListEmpty::from_syntax_node(db, self.0.lookup(db))
20014 }
20015}
20016impl<'db> From<OptionWrappedGenericParamListEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
20017 fn from(ptr: OptionWrappedGenericParamListEmptyPtr<'db>) -> Self {
20018 ptr.untyped()
20019 }
20020}
20021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20022pub struct OptionWrappedGenericParamListEmptyGreen<'db>(pub GreenId<'db>);
20023impl<'db> TypedSyntaxNode<'db> for OptionWrappedGenericParamListEmpty<'db> {
20024 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionWrappedGenericParamListEmpty);
20025 type StablePtr = OptionWrappedGenericParamListEmptyPtr<'db>;
20026 type Green = OptionWrappedGenericParamListEmptyGreen<'db>;
20027 fn missing(db: &'db dyn Database) -> Self::Green {
20028 OptionWrappedGenericParamListEmptyGreen(
20029 GreenNode {
20030 kind: SyntaxKind::OptionWrappedGenericParamListEmpty,
20031 details: GreenNodeDetails::Node {
20032 children: [].into(),
20033 width: TextWidth::default(),
20034 },
20035 }
20036 .intern(db),
20037 )
20038 }
20039 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20040 let kind = node.kind(db);
20041 assert_eq!(
20042 kind,
20043 SyntaxKind::OptionWrappedGenericParamListEmpty,
20044 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20045 kind,
20046 SyntaxKind::OptionWrappedGenericParamListEmpty
20047 );
20048 Self { node }
20049 }
20050 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20051 let kind = node.kind(db);
20052 if kind == SyntaxKind::OptionWrappedGenericParamListEmpty {
20053 Some(Self::from_syntax_node(db, node))
20054 } else {
20055 None
20056 }
20057 }
20058 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20059 self.node
20060 }
20061 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20062 OptionWrappedGenericParamListEmptyPtr(self.node.stable_ptr(db))
20063 }
20064}
20065#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20066pub struct WrappedGenericParamList<'db> {
20067 node: SyntaxNode<'db>,
20068}
20069impl<'db> WrappedGenericParamList<'db> {
20070 pub const INDEX_LANGLE: usize = 0;
20071 pub const INDEX_GENERIC_PARAMS: usize = 1;
20072 pub const INDEX_RANGLE: usize = 2;
20073 pub fn new_green(
20074 db: &'db dyn Database,
20075 langle: TerminalLTGreen<'db>,
20076 generic_params: GenericParamListGreen<'db>,
20077 rangle: TerminalGTGreen<'db>,
20078 ) -> WrappedGenericParamListGreen<'db> {
20079 let children = [langle.0, generic_params.0, rangle.0];
20080 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20081 WrappedGenericParamListGreen(
20082 GreenNode {
20083 kind: SyntaxKind::WrappedGenericParamList,
20084 details: GreenNodeDetails::Node { children: children.into(), width },
20085 }
20086 .intern(db),
20087 )
20088 }
20089}
20090impl<'db> WrappedGenericParamList<'db> {
20091 pub fn langle(&self, db: &'db dyn Database) -> TerminalLT<'db> {
20092 TerminalLT::from_syntax_node(db, self.node.get_children(db)[0])
20093 }
20094 pub fn generic_params(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20095 GenericParamList::from_syntax_node(db, self.node.get_children(db)[1])
20096 }
20097 pub fn rangle(&self, db: &'db dyn Database) -> TerminalGT<'db> {
20098 TerminalGT::from_syntax_node(db, self.node.get_children(db)[2])
20099 }
20100}
20101#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20102pub struct WrappedGenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20103impl<'db> WrappedGenericParamListPtr<'db> {}
20104impl<'db> TypedStablePtr<'db> for WrappedGenericParamListPtr<'db> {
20105 type SyntaxNode = WrappedGenericParamList<'db>;
20106 fn untyped(self) -> SyntaxStablePtrId<'db> {
20107 self.0
20108 }
20109 fn lookup(&self, db: &'db dyn Database) -> WrappedGenericParamList<'db> {
20110 WrappedGenericParamList::from_syntax_node(db, self.0.lookup(db))
20111 }
20112}
20113impl<'db> From<WrappedGenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20114 fn from(ptr: WrappedGenericParamListPtr<'db>) -> Self {
20115 ptr.untyped()
20116 }
20117}
20118#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20119pub struct WrappedGenericParamListGreen<'db>(pub GreenId<'db>);
20120impl<'db> TypedSyntaxNode<'db> for WrappedGenericParamList<'db> {
20121 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedGenericParamList);
20122 type StablePtr = WrappedGenericParamListPtr<'db>;
20123 type Green = WrappedGenericParamListGreen<'db>;
20124 fn missing(db: &'db dyn Database) -> Self::Green {
20125 WrappedGenericParamListGreen(
20126 GreenNode {
20127 kind: SyntaxKind::WrappedGenericParamList,
20128 details: GreenNodeDetails::Node {
20129 children: [
20130 TerminalLT::missing(db).0,
20131 GenericParamList::missing(db).0,
20132 TerminalGT::missing(db).0,
20133 ]
20134 .into(),
20135 width: TextWidth::default(),
20136 },
20137 }
20138 .intern(db),
20139 )
20140 }
20141 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20142 let kind = node.kind(db);
20143 assert_eq!(
20144 kind,
20145 SyntaxKind::WrappedGenericParamList,
20146 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20147 kind,
20148 SyntaxKind::WrappedGenericParamList
20149 );
20150 Self { node }
20151 }
20152 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20153 let kind = node.kind(db);
20154 if kind == SyntaxKind::WrappedGenericParamList {
20155 Some(Self::from_syntax_node(db, node))
20156 } else {
20157 None
20158 }
20159 }
20160 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20161 self.node
20162 }
20163 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20164 WrappedGenericParamListPtr(self.node.stable_ptr(db))
20165 }
20166}
20167#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20168pub struct GenericParamList<'db>(ElementList<'db, GenericParam<'db>, 2>);
20169impl<'db> Deref for GenericParamList<'db> {
20170 type Target = ElementList<'db, GenericParam<'db>, 2>;
20171 fn deref(&self) -> &Self::Target {
20172 &self.0
20173 }
20174}
20175impl<'db> GenericParamList<'db> {
20176 pub fn new_green(
20177 db: &'db dyn Database,
20178 children: &[GenericParamListElementOrSeparatorGreen<'db>],
20179 ) -> GenericParamListGreen<'db> {
20180 let width = children.iter().map(|id| id.id().long(db).width(db)).sum();
20181 GenericParamListGreen(
20182 GreenNode {
20183 kind: SyntaxKind::GenericParamList,
20184 details: GreenNodeDetails::Node {
20185 children: children.iter().map(|x| x.id()).collect(),
20186 width,
20187 },
20188 }
20189 .intern(db),
20190 )
20191 }
20192}
20193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20194pub struct GenericParamListPtr<'db>(pub SyntaxStablePtrId<'db>);
20195impl<'db> TypedStablePtr<'db> for GenericParamListPtr<'db> {
20196 type SyntaxNode = GenericParamList<'db>;
20197 fn untyped(self) -> SyntaxStablePtrId<'db> {
20198 self.0
20199 }
20200 fn lookup(&self, db: &'db dyn Database) -> GenericParamList<'db> {
20201 GenericParamList::from_syntax_node(db, self.0.lookup(db))
20202 }
20203}
20204impl<'db> From<GenericParamListPtr<'db>> for SyntaxStablePtrId<'db> {
20205 fn from(ptr: GenericParamListPtr<'db>) -> Self {
20206 ptr.untyped()
20207 }
20208}
20209#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20210pub enum GenericParamListElementOrSeparatorGreen<'db> {
20211 Separator(TerminalCommaGreen<'db>),
20212 Element(GenericParamGreen<'db>),
20213}
20214impl<'db> From<TerminalCommaGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20215 fn from(value: TerminalCommaGreen<'db>) -> Self {
20216 GenericParamListElementOrSeparatorGreen::Separator(value)
20217 }
20218}
20219impl<'db> From<GenericParamGreen<'db>> for GenericParamListElementOrSeparatorGreen<'db> {
20220 fn from(value: GenericParamGreen<'db>) -> Self {
20221 GenericParamListElementOrSeparatorGreen::Element(value)
20222 }
20223}
20224impl<'db> GenericParamListElementOrSeparatorGreen<'db> {
20225 fn id(&self) -> GreenId<'db> {
20226 match self {
20227 GenericParamListElementOrSeparatorGreen::Separator(green) => green.0,
20228 GenericParamListElementOrSeparatorGreen::Element(green) => green.0,
20229 }
20230 }
20231}
20232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20233pub struct GenericParamListGreen<'db>(pub GreenId<'db>);
20234impl<'db> TypedSyntaxNode<'db> for GenericParamList<'db> {
20235 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamList);
20236 type StablePtr = GenericParamListPtr<'db>;
20237 type Green = GenericParamListGreen<'db>;
20238 fn missing(db: &'db dyn Database) -> Self::Green {
20239 GenericParamListGreen(
20240 GreenNode {
20241 kind: SyntaxKind::GenericParamList,
20242 details: GreenNodeDetails::Node {
20243 children: [].into(),
20244 width: TextWidth::default(),
20245 },
20246 }
20247 .intern(db),
20248 )
20249 }
20250 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20251 Self(ElementList::new(node))
20252 }
20253 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20254 if node.kind(db) == SyntaxKind::GenericParamList {
20255 Some(Self(ElementList::new(node)))
20256 } else {
20257 None
20258 }
20259 }
20260 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20261 self.node
20262 }
20263 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20264 GenericParamListPtr(self.node.stable_ptr(db))
20265 }
20266}
20267#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20268pub enum GenericParam<'db> {
20269 Type(GenericParamType<'db>),
20270 Const(GenericParamConst<'db>),
20271 ImplNamed(GenericParamImplNamed<'db>),
20272 ImplAnonymous(GenericParamImplAnonymous<'db>),
20273 NegativeImpl(GenericParamNegativeImpl<'db>),
20274}
20275#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20276pub struct GenericParamPtr<'db>(pub SyntaxStablePtrId<'db>);
20277impl<'db> TypedStablePtr<'db> for GenericParamPtr<'db> {
20278 type SyntaxNode = GenericParam<'db>;
20279 fn untyped(self) -> SyntaxStablePtrId<'db> {
20280 self.0
20281 }
20282 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
20283 GenericParam::from_syntax_node(db, self.0.lookup(db))
20284 }
20285}
20286impl<'db> From<GenericParamPtr<'db>> for SyntaxStablePtrId<'db> {
20287 fn from(ptr: GenericParamPtr<'db>) -> Self {
20288 ptr.untyped()
20289 }
20290}
20291impl<'db> From<GenericParamTypePtr<'db>> for GenericParamPtr<'db> {
20292 fn from(value: GenericParamTypePtr<'db>) -> Self {
20293 Self(value.0)
20294 }
20295}
20296impl<'db> From<GenericParamConstPtr<'db>> for GenericParamPtr<'db> {
20297 fn from(value: GenericParamConstPtr<'db>) -> Self {
20298 Self(value.0)
20299 }
20300}
20301impl<'db> From<GenericParamImplNamedPtr<'db>> for GenericParamPtr<'db> {
20302 fn from(value: GenericParamImplNamedPtr<'db>) -> Self {
20303 Self(value.0)
20304 }
20305}
20306impl<'db> From<GenericParamImplAnonymousPtr<'db>> for GenericParamPtr<'db> {
20307 fn from(value: GenericParamImplAnonymousPtr<'db>) -> Self {
20308 Self(value.0)
20309 }
20310}
20311impl<'db> From<GenericParamNegativeImplPtr<'db>> for GenericParamPtr<'db> {
20312 fn from(value: GenericParamNegativeImplPtr<'db>) -> Self {
20313 Self(value.0)
20314 }
20315}
20316impl<'db> From<GenericParamTypeGreen<'db>> for GenericParamGreen<'db> {
20317 fn from(value: GenericParamTypeGreen<'db>) -> Self {
20318 Self(value.0)
20319 }
20320}
20321impl<'db> From<GenericParamConstGreen<'db>> for GenericParamGreen<'db> {
20322 fn from(value: GenericParamConstGreen<'db>) -> Self {
20323 Self(value.0)
20324 }
20325}
20326impl<'db> From<GenericParamImplNamedGreen<'db>> for GenericParamGreen<'db> {
20327 fn from(value: GenericParamImplNamedGreen<'db>) -> Self {
20328 Self(value.0)
20329 }
20330}
20331impl<'db> From<GenericParamImplAnonymousGreen<'db>> for GenericParamGreen<'db> {
20332 fn from(value: GenericParamImplAnonymousGreen<'db>) -> Self {
20333 Self(value.0)
20334 }
20335}
20336impl<'db> From<GenericParamNegativeImplGreen<'db>> for GenericParamGreen<'db> {
20337 fn from(value: GenericParamNegativeImplGreen<'db>) -> Self {
20338 Self(value.0)
20339 }
20340}
20341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20342pub struct GenericParamGreen<'db>(pub GreenId<'db>);
20343impl<'db> TypedSyntaxNode<'db> for GenericParam<'db> {
20344 const OPTIONAL_KIND: Option<SyntaxKind> = None;
20345 type StablePtr = GenericParamPtr<'db>;
20346 type Green = GenericParamGreen<'db>;
20347 fn missing(db: &'db dyn Database) -> Self::Green {
20348 panic!("No missing variant.");
20349 }
20350 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20351 let kind = node.kind(db);
20352 match kind {
20353 SyntaxKind::GenericParamType => {
20354 GenericParam::Type(GenericParamType::from_syntax_node(db, node))
20355 }
20356 SyntaxKind::GenericParamConst => {
20357 GenericParam::Const(GenericParamConst::from_syntax_node(db, node))
20358 }
20359 SyntaxKind::GenericParamImplNamed => {
20360 GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node))
20361 }
20362 SyntaxKind::GenericParamImplAnonymous => {
20363 GenericParam::ImplAnonymous(GenericParamImplAnonymous::from_syntax_node(db, node))
20364 }
20365 SyntaxKind::GenericParamNegativeImpl => {
20366 GenericParam::NegativeImpl(GenericParamNegativeImpl::from_syntax_node(db, node))
20367 }
20368 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "GenericParam"),
20369 }
20370 }
20371 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20372 let kind = node.kind(db);
20373 match kind {
20374 SyntaxKind::GenericParamType => {
20375 Some(GenericParam::Type(GenericParamType::from_syntax_node(db, node)))
20376 }
20377 SyntaxKind::GenericParamConst => {
20378 Some(GenericParam::Const(GenericParamConst::from_syntax_node(db, node)))
20379 }
20380 SyntaxKind::GenericParamImplNamed => {
20381 Some(GenericParam::ImplNamed(GenericParamImplNamed::from_syntax_node(db, node)))
20382 }
20383 SyntaxKind::GenericParamImplAnonymous => Some(GenericParam::ImplAnonymous(
20384 GenericParamImplAnonymous::from_syntax_node(db, node),
20385 )),
20386 SyntaxKind::GenericParamNegativeImpl => Some(GenericParam::NegativeImpl(
20387 GenericParamNegativeImpl::from_syntax_node(db, node),
20388 )),
20389 _ => None,
20390 }
20391 }
20392 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20393 match self {
20394 GenericParam::Type(x) => x.as_syntax_node(),
20395 GenericParam::Const(x) => x.as_syntax_node(),
20396 GenericParam::ImplNamed(x) => x.as_syntax_node(),
20397 GenericParam::ImplAnonymous(x) => x.as_syntax_node(),
20398 GenericParam::NegativeImpl(x) => x.as_syntax_node(),
20399 }
20400 }
20401 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20402 GenericParamPtr(self.as_syntax_node().stable_ptr(db))
20403 }
20404}
20405impl<'db> GenericParam<'db> {
20406 pub fn is_variant(kind: SyntaxKind) -> bool {
20408 matches!(
20409 kind,
20410 SyntaxKind::GenericParamType
20411 | SyntaxKind::GenericParamConst
20412 | SyntaxKind::GenericParamImplNamed
20413 | SyntaxKind::GenericParamImplAnonymous
20414 | SyntaxKind::GenericParamNegativeImpl
20415 )
20416 }
20417}
20418#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20419pub struct GenericParamType<'db> {
20420 node: SyntaxNode<'db>,
20421}
20422impl<'db> GenericParamType<'db> {
20423 pub const INDEX_NAME: usize = 0;
20424 pub fn new_green(
20425 db: &'db dyn Database,
20426 name: TerminalIdentifierGreen<'db>,
20427 ) -> GenericParamTypeGreen<'db> {
20428 let children = [name.0];
20429 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20430 GenericParamTypeGreen(
20431 GreenNode {
20432 kind: SyntaxKind::GenericParamType,
20433 details: GreenNodeDetails::Node { children: children.into(), width },
20434 }
20435 .intern(db),
20436 )
20437 }
20438}
20439impl<'db> GenericParamType<'db> {
20440 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20441 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
20442 }
20443}
20444#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20445pub struct GenericParamTypePtr<'db>(pub SyntaxStablePtrId<'db>);
20446impl<'db> GenericParamTypePtr<'db> {
20447 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20448 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20449 }
20450}
20451impl<'db> TypedStablePtr<'db> for GenericParamTypePtr<'db> {
20452 type SyntaxNode = GenericParamType<'db>;
20453 fn untyped(self) -> SyntaxStablePtrId<'db> {
20454 self.0
20455 }
20456 fn lookup(&self, db: &'db dyn Database) -> GenericParamType<'db> {
20457 GenericParamType::from_syntax_node(db, self.0.lookup(db))
20458 }
20459}
20460impl<'db> From<GenericParamTypePtr<'db>> for SyntaxStablePtrId<'db> {
20461 fn from(ptr: GenericParamTypePtr<'db>) -> Self {
20462 ptr.untyped()
20463 }
20464}
20465#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20466pub struct GenericParamTypeGreen<'db>(pub GreenId<'db>);
20467impl<'db> TypedSyntaxNode<'db> for GenericParamType<'db> {
20468 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamType);
20469 type StablePtr = GenericParamTypePtr<'db>;
20470 type Green = GenericParamTypeGreen<'db>;
20471 fn missing(db: &'db dyn Database) -> Self::Green {
20472 GenericParamTypeGreen(
20473 GreenNode {
20474 kind: SyntaxKind::GenericParamType,
20475 details: GreenNodeDetails::Node {
20476 children: [TerminalIdentifier::missing(db).0].into(),
20477 width: TextWidth::default(),
20478 },
20479 }
20480 .intern(db),
20481 )
20482 }
20483 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20484 let kind = node.kind(db);
20485 assert_eq!(
20486 kind,
20487 SyntaxKind::GenericParamType,
20488 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20489 kind,
20490 SyntaxKind::GenericParamType
20491 );
20492 Self { node }
20493 }
20494 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20495 let kind = node.kind(db);
20496 if kind == SyntaxKind::GenericParamType {
20497 Some(Self::from_syntax_node(db, node))
20498 } else {
20499 None
20500 }
20501 }
20502 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20503 self.node
20504 }
20505 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20506 GenericParamTypePtr(self.node.stable_ptr(db))
20507 }
20508}
20509#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20510pub struct GenericParamConst<'db> {
20511 node: SyntaxNode<'db>,
20512}
20513impl<'db> GenericParamConst<'db> {
20514 pub const INDEX_CONST_KW: usize = 0;
20515 pub const INDEX_NAME: usize = 1;
20516 pub const INDEX_COLON: usize = 2;
20517 pub const INDEX_TY: usize = 3;
20518 pub fn new_green(
20519 db: &'db dyn Database,
20520 const_kw: TerminalConstGreen<'db>,
20521 name: TerminalIdentifierGreen<'db>,
20522 colon: TerminalColonGreen<'db>,
20523 ty: ExprGreen<'db>,
20524 ) -> GenericParamConstGreen<'db> {
20525 let children = [const_kw.0, name.0, colon.0, ty.0];
20526 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20527 GenericParamConstGreen(
20528 GreenNode {
20529 kind: SyntaxKind::GenericParamConst,
20530 details: GreenNodeDetails::Node { children: children.into(), width },
20531 }
20532 .intern(db),
20533 )
20534 }
20535}
20536impl<'db> GenericParamConst<'db> {
20537 pub fn const_kw(&self, db: &'db dyn Database) -> TerminalConst<'db> {
20538 TerminalConst::from_syntax_node(db, self.node.get_children(db)[0])
20539 }
20540 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20541 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20542 }
20543 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20544 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20545 }
20546 pub fn ty(&self, db: &'db dyn Database) -> Expr<'db> {
20547 Expr::from_syntax_node(db, self.node.get_children(db)[3])
20548 }
20549}
20550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20551pub struct GenericParamConstPtr<'db>(pub SyntaxStablePtrId<'db>);
20552impl<'db> GenericParamConstPtr<'db> {
20553 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20554 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20555 }
20556}
20557impl<'db> TypedStablePtr<'db> for GenericParamConstPtr<'db> {
20558 type SyntaxNode = GenericParamConst<'db>;
20559 fn untyped(self) -> SyntaxStablePtrId<'db> {
20560 self.0
20561 }
20562 fn lookup(&self, db: &'db dyn Database) -> GenericParamConst<'db> {
20563 GenericParamConst::from_syntax_node(db, self.0.lookup(db))
20564 }
20565}
20566impl<'db> From<GenericParamConstPtr<'db>> for SyntaxStablePtrId<'db> {
20567 fn from(ptr: GenericParamConstPtr<'db>) -> Self {
20568 ptr.untyped()
20569 }
20570}
20571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20572pub struct GenericParamConstGreen<'db>(pub GreenId<'db>);
20573impl<'db> TypedSyntaxNode<'db> for GenericParamConst<'db> {
20574 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamConst);
20575 type StablePtr = GenericParamConstPtr<'db>;
20576 type Green = GenericParamConstGreen<'db>;
20577 fn missing(db: &'db dyn Database) -> Self::Green {
20578 GenericParamConstGreen(
20579 GreenNode {
20580 kind: SyntaxKind::GenericParamConst,
20581 details: GreenNodeDetails::Node {
20582 children: [
20583 TerminalConst::missing(db).0,
20584 TerminalIdentifier::missing(db).0,
20585 TerminalColon::missing(db).0,
20586 Expr::missing(db).0,
20587 ]
20588 .into(),
20589 width: TextWidth::default(),
20590 },
20591 }
20592 .intern(db),
20593 )
20594 }
20595 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20596 let kind = node.kind(db);
20597 assert_eq!(
20598 kind,
20599 SyntaxKind::GenericParamConst,
20600 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20601 kind,
20602 SyntaxKind::GenericParamConst
20603 );
20604 Self { node }
20605 }
20606 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20607 let kind = node.kind(db);
20608 if kind == SyntaxKind::GenericParamConst {
20609 Some(Self::from_syntax_node(db, node))
20610 } else {
20611 None
20612 }
20613 }
20614 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20615 self.node
20616 }
20617 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20618 GenericParamConstPtr(self.node.stable_ptr(db))
20619 }
20620}
20621#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20622pub struct GenericParamImplNamed<'db> {
20623 node: SyntaxNode<'db>,
20624}
20625impl<'db> GenericParamImplNamed<'db> {
20626 pub const INDEX_IMPL_KW: usize = 0;
20627 pub const INDEX_NAME: usize = 1;
20628 pub const INDEX_COLON: usize = 2;
20629 pub const INDEX_TRAIT_PATH: usize = 3;
20630 pub const INDEX_TYPE_CONSTRAINS: usize = 4;
20631 pub fn new_green(
20632 db: &'db dyn Database,
20633 impl_kw: TerminalImplGreen<'db>,
20634 name: TerminalIdentifierGreen<'db>,
20635 colon: TerminalColonGreen<'db>,
20636 trait_path: ExprPathGreen<'db>,
20637 type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20638 ) -> GenericParamImplNamedGreen<'db> {
20639 let children = [impl_kw.0, name.0, colon.0, trait_path.0, type_constrains.0];
20640 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20641 GenericParamImplNamedGreen(
20642 GreenNode {
20643 kind: SyntaxKind::GenericParamImplNamed,
20644 details: GreenNodeDetails::Node { children: children.into(), width },
20645 }
20646 .intern(db),
20647 )
20648 }
20649}
20650impl<'db> GenericParamImplNamed<'db> {
20651 pub fn impl_kw(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
20652 TerminalImpl::from_syntax_node(db, self.node.get_children(db)[0])
20653 }
20654 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
20655 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
20656 }
20657 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
20658 TerminalColon::from_syntax_node(db, self.node.get_children(db)[2])
20659 }
20660 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20661 ExprPath::from_syntax_node(db, self.node.get_children(db)[3])
20662 }
20663 pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20664 OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[4])
20665 }
20666}
20667#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20668pub struct GenericParamImplNamedPtr<'db>(pub SyntaxStablePtrId<'db>);
20669impl<'db> GenericParamImplNamedPtr<'db> {
20670 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
20671 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
20672 }
20673}
20674impl<'db> TypedStablePtr<'db> for GenericParamImplNamedPtr<'db> {
20675 type SyntaxNode = GenericParamImplNamed<'db>;
20676 fn untyped(self) -> SyntaxStablePtrId<'db> {
20677 self.0
20678 }
20679 fn lookup(&self, db: &'db dyn Database) -> GenericParamImplNamed<'db> {
20680 GenericParamImplNamed::from_syntax_node(db, self.0.lookup(db))
20681 }
20682}
20683impl<'db> From<GenericParamImplNamedPtr<'db>> for SyntaxStablePtrId<'db> {
20684 fn from(ptr: GenericParamImplNamedPtr<'db>) -> Self {
20685 ptr.untyped()
20686 }
20687}
20688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20689pub struct GenericParamImplNamedGreen<'db>(pub GreenId<'db>);
20690impl<'db> TypedSyntaxNode<'db> for GenericParamImplNamed<'db> {
20691 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplNamed);
20692 type StablePtr = GenericParamImplNamedPtr<'db>;
20693 type Green = GenericParamImplNamedGreen<'db>;
20694 fn missing(db: &'db dyn Database) -> Self::Green {
20695 GenericParamImplNamedGreen(
20696 GreenNode {
20697 kind: SyntaxKind::GenericParamImplNamed,
20698 details: GreenNodeDetails::Node {
20699 children: [
20700 TerminalImpl::missing(db).0,
20701 TerminalIdentifier::missing(db).0,
20702 TerminalColon::missing(db).0,
20703 ExprPath::missing(db).0,
20704 OptionAssociatedItemConstraints::missing(db).0,
20705 ]
20706 .into(),
20707 width: TextWidth::default(),
20708 },
20709 }
20710 .intern(db),
20711 )
20712 }
20713 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20714 let kind = node.kind(db);
20715 assert_eq!(
20716 kind,
20717 SyntaxKind::GenericParamImplNamed,
20718 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20719 kind,
20720 SyntaxKind::GenericParamImplNamed
20721 );
20722 Self { node }
20723 }
20724 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20725 let kind = node.kind(db);
20726 if kind == SyntaxKind::GenericParamImplNamed {
20727 Some(Self::from_syntax_node(db, node))
20728 } else {
20729 None
20730 }
20731 }
20732 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20733 self.node
20734 }
20735 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20736 GenericParamImplNamedPtr(self.node.stable_ptr(db))
20737 }
20738}
20739#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20740pub struct GenericParamImplAnonymous<'db> {
20741 node: SyntaxNode<'db>,
20742}
20743impl<'db> GenericParamImplAnonymous<'db> {
20744 pub const INDEX_PLUS: usize = 0;
20745 pub const INDEX_TRAIT_PATH: usize = 1;
20746 pub const INDEX_TYPE_CONSTRAINS: usize = 2;
20747 pub fn new_green(
20748 db: &'db dyn Database,
20749 plus: TerminalPlusGreen<'db>,
20750 trait_path: ExprPathGreen<'db>,
20751 type_constrains: OptionAssociatedItemConstraintsGreen<'db>,
20752 ) -> GenericParamImplAnonymousGreen<'db> {
20753 let children = [plus.0, trait_path.0, type_constrains.0];
20754 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20755 GenericParamImplAnonymousGreen(
20756 GreenNode {
20757 kind: SyntaxKind::GenericParamImplAnonymous,
20758 details: GreenNodeDetails::Node { children: children.into(), width },
20759 }
20760 .intern(db),
20761 )
20762 }
20763}
20764impl<'db> GenericParamImplAnonymous<'db> {
20765 pub fn plus(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
20766 TerminalPlus::from_syntax_node(db, self.node.get_children(db)[0])
20767 }
20768 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20769 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20770 }
20771 pub fn type_constrains(&self, db: &'db dyn Database) -> OptionAssociatedItemConstraints<'db> {
20772 OptionAssociatedItemConstraints::from_syntax_node(db, self.node.get_children(db)[2])
20773 }
20774}
20775#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20776pub struct GenericParamImplAnonymousPtr<'db>(pub SyntaxStablePtrId<'db>);
20777impl<'db> GenericParamImplAnonymousPtr<'db> {}
20778impl<'db> TypedStablePtr<'db> for GenericParamImplAnonymousPtr<'db> {
20779 type SyntaxNode = GenericParamImplAnonymous<'db>;
20780 fn untyped(self) -> SyntaxStablePtrId<'db> {
20781 self.0
20782 }
20783 fn lookup(&self, db: &'db dyn Database) -> GenericParamImplAnonymous<'db> {
20784 GenericParamImplAnonymous::from_syntax_node(db, self.0.lookup(db))
20785 }
20786}
20787impl<'db> From<GenericParamImplAnonymousPtr<'db>> for SyntaxStablePtrId<'db> {
20788 fn from(ptr: GenericParamImplAnonymousPtr<'db>) -> Self {
20789 ptr.untyped()
20790 }
20791}
20792#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20793pub struct GenericParamImplAnonymousGreen<'db>(pub GreenId<'db>);
20794impl<'db> TypedSyntaxNode<'db> for GenericParamImplAnonymous<'db> {
20795 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamImplAnonymous);
20796 type StablePtr = GenericParamImplAnonymousPtr<'db>;
20797 type Green = GenericParamImplAnonymousGreen<'db>;
20798 fn missing(db: &'db dyn Database) -> Self::Green {
20799 GenericParamImplAnonymousGreen(
20800 GreenNode {
20801 kind: SyntaxKind::GenericParamImplAnonymous,
20802 details: GreenNodeDetails::Node {
20803 children: [
20804 TerminalPlus::missing(db).0,
20805 ExprPath::missing(db).0,
20806 OptionAssociatedItemConstraints::missing(db).0,
20807 ]
20808 .into(),
20809 width: TextWidth::default(),
20810 },
20811 }
20812 .intern(db),
20813 )
20814 }
20815 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20816 let kind = node.kind(db);
20817 assert_eq!(
20818 kind,
20819 SyntaxKind::GenericParamImplAnonymous,
20820 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20821 kind,
20822 SyntaxKind::GenericParamImplAnonymous
20823 );
20824 Self { node }
20825 }
20826 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20827 let kind = node.kind(db);
20828 if kind == SyntaxKind::GenericParamImplAnonymous {
20829 Some(Self::from_syntax_node(db, node))
20830 } else {
20831 None
20832 }
20833 }
20834 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20835 self.node
20836 }
20837 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20838 GenericParamImplAnonymousPtr(self.node.stable_ptr(db))
20839 }
20840}
20841#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20842pub struct GenericParamNegativeImpl<'db> {
20843 node: SyntaxNode<'db>,
20844}
20845impl<'db> GenericParamNegativeImpl<'db> {
20846 pub const INDEX_MINUS: usize = 0;
20847 pub const INDEX_TRAIT_PATH: usize = 1;
20848 pub fn new_green(
20849 db: &'db dyn Database,
20850 minus: TerminalMinusGreen<'db>,
20851 trait_path: ExprPathGreen<'db>,
20852 ) -> GenericParamNegativeImplGreen<'db> {
20853 let children = [minus.0, trait_path.0];
20854 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
20855 GenericParamNegativeImplGreen(
20856 GreenNode {
20857 kind: SyntaxKind::GenericParamNegativeImpl,
20858 details: GreenNodeDetails::Node { children: children.into(), width },
20859 }
20860 .intern(db),
20861 )
20862 }
20863}
20864impl<'db> GenericParamNegativeImpl<'db> {
20865 pub fn minus(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
20866 TerminalMinus::from_syntax_node(db, self.node.get_children(db)[0])
20867 }
20868 pub fn trait_path(&self, db: &'db dyn Database) -> ExprPath<'db> {
20869 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
20870 }
20871}
20872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20873pub struct GenericParamNegativeImplPtr<'db>(pub SyntaxStablePtrId<'db>);
20874impl<'db> GenericParamNegativeImplPtr<'db> {}
20875impl<'db> TypedStablePtr<'db> for GenericParamNegativeImplPtr<'db> {
20876 type SyntaxNode = GenericParamNegativeImpl<'db>;
20877 fn untyped(self) -> SyntaxStablePtrId<'db> {
20878 self.0
20879 }
20880 fn lookup(&self, db: &'db dyn Database) -> GenericParamNegativeImpl<'db> {
20881 GenericParamNegativeImpl::from_syntax_node(db, self.0.lookup(db))
20882 }
20883}
20884impl<'db> From<GenericParamNegativeImplPtr<'db>> for SyntaxStablePtrId<'db> {
20885 fn from(ptr: GenericParamNegativeImplPtr<'db>) -> Self {
20886 ptr.untyped()
20887 }
20888}
20889#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20890pub struct GenericParamNegativeImplGreen<'db>(pub GreenId<'db>);
20891impl<'db> TypedSyntaxNode<'db> for GenericParamNegativeImpl<'db> {
20892 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::GenericParamNegativeImpl);
20893 type StablePtr = GenericParamNegativeImplPtr<'db>;
20894 type Green = GenericParamNegativeImplGreen<'db>;
20895 fn missing(db: &'db dyn Database) -> Self::Green {
20896 GenericParamNegativeImplGreen(
20897 GreenNode {
20898 kind: SyntaxKind::GenericParamNegativeImpl,
20899 details: GreenNodeDetails::Node {
20900 children: [TerminalMinus::missing(db).0, ExprPath::missing(db).0].into(),
20901 width: TextWidth::default(),
20902 },
20903 }
20904 .intern(db),
20905 )
20906 }
20907 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20908 let kind = node.kind(db);
20909 assert_eq!(
20910 kind,
20911 SyntaxKind::GenericParamNegativeImpl,
20912 "Unexpected SyntaxKind {:?}. Expected {:?}.",
20913 kind,
20914 SyntaxKind::GenericParamNegativeImpl
20915 );
20916 Self { node }
20917 }
20918 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20919 let kind = node.kind(db);
20920 if kind == SyntaxKind::GenericParamNegativeImpl {
20921 Some(Self::from_syntax_node(db, node))
20922 } else {
20923 None
20924 }
20925 }
20926 fn as_syntax_node(&self) -> SyntaxNode<'db> {
20927 self.node
20928 }
20929 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
20930 GenericParamNegativeImplPtr(self.node.stable_ptr(db))
20931 }
20932}
20933#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
20934pub struct TokenList<'db>(ElementList<'db, TokenTree<'db>, 1>);
20935impl<'db> Deref for TokenList<'db> {
20936 type Target = ElementList<'db, TokenTree<'db>, 1>;
20937 fn deref(&self) -> &Self::Target {
20938 &self.0
20939 }
20940}
20941impl<'db> TokenList<'db> {
20942 pub fn new_green(
20943 db: &'db dyn Database,
20944 children: &[TokenTreeGreen<'db>],
20945 ) -> TokenListGreen<'db> {
20946 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
20947 TokenListGreen(
20948 GreenNode {
20949 kind: SyntaxKind::TokenList,
20950 details: GreenNodeDetails::Node {
20951 children: children.iter().map(|x| x.0).collect(),
20952 width,
20953 },
20954 }
20955 .intern(db),
20956 )
20957 }
20958}
20959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20960pub struct TokenListPtr<'db>(pub SyntaxStablePtrId<'db>);
20961impl<'db> TypedStablePtr<'db> for TokenListPtr<'db> {
20962 type SyntaxNode = TokenList<'db>;
20963 fn untyped(self) -> SyntaxStablePtrId<'db> {
20964 self.0
20965 }
20966 fn lookup(&self, db: &'db dyn Database) -> TokenList<'db> {
20967 TokenList::from_syntax_node(db, self.0.lookup(db))
20968 }
20969}
20970impl<'db> From<TokenListPtr<'db>> for SyntaxStablePtrId<'db> {
20971 fn from(ptr: TokenListPtr<'db>) -> Self {
20972 ptr.untyped()
20973 }
20974}
20975#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
20976pub struct TokenListGreen<'db>(pub GreenId<'db>);
20977impl<'db> TypedSyntaxNode<'db> for TokenList<'db> {
20978 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenList);
20979 type StablePtr = TokenListPtr<'db>;
20980 type Green = TokenListGreen<'db>;
20981 fn missing(db: &'db dyn Database) -> Self::Green {
20982 TokenListGreen(
20983 GreenNode {
20984 kind: SyntaxKind::TokenList,
20985 details: GreenNodeDetails::Node {
20986 children: [].into(),
20987 width: TextWidth::default(),
20988 },
20989 }
20990 .intern(db),
20991 )
20992 }
20993 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
20994 Self(ElementList::new(node))
20995 }
20996 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
20997 if node.kind(db) == SyntaxKind::TokenList {
20998 Some(Self(ElementList::new(node)))
20999 } else {
21000 None
21001 }
21002 }
21003 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21004 self.node
21005 }
21006 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21007 TokenListPtr(self.node.stable_ptr(db))
21008 }
21009}
21010#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21011pub struct TokenTreeLeaf<'db> {
21012 node: SyntaxNode<'db>,
21013}
21014impl<'db> TokenTreeLeaf<'db> {
21015 pub const INDEX_LEAF: usize = 0;
21016 pub fn new_green(db: &'db dyn Database, leaf: TokenNodeGreen<'db>) -> TokenTreeLeafGreen<'db> {
21017 let children = [leaf.0];
21018 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21019 TokenTreeLeafGreen(
21020 GreenNode {
21021 kind: SyntaxKind::TokenTreeLeaf,
21022 details: GreenNodeDetails::Node { children: children.into(), width },
21023 }
21024 .intern(db),
21025 )
21026 }
21027}
21028impl<'db> TokenTreeLeaf<'db> {
21029 pub fn leaf(&self, db: &'db dyn Database) -> TokenNode<'db> {
21030 TokenNode::from_syntax_node(db, self.node.get_children(db)[0])
21031 }
21032}
21033#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21034pub struct TokenTreeLeafPtr<'db>(pub SyntaxStablePtrId<'db>);
21035impl<'db> TokenTreeLeafPtr<'db> {}
21036impl<'db> TypedStablePtr<'db> for TokenTreeLeafPtr<'db> {
21037 type SyntaxNode = TokenTreeLeaf<'db>;
21038 fn untyped(self) -> SyntaxStablePtrId<'db> {
21039 self.0
21040 }
21041 fn lookup(&self, db: &'db dyn Database) -> TokenTreeLeaf<'db> {
21042 TokenTreeLeaf::from_syntax_node(db, self.0.lookup(db))
21043 }
21044}
21045impl<'db> From<TokenTreeLeafPtr<'db>> for SyntaxStablePtrId<'db> {
21046 fn from(ptr: TokenTreeLeafPtr<'db>) -> Self {
21047 ptr.untyped()
21048 }
21049}
21050#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21051pub struct TokenTreeLeafGreen<'db>(pub GreenId<'db>);
21052impl<'db> TypedSyntaxNode<'db> for TokenTreeLeaf<'db> {
21053 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeLeaf);
21054 type StablePtr = TokenTreeLeafPtr<'db>;
21055 type Green = TokenTreeLeafGreen<'db>;
21056 fn missing(db: &'db dyn Database) -> Self::Green {
21057 TokenTreeLeafGreen(
21058 GreenNode {
21059 kind: SyntaxKind::TokenTreeLeaf,
21060 details: GreenNodeDetails::Node {
21061 children: [TokenNode::missing(db).0].into(),
21062 width: TextWidth::default(),
21063 },
21064 }
21065 .intern(db),
21066 )
21067 }
21068 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21069 let kind = node.kind(db);
21070 assert_eq!(
21071 kind,
21072 SyntaxKind::TokenTreeLeaf,
21073 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21074 kind,
21075 SyntaxKind::TokenTreeLeaf
21076 );
21077 Self { node }
21078 }
21079 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21080 let kind = node.kind(db);
21081 if kind == SyntaxKind::TokenTreeLeaf {
21082 Some(Self::from_syntax_node(db, node))
21083 } else {
21084 None
21085 }
21086 }
21087 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21088 self.node
21089 }
21090 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21091 TokenTreeLeafPtr(self.node.stable_ptr(db))
21092 }
21093}
21094#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21095pub struct TokenTreeNode<'db> {
21096 node: SyntaxNode<'db>,
21097}
21098impl<'db> TokenTreeNode<'db> {
21099 pub const INDEX_SUBTREE: usize = 0;
21100 pub fn new_green(
21101 db: &'db dyn Database,
21102 subtree: WrappedTokenTreeGreen<'db>,
21103 ) -> TokenTreeNodeGreen<'db> {
21104 let children = [subtree.0];
21105 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21106 TokenTreeNodeGreen(
21107 GreenNode {
21108 kind: SyntaxKind::TokenTreeNode,
21109 details: GreenNodeDetails::Node { children: children.into(), width },
21110 }
21111 .intern(db),
21112 )
21113 }
21114}
21115impl<'db> TokenTreeNode<'db> {
21116 pub fn subtree(&self, db: &'db dyn Database) -> WrappedTokenTree<'db> {
21117 WrappedTokenTree::from_syntax_node(db, self.node.get_children(db)[0])
21118 }
21119}
21120#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21121pub struct TokenTreeNodePtr<'db>(pub SyntaxStablePtrId<'db>);
21122impl<'db> TokenTreeNodePtr<'db> {}
21123impl<'db> TypedStablePtr<'db> for TokenTreeNodePtr<'db> {
21124 type SyntaxNode = TokenTreeNode<'db>;
21125 fn untyped(self) -> SyntaxStablePtrId<'db> {
21126 self.0
21127 }
21128 fn lookup(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
21129 TokenTreeNode::from_syntax_node(db, self.0.lookup(db))
21130 }
21131}
21132impl<'db> From<TokenTreeNodePtr<'db>> for SyntaxStablePtrId<'db> {
21133 fn from(ptr: TokenTreeNodePtr<'db>) -> Self {
21134 ptr.untyped()
21135 }
21136}
21137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21138pub struct TokenTreeNodeGreen<'db>(pub GreenId<'db>);
21139impl<'db> TypedSyntaxNode<'db> for TokenTreeNode<'db> {
21140 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeNode);
21141 type StablePtr = TokenTreeNodePtr<'db>;
21142 type Green = TokenTreeNodeGreen<'db>;
21143 fn missing(db: &'db dyn Database) -> Self::Green {
21144 TokenTreeNodeGreen(
21145 GreenNode {
21146 kind: SyntaxKind::TokenTreeNode,
21147 details: GreenNodeDetails::Node {
21148 children: [WrappedTokenTree::missing(db).0].into(),
21149 width: TextWidth::default(),
21150 },
21151 }
21152 .intern(db),
21153 )
21154 }
21155 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21156 let kind = node.kind(db);
21157 assert_eq!(
21158 kind,
21159 SyntaxKind::TokenTreeNode,
21160 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21161 kind,
21162 SyntaxKind::TokenTreeNode
21163 );
21164 Self { node }
21165 }
21166 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21167 let kind = node.kind(db);
21168 if kind == SyntaxKind::TokenTreeNode {
21169 Some(Self::from_syntax_node(db, node))
21170 } else {
21171 None
21172 }
21173 }
21174 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21175 self.node
21176 }
21177 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21178 TokenTreeNodePtr(self.node.stable_ptr(db))
21179 }
21180}
21181#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21182pub struct TokenTreeRepetition<'db> {
21183 node: SyntaxNode<'db>,
21184}
21185impl<'db> TokenTreeRepetition<'db> {
21186 pub const INDEX_DOLLAR: usize = 0;
21187 pub const INDEX_LPAREN: usize = 1;
21188 pub const INDEX_ELEMENTS: usize = 2;
21189 pub const INDEX_RPAREN: usize = 3;
21190 pub const INDEX_SEPARATOR: usize = 4;
21191 pub const INDEX_OPERATOR: usize = 5;
21192 pub fn new_green(
21193 db: &'db dyn Database,
21194 dollar: TerminalDollarGreen<'db>,
21195 lparen: TerminalLParenGreen<'db>,
21196 elements: TokenListGreen<'db>,
21197 rparen: TerminalRParenGreen<'db>,
21198 separator: OptionTerminalCommaGreen<'db>,
21199 operator: MacroRepetitionOperatorGreen<'db>,
21200 ) -> TokenTreeRepetitionGreen<'db> {
21201 let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
21202 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21203 TokenTreeRepetitionGreen(
21204 GreenNode {
21205 kind: SyntaxKind::TokenTreeRepetition,
21206 details: GreenNodeDetails::Node { children: children.into(), width },
21207 }
21208 .intern(db),
21209 )
21210 }
21211}
21212impl<'db> TokenTreeRepetition<'db> {
21213 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21214 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21215 }
21216 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21217 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
21218 }
21219 pub fn elements(&self, db: &'db dyn Database) -> TokenList<'db> {
21220 TokenList::from_syntax_node(db, self.node.get_children(db)[2])
21221 }
21222 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21223 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
21224 }
21225 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
21226 OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
21227 }
21228 pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
21229 MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
21230 }
21231}
21232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21233pub struct TokenTreeRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
21234impl<'db> TokenTreeRepetitionPtr<'db> {}
21235impl<'db> TypedStablePtr<'db> for TokenTreeRepetitionPtr<'db> {
21236 type SyntaxNode = TokenTreeRepetition<'db>;
21237 fn untyped(self) -> SyntaxStablePtrId<'db> {
21238 self.0
21239 }
21240 fn lookup(&self, db: &'db dyn Database) -> TokenTreeRepetition<'db> {
21241 TokenTreeRepetition::from_syntax_node(db, self.0.lookup(db))
21242 }
21243}
21244impl<'db> From<TokenTreeRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
21245 fn from(ptr: TokenTreeRepetitionPtr<'db>) -> Self {
21246 ptr.untyped()
21247 }
21248}
21249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21250pub struct TokenTreeRepetitionGreen<'db>(pub GreenId<'db>);
21251impl<'db> TypedSyntaxNode<'db> for TokenTreeRepetition<'db> {
21252 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeRepetition);
21253 type StablePtr = TokenTreeRepetitionPtr<'db>;
21254 type Green = TokenTreeRepetitionGreen<'db>;
21255 fn missing(db: &'db dyn Database) -> Self::Green {
21256 TokenTreeRepetitionGreen(
21257 GreenNode {
21258 kind: SyntaxKind::TokenTreeRepetition,
21259 details: GreenNodeDetails::Node {
21260 children: [
21261 TerminalDollar::missing(db).0,
21262 TerminalLParen::missing(db).0,
21263 TokenList::missing(db).0,
21264 TerminalRParen::missing(db).0,
21265 OptionTerminalComma::missing(db).0,
21266 MacroRepetitionOperator::missing(db).0,
21267 ]
21268 .into(),
21269 width: TextWidth::default(),
21270 },
21271 }
21272 .intern(db),
21273 )
21274 }
21275 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21276 let kind = node.kind(db);
21277 assert_eq!(
21278 kind,
21279 SyntaxKind::TokenTreeRepetition,
21280 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21281 kind,
21282 SyntaxKind::TokenTreeRepetition
21283 );
21284 Self { node }
21285 }
21286 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21287 let kind = node.kind(db);
21288 if kind == SyntaxKind::TokenTreeRepetition {
21289 Some(Self::from_syntax_node(db, node))
21290 } else {
21291 None
21292 }
21293 }
21294 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21295 self.node
21296 }
21297 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21298 TokenTreeRepetitionPtr(self.node.stable_ptr(db))
21299 }
21300}
21301#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21302pub struct TokenTreeParam<'db> {
21303 node: SyntaxNode<'db>,
21304}
21305impl<'db> TokenTreeParam<'db> {
21306 pub const INDEX_DOLLAR: usize = 0;
21307 pub const INDEX_NAME: usize = 1;
21308 pub fn new_green(
21309 db: &'db dyn Database,
21310 dollar: TerminalDollarGreen<'db>,
21311 name: TerminalIdentifierGreen<'db>,
21312 ) -> TokenTreeParamGreen<'db> {
21313 let children = [dollar.0, name.0];
21314 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21315 TokenTreeParamGreen(
21316 GreenNode {
21317 kind: SyntaxKind::TokenTreeParam,
21318 details: GreenNodeDetails::Node { children: children.into(), width },
21319 }
21320 .intern(db),
21321 )
21322 }
21323}
21324impl<'db> TokenTreeParam<'db> {
21325 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
21326 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
21327 }
21328 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
21329 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
21330 }
21331}
21332#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21333pub struct TokenTreeParamPtr<'db>(pub SyntaxStablePtrId<'db>);
21334impl<'db> TokenTreeParamPtr<'db> {}
21335impl<'db> TypedStablePtr<'db> for TokenTreeParamPtr<'db> {
21336 type SyntaxNode = TokenTreeParam<'db>;
21337 fn untyped(self) -> SyntaxStablePtrId<'db> {
21338 self.0
21339 }
21340 fn lookup(&self, db: &'db dyn Database) -> TokenTreeParam<'db> {
21341 TokenTreeParam::from_syntax_node(db, self.0.lookup(db))
21342 }
21343}
21344impl<'db> From<TokenTreeParamPtr<'db>> for SyntaxStablePtrId<'db> {
21345 fn from(ptr: TokenTreeParamPtr<'db>) -> Self {
21346 ptr.untyped()
21347 }
21348}
21349#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21350pub struct TokenTreeParamGreen<'db>(pub GreenId<'db>);
21351impl<'db> TypedSyntaxNode<'db> for TokenTreeParam<'db> {
21352 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeParam);
21353 type StablePtr = TokenTreeParamPtr<'db>;
21354 type Green = TokenTreeParamGreen<'db>;
21355 fn missing(db: &'db dyn Database) -> Self::Green {
21356 TokenTreeParamGreen(
21357 GreenNode {
21358 kind: SyntaxKind::TokenTreeParam,
21359 details: GreenNodeDetails::Node {
21360 children: [TerminalDollar::missing(db).0, TerminalIdentifier::missing(db).0]
21361 .into(),
21362 width: TextWidth::default(),
21363 },
21364 }
21365 .intern(db),
21366 )
21367 }
21368 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21369 let kind = node.kind(db);
21370 assert_eq!(
21371 kind,
21372 SyntaxKind::TokenTreeParam,
21373 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21374 kind,
21375 SyntaxKind::TokenTreeParam
21376 );
21377 Self { node }
21378 }
21379 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21380 let kind = node.kind(db);
21381 if kind == SyntaxKind::TokenTreeParam {
21382 Some(Self::from_syntax_node(db, node))
21383 } else {
21384 None
21385 }
21386 }
21387 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21388 self.node
21389 }
21390 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21391 TokenTreeParamPtr(self.node.stable_ptr(db))
21392 }
21393}
21394#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21395pub enum TokenTree<'db> {
21396 Token(TokenTreeLeaf<'db>),
21397 Subtree(TokenTreeNode<'db>),
21398 Repetition(TokenTreeRepetition<'db>),
21399 Param(TokenTreeParam<'db>),
21400 Missing(TokenTreeMissing<'db>),
21401}
21402#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21403pub struct TokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21404impl<'db> TypedStablePtr<'db> for TokenTreePtr<'db> {
21405 type SyntaxNode = TokenTree<'db>;
21406 fn untyped(self) -> SyntaxStablePtrId<'db> {
21407 self.0
21408 }
21409 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21410 TokenTree::from_syntax_node(db, self.0.lookup(db))
21411 }
21412}
21413impl<'db> From<TokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21414 fn from(ptr: TokenTreePtr<'db>) -> Self {
21415 ptr.untyped()
21416 }
21417}
21418impl<'db> From<TokenTreeLeafPtr<'db>> for TokenTreePtr<'db> {
21419 fn from(value: TokenTreeLeafPtr<'db>) -> Self {
21420 Self(value.0)
21421 }
21422}
21423impl<'db> From<TokenTreeNodePtr<'db>> for TokenTreePtr<'db> {
21424 fn from(value: TokenTreeNodePtr<'db>) -> Self {
21425 Self(value.0)
21426 }
21427}
21428impl<'db> From<TokenTreeRepetitionPtr<'db>> for TokenTreePtr<'db> {
21429 fn from(value: TokenTreeRepetitionPtr<'db>) -> Self {
21430 Self(value.0)
21431 }
21432}
21433impl<'db> From<TokenTreeParamPtr<'db>> for TokenTreePtr<'db> {
21434 fn from(value: TokenTreeParamPtr<'db>) -> Self {
21435 Self(value.0)
21436 }
21437}
21438impl<'db> From<TokenTreeMissingPtr<'db>> for TokenTreePtr<'db> {
21439 fn from(value: TokenTreeMissingPtr<'db>) -> Self {
21440 Self(value.0)
21441 }
21442}
21443impl<'db> From<TokenTreeLeafGreen<'db>> for TokenTreeGreen<'db> {
21444 fn from(value: TokenTreeLeafGreen<'db>) -> Self {
21445 Self(value.0)
21446 }
21447}
21448impl<'db> From<TokenTreeNodeGreen<'db>> for TokenTreeGreen<'db> {
21449 fn from(value: TokenTreeNodeGreen<'db>) -> Self {
21450 Self(value.0)
21451 }
21452}
21453impl<'db> From<TokenTreeRepetitionGreen<'db>> for TokenTreeGreen<'db> {
21454 fn from(value: TokenTreeRepetitionGreen<'db>) -> Self {
21455 Self(value.0)
21456 }
21457}
21458impl<'db> From<TokenTreeParamGreen<'db>> for TokenTreeGreen<'db> {
21459 fn from(value: TokenTreeParamGreen<'db>) -> Self {
21460 Self(value.0)
21461 }
21462}
21463impl<'db> From<TokenTreeMissingGreen<'db>> for TokenTreeGreen<'db> {
21464 fn from(value: TokenTreeMissingGreen<'db>) -> Self {
21465 Self(value.0)
21466 }
21467}
21468#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21469pub struct TokenTreeGreen<'db>(pub GreenId<'db>);
21470impl<'db> TypedSyntaxNode<'db> for TokenTree<'db> {
21471 const OPTIONAL_KIND: Option<SyntaxKind> = None;
21472 type StablePtr = TokenTreePtr<'db>;
21473 type Green = TokenTreeGreen<'db>;
21474 fn missing(db: &'db dyn Database) -> Self::Green {
21475 TokenTreeGreen(TokenTreeMissing::missing(db).0)
21476 }
21477 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21478 let kind = node.kind(db);
21479 match kind {
21480 SyntaxKind::TokenTreeLeaf => {
21481 TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node))
21482 }
21483 SyntaxKind::TokenTreeNode => {
21484 TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node))
21485 }
21486 SyntaxKind::TokenTreeRepetition => {
21487 TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node))
21488 }
21489 SyntaxKind::TokenTreeParam => {
21490 TokenTree::Param(TokenTreeParam::from_syntax_node(db, node))
21491 }
21492 SyntaxKind::TokenTreeMissing => {
21493 TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node))
21494 }
21495 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenTree"),
21496 }
21497 }
21498 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21499 let kind = node.kind(db);
21500 match kind {
21501 SyntaxKind::TokenTreeLeaf => {
21502 Some(TokenTree::Token(TokenTreeLeaf::from_syntax_node(db, node)))
21503 }
21504 SyntaxKind::TokenTreeNode => {
21505 Some(TokenTree::Subtree(TokenTreeNode::from_syntax_node(db, node)))
21506 }
21507 SyntaxKind::TokenTreeRepetition => {
21508 Some(TokenTree::Repetition(TokenTreeRepetition::from_syntax_node(db, node)))
21509 }
21510 SyntaxKind::TokenTreeParam => {
21511 Some(TokenTree::Param(TokenTreeParam::from_syntax_node(db, node)))
21512 }
21513 SyntaxKind::TokenTreeMissing => {
21514 Some(TokenTree::Missing(TokenTreeMissing::from_syntax_node(db, node)))
21515 }
21516 _ => None,
21517 }
21518 }
21519 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21520 match self {
21521 TokenTree::Token(x) => x.as_syntax_node(),
21522 TokenTree::Subtree(x) => x.as_syntax_node(),
21523 TokenTree::Repetition(x) => x.as_syntax_node(),
21524 TokenTree::Param(x) => x.as_syntax_node(),
21525 TokenTree::Missing(x) => x.as_syntax_node(),
21526 }
21527 }
21528 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21529 TokenTreePtr(self.as_syntax_node().stable_ptr(db))
21530 }
21531}
21532impl<'db> TokenTree<'db> {
21533 pub fn is_variant(kind: SyntaxKind) -> bool {
21535 matches!(
21536 kind,
21537 SyntaxKind::TokenTreeLeaf
21538 | SyntaxKind::TokenTreeNode
21539 | SyntaxKind::TokenTreeRepetition
21540 | SyntaxKind::TokenTreeParam
21541 | SyntaxKind::TokenTreeMissing
21542 )
21543 }
21544}
21545#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21546pub struct TokenTreeMissing<'db> {
21547 node: SyntaxNode<'db>,
21548}
21549impl<'db> TokenTreeMissing<'db> {
21550 pub fn new_green(db: &'db dyn Database) -> TokenTreeMissingGreen<'db> {
21551 let children = [];
21552 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21553 TokenTreeMissingGreen(
21554 GreenNode {
21555 kind: SyntaxKind::TokenTreeMissing,
21556 details: GreenNodeDetails::Node { children: children.into(), width },
21557 }
21558 .intern(db),
21559 )
21560 }
21561}
21562impl<'db> TokenTreeMissing<'db> {}
21563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21564pub struct TokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21565impl<'db> TokenTreeMissingPtr<'db> {}
21566impl<'db> TypedStablePtr<'db> for TokenTreeMissingPtr<'db> {
21567 type SyntaxNode = TokenTreeMissing<'db>;
21568 fn untyped(self) -> SyntaxStablePtrId<'db> {
21569 self.0
21570 }
21571 fn lookup(&self, db: &'db dyn Database) -> TokenTreeMissing<'db> {
21572 TokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21573 }
21574}
21575impl<'db> From<TokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21576 fn from(ptr: TokenTreeMissingPtr<'db>) -> Self {
21577 ptr.untyped()
21578 }
21579}
21580#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21581pub struct TokenTreeMissingGreen<'db>(pub GreenId<'db>);
21582impl<'db> TypedSyntaxNode<'db> for TokenTreeMissing<'db> {
21583 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTreeMissing);
21584 type StablePtr = TokenTreeMissingPtr<'db>;
21585 type Green = TokenTreeMissingGreen<'db>;
21586 fn missing(db: &'db dyn Database) -> Self::Green {
21587 TokenTreeMissingGreen(
21588 GreenNode {
21589 kind: SyntaxKind::TokenTreeMissing,
21590 details: GreenNodeDetails::Node {
21591 children: [].into(),
21592 width: TextWidth::default(),
21593 },
21594 }
21595 .intern(db),
21596 )
21597 }
21598 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21599 let kind = node.kind(db);
21600 assert_eq!(
21601 kind,
21602 SyntaxKind::TokenTreeMissing,
21603 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21604 kind,
21605 SyntaxKind::TokenTreeMissing
21606 );
21607 Self { node }
21608 }
21609 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21610 let kind = node.kind(db);
21611 if kind == SyntaxKind::TokenTreeMissing {
21612 Some(Self::from_syntax_node(db, node))
21613 } else {
21614 None
21615 }
21616 }
21617 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21618 self.node
21619 }
21620 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21621 TokenTreeMissingPtr(self.node.stable_ptr(db))
21622 }
21623}
21624#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21625pub enum WrappedTokenTree<'db> {
21626 Parenthesized(ParenthesizedTokenTree<'db>),
21627 Braced(BracedTokenTree<'db>),
21628 Bracketed(BracketedTokenTree<'db>),
21629 Missing(WrappedTokenTreeMissing<'db>),
21630}
21631#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21632pub struct WrappedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21633impl<'db> TypedStablePtr<'db> for WrappedTokenTreePtr<'db> {
21634 type SyntaxNode = WrappedTokenTree<'db>;
21635 fn untyped(self) -> SyntaxStablePtrId<'db> {
21636 self.0
21637 }
21638 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
21639 WrappedTokenTree::from_syntax_node(db, self.0.lookup(db))
21640 }
21641}
21642impl<'db> From<WrappedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21643 fn from(ptr: WrappedTokenTreePtr<'db>) -> Self {
21644 ptr.untyped()
21645 }
21646}
21647impl<'db> From<ParenthesizedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21648 fn from(value: ParenthesizedTokenTreePtr<'db>) -> Self {
21649 Self(value.0)
21650 }
21651}
21652impl<'db> From<BracedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21653 fn from(value: BracedTokenTreePtr<'db>) -> Self {
21654 Self(value.0)
21655 }
21656}
21657impl<'db> From<BracketedTokenTreePtr<'db>> for WrappedTokenTreePtr<'db> {
21658 fn from(value: BracketedTokenTreePtr<'db>) -> Self {
21659 Self(value.0)
21660 }
21661}
21662impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for WrappedTokenTreePtr<'db> {
21663 fn from(value: WrappedTokenTreeMissingPtr<'db>) -> Self {
21664 Self(value.0)
21665 }
21666}
21667impl<'db> From<ParenthesizedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21668 fn from(value: ParenthesizedTokenTreeGreen<'db>) -> Self {
21669 Self(value.0)
21670 }
21671}
21672impl<'db> From<BracedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21673 fn from(value: BracedTokenTreeGreen<'db>) -> Self {
21674 Self(value.0)
21675 }
21676}
21677impl<'db> From<BracketedTokenTreeGreen<'db>> for WrappedTokenTreeGreen<'db> {
21678 fn from(value: BracketedTokenTreeGreen<'db>) -> Self {
21679 Self(value.0)
21680 }
21681}
21682impl<'db> From<WrappedTokenTreeMissingGreen<'db>> for WrappedTokenTreeGreen<'db> {
21683 fn from(value: WrappedTokenTreeMissingGreen<'db>) -> Self {
21684 Self(value.0)
21685 }
21686}
21687#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21688pub struct WrappedTokenTreeGreen<'db>(pub GreenId<'db>);
21689impl<'db> TypedSyntaxNode<'db> for WrappedTokenTree<'db> {
21690 const OPTIONAL_KIND: Option<SyntaxKind> = None;
21691 type StablePtr = WrappedTokenTreePtr<'db>;
21692 type Green = WrappedTokenTreeGreen<'db>;
21693 fn missing(db: &'db dyn Database) -> Self::Green {
21694 WrappedTokenTreeGreen(WrappedTokenTreeMissing::missing(db).0)
21695 }
21696 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21697 let kind = node.kind(db);
21698 match kind {
21699 SyntaxKind::ParenthesizedTokenTree => {
21700 WrappedTokenTree::Parenthesized(ParenthesizedTokenTree::from_syntax_node(db, node))
21701 }
21702 SyntaxKind::BracedTokenTree => {
21703 WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node))
21704 }
21705 SyntaxKind::BracketedTokenTree => {
21706 WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node))
21707 }
21708 SyntaxKind::WrappedTokenTreeMissing => {
21709 WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node))
21710 }
21711 _ => panic!(
21712 "Unexpected syntax kind {:?} when constructing {}.",
21713 kind, "WrappedTokenTree"
21714 ),
21715 }
21716 }
21717 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21718 let kind = node.kind(db);
21719 match kind {
21720 SyntaxKind::ParenthesizedTokenTree => Some(WrappedTokenTree::Parenthesized(
21721 ParenthesizedTokenTree::from_syntax_node(db, node),
21722 )),
21723 SyntaxKind::BracedTokenTree => {
21724 Some(WrappedTokenTree::Braced(BracedTokenTree::from_syntax_node(db, node)))
21725 }
21726 SyntaxKind::BracketedTokenTree => {
21727 Some(WrappedTokenTree::Bracketed(BracketedTokenTree::from_syntax_node(db, node)))
21728 }
21729 SyntaxKind::WrappedTokenTreeMissing => {
21730 Some(WrappedTokenTree::Missing(WrappedTokenTreeMissing::from_syntax_node(db, node)))
21731 }
21732 _ => None,
21733 }
21734 }
21735 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21736 match self {
21737 WrappedTokenTree::Parenthesized(x) => x.as_syntax_node(),
21738 WrappedTokenTree::Braced(x) => x.as_syntax_node(),
21739 WrappedTokenTree::Bracketed(x) => x.as_syntax_node(),
21740 WrappedTokenTree::Missing(x) => x.as_syntax_node(),
21741 }
21742 }
21743 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21744 WrappedTokenTreePtr(self.as_syntax_node().stable_ptr(db))
21745 }
21746}
21747impl<'db> WrappedTokenTree<'db> {
21748 pub fn is_variant(kind: SyntaxKind) -> bool {
21750 matches!(
21751 kind,
21752 SyntaxKind::ParenthesizedTokenTree
21753 | SyntaxKind::BracedTokenTree
21754 | SyntaxKind::BracketedTokenTree
21755 | SyntaxKind::WrappedTokenTreeMissing
21756 )
21757 }
21758}
21759#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21760pub struct WrappedTokenTreeMissing<'db> {
21761 node: SyntaxNode<'db>,
21762}
21763impl<'db> WrappedTokenTreeMissing<'db> {
21764 pub fn new_green(db: &'db dyn Database) -> WrappedTokenTreeMissingGreen<'db> {
21765 let children = [];
21766 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21767 WrappedTokenTreeMissingGreen(
21768 GreenNode {
21769 kind: SyntaxKind::WrappedTokenTreeMissing,
21770 details: GreenNodeDetails::Node { children: children.into(), width },
21771 }
21772 .intern(db),
21773 )
21774 }
21775}
21776impl<'db> WrappedTokenTreeMissing<'db> {}
21777#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21778pub struct WrappedTokenTreeMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
21779impl<'db> WrappedTokenTreeMissingPtr<'db> {}
21780impl<'db> TypedStablePtr<'db> for WrappedTokenTreeMissingPtr<'db> {
21781 type SyntaxNode = WrappedTokenTreeMissing<'db>;
21782 fn untyped(self) -> SyntaxStablePtrId<'db> {
21783 self.0
21784 }
21785 fn lookup(&self, db: &'db dyn Database) -> WrappedTokenTreeMissing<'db> {
21786 WrappedTokenTreeMissing::from_syntax_node(db, self.0.lookup(db))
21787 }
21788}
21789impl<'db> From<WrappedTokenTreeMissingPtr<'db>> for SyntaxStablePtrId<'db> {
21790 fn from(ptr: WrappedTokenTreeMissingPtr<'db>) -> Self {
21791 ptr.untyped()
21792 }
21793}
21794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21795pub struct WrappedTokenTreeMissingGreen<'db>(pub GreenId<'db>);
21796impl<'db> TypedSyntaxNode<'db> for WrappedTokenTreeMissing<'db> {
21797 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::WrappedTokenTreeMissing);
21798 type StablePtr = WrappedTokenTreeMissingPtr<'db>;
21799 type Green = WrappedTokenTreeMissingGreen<'db>;
21800 fn missing(db: &'db dyn Database) -> Self::Green {
21801 WrappedTokenTreeMissingGreen(
21802 GreenNode {
21803 kind: SyntaxKind::WrappedTokenTreeMissing,
21804 details: GreenNodeDetails::Node {
21805 children: [].into(),
21806 width: TextWidth::default(),
21807 },
21808 }
21809 .intern(db),
21810 )
21811 }
21812 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21813 let kind = node.kind(db);
21814 assert_eq!(
21815 kind,
21816 SyntaxKind::WrappedTokenTreeMissing,
21817 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21818 kind,
21819 SyntaxKind::WrappedTokenTreeMissing
21820 );
21821 Self { node }
21822 }
21823 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21824 let kind = node.kind(db);
21825 if kind == SyntaxKind::WrappedTokenTreeMissing {
21826 Some(Self::from_syntax_node(db, node))
21827 } else {
21828 None
21829 }
21830 }
21831 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21832 self.node
21833 }
21834 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21835 WrappedTokenTreeMissingPtr(self.node.stable_ptr(db))
21836 }
21837}
21838#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21839pub struct ParenthesizedTokenTree<'db> {
21840 node: SyntaxNode<'db>,
21841}
21842impl<'db> ParenthesizedTokenTree<'db> {
21843 pub const INDEX_LPAREN: usize = 0;
21844 pub const INDEX_TOKENS: usize = 1;
21845 pub const INDEX_RPAREN: usize = 2;
21846 pub fn new_green(
21847 db: &'db dyn Database,
21848 lparen: TerminalLParenGreen<'db>,
21849 tokens: TokenListGreen<'db>,
21850 rparen: TerminalRParenGreen<'db>,
21851 ) -> ParenthesizedTokenTreeGreen<'db> {
21852 let children = [lparen.0, tokens.0, rparen.0];
21853 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21854 ParenthesizedTokenTreeGreen(
21855 GreenNode {
21856 kind: SyntaxKind::ParenthesizedTokenTree,
21857 details: GreenNodeDetails::Node { children: children.into(), width },
21858 }
21859 .intern(db),
21860 )
21861 }
21862}
21863impl<'db> ParenthesizedTokenTree<'db> {
21864 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
21865 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
21866 }
21867 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21868 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21869 }
21870 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
21871 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
21872 }
21873}
21874#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21875pub struct ParenthesizedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21876impl<'db> ParenthesizedTokenTreePtr<'db> {}
21877impl<'db> TypedStablePtr<'db> for ParenthesizedTokenTreePtr<'db> {
21878 type SyntaxNode = ParenthesizedTokenTree<'db>;
21879 fn untyped(self) -> SyntaxStablePtrId<'db> {
21880 self.0
21881 }
21882 fn lookup(&self, db: &'db dyn Database) -> ParenthesizedTokenTree<'db> {
21883 ParenthesizedTokenTree::from_syntax_node(db, self.0.lookup(db))
21884 }
21885}
21886impl<'db> From<ParenthesizedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21887 fn from(ptr: ParenthesizedTokenTreePtr<'db>) -> Self {
21888 ptr.untyped()
21889 }
21890}
21891#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21892pub struct ParenthesizedTokenTreeGreen<'db>(pub GreenId<'db>);
21893impl<'db> TypedSyntaxNode<'db> for ParenthesizedTokenTree<'db> {
21894 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedTokenTree);
21895 type StablePtr = ParenthesizedTokenTreePtr<'db>;
21896 type Green = ParenthesizedTokenTreeGreen<'db>;
21897 fn missing(db: &'db dyn Database) -> Self::Green {
21898 ParenthesizedTokenTreeGreen(
21899 GreenNode {
21900 kind: SyntaxKind::ParenthesizedTokenTree,
21901 details: GreenNodeDetails::Node {
21902 children: [
21903 TerminalLParen::missing(db).0,
21904 TokenList::missing(db).0,
21905 TerminalRParen::missing(db).0,
21906 ]
21907 .into(),
21908 width: TextWidth::default(),
21909 },
21910 }
21911 .intern(db),
21912 )
21913 }
21914 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
21915 let kind = node.kind(db);
21916 assert_eq!(
21917 kind,
21918 SyntaxKind::ParenthesizedTokenTree,
21919 "Unexpected SyntaxKind {:?}. Expected {:?}.",
21920 kind,
21921 SyntaxKind::ParenthesizedTokenTree
21922 );
21923 Self { node }
21924 }
21925 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
21926 let kind = node.kind(db);
21927 if kind == SyntaxKind::ParenthesizedTokenTree {
21928 Some(Self::from_syntax_node(db, node))
21929 } else {
21930 None
21931 }
21932 }
21933 fn as_syntax_node(&self) -> SyntaxNode<'db> {
21934 self.node
21935 }
21936 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
21937 ParenthesizedTokenTreePtr(self.node.stable_ptr(db))
21938 }
21939}
21940#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
21941pub struct BracedTokenTree<'db> {
21942 node: SyntaxNode<'db>,
21943}
21944impl<'db> BracedTokenTree<'db> {
21945 pub const INDEX_LBRACE: usize = 0;
21946 pub const INDEX_TOKENS: usize = 1;
21947 pub const INDEX_RBRACE: usize = 2;
21948 pub fn new_green(
21949 db: &'db dyn Database,
21950 lbrace: TerminalLBraceGreen<'db>,
21951 tokens: TokenListGreen<'db>,
21952 rbrace: TerminalRBraceGreen<'db>,
21953 ) -> BracedTokenTreeGreen<'db> {
21954 let children = [lbrace.0, tokens.0, rbrace.0];
21955 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
21956 BracedTokenTreeGreen(
21957 GreenNode {
21958 kind: SyntaxKind::BracedTokenTree,
21959 details: GreenNodeDetails::Node { children: children.into(), width },
21960 }
21961 .intern(db),
21962 )
21963 }
21964}
21965impl<'db> BracedTokenTree<'db> {
21966 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
21967 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
21968 }
21969 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
21970 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
21971 }
21972 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
21973 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
21974 }
21975}
21976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21977pub struct BracedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
21978impl<'db> BracedTokenTreePtr<'db> {}
21979impl<'db> TypedStablePtr<'db> for BracedTokenTreePtr<'db> {
21980 type SyntaxNode = BracedTokenTree<'db>;
21981 fn untyped(self) -> SyntaxStablePtrId<'db> {
21982 self.0
21983 }
21984 fn lookup(&self, db: &'db dyn Database) -> BracedTokenTree<'db> {
21985 BracedTokenTree::from_syntax_node(db, self.0.lookup(db))
21986 }
21987}
21988impl<'db> From<BracedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
21989 fn from(ptr: BracedTokenTreePtr<'db>) -> Self {
21990 ptr.untyped()
21991 }
21992}
21993#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
21994pub struct BracedTokenTreeGreen<'db>(pub GreenId<'db>);
21995impl<'db> TypedSyntaxNode<'db> for BracedTokenTree<'db> {
21996 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedTokenTree);
21997 type StablePtr = BracedTokenTreePtr<'db>;
21998 type Green = BracedTokenTreeGreen<'db>;
21999 fn missing(db: &'db dyn Database) -> Self::Green {
22000 BracedTokenTreeGreen(
22001 GreenNode {
22002 kind: SyntaxKind::BracedTokenTree,
22003 details: GreenNodeDetails::Node {
22004 children: [
22005 TerminalLBrace::missing(db).0,
22006 TokenList::missing(db).0,
22007 TerminalRBrace::missing(db).0,
22008 ]
22009 .into(),
22010 width: TextWidth::default(),
22011 },
22012 }
22013 .intern(db),
22014 )
22015 }
22016 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22017 let kind = node.kind(db);
22018 assert_eq!(
22019 kind,
22020 SyntaxKind::BracedTokenTree,
22021 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22022 kind,
22023 SyntaxKind::BracedTokenTree
22024 );
22025 Self { node }
22026 }
22027 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22028 let kind = node.kind(db);
22029 if kind == SyntaxKind::BracedTokenTree {
22030 Some(Self::from_syntax_node(db, node))
22031 } else {
22032 None
22033 }
22034 }
22035 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22036 self.node
22037 }
22038 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22039 BracedTokenTreePtr(self.node.stable_ptr(db))
22040 }
22041}
22042#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22043pub struct BracketedTokenTree<'db> {
22044 node: SyntaxNode<'db>,
22045}
22046impl<'db> BracketedTokenTree<'db> {
22047 pub const INDEX_LBRACK: usize = 0;
22048 pub const INDEX_TOKENS: usize = 1;
22049 pub const INDEX_RBRACK: usize = 2;
22050 pub fn new_green(
22051 db: &'db dyn Database,
22052 lbrack: TerminalLBrackGreen<'db>,
22053 tokens: TokenListGreen<'db>,
22054 rbrack: TerminalRBrackGreen<'db>,
22055 ) -> BracketedTokenTreeGreen<'db> {
22056 let children = [lbrack.0, tokens.0, rbrack.0];
22057 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22058 BracketedTokenTreeGreen(
22059 GreenNode {
22060 kind: SyntaxKind::BracketedTokenTree,
22061 details: GreenNodeDetails::Node { children: children.into(), width },
22062 }
22063 .intern(db),
22064 )
22065 }
22066}
22067impl<'db> BracketedTokenTree<'db> {
22068 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
22069 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
22070 }
22071 pub fn tokens(&self, db: &'db dyn Database) -> TokenList<'db> {
22072 TokenList::from_syntax_node(db, self.node.get_children(db)[1])
22073 }
22074 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
22075 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
22076 }
22077}
22078#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22079pub struct BracketedTokenTreePtr<'db>(pub SyntaxStablePtrId<'db>);
22080impl<'db> BracketedTokenTreePtr<'db> {}
22081impl<'db> TypedStablePtr<'db> for BracketedTokenTreePtr<'db> {
22082 type SyntaxNode = BracketedTokenTree<'db>;
22083 fn untyped(self) -> SyntaxStablePtrId<'db> {
22084 self.0
22085 }
22086 fn lookup(&self, db: &'db dyn Database) -> BracketedTokenTree<'db> {
22087 BracketedTokenTree::from_syntax_node(db, self.0.lookup(db))
22088 }
22089}
22090impl<'db> From<BracketedTokenTreePtr<'db>> for SyntaxStablePtrId<'db> {
22091 fn from(ptr: BracketedTokenTreePtr<'db>) -> Self {
22092 ptr.untyped()
22093 }
22094}
22095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22096pub struct BracketedTokenTreeGreen<'db>(pub GreenId<'db>);
22097impl<'db> TypedSyntaxNode<'db> for BracketedTokenTree<'db> {
22098 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedTokenTree);
22099 type StablePtr = BracketedTokenTreePtr<'db>;
22100 type Green = BracketedTokenTreeGreen<'db>;
22101 fn missing(db: &'db dyn Database) -> Self::Green {
22102 BracketedTokenTreeGreen(
22103 GreenNode {
22104 kind: SyntaxKind::BracketedTokenTree,
22105 details: GreenNodeDetails::Node {
22106 children: [
22107 TerminalLBrack::missing(db).0,
22108 TokenList::missing(db).0,
22109 TerminalRBrack::missing(db).0,
22110 ]
22111 .into(),
22112 width: TextWidth::default(),
22113 },
22114 }
22115 .intern(db),
22116 )
22117 }
22118 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22119 let kind = node.kind(db);
22120 assert_eq!(
22121 kind,
22122 SyntaxKind::BracketedTokenTree,
22123 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22124 kind,
22125 SyntaxKind::BracketedTokenTree
22126 );
22127 Self { node }
22128 }
22129 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22130 let kind = node.kind(db);
22131 if kind == SyntaxKind::BracketedTokenTree {
22132 Some(Self::from_syntax_node(db, node))
22133 } else {
22134 None
22135 }
22136 }
22137 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22138 self.node
22139 }
22140 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22141 BracketedTokenTreePtr(self.node.stable_ptr(db))
22142 }
22143}
22144#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22145pub struct ExprInlineMacro<'db> {
22146 node: SyntaxNode<'db>,
22147}
22148impl<'db> ExprInlineMacro<'db> {
22149 pub const INDEX_PATH: usize = 0;
22150 pub const INDEX_BANG: usize = 1;
22151 pub const INDEX_ARGUMENTS: usize = 2;
22152 pub fn new_green(
22153 db: &'db dyn Database,
22154 path: ExprPathGreen<'db>,
22155 bang: TerminalNotGreen<'db>,
22156 arguments: TokenTreeNodeGreen<'db>,
22157 ) -> ExprInlineMacroGreen<'db> {
22158 let children = [path.0, bang.0, arguments.0];
22159 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22160 ExprInlineMacroGreen(
22161 GreenNode {
22162 kind: SyntaxKind::ExprInlineMacro,
22163 details: GreenNodeDetails::Node { children: children.into(), width },
22164 }
22165 .intern(db),
22166 )
22167 }
22168}
22169impl<'db> ExprInlineMacro<'db> {
22170 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22171 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
22172 }
22173 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22174 TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
22175 }
22176 pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22177 TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[2])
22178 }
22179}
22180#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22181pub struct ExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22182impl<'db> ExprInlineMacroPtr<'db> {}
22183impl<'db> TypedStablePtr<'db> for ExprInlineMacroPtr<'db> {
22184 type SyntaxNode = ExprInlineMacro<'db>;
22185 fn untyped(self) -> SyntaxStablePtrId<'db> {
22186 self.0
22187 }
22188 fn lookup(&self, db: &'db dyn Database) -> ExprInlineMacro<'db> {
22189 ExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
22190 }
22191}
22192impl<'db> From<ExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22193 fn from(ptr: ExprInlineMacroPtr<'db>) -> Self {
22194 ptr.untyped()
22195 }
22196}
22197#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22198pub struct ExprInlineMacroGreen<'db>(pub GreenId<'db>);
22199impl<'db> TypedSyntaxNode<'db> for ExprInlineMacro<'db> {
22200 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ExprInlineMacro);
22201 type StablePtr = ExprInlineMacroPtr<'db>;
22202 type Green = ExprInlineMacroGreen<'db>;
22203 fn missing(db: &'db dyn Database) -> Self::Green {
22204 ExprInlineMacroGreen(
22205 GreenNode {
22206 kind: SyntaxKind::ExprInlineMacro,
22207 details: GreenNodeDetails::Node {
22208 children: [
22209 ExprPath::missing(db).0,
22210 TerminalNot::missing(db).0,
22211 TokenTreeNode::missing(db).0,
22212 ]
22213 .into(),
22214 width: TextWidth::default(),
22215 },
22216 }
22217 .intern(db),
22218 )
22219 }
22220 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22221 let kind = node.kind(db);
22222 assert_eq!(
22223 kind,
22224 SyntaxKind::ExprInlineMacro,
22225 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22226 kind,
22227 SyntaxKind::ExprInlineMacro
22228 );
22229 Self { node }
22230 }
22231 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22232 let kind = node.kind(db);
22233 if kind == SyntaxKind::ExprInlineMacro {
22234 Some(Self::from_syntax_node(db, node))
22235 } else {
22236 None
22237 }
22238 }
22239 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22240 self.node
22241 }
22242 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22243 ExprInlineMacroPtr(self.node.stable_ptr(db))
22244 }
22245}
22246#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22247pub struct ItemInlineMacro<'db> {
22248 node: SyntaxNode<'db>,
22249}
22250impl<'db> ItemInlineMacro<'db> {
22251 pub const INDEX_ATTRIBUTES: usize = 0;
22252 pub const INDEX_PATH: usize = 1;
22253 pub const INDEX_BANG: usize = 2;
22254 pub const INDEX_ARGUMENTS: usize = 3;
22255 pub const INDEX_SEMICOLON: usize = 4;
22256 pub fn new_green(
22257 db: &'db dyn Database,
22258 attributes: AttributeListGreen<'db>,
22259 path: ExprPathGreen<'db>,
22260 bang: TerminalNotGreen<'db>,
22261 arguments: TokenTreeNodeGreen<'db>,
22262 semicolon: TerminalSemicolonGreen<'db>,
22263 ) -> ItemInlineMacroGreen<'db> {
22264 let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
22265 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22266 ItemInlineMacroGreen(
22267 GreenNode {
22268 kind: SyntaxKind::ItemInlineMacro,
22269 details: GreenNodeDetails::Node { children: children.into(), width },
22270 }
22271 .intern(db),
22272 )
22273 }
22274}
22275impl<'db> ItemInlineMacro<'db> {
22276 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22277 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22278 }
22279 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
22280 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
22281 }
22282 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
22283 TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
22284 }
22285 pub fn arguments(&self, db: &'db dyn Database) -> TokenTreeNode<'db> {
22286 TokenTreeNode::from_syntax_node(db, self.node.get_children(db)[3])
22287 }
22288 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22289 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
22290 }
22291}
22292#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22293pub struct ItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
22294impl<'db> ItemInlineMacroPtr<'db> {}
22295impl<'db> TypedStablePtr<'db> for ItemInlineMacroPtr<'db> {
22296 type SyntaxNode = ItemInlineMacro<'db>;
22297 fn untyped(self) -> SyntaxStablePtrId<'db> {
22298 self.0
22299 }
22300 fn lookup(&self, db: &'db dyn Database) -> ItemInlineMacro<'db> {
22301 ItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
22302 }
22303}
22304impl<'db> From<ItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
22305 fn from(ptr: ItemInlineMacroPtr<'db>) -> Self {
22306 ptr.untyped()
22307 }
22308}
22309#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22310pub struct ItemInlineMacroGreen<'db>(pub GreenId<'db>);
22311impl<'db> TypedSyntaxNode<'db> for ItemInlineMacro<'db> {
22312 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemInlineMacro);
22313 type StablePtr = ItemInlineMacroPtr<'db>;
22314 type Green = ItemInlineMacroGreen<'db>;
22315 fn missing(db: &'db dyn Database) -> Self::Green {
22316 ItemInlineMacroGreen(
22317 GreenNode {
22318 kind: SyntaxKind::ItemInlineMacro,
22319 details: GreenNodeDetails::Node {
22320 children: [
22321 AttributeList::missing(db).0,
22322 ExprPath::missing(db).0,
22323 TerminalNot::missing(db).0,
22324 TokenTreeNode::missing(db).0,
22325 TerminalSemicolon::missing(db).0,
22326 ]
22327 .into(),
22328 width: TextWidth::default(),
22329 },
22330 }
22331 .intern(db),
22332 )
22333 }
22334 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22335 let kind = node.kind(db);
22336 assert_eq!(
22337 kind,
22338 SyntaxKind::ItemInlineMacro,
22339 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22340 kind,
22341 SyntaxKind::ItemInlineMacro
22342 );
22343 Self { node }
22344 }
22345 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22346 let kind = node.kind(db);
22347 if kind == SyntaxKind::ItemInlineMacro {
22348 Some(Self::from_syntax_node(db, node))
22349 } else {
22350 None
22351 }
22352 }
22353 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22354 self.node
22355 }
22356 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22357 ItemInlineMacroPtr(self.node.stable_ptr(db))
22358 }
22359}
22360#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22361pub struct ItemMacroDeclaration<'db> {
22362 node: SyntaxNode<'db>,
22363}
22364impl<'db> ItemMacroDeclaration<'db> {
22365 pub const INDEX_ATTRIBUTES: usize = 0;
22366 pub const INDEX_VISIBILITY: usize = 1;
22367 pub const INDEX_MACRO_KW: usize = 2;
22368 pub const INDEX_NAME: usize = 3;
22369 pub const INDEX_LBRACE: usize = 4;
22370 pub const INDEX_RULES: usize = 5;
22371 pub const INDEX_RBRACE: usize = 6;
22372 pub fn new_green(
22373 db: &'db dyn Database,
22374 attributes: AttributeListGreen<'db>,
22375 visibility: VisibilityGreen<'db>,
22376 macro_kw: TerminalMacroGreen<'db>,
22377 name: TerminalIdentifierGreen<'db>,
22378 lbrace: TerminalLBraceGreen<'db>,
22379 rules: MacroRulesListGreen<'db>,
22380 rbrace: TerminalRBraceGreen<'db>,
22381 ) -> ItemMacroDeclarationGreen<'db> {
22382 let children =
22383 [attributes.0, visibility.0, macro_kw.0, name.0, lbrace.0, rules.0, rbrace.0];
22384 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22385 ItemMacroDeclarationGreen(
22386 GreenNode {
22387 kind: SyntaxKind::ItemMacroDeclaration,
22388 details: GreenNodeDetails::Node { children: children.into(), width },
22389 }
22390 .intern(db),
22391 )
22392 }
22393}
22394impl<'db> ItemMacroDeclaration<'db> {
22395 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
22396 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
22397 }
22398 pub fn visibility(&self, db: &'db dyn Database) -> Visibility<'db> {
22399 Visibility::from_syntax_node(db, self.node.get_children(db)[1])
22400 }
22401 pub fn macro_kw(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
22402 TerminalMacro::from_syntax_node(db, self.node.get_children(db)[2])
22403 }
22404 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22405 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[3])
22406 }
22407 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
22408 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[4])
22409 }
22410 pub fn rules(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22411 MacroRulesList::from_syntax_node(db, self.node.get_children(db)[5])
22412 }
22413 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
22414 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[6])
22415 }
22416}
22417#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22418pub struct ItemMacroDeclarationPtr<'db>(pub SyntaxStablePtrId<'db>);
22419impl<'db> ItemMacroDeclarationPtr<'db> {
22420 pub fn name_green(self, db: &'db dyn Database) -> TerminalIdentifierGreen<'db> {
22421 TerminalIdentifierGreen(self.0.0.key_fields(db)[0])
22422 }
22423}
22424impl<'db> TypedStablePtr<'db> for ItemMacroDeclarationPtr<'db> {
22425 type SyntaxNode = ItemMacroDeclaration<'db>;
22426 fn untyped(self) -> SyntaxStablePtrId<'db> {
22427 self.0
22428 }
22429 fn lookup(&self, db: &'db dyn Database) -> ItemMacroDeclaration<'db> {
22430 ItemMacroDeclaration::from_syntax_node(db, self.0.lookup(db))
22431 }
22432}
22433impl<'db> From<ItemMacroDeclarationPtr<'db>> for SyntaxStablePtrId<'db> {
22434 fn from(ptr: ItemMacroDeclarationPtr<'db>) -> Self {
22435 ptr.untyped()
22436 }
22437}
22438#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22439pub struct ItemMacroDeclarationGreen<'db>(pub GreenId<'db>);
22440impl<'db> TypedSyntaxNode<'db> for ItemMacroDeclaration<'db> {
22441 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ItemMacroDeclaration);
22442 type StablePtr = ItemMacroDeclarationPtr<'db>;
22443 type Green = ItemMacroDeclarationGreen<'db>;
22444 fn missing(db: &'db dyn Database) -> Self::Green {
22445 ItemMacroDeclarationGreen(
22446 GreenNode {
22447 kind: SyntaxKind::ItemMacroDeclaration,
22448 details: GreenNodeDetails::Node {
22449 children: [
22450 AttributeList::missing(db).0,
22451 Visibility::missing(db).0,
22452 TerminalMacro::missing(db).0,
22453 TerminalIdentifier::missing(db).0,
22454 TerminalLBrace::missing(db).0,
22455 MacroRulesList::missing(db).0,
22456 TerminalRBrace::missing(db).0,
22457 ]
22458 .into(),
22459 width: TextWidth::default(),
22460 },
22461 }
22462 .intern(db),
22463 )
22464 }
22465 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22466 let kind = node.kind(db);
22467 assert_eq!(
22468 kind,
22469 SyntaxKind::ItemMacroDeclaration,
22470 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22471 kind,
22472 SyntaxKind::ItemMacroDeclaration
22473 );
22474 Self { node }
22475 }
22476 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22477 let kind = node.kind(db);
22478 if kind == SyntaxKind::ItemMacroDeclaration {
22479 Some(Self::from_syntax_node(db, node))
22480 } else {
22481 None
22482 }
22483 }
22484 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22485 self.node
22486 }
22487 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22488 ItemMacroDeclarationPtr(self.node.stable_ptr(db))
22489 }
22490}
22491#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22492pub struct MacroRulesList<'db>(ElementList<'db, MacroRule<'db>, 1>);
22493impl<'db> Deref for MacroRulesList<'db> {
22494 type Target = ElementList<'db, MacroRule<'db>, 1>;
22495 fn deref(&self) -> &Self::Target {
22496 &self.0
22497 }
22498}
22499impl<'db> MacroRulesList<'db> {
22500 pub fn new_green(
22501 db: &'db dyn Database,
22502 children: &[MacroRuleGreen<'db>],
22503 ) -> MacroRulesListGreen<'db> {
22504 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
22505 MacroRulesListGreen(
22506 GreenNode {
22507 kind: SyntaxKind::MacroRulesList,
22508 details: GreenNodeDetails::Node {
22509 children: children.iter().map(|x| x.0).collect(),
22510 width,
22511 },
22512 }
22513 .intern(db),
22514 )
22515 }
22516}
22517#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22518pub struct MacroRulesListPtr<'db>(pub SyntaxStablePtrId<'db>);
22519impl<'db> TypedStablePtr<'db> for MacroRulesListPtr<'db> {
22520 type SyntaxNode = MacroRulesList<'db>;
22521 fn untyped(self) -> SyntaxStablePtrId<'db> {
22522 self.0
22523 }
22524 fn lookup(&self, db: &'db dyn Database) -> MacroRulesList<'db> {
22525 MacroRulesList::from_syntax_node(db, self.0.lookup(db))
22526 }
22527}
22528impl<'db> From<MacroRulesListPtr<'db>> for SyntaxStablePtrId<'db> {
22529 fn from(ptr: MacroRulesListPtr<'db>) -> Self {
22530 ptr.untyped()
22531 }
22532}
22533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22534pub struct MacroRulesListGreen<'db>(pub GreenId<'db>);
22535impl<'db> TypedSyntaxNode<'db> for MacroRulesList<'db> {
22536 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRulesList);
22537 type StablePtr = MacroRulesListPtr<'db>;
22538 type Green = MacroRulesListGreen<'db>;
22539 fn missing(db: &'db dyn Database) -> Self::Green {
22540 MacroRulesListGreen(
22541 GreenNode {
22542 kind: SyntaxKind::MacroRulesList,
22543 details: GreenNodeDetails::Node {
22544 children: [].into(),
22545 width: TextWidth::default(),
22546 },
22547 }
22548 .intern(db),
22549 )
22550 }
22551 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22552 Self(ElementList::new(node))
22553 }
22554 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22555 if node.kind(db) == SyntaxKind::MacroRulesList {
22556 Some(Self(ElementList::new(node)))
22557 } else {
22558 None
22559 }
22560 }
22561 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22562 self.node
22563 }
22564 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22565 MacroRulesListPtr(self.node.stable_ptr(db))
22566 }
22567}
22568#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22569pub struct MacroRule<'db> {
22570 node: SyntaxNode<'db>,
22571}
22572impl<'db> MacroRule<'db> {
22573 pub const INDEX_LHS: usize = 0;
22574 pub const INDEX_FAT_ARROW: usize = 1;
22575 pub const INDEX_RHS: usize = 2;
22576 pub const INDEX_SEMICOLON: usize = 3;
22577 pub fn new_green(
22578 db: &'db dyn Database,
22579 lhs: WrappedMacroGreen<'db>,
22580 fat_arrow: TerminalMatchArrowGreen<'db>,
22581 rhs: BracedMacroGreen<'db>,
22582 semicolon: TerminalSemicolonGreen<'db>,
22583 ) -> MacroRuleGreen<'db> {
22584 let children = [lhs.0, fat_arrow.0, rhs.0, semicolon.0];
22585 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22586 MacroRuleGreen(
22587 GreenNode {
22588 kind: SyntaxKind::MacroRule,
22589 details: GreenNodeDetails::Node { children: children.into(), width },
22590 }
22591 .intern(db),
22592 )
22593 }
22594}
22595impl<'db> MacroRule<'db> {
22596 pub fn lhs(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
22597 WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
22598 }
22599 pub fn fat_arrow(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
22600 TerminalMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
22601 }
22602 pub fn rhs(&self, db: &'db dyn Database) -> BracedMacro<'db> {
22603 BracedMacro::from_syntax_node(db, self.node.get_children(db)[2])
22604 }
22605 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
22606 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[3])
22607 }
22608}
22609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22610pub struct MacroRulePtr<'db>(pub SyntaxStablePtrId<'db>);
22611impl<'db> MacroRulePtr<'db> {}
22612impl<'db> TypedStablePtr<'db> for MacroRulePtr<'db> {
22613 type SyntaxNode = MacroRule<'db>;
22614 fn untyped(self) -> SyntaxStablePtrId<'db> {
22615 self.0
22616 }
22617 fn lookup(&self, db: &'db dyn Database) -> MacroRule<'db> {
22618 MacroRule::from_syntax_node(db, self.0.lookup(db))
22619 }
22620}
22621impl<'db> From<MacroRulePtr<'db>> for SyntaxStablePtrId<'db> {
22622 fn from(ptr: MacroRulePtr<'db>) -> Self {
22623 ptr.untyped()
22624 }
22625}
22626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22627pub struct MacroRuleGreen<'db>(pub GreenId<'db>);
22628impl<'db> TypedSyntaxNode<'db> for MacroRule<'db> {
22629 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRule);
22630 type StablePtr = MacroRulePtr<'db>;
22631 type Green = MacroRuleGreen<'db>;
22632 fn missing(db: &'db dyn Database) -> Self::Green {
22633 MacroRuleGreen(
22634 GreenNode {
22635 kind: SyntaxKind::MacroRule,
22636 details: GreenNodeDetails::Node {
22637 children: [
22638 WrappedMacro::missing(db).0,
22639 TerminalMatchArrow::missing(db).0,
22640 BracedMacro::missing(db).0,
22641 TerminalSemicolon::missing(db).0,
22642 ]
22643 .into(),
22644 width: TextWidth::default(),
22645 },
22646 }
22647 .intern(db),
22648 )
22649 }
22650 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22651 let kind = node.kind(db);
22652 assert_eq!(
22653 kind,
22654 SyntaxKind::MacroRule,
22655 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22656 kind,
22657 SyntaxKind::MacroRule
22658 );
22659 Self { node }
22660 }
22661 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22662 let kind = node.kind(db);
22663 if kind == SyntaxKind::MacroRule { Some(Self::from_syntax_node(db, node)) } else { None }
22664 }
22665 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22666 self.node
22667 }
22668 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22669 MacroRulePtr(self.node.stable_ptr(db))
22670 }
22671}
22672#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22673pub struct ParamKind<'db> {
22674 node: SyntaxNode<'db>,
22675}
22676impl<'db> ParamKind<'db> {
22677 pub const INDEX_COLON: usize = 0;
22678 pub const INDEX_KIND: usize = 1;
22679 pub fn new_green(
22680 db: &'db dyn Database,
22681 colon: TerminalColonGreen<'db>,
22682 kind: MacroParamKindGreen<'db>,
22683 ) -> ParamKindGreen<'db> {
22684 let children = [colon.0, kind.0];
22685 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22686 ParamKindGreen(
22687 GreenNode {
22688 kind: SyntaxKind::ParamKind,
22689 details: GreenNodeDetails::Node { children: children.into(), width },
22690 }
22691 .intern(db),
22692 )
22693 }
22694}
22695impl<'db> ParamKind<'db> {
22696 pub fn colon(&self, db: &'db dyn Database) -> TerminalColon<'db> {
22697 TerminalColon::from_syntax_node(db, self.node.get_children(db)[0])
22698 }
22699 pub fn kind(&self, db: &'db dyn Database) -> MacroParamKind<'db> {
22700 MacroParamKind::from_syntax_node(db, self.node.get_children(db)[1])
22701 }
22702}
22703#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22704pub struct ParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22705impl<'db> ParamKindPtr<'db> {}
22706impl<'db> TypedStablePtr<'db> for ParamKindPtr<'db> {
22707 type SyntaxNode = ParamKind<'db>;
22708 fn untyped(self) -> SyntaxStablePtrId<'db> {
22709 self.0
22710 }
22711 fn lookup(&self, db: &'db dyn Database) -> ParamKind<'db> {
22712 ParamKind::from_syntax_node(db, self.0.lookup(db))
22713 }
22714}
22715impl<'db> From<ParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22716 fn from(ptr: ParamKindPtr<'db>) -> Self {
22717 ptr.untyped()
22718 }
22719}
22720#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22721pub struct ParamKindGreen<'db>(pub GreenId<'db>);
22722impl<'db> TypedSyntaxNode<'db> for ParamKind<'db> {
22723 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamKind);
22724 type StablePtr = ParamKindPtr<'db>;
22725 type Green = ParamKindGreen<'db>;
22726 fn missing(db: &'db dyn Database) -> Self::Green {
22727 ParamKindGreen(
22728 GreenNode {
22729 kind: SyntaxKind::ParamKind,
22730 details: GreenNodeDetails::Node {
22731 children: [TerminalColon::missing(db).0, MacroParamKind::missing(db).0].into(),
22732 width: TextWidth::default(),
22733 },
22734 }
22735 .intern(db),
22736 )
22737 }
22738 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22739 let kind = node.kind(db);
22740 assert_eq!(
22741 kind,
22742 SyntaxKind::ParamKind,
22743 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22744 kind,
22745 SyntaxKind::ParamKind
22746 );
22747 Self { node }
22748 }
22749 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22750 let kind = node.kind(db);
22751 if kind == SyntaxKind::ParamKind { Some(Self::from_syntax_node(db, node)) } else { None }
22752 }
22753 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22754 self.node
22755 }
22756 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22757 ParamKindPtr(self.node.stable_ptr(db))
22758 }
22759}
22760#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22761pub enum OptionParamKind<'db> {
22762 Empty(OptionParamKindEmpty<'db>),
22763 ParamKind(ParamKind<'db>),
22764}
22765#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22766pub struct OptionParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
22767impl<'db> TypedStablePtr<'db> for OptionParamKindPtr<'db> {
22768 type SyntaxNode = OptionParamKind<'db>;
22769 fn untyped(self) -> SyntaxStablePtrId<'db> {
22770 self.0
22771 }
22772 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
22773 OptionParamKind::from_syntax_node(db, self.0.lookup(db))
22774 }
22775}
22776impl<'db> From<OptionParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
22777 fn from(ptr: OptionParamKindPtr<'db>) -> Self {
22778 ptr.untyped()
22779 }
22780}
22781impl<'db> From<OptionParamKindEmptyPtr<'db>> for OptionParamKindPtr<'db> {
22782 fn from(value: OptionParamKindEmptyPtr<'db>) -> Self {
22783 Self(value.0)
22784 }
22785}
22786impl<'db> From<ParamKindPtr<'db>> for OptionParamKindPtr<'db> {
22787 fn from(value: ParamKindPtr<'db>) -> Self {
22788 Self(value.0)
22789 }
22790}
22791impl<'db> From<OptionParamKindEmptyGreen<'db>> for OptionParamKindGreen<'db> {
22792 fn from(value: OptionParamKindEmptyGreen<'db>) -> Self {
22793 Self(value.0)
22794 }
22795}
22796impl<'db> From<ParamKindGreen<'db>> for OptionParamKindGreen<'db> {
22797 fn from(value: ParamKindGreen<'db>) -> Self {
22798 Self(value.0)
22799 }
22800}
22801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22802pub struct OptionParamKindGreen<'db>(pub GreenId<'db>);
22803impl<'db> TypedSyntaxNode<'db> for OptionParamKind<'db> {
22804 const OPTIONAL_KIND: Option<SyntaxKind> = None;
22805 type StablePtr = OptionParamKindPtr<'db>;
22806 type Green = OptionParamKindGreen<'db>;
22807 fn missing(db: &'db dyn Database) -> Self::Green {
22808 panic!("No missing variant.");
22809 }
22810 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22811 let kind = node.kind(db);
22812 match kind {
22813 SyntaxKind::OptionParamKindEmpty => {
22814 OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node))
22815 }
22816 SyntaxKind::ParamKind => {
22817 OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node))
22818 }
22819 _ => {
22820 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "OptionParamKind")
22821 }
22822 }
22823 }
22824 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22825 let kind = node.kind(db);
22826 match kind {
22827 SyntaxKind::OptionParamKindEmpty => {
22828 Some(OptionParamKind::Empty(OptionParamKindEmpty::from_syntax_node(db, node)))
22829 }
22830 SyntaxKind::ParamKind => {
22831 Some(OptionParamKind::ParamKind(ParamKind::from_syntax_node(db, node)))
22832 }
22833 _ => None,
22834 }
22835 }
22836 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22837 match self {
22838 OptionParamKind::Empty(x) => x.as_syntax_node(),
22839 OptionParamKind::ParamKind(x) => x.as_syntax_node(),
22840 }
22841 }
22842 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22843 OptionParamKindPtr(self.as_syntax_node().stable_ptr(db))
22844 }
22845}
22846impl<'db> OptionParamKind<'db> {
22847 pub fn is_variant(kind: SyntaxKind) -> bool {
22849 matches!(kind, SyntaxKind::OptionParamKindEmpty | SyntaxKind::ParamKind)
22850 }
22851}
22852#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22853pub struct OptionParamKindEmpty<'db> {
22854 node: SyntaxNode<'db>,
22855}
22856impl<'db> OptionParamKindEmpty<'db> {
22857 pub fn new_green(db: &'db dyn Database) -> OptionParamKindEmptyGreen<'db> {
22858 let children = [];
22859 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22860 OptionParamKindEmptyGreen(
22861 GreenNode {
22862 kind: SyntaxKind::OptionParamKindEmpty,
22863 details: GreenNodeDetails::Node { children: children.into(), width },
22864 }
22865 .intern(db),
22866 )
22867 }
22868}
22869impl<'db> OptionParamKindEmpty<'db> {}
22870#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22871pub struct OptionParamKindEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
22872impl<'db> OptionParamKindEmptyPtr<'db> {}
22873impl<'db> TypedStablePtr<'db> for OptionParamKindEmptyPtr<'db> {
22874 type SyntaxNode = OptionParamKindEmpty<'db>;
22875 fn untyped(self) -> SyntaxStablePtrId<'db> {
22876 self.0
22877 }
22878 fn lookup(&self, db: &'db dyn Database) -> OptionParamKindEmpty<'db> {
22879 OptionParamKindEmpty::from_syntax_node(db, self.0.lookup(db))
22880 }
22881}
22882impl<'db> From<OptionParamKindEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
22883 fn from(ptr: OptionParamKindEmptyPtr<'db>) -> Self {
22884 ptr.untyped()
22885 }
22886}
22887#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22888pub struct OptionParamKindEmptyGreen<'db>(pub GreenId<'db>);
22889impl<'db> TypedSyntaxNode<'db> for OptionParamKindEmpty<'db> {
22890 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionParamKindEmpty);
22891 type StablePtr = OptionParamKindEmptyPtr<'db>;
22892 type Green = OptionParamKindEmptyGreen<'db>;
22893 fn missing(db: &'db dyn Database) -> Self::Green {
22894 OptionParamKindEmptyGreen(
22895 GreenNode {
22896 kind: SyntaxKind::OptionParamKindEmpty,
22897 details: GreenNodeDetails::Node {
22898 children: [].into(),
22899 width: TextWidth::default(),
22900 },
22901 }
22902 .intern(db),
22903 )
22904 }
22905 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
22906 let kind = node.kind(db);
22907 assert_eq!(
22908 kind,
22909 SyntaxKind::OptionParamKindEmpty,
22910 "Unexpected SyntaxKind {:?}. Expected {:?}.",
22911 kind,
22912 SyntaxKind::OptionParamKindEmpty
22913 );
22914 Self { node }
22915 }
22916 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
22917 let kind = node.kind(db);
22918 if kind == SyntaxKind::OptionParamKindEmpty {
22919 Some(Self::from_syntax_node(db, node))
22920 } else {
22921 None
22922 }
22923 }
22924 fn as_syntax_node(&self) -> SyntaxNode<'db> {
22925 self.node
22926 }
22927 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
22928 OptionParamKindEmptyPtr(self.node.stable_ptr(db))
22929 }
22930}
22931#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
22932pub struct MacroParam<'db> {
22933 node: SyntaxNode<'db>,
22934}
22935impl<'db> MacroParam<'db> {
22936 pub const INDEX_DOLLAR: usize = 0;
22937 pub const INDEX_NAME: usize = 1;
22938 pub const INDEX_KIND: usize = 2;
22939 pub fn new_green(
22940 db: &'db dyn Database,
22941 dollar: TerminalDollarGreen<'db>,
22942 name: TerminalIdentifierGreen<'db>,
22943 kind: OptionParamKindGreen<'db>,
22944 ) -> MacroParamGreen<'db> {
22945 let children = [dollar.0, name.0, kind.0];
22946 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
22947 MacroParamGreen(
22948 GreenNode {
22949 kind: SyntaxKind::MacroParam,
22950 details: GreenNodeDetails::Node { children: children.into(), width },
22951 }
22952 .intern(db),
22953 )
22954 }
22955}
22956impl<'db> MacroParam<'db> {
22957 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
22958 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
22959 }
22960 pub fn name(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
22961 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
22962 }
22963 pub fn kind(&self, db: &'db dyn Database) -> OptionParamKind<'db> {
22964 OptionParamKind::from_syntax_node(db, self.node.get_children(db)[2])
22965 }
22966}
22967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22968pub struct MacroParamPtr<'db>(pub SyntaxStablePtrId<'db>);
22969impl<'db> MacroParamPtr<'db> {}
22970impl<'db> TypedStablePtr<'db> for MacroParamPtr<'db> {
22971 type SyntaxNode = MacroParam<'db>;
22972 fn untyped(self) -> SyntaxStablePtrId<'db> {
22973 self.0
22974 }
22975 fn lookup(&self, db: &'db dyn Database) -> MacroParam<'db> {
22976 MacroParam::from_syntax_node(db, self.0.lookup(db))
22977 }
22978}
22979impl<'db> From<MacroParamPtr<'db>> for SyntaxStablePtrId<'db> {
22980 fn from(ptr: MacroParamPtr<'db>) -> Self {
22981 ptr.untyped()
22982 }
22983}
22984#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
22985pub struct MacroParamGreen<'db>(pub GreenId<'db>);
22986impl<'db> TypedSyntaxNode<'db> for MacroParam<'db> {
22987 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParam);
22988 type StablePtr = MacroParamPtr<'db>;
22989 type Green = MacroParamGreen<'db>;
22990 fn missing(db: &'db dyn Database) -> Self::Green {
22991 MacroParamGreen(
22992 GreenNode {
22993 kind: SyntaxKind::MacroParam,
22994 details: GreenNodeDetails::Node {
22995 children: [
22996 TerminalDollar::missing(db).0,
22997 TerminalIdentifier::missing(db).0,
22998 OptionParamKind::missing(db).0,
22999 ]
23000 .into(),
23001 width: TextWidth::default(),
23002 },
23003 }
23004 .intern(db),
23005 )
23006 }
23007 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23008 let kind = node.kind(db);
23009 assert_eq!(
23010 kind,
23011 SyntaxKind::MacroParam,
23012 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23013 kind,
23014 SyntaxKind::MacroParam
23015 );
23016 Self { node }
23017 }
23018 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23019 let kind = node.kind(db);
23020 if kind == SyntaxKind::MacroParam { Some(Self::from_syntax_node(db, node)) } else { None }
23021 }
23022 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23023 self.node
23024 }
23025 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23026 MacroParamPtr(self.node.stable_ptr(db))
23027 }
23028}
23029#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23030pub struct MacroRepetition<'db> {
23031 node: SyntaxNode<'db>,
23032}
23033impl<'db> MacroRepetition<'db> {
23034 pub const INDEX_DOLLAR: usize = 0;
23035 pub const INDEX_LPAREN: usize = 1;
23036 pub const INDEX_ELEMENTS: usize = 2;
23037 pub const INDEX_RPAREN: usize = 3;
23038 pub const INDEX_SEPARATOR: usize = 4;
23039 pub const INDEX_OPERATOR: usize = 5;
23040 pub fn new_green(
23041 db: &'db dyn Database,
23042 dollar: TerminalDollarGreen<'db>,
23043 lparen: TerminalLParenGreen<'db>,
23044 elements: MacroElementsGreen<'db>,
23045 rparen: TerminalRParenGreen<'db>,
23046 separator: OptionTerminalCommaGreen<'db>,
23047 operator: MacroRepetitionOperatorGreen<'db>,
23048 ) -> MacroRepetitionGreen<'db> {
23049 let children = [dollar.0, lparen.0, elements.0, rparen.0, separator.0, operator.0];
23050 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23051 MacroRepetitionGreen(
23052 GreenNode {
23053 kind: SyntaxKind::MacroRepetition,
23054 details: GreenNodeDetails::Node { children: children.into(), width },
23055 }
23056 .intern(db),
23057 )
23058 }
23059}
23060impl<'db> MacroRepetition<'db> {
23061 pub fn dollar(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
23062 TerminalDollar::from_syntax_node(db, self.node.get_children(db)[0])
23063 }
23064 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
23065 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[1])
23066 }
23067 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
23068 MacroElements::from_syntax_node(db, self.node.get_children(db)[2])
23069 }
23070 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
23071 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[3])
23072 }
23073 pub fn separator(&self, db: &'db dyn Database) -> OptionTerminalComma<'db> {
23074 OptionTerminalComma::from_syntax_node(db, self.node.get_children(db)[4])
23075 }
23076 pub fn operator(&self, db: &'db dyn Database) -> MacroRepetitionOperator<'db> {
23077 MacroRepetitionOperator::from_syntax_node(db, self.node.get_children(db)[5])
23078 }
23079}
23080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23081pub struct MacroRepetitionPtr<'db>(pub SyntaxStablePtrId<'db>);
23082impl<'db> MacroRepetitionPtr<'db> {}
23083impl<'db> TypedStablePtr<'db> for MacroRepetitionPtr<'db> {
23084 type SyntaxNode = MacroRepetition<'db>;
23085 fn untyped(self) -> SyntaxStablePtrId<'db> {
23086 self.0
23087 }
23088 fn lookup(&self, db: &'db dyn Database) -> MacroRepetition<'db> {
23089 MacroRepetition::from_syntax_node(db, self.0.lookup(db))
23090 }
23091}
23092impl<'db> From<MacroRepetitionPtr<'db>> for SyntaxStablePtrId<'db> {
23093 fn from(ptr: MacroRepetitionPtr<'db>) -> Self {
23094 ptr.untyped()
23095 }
23096}
23097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23098pub struct MacroRepetitionGreen<'db>(pub GreenId<'db>);
23099impl<'db> TypedSyntaxNode<'db> for MacroRepetition<'db> {
23100 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetition);
23101 type StablePtr = MacroRepetitionPtr<'db>;
23102 type Green = MacroRepetitionGreen<'db>;
23103 fn missing(db: &'db dyn Database) -> Self::Green {
23104 MacroRepetitionGreen(
23105 GreenNode {
23106 kind: SyntaxKind::MacroRepetition,
23107 details: GreenNodeDetails::Node {
23108 children: [
23109 TerminalDollar::missing(db).0,
23110 TerminalLParen::missing(db).0,
23111 MacroElements::missing(db).0,
23112 TerminalRParen::missing(db).0,
23113 OptionTerminalComma::missing(db).0,
23114 MacroRepetitionOperator::missing(db).0,
23115 ]
23116 .into(),
23117 width: TextWidth::default(),
23118 },
23119 }
23120 .intern(db),
23121 )
23122 }
23123 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23124 let kind = node.kind(db);
23125 assert_eq!(
23126 kind,
23127 SyntaxKind::MacroRepetition,
23128 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23129 kind,
23130 SyntaxKind::MacroRepetition
23131 );
23132 Self { node }
23133 }
23134 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23135 let kind = node.kind(db);
23136 if kind == SyntaxKind::MacroRepetition {
23137 Some(Self::from_syntax_node(db, node))
23138 } else {
23139 None
23140 }
23141 }
23142 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23143 self.node
23144 }
23145 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23146 MacroRepetitionPtr(self.node.stable_ptr(db))
23147 }
23148}
23149#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23150pub enum OptionTerminalComma<'db> {
23151 Empty(OptionTerminalCommaEmpty<'db>),
23152 TerminalComma(TerminalComma<'db>),
23153}
23154#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23155pub struct OptionTerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
23156impl<'db> TypedStablePtr<'db> for OptionTerminalCommaPtr<'db> {
23157 type SyntaxNode = OptionTerminalComma<'db>;
23158 fn untyped(self) -> SyntaxStablePtrId<'db> {
23159 self.0
23160 }
23161 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23162 OptionTerminalComma::from_syntax_node(db, self.0.lookup(db))
23163 }
23164}
23165impl<'db> From<OptionTerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
23166 fn from(ptr: OptionTerminalCommaPtr<'db>) -> Self {
23167 ptr.untyped()
23168 }
23169}
23170impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for OptionTerminalCommaPtr<'db> {
23171 fn from(value: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23172 Self(value.0)
23173 }
23174}
23175impl<'db> From<TerminalCommaPtr<'db>> for OptionTerminalCommaPtr<'db> {
23176 fn from(value: TerminalCommaPtr<'db>) -> Self {
23177 Self(value.0)
23178 }
23179}
23180impl<'db> From<OptionTerminalCommaEmptyGreen<'db>> for OptionTerminalCommaGreen<'db> {
23181 fn from(value: OptionTerminalCommaEmptyGreen<'db>) -> Self {
23182 Self(value.0)
23183 }
23184}
23185impl<'db> From<TerminalCommaGreen<'db>> for OptionTerminalCommaGreen<'db> {
23186 fn from(value: TerminalCommaGreen<'db>) -> Self {
23187 Self(value.0)
23188 }
23189}
23190#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23191pub struct OptionTerminalCommaGreen<'db>(pub GreenId<'db>);
23192impl<'db> TypedSyntaxNode<'db> for OptionTerminalComma<'db> {
23193 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23194 type StablePtr = OptionTerminalCommaPtr<'db>;
23195 type Green = OptionTerminalCommaGreen<'db>;
23196 fn missing(db: &'db dyn Database) -> Self::Green {
23197 panic!("No missing variant.");
23198 }
23199 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23200 let kind = node.kind(db);
23201 match kind {
23202 SyntaxKind::OptionTerminalCommaEmpty => {
23203 OptionTerminalComma::Empty(OptionTerminalCommaEmpty::from_syntax_node(db, node))
23204 }
23205 SyntaxKind::TerminalComma => {
23206 OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node))
23207 }
23208 _ => panic!(
23209 "Unexpected syntax kind {:?} when constructing {}.",
23210 kind, "OptionTerminalComma"
23211 ),
23212 }
23213 }
23214 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23215 let kind = node.kind(db);
23216 match kind {
23217 SyntaxKind::OptionTerminalCommaEmpty => Some(OptionTerminalComma::Empty(
23218 OptionTerminalCommaEmpty::from_syntax_node(db, node),
23219 )),
23220 SyntaxKind::TerminalComma => {
23221 Some(OptionTerminalComma::TerminalComma(TerminalComma::from_syntax_node(db, node)))
23222 }
23223 _ => None,
23224 }
23225 }
23226 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23227 match self {
23228 OptionTerminalComma::Empty(x) => x.as_syntax_node(),
23229 OptionTerminalComma::TerminalComma(x) => x.as_syntax_node(),
23230 }
23231 }
23232 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23233 OptionTerminalCommaPtr(self.as_syntax_node().stable_ptr(db))
23234 }
23235}
23236impl<'db> OptionTerminalComma<'db> {
23237 pub fn is_variant(kind: SyntaxKind) -> bool {
23239 matches!(kind, SyntaxKind::OptionTerminalCommaEmpty | SyntaxKind::TerminalComma)
23240 }
23241}
23242#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23243pub struct OptionTerminalCommaEmpty<'db> {
23244 node: SyntaxNode<'db>,
23245}
23246impl<'db> OptionTerminalCommaEmpty<'db> {
23247 pub fn new_green(db: &'db dyn Database) -> OptionTerminalCommaEmptyGreen<'db> {
23248 let children = [];
23249 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23250 OptionTerminalCommaEmptyGreen(
23251 GreenNode {
23252 kind: SyntaxKind::OptionTerminalCommaEmpty,
23253 details: GreenNodeDetails::Node { children: children.into(), width },
23254 }
23255 .intern(db),
23256 )
23257 }
23258}
23259impl<'db> OptionTerminalCommaEmpty<'db> {}
23260#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23261pub struct OptionTerminalCommaEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
23262impl<'db> OptionTerminalCommaEmptyPtr<'db> {}
23263impl<'db> TypedStablePtr<'db> for OptionTerminalCommaEmptyPtr<'db> {
23264 type SyntaxNode = OptionTerminalCommaEmpty<'db>;
23265 fn untyped(self) -> SyntaxStablePtrId<'db> {
23266 self.0
23267 }
23268 fn lookup(&self, db: &'db dyn Database) -> OptionTerminalCommaEmpty<'db> {
23269 OptionTerminalCommaEmpty::from_syntax_node(db, self.0.lookup(db))
23270 }
23271}
23272impl<'db> From<OptionTerminalCommaEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
23273 fn from(ptr: OptionTerminalCommaEmptyPtr<'db>) -> Self {
23274 ptr.untyped()
23275 }
23276}
23277#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23278pub struct OptionTerminalCommaEmptyGreen<'db>(pub GreenId<'db>);
23279impl<'db> TypedSyntaxNode<'db> for OptionTerminalCommaEmpty<'db> {
23280 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::OptionTerminalCommaEmpty);
23281 type StablePtr = OptionTerminalCommaEmptyPtr<'db>;
23282 type Green = OptionTerminalCommaEmptyGreen<'db>;
23283 fn missing(db: &'db dyn Database) -> Self::Green {
23284 OptionTerminalCommaEmptyGreen(
23285 GreenNode {
23286 kind: SyntaxKind::OptionTerminalCommaEmpty,
23287 details: GreenNodeDetails::Node {
23288 children: [].into(),
23289 width: TextWidth::default(),
23290 },
23291 }
23292 .intern(db),
23293 )
23294 }
23295 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23296 let kind = node.kind(db);
23297 assert_eq!(
23298 kind,
23299 SyntaxKind::OptionTerminalCommaEmpty,
23300 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23301 kind,
23302 SyntaxKind::OptionTerminalCommaEmpty
23303 );
23304 Self { node }
23305 }
23306 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23307 let kind = node.kind(db);
23308 if kind == SyntaxKind::OptionTerminalCommaEmpty {
23309 Some(Self::from_syntax_node(db, node))
23310 } else {
23311 None
23312 }
23313 }
23314 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23315 self.node
23316 }
23317 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23318 OptionTerminalCommaEmptyPtr(self.node.stable_ptr(db))
23319 }
23320}
23321#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23322pub enum MacroRepetitionOperator<'db> {
23323 ZeroOrOne(TerminalQuestionMark<'db>),
23324 OneOrMore(TerminalPlus<'db>),
23325 ZeroOrMore(TerminalMul<'db>),
23326 Missing(MacroRepetitionOperatorMissing<'db>),
23327}
23328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23329pub struct MacroRepetitionOperatorPtr<'db>(pub SyntaxStablePtrId<'db>);
23330impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorPtr<'db> {
23331 type SyntaxNode = MacroRepetitionOperator<'db>;
23332 fn untyped(self) -> SyntaxStablePtrId<'db> {
23333 self.0
23334 }
23335 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23336 MacroRepetitionOperator::from_syntax_node(db, self.0.lookup(db))
23337 }
23338}
23339impl<'db> From<MacroRepetitionOperatorPtr<'db>> for SyntaxStablePtrId<'db> {
23340 fn from(ptr: MacroRepetitionOperatorPtr<'db>) -> Self {
23341 ptr.untyped()
23342 }
23343}
23344impl<'db> From<TerminalQuestionMarkPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23345 fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
23346 Self(value.0)
23347 }
23348}
23349impl<'db> From<TerminalPlusPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23350 fn from(value: TerminalPlusPtr<'db>) -> Self {
23351 Self(value.0)
23352 }
23353}
23354impl<'db> From<TerminalMulPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23355 fn from(value: TerminalMulPtr<'db>) -> Self {
23356 Self(value.0)
23357 }
23358}
23359impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for MacroRepetitionOperatorPtr<'db> {
23360 fn from(value: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23361 Self(value.0)
23362 }
23363}
23364impl<'db> From<TerminalQuestionMarkGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23365 fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
23366 Self(value.0)
23367 }
23368}
23369impl<'db> From<TerminalPlusGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23370 fn from(value: TerminalPlusGreen<'db>) -> Self {
23371 Self(value.0)
23372 }
23373}
23374impl<'db> From<TerminalMulGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23375 fn from(value: TerminalMulGreen<'db>) -> Self {
23376 Self(value.0)
23377 }
23378}
23379impl<'db> From<MacroRepetitionOperatorMissingGreen<'db>> for MacroRepetitionOperatorGreen<'db> {
23380 fn from(value: MacroRepetitionOperatorMissingGreen<'db>) -> Self {
23381 Self(value.0)
23382 }
23383}
23384#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23385pub struct MacroRepetitionOperatorGreen<'db>(pub GreenId<'db>);
23386impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperator<'db> {
23387 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23388 type StablePtr = MacroRepetitionOperatorPtr<'db>;
23389 type Green = MacroRepetitionOperatorGreen<'db>;
23390 fn missing(db: &'db dyn Database) -> Self::Green {
23391 MacroRepetitionOperatorGreen(MacroRepetitionOperatorMissing::missing(db).0)
23392 }
23393 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23394 let kind = node.kind(db);
23395 match kind {
23396 SyntaxKind::TerminalQuestionMark => {
23397 MacroRepetitionOperator::ZeroOrOne(TerminalQuestionMark::from_syntax_node(db, node))
23398 }
23399 SyntaxKind::TerminalPlus => {
23400 MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node))
23401 }
23402 SyntaxKind::TerminalMul => {
23403 MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node))
23404 }
23405 SyntaxKind::MacroRepetitionOperatorMissing => MacroRepetitionOperator::Missing(
23406 MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23407 ),
23408 _ => panic!(
23409 "Unexpected syntax kind {:?} when constructing {}.",
23410 kind, "MacroRepetitionOperator"
23411 ),
23412 }
23413 }
23414 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23415 let kind = node.kind(db);
23416 match kind {
23417 SyntaxKind::TerminalQuestionMark => Some(MacroRepetitionOperator::ZeroOrOne(
23418 TerminalQuestionMark::from_syntax_node(db, node),
23419 )),
23420 SyntaxKind::TerminalPlus => {
23421 Some(MacroRepetitionOperator::OneOrMore(TerminalPlus::from_syntax_node(db, node)))
23422 }
23423 SyntaxKind::TerminalMul => {
23424 Some(MacroRepetitionOperator::ZeroOrMore(TerminalMul::from_syntax_node(db, node)))
23425 }
23426 SyntaxKind::MacroRepetitionOperatorMissing => Some(MacroRepetitionOperator::Missing(
23427 MacroRepetitionOperatorMissing::from_syntax_node(db, node),
23428 )),
23429 _ => None,
23430 }
23431 }
23432 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23433 match self {
23434 MacroRepetitionOperator::ZeroOrOne(x) => x.as_syntax_node(),
23435 MacroRepetitionOperator::OneOrMore(x) => x.as_syntax_node(),
23436 MacroRepetitionOperator::ZeroOrMore(x) => x.as_syntax_node(),
23437 MacroRepetitionOperator::Missing(x) => x.as_syntax_node(),
23438 }
23439 }
23440 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23441 MacroRepetitionOperatorPtr(self.as_syntax_node().stable_ptr(db))
23442 }
23443}
23444impl<'db> MacroRepetitionOperator<'db> {
23445 pub fn is_variant(kind: SyntaxKind) -> bool {
23447 matches!(
23448 kind,
23449 SyntaxKind::TerminalQuestionMark
23450 | SyntaxKind::TerminalPlus
23451 | SyntaxKind::TerminalMul
23452 | SyntaxKind::MacroRepetitionOperatorMissing
23453 )
23454 }
23455}
23456#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23457pub struct MacroRepetitionOperatorMissing<'db> {
23458 node: SyntaxNode<'db>,
23459}
23460impl<'db> MacroRepetitionOperatorMissing<'db> {
23461 pub fn new_green(db: &'db dyn Database) -> MacroRepetitionOperatorMissingGreen<'db> {
23462 let children = [];
23463 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23464 MacroRepetitionOperatorMissingGreen(
23465 GreenNode {
23466 kind: SyntaxKind::MacroRepetitionOperatorMissing,
23467 details: GreenNodeDetails::Node { children: children.into(), width },
23468 }
23469 .intern(db),
23470 )
23471 }
23472}
23473impl<'db> MacroRepetitionOperatorMissing<'db> {}
23474#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23475pub struct MacroRepetitionOperatorMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23476impl<'db> MacroRepetitionOperatorMissingPtr<'db> {}
23477impl<'db> TypedStablePtr<'db> for MacroRepetitionOperatorMissingPtr<'db> {
23478 type SyntaxNode = MacroRepetitionOperatorMissing<'db>;
23479 fn untyped(self) -> SyntaxStablePtrId<'db> {
23480 self.0
23481 }
23482 fn lookup(&self, db: &'db dyn Database) -> MacroRepetitionOperatorMissing<'db> {
23483 MacroRepetitionOperatorMissing::from_syntax_node(db, self.0.lookup(db))
23484 }
23485}
23486impl<'db> From<MacroRepetitionOperatorMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23487 fn from(ptr: MacroRepetitionOperatorMissingPtr<'db>) -> Self {
23488 ptr.untyped()
23489 }
23490}
23491#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23492pub struct MacroRepetitionOperatorMissingGreen<'db>(pub GreenId<'db>);
23493impl<'db> TypedSyntaxNode<'db> for MacroRepetitionOperatorMissing<'db> {
23494 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroRepetitionOperatorMissing);
23495 type StablePtr = MacroRepetitionOperatorMissingPtr<'db>;
23496 type Green = MacroRepetitionOperatorMissingGreen<'db>;
23497 fn missing(db: &'db dyn Database) -> Self::Green {
23498 MacroRepetitionOperatorMissingGreen(
23499 GreenNode {
23500 kind: SyntaxKind::MacroRepetitionOperatorMissing,
23501 details: GreenNodeDetails::Node {
23502 children: [].into(),
23503 width: TextWidth::default(),
23504 },
23505 }
23506 .intern(db),
23507 )
23508 }
23509 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23510 let kind = node.kind(db);
23511 assert_eq!(
23512 kind,
23513 SyntaxKind::MacroRepetitionOperatorMissing,
23514 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23515 kind,
23516 SyntaxKind::MacroRepetitionOperatorMissing
23517 );
23518 Self { node }
23519 }
23520 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23521 let kind = node.kind(db);
23522 if kind == SyntaxKind::MacroRepetitionOperatorMissing {
23523 Some(Self::from_syntax_node(db, node))
23524 } else {
23525 None
23526 }
23527 }
23528 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23529 self.node
23530 }
23531 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23532 MacroRepetitionOperatorMissingPtr(self.node.stable_ptr(db))
23533 }
23534}
23535#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23536pub struct ParamIdent<'db> {
23537 node: SyntaxNode<'db>,
23538}
23539impl<'db> ParamIdent<'db> {
23540 pub const INDEX_IDENT: usize = 0;
23541 pub fn new_green(
23542 db: &'db dyn Database,
23543 ident: TerminalIdentifierGreen<'db>,
23544 ) -> ParamIdentGreen<'db> {
23545 let children = [ident.0];
23546 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23547 ParamIdentGreen(
23548 GreenNode {
23549 kind: SyntaxKind::ParamIdent,
23550 details: GreenNodeDetails::Node { children: children.into(), width },
23551 }
23552 .intern(db),
23553 )
23554 }
23555}
23556impl<'db> ParamIdent<'db> {
23557 pub fn ident(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23558 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23559 }
23560}
23561#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23562pub struct ParamIdentPtr<'db>(pub SyntaxStablePtrId<'db>);
23563impl<'db> ParamIdentPtr<'db> {}
23564impl<'db> TypedStablePtr<'db> for ParamIdentPtr<'db> {
23565 type SyntaxNode = ParamIdent<'db>;
23566 fn untyped(self) -> SyntaxStablePtrId<'db> {
23567 self.0
23568 }
23569 fn lookup(&self, db: &'db dyn Database) -> ParamIdent<'db> {
23570 ParamIdent::from_syntax_node(db, self.0.lookup(db))
23571 }
23572}
23573impl<'db> From<ParamIdentPtr<'db>> for SyntaxStablePtrId<'db> {
23574 fn from(ptr: ParamIdentPtr<'db>) -> Self {
23575 ptr.untyped()
23576 }
23577}
23578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23579pub struct ParamIdentGreen<'db>(pub GreenId<'db>);
23580impl<'db> TypedSyntaxNode<'db> for ParamIdent<'db> {
23581 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamIdent);
23582 type StablePtr = ParamIdentPtr<'db>;
23583 type Green = ParamIdentGreen<'db>;
23584 fn missing(db: &'db dyn Database) -> Self::Green {
23585 ParamIdentGreen(
23586 GreenNode {
23587 kind: SyntaxKind::ParamIdent,
23588 details: GreenNodeDetails::Node {
23589 children: [TerminalIdentifier::missing(db).0].into(),
23590 width: TextWidth::default(),
23591 },
23592 }
23593 .intern(db),
23594 )
23595 }
23596 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23597 let kind = node.kind(db);
23598 assert_eq!(
23599 kind,
23600 SyntaxKind::ParamIdent,
23601 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23602 kind,
23603 SyntaxKind::ParamIdent
23604 );
23605 Self { node }
23606 }
23607 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23608 let kind = node.kind(db);
23609 if kind == SyntaxKind::ParamIdent { Some(Self::from_syntax_node(db, node)) } else { None }
23610 }
23611 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23612 self.node
23613 }
23614 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23615 ParamIdentPtr(self.node.stable_ptr(db))
23616 }
23617}
23618#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23619pub struct ParamExpr<'db> {
23620 node: SyntaxNode<'db>,
23621}
23622impl<'db> ParamExpr<'db> {
23623 pub const INDEX_EXPR: usize = 0;
23624 pub fn new_green(
23625 db: &'db dyn Database,
23626 expr: TerminalIdentifierGreen<'db>,
23627 ) -> ParamExprGreen<'db> {
23628 let children = [expr.0];
23629 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23630 ParamExprGreen(
23631 GreenNode {
23632 kind: SyntaxKind::ParamExpr,
23633 details: GreenNodeDetails::Node { children: children.into(), width },
23634 }
23635 .intern(db),
23636 )
23637 }
23638}
23639impl<'db> ParamExpr<'db> {
23640 pub fn expr(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
23641 TerminalIdentifier::from_syntax_node(db, self.node.get_children(db)[0])
23642 }
23643}
23644#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23645pub struct ParamExprPtr<'db>(pub SyntaxStablePtrId<'db>);
23646impl<'db> ParamExprPtr<'db> {}
23647impl<'db> TypedStablePtr<'db> for ParamExprPtr<'db> {
23648 type SyntaxNode = ParamExpr<'db>;
23649 fn untyped(self) -> SyntaxStablePtrId<'db> {
23650 self.0
23651 }
23652 fn lookup(&self, db: &'db dyn Database) -> ParamExpr<'db> {
23653 ParamExpr::from_syntax_node(db, self.0.lookup(db))
23654 }
23655}
23656impl<'db> From<ParamExprPtr<'db>> for SyntaxStablePtrId<'db> {
23657 fn from(ptr: ParamExprPtr<'db>) -> Self {
23658 ptr.untyped()
23659 }
23660}
23661#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23662pub struct ParamExprGreen<'db>(pub GreenId<'db>);
23663impl<'db> TypedSyntaxNode<'db> for ParamExpr<'db> {
23664 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParamExpr);
23665 type StablePtr = ParamExprPtr<'db>;
23666 type Green = ParamExprGreen<'db>;
23667 fn missing(db: &'db dyn Database) -> Self::Green {
23668 ParamExprGreen(
23669 GreenNode {
23670 kind: SyntaxKind::ParamExpr,
23671 details: GreenNodeDetails::Node {
23672 children: [TerminalIdentifier::missing(db).0].into(),
23673 width: TextWidth::default(),
23674 },
23675 }
23676 .intern(db),
23677 )
23678 }
23679 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23680 let kind = node.kind(db);
23681 assert_eq!(
23682 kind,
23683 SyntaxKind::ParamExpr,
23684 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23685 kind,
23686 SyntaxKind::ParamExpr
23687 );
23688 Self { node }
23689 }
23690 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23691 let kind = node.kind(db);
23692 if kind == SyntaxKind::ParamExpr { Some(Self::from_syntax_node(db, node)) } else { None }
23693 }
23694 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23695 self.node
23696 }
23697 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23698 ParamExprPtr(self.node.stable_ptr(db))
23699 }
23700}
23701#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23702pub enum MacroParamKind<'db> {
23703 Identifier(ParamIdent<'db>),
23704 Expr(ParamExpr<'db>),
23705 Missing(MacroParamKindMissing<'db>),
23706}
23707#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23708pub struct MacroParamKindPtr<'db>(pub SyntaxStablePtrId<'db>);
23709impl<'db> TypedStablePtr<'db> for MacroParamKindPtr<'db> {
23710 type SyntaxNode = MacroParamKind<'db>;
23711 fn untyped(self) -> SyntaxStablePtrId<'db> {
23712 self.0
23713 }
23714 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23715 MacroParamKind::from_syntax_node(db, self.0.lookup(db))
23716 }
23717}
23718impl<'db> From<MacroParamKindPtr<'db>> for SyntaxStablePtrId<'db> {
23719 fn from(ptr: MacroParamKindPtr<'db>) -> Self {
23720 ptr.untyped()
23721 }
23722}
23723impl<'db> From<ParamIdentPtr<'db>> for MacroParamKindPtr<'db> {
23724 fn from(value: ParamIdentPtr<'db>) -> Self {
23725 Self(value.0)
23726 }
23727}
23728impl<'db> From<ParamExprPtr<'db>> for MacroParamKindPtr<'db> {
23729 fn from(value: ParamExprPtr<'db>) -> Self {
23730 Self(value.0)
23731 }
23732}
23733impl<'db> From<MacroParamKindMissingPtr<'db>> for MacroParamKindPtr<'db> {
23734 fn from(value: MacroParamKindMissingPtr<'db>) -> Self {
23735 Self(value.0)
23736 }
23737}
23738impl<'db> From<ParamIdentGreen<'db>> for MacroParamKindGreen<'db> {
23739 fn from(value: ParamIdentGreen<'db>) -> Self {
23740 Self(value.0)
23741 }
23742}
23743impl<'db> From<ParamExprGreen<'db>> for MacroParamKindGreen<'db> {
23744 fn from(value: ParamExprGreen<'db>) -> Self {
23745 Self(value.0)
23746 }
23747}
23748impl<'db> From<MacroParamKindMissingGreen<'db>> for MacroParamKindGreen<'db> {
23749 fn from(value: MacroParamKindMissingGreen<'db>) -> Self {
23750 Self(value.0)
23751 }
23752}
23753#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23754pub struct MacroParamKindGreen<'db>(pub GreenId<'db>);
23755impl<'db> TypedSyntaxNode<'db> for MacroParamKind<'db> {
23756 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23757 type StablePtr = MacroParamKindPtr<'db>;
23758 type Green = MacroParamKindGreen<'db>;
23759 fn missing(db: &'db dyn Database) -> Self::Green {
23760 MacroParamKindGreen(MacroParamKindMissing::missing(db).0)
23761 }
23762 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23763 let kind = node.kind(db);
23764 match kind {
23765 SyntaxKind::ParamIdent => {
23766 MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node))
23767 }
23768 SyntaxKind::ParamExpr => MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)),
23769 SyntaxKind::MacroParamKindMissing => {
23770 MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node))
23771 }
23772 _ => {
23773 panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroParamKind")
23774 }
23775 }
23776 }
23777 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23778 let kind = node.kind(db);
23779 match kind {
23780 SyntaxKind::ParamIdent => {
23781 Some(MacroParamKind::Identifier(ParamIdent::from_syntax_node(db, node)))
23782 }
23783 SyntaxKind::ParamExpr => {
23784 Some(MacroParamKind::Expr(ParamExpr::from_syntax_node(db, node)))
23785 }
23786 SyntaxKind::MacroParamKindMissing => {
23787 Some(MacroParamKind::Missing(MacroParamKindMissing::from_syntax_node(db, node)))
23788 }
23789 _ => None,
23790 }
23791 }
23792 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23793 match self {
23794 MacroParamKind::Identifier(x) => x.as_syntax_node(),
23795 MacroParamKind::Expr(x) => x.as_syntax_node(),
23796 MacroParamKind::Missing(x) => x.as_syntax_node(),
23797 }
23798 }
23799 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23800 MacroParamKindPtr(self.as_syntax_node().stable_ptr(db))
23801 }
23802}
23803impl<'db> MacroParamKind<'db> {
23804 pub fn is_variant(kind: SyntaxKind) -> bool {
23806 matches!(
23807 kind,
23808 SyntaxKind::ParamIdent | SyntaxKind::ParamExpr | SyntaxKind::MacroParamKindMissing
23809 )
23810 }
23811}
23812#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23813pub struct MacroParamKindMissing<'db> {
23814 node: SyntaxNode<'db>,
23815}
23816impl<'db> MacroParamKindMissing<'db> {
23817 pub fn new_green(db: &'db dyn Database) -> MacroParamKindMissingGreen<'db> {
23818 let children = [];
23819 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
23820 MacroParamKindMissingGreen(
23821 GreenNode {
23822 kind: SyntaxKind::MacroParamKindMissing,
23823 details: GreenNodeDetails::Node { children: children.into(), width },
23824 }
23825 .intern(db),
23826 )
23827 }
23828}
23829impl<'db> MacroParamKindMissing<'db> {}
23830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23831pub struct MacroParamKindMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
23832impl<'db> MacroParamKindMissingPtr<'db> {}
23833impl<'db> TypedStablePtr<'db> for MacroParamKindMissingPtr<'db> {
23834 type SyntaxNode = MacroParamKindMissing<'db>;
23835 fn untyped(self) -> SyntaxStablePtrId<'db> {
23836 self.0
23837 }
23838 fn lookup(&self, db: &'db dyn Database) -> MacroParamKindMissing<'db> {
23839 MacroParamKindMissing::from_syntax_node(db, self.0.lookup(db))
23840 }
23841}
23842impl<'db> From<MacroParamKindMissingPtr<'db>> for SyntaxStablePtrId<'db> {
23843 fn from(ptr: MacroParamKindMissingPtr<'db>) -> Self {
23844 ptr.untyped()
23845 }
23846}
23847#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23848pub struct MacroParamKindMissingGreen<'db>(pub GreenId<'db>);
23849impl<'db> TypedSyntaxNode<'db> for MacroParamKindMissing<'db> {
23850 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroParamKindMissing);
23851 type StablePtr = MacroParamKindMissingPtr<'db>;
23852 type Green = MacroParamKindMissingGreen<'db>;
23853 fn missing(db: &'db dyn Database) -> Self::Green {
23854 MacroParamKindMissingGreen(
23855 GreenNode {
23856 kind: SyntaxKind::MacroParamKindMissing,
23857 details: GreenNodeDetails::Node {
23858 children: [].into(),
23859 width: TextWidth::default(),
23860 },
23861 }
23862 .intern(db),
23863 )
23864 }
23865 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23866 let kind = node.kind(db);
23867 assert_eq!(
23868 kind,
23869 SyntaxKind::MacroParamKindMissing,
23870 "Unexpected SyntaxKind {:?}. Expected {:?}.",
23871 kind,
23872 SyntaxKind::MacroParamKindMissing
23873 );
23874 Self { node }
23875 }
23876 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23877 let kind = node.kind(db);
23878 if kind == SyntaxKind::MacroParamKindMissing {
23879 Some(Self::from_syntax_node(db, node))
23880 } else {
23881 None
23882 }
23883 }
23884 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23885 self.node
23886 }
23887 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
23888 MacroParamKindMissingPtr(self.node.stable_ptr(db))
23889 }
23890}
23891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
23892pub enum MacroElement<'db> {
23893 Token(TokenTreeLeaf<'db>),
23894 Param(MacroParam<'db>),
23895 Subtree(MacroWrapper<'db>),
23896 Repetition(MacroRepetition<'db>),
23897}
23898#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23899pub struct MacroElementPtr<'db>(pub SyntaxStablePtrId<'db>);
23900impl<'db> TypedStablePtr<'db> for MacroElementPtr<'db> {
23901 type SyntaxNode = MacroElement<'db>;
23902 fn untyped(self) -> SyntaxStablePtrId<'db> {
23903 self.0
23904 }
23905 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
23906 MacroElement::from_syntax_node(db, self.0.lookup(db))
23907 }
23908}
23909impl<'db> From<MacroElementPtr<'db>> for SyntaxStablePtrId<'db> {
23910 fn from(ptr: MacroElementPtr<'db>) -> Self {
23911 ptr.untyped()
23912 }
23913}
23914impl<'db> From<TokenTreeLeafPtr<'db>> for MacroElementPtr<'db> {
23915 fn from(value: TokenTreeLeafPtr<'db>) -> Self {
23916 Self(value.0)
23917 }
23918}
23919impl<'db> From<MacroParamPtr<'db>> for MacroElementPtr<'db> {
23920 fn from(value: MacroParamPtr<'db>) -> Self {
23921 Self(value.0)
23922 }
23923}
23924impl<'db> From<MacroWrapperPtr<'db>> for MacroElementPtr<'db> {
23925 fn from(value: MacroWrapperPtr<'db>) -> Self {
23926 Self(value.0)
23927 }
23928}
23929impl<'db> From<MacroRepetitionPtr<'db>> for MacroElementPtr<'db> {
23930 fn from(value: MacroRepetitionPtr<'db>) -> Self {
23931 Self(value.0)
23932 }
23933}
23934impl<'db> From<TokenTreeLeafGreen<'db>> for MacroElementGreen<'db> {
23935 fn from(value: TokenTreeLeafGreen<'db>) -> Self {
23936 Self(value.0)
23937 }
23938}
23939impl<'db> From<MacroParamGreen<'db>> for MacroElementGreen<'db> {
23940 fn from(value: MacroParamGreen<'db>) -> Self {
23941 Self(value.0)
23942 }
23943}
23944impl<'db> From<MacroWrapperGreen<'db>> for MacroElementGreen<'db> {
23945 fn from(value: MacroWrapperGreen<'db>) -> Self {
23946 Self(value.0)
23947 }
23948}
23949impl<'db> From<MacroRepetitionGreen<'db>> for MacroElementGreen<'db> {
23950 fn from(value: MacroRepetitionGreen<'db>) -> Self {
23951 Self(value.0)
23952 }
23953}
23954#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
23955pub struct MacroElementGreen<'db>(pub GreenId<'db>);
23956impl<'db> TypedSyntaxNode<'db> for MacroElement<'db> {
23957 const OPTIONAL_KIND: Option<SyntaxKind> = None;
23958 type StablePtr = MacroElementPtr<'db>;
23959 type Green = MacroElementGreen<'db>;
23960 fn missing(db: &'db dyn Database) -> Self::Green {
23961 panic!("No missing variant.");
23962 }
23963 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
23964 let kind = node.kind(db);
23965 match kind {
23966 SyntaxKind::TokenTreeLeaf => {
23967 MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node))
23968 }
23969 SyntaxKind::MacroParam => MacroElement::Param(MacroParam::from_syntax_node(db, node)),
23970 SyntaxKind::MacroWrapper => {
23971 MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node))
23972 }
23973 SyntaxKind::MacroRepetition => {
23974 MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node))
23975 }
23976 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "MacroElement"),
23977 }
23978 }
23979 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
23980 let kind = node.kind(db);
23981 match kind {
23982 SyntaxKind::TokenTreeLeaf => {
23983 Some(MacroElement::Token(TokenTreeLeaf::from_syntax_node(db, node)))
23984 }
23985 SyntaxKind::MacroParam => {
23986 Some(MacroElement::Param(MacroParam::from_syntax_node(db, node)))
23987 }
23988 SyntaxKind::MacroWrapper => {
23989 Some(MacroElement::Subtree(MacroWrapper::from_syntax_node(db, node)))
23990 }
23991 SyntaxKind::MacroRepetition => {
23992 Some(MacroElement::Repetition(MacroRepetition::from_syntax_node(db, node)))
23993 }
23994 _ => None,
23995 }
23996 }
23997 fn as_syntax_node(&self) -> SyntaxNode<'db> {
23998 match self {
23999 MacroElement::Token(x) => x.as_syntax_node(),
24000 MacroElement::Param(x) => x.as_syntax_node(),
24001 MacroElement::Subtree(x) => x.as_syntax_node(),
24002 MacroElement::Repetition(x) => x.as_syntax_node(),
24003 }
24004 }
24005 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24006 MacroElementPtr(self.as_syntax_node().stable_ptr(db))
24007 }
24008}
24009impl<'db> MacroElement<'db> {
24010 pub fn is_variant(kind: SyntaxKind) -> bool {
24012 matches!(
24013 kind,
24014 SyntaxKind::TokenTreeLeaf
24015 | SyntaxKind::MacroParam
24016 | SyntaxKind::MacroWrapper
24017 | SyntaxKind::MacroRepetition
24018 )
24019 }
24020}
24021#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24022pub struct MacroElements<'db>(ElementList<'db, MacroElement<'db>, 1>);
24023impl<'db> Deref for MacroElements<'db> {
24024 type Target = ElementList<'db, MacroElement<'db>, 1>;
24025 fn deref(&self) -> &Self::Target {
24026 &self.0
24027 }
24028}
24029impl<'db> MacroElements<'db> {
24030 pub fn new_green(
24031 db: &'db dyn Database,
24032 children: &[MacroElementGreen<'db>],
24033 ) -> MacroElementsGreen<'db> {
24034 let width = children.iter().map(|id| id.0.long(db).width(db)).sum();
24035 MacroElementsGreen(
24036 GreenNode {
24037 kind: SyntaxKind::MacroElements,
24038 details: GreenNodeDetails::Node {
24039 children: children.iter().map(|x| x.0).collect(),
24040 width,
24041 },
24042 }
24043 .intern(db),
24044 )
24045 }
24046}
24047#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24048pub struct MacroElementsPtr<'db>(pub SyntaxStablePtrId<'db>);
24049impl<'db> TypedStablePtr<'db> for MacroElementsPtr<'db> {
24050 type SyntaxNode = MacroElements<'db>;
24051 fn untyped(self) -> SyntaxStablePtrId<'db> {
24052 self.0
24053 }
24054 fn lookup(&self, db: &'db dyn Database) -> MacroElements<'db> {
24055 MacroElements::from_syntax_node(db, self.0.lookup(db))
24056 }
24057}
24058impl<'db> From<MacroElementsPtr<'db>> for SyntaxStablePtrId<'db> {
24059 fn from(ptr: MacroElementsPtr<'db>) -> Self {
24060 ptr.untyped()
24061 }
24062}
24063#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24064pub struct MacroElementsGreen<'db>(pub GreenId<'db>);
24065impl<'db> TypedSyntaxNode<'db> for MacroElements<'db> {
24066 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroElements);
24067 type StablePtr = MacroElementsPtr<'db>;
24068 type Green = MacroElementsGreen<'db>;
24069 fn missing(db: &'db dyn Database) -> Self::Green {
24070 MacroElementsGreen(
24071 GreenNode {
24072 kind: SyntaxKind::MacroElements,
24073 details: GreenNodeDetails::Node {
24074 children: [].into(),
24075 width: TextWidth::default(),
24076 },
24077 }
24078 .intern(db),
24079 )
24080 }
24081 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24082 Self(ElementList::new(node))
24083 }
24084 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24085 if node.kind(db) == SyntaxKind::MacroElements {
24086 Some(Self(ElementList::new(node)))
24087 } else {
24088 None
24089 }
24090 }
24091 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24092 self.node
24093 }
24094 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24095 MacroElementsPtr(self.node.stable_ptr(db))
24096 }
24097}
24098#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24099pub struct MacroWrapper<'db> {
24100 node: SyntaxNode<'db>,
24101}
24102impl<'db> MacroWrapper<'db> {
24103 pub const INDEX_SUBTREE: usize = 0;
24104 pub fn new_green(
24105 db: &'db dyn Database,
24106 subtree: WrappedMacroGreen<'db>,
24107 ) -> MacroWrapperGreen<'db> {
24108 let children = [subtree.0];
24109 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24110 MacroWrapperGreen(
24111 GreenNode {
24112 kind: SyntaxKind::MacroWrapper,
24113 details: GreenNodeDetails::Node { children: children.into(), width },
24114 }
24115 .intern(db),
24116 )
24117 }
24118}
24119impl<'db> MacroWrapper<'db> {
24120 pub fn subtree(&self, db: &'db dyn Database) -> WrappedMacro<'db> {
24121 WrappedMacro::from_syntax_node(db, self.node.get_children(db)[0])
24122 }
24123}
24124#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24125pub struct MacroWrapperPtr<'db>(pub SyntaxStablePtrId<'db>);
24126impl<'db> MacroWrapperPtr<'db> {}
24127impl<'db> TypedStablePtr<'db> for MacroWrapperPtr<'db> {
24128 type SyntaxNode = MacroWrapper<'db>;
24129 fn untyped(self) -> SyntaxStablePtrId<'db> {
24130 self.0
24131 }
24132 fn lookup(&self, db: &'db dyn Database) -> MacroWrapper<'db> {
24133 MacroWrapper::from_syntax_node(db, self.0.lookup(db))
24134 }
24135}
24136impl<'db> From<MacroWrapperPtr<'db>> for SyntaxStablePtrId<'db> {
24137 fn from(ptr: MacroWrapperPtr<'db>) -> Self {
24138 ptr.untyped()
24139 }
24140}
24141#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24142pub struct MacroWrapperGreen<'db>(pub GreenId<'db>);
24143impl<'db> TypedSyntaxNode<'db> for MacroWrapper<'db> {
24144 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::MacroWrapper);
24145 type StablePtr = MacroWrapperPtr<'db>;
24146 type Green = MacroWrapperGreen<'db>;
24147 fn missing(db: &'db dyn Database) -> Self::Green {
24148 MacroWrapperGreen(
24149 GreenNode {
24150 kind: SyntaxKind::MacroWrapper,
24151 details: GreenNodeDetails::Node {
24152 children: [WrappedMacro::missing(db).0].into(),
24153 width: TextWidth::default(),
24154 },
24155 }
24156 .intern(db),
24157 )
24158 }
24159 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24160 let kind = node.kind(db);
24161 assert_eq!(
24162 kind,
24163 SyntaxKind::MacroWrapper,
24164 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24165 kind,
24166 SyntaxKind::MacroWrapper
24167 );
24168 Self { node }
24169 }
24170 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24171 let kind = node.kind(db);
24172 if kind == SyntaxKind::MacroWrapper { Some(Self::from_syntax_node(db, node)) } else { None }
24173 }
24174 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24175 self.node
24176 }
24177 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24178 MacroWrapperPtr(self.node.stable_ptr(db))
24179 }
24180}
24181#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24182pub enum WrappedMacro<'db> {
24183 Parenthesized(ParenthesizedMacro<'db>),
24184 Braced(BracedMacro<'db>),
24185 Bracketed(BracketedMacro<'db>),
24186}
24187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24188pub struct WrappedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24189impl<'db> TypedStablePtr<'db> for WrappedMacroPtr<'db> {
24190 type SyntaxNode = WrappedMacro<'db>;
24191 fn untyped(self) -> SyntaxStablePtrId<'db> {
24192 self.0
24193 }
24194 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24195 WrappedMacro::from_syntax_node(db, self.0.lookup(db))
24196 }
24197}
24198impl<'db> From<WrappedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24199 fn from(ptr: WrappedMacroPtr<'db>) -> Self {
24200 ptr.untyped()
24201 }
24202}
24203impl<'db> From<ParenthesizedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24204 fn from(value: ParenthesizedMacroPtr<'db>) -> Self {
24205 Self(value.0)
24206 }
24207}
24208impl<'db> From<BracedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24209 fn from(value: BracedMacroPtr<'db>) -> Self {
24210 Self(value.0)
24211 }
24212}
24213impl<'db> From<BracketedMacroPtr<'db>> for WrappedMacroPtr<'db> {
24214 fn from(value: BracketedMacroPtr<'db>) -> Self {
24215 Self(value.0)
24216 }
24217}
24218impl<'db> From<ParenthesizedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24219 fn from(value: ParenthesizedMacroGreen<'db>) -> Self {
24220 Self(value.0)
24221 }
24222}
24223impl<'db> From<BracedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24224 fn from(value: BracedMacroGreen<'db>) -> Self {
24225 Self(value.0)
24226 }
24227}
24228impl<'db> From<BracketedMacroGreen<'db>> for WrappedMacroGreen<'db> {
24229 fn from(value: BracketedMacroGreen<'db>) -> Self {
24230 Self(value.0)
24231 }
24232}
24233#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24234pub struct WrappedMacroGreen<'db>(pub GreenId<'db>);
24235impl<'db> TypedSyntaxNode<'db> for WrappedMacro<'db> {
24236 const OPTIONAL_KIND: Option<SyntaxKind> = None;
24237 type StablePtr = WrappedMacroPtr<'db>;
24238 type Green = WrappedMacroGreen<'db>;
24239 fn missing(db: &'db dyn Database) -> Self::Green {
24240 panic!("No missing variant.");
24241 }
24242 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24243 let kind = node.kind(db);
24244 match kind {
24245 SyntaxKind::ParenthesizedMacro => {
24246 WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node))
24247 }
24248 SyntaxKind::BracedMacro => {
24249 WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node))
24250 }
24251 SyntaxKind::BracketedMacro => {
24252 WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node))
24253 }
24254 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "WrappedMacro"),
24255 }
24256 }
24257 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24258 let kind = node.kind(db);
24259 match kind {
24260 SyntaxKind::ParenthesizedMacro => {
24261 Some(WrappedMacro::Parenthesized(ParenthesizedMacro::from_syntax_node(db, node)))
24262 }
24263 SyntaxKind::BracedMacro => {
24264 Some(WrappedMacro::Braced(BracedMacro::from_syntax_node(db, node)))
24265 }
24266 SyntaxKind::BracketedMacro => {
24267 Some(WrappedMacro::Bracketed(BracketedMacro::from_syntax_node(db, node)))
24268 }
24269 _ => None,
24270 }
24271 }
24272 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24273 match self {
24274 WrappedMacro::Parenthesized(x) => x.as_syntax_node(),
24275 WrappedMacro::Braced(x) => x.as_syntax_node(),
24276 WrappedMacro::Bracketed(x) => x.as_syntax_node(),
24277 }
24278 }
24279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24280 WrappedMacroPtr(self.as_syntax_node().stable_ptr(db))
24281 }
24282}
24283impl<'db> WrappedMacro<'db> {
24284 pub fn is_variant(kind: SyntaxKind) -> bool {
24286 matches!(
24287 kind,
24288 SyntaxKind::ParenthesizedMacro | SyntaxKind::BracedMacro | SyntaxKind::BracketedMacro
24289 )
24290 }
24291}
24292#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24293pub struct ParenthesizedMacro<'db> {
24294 node: SyntaxNode<'db>,
24295}
24296impl<'db> ParenthesizedMacro<'db> {
24297 pub const INDEX_LPAREN: usize = 0;
24298 pub const INDEX_ELEMENTS: usize = 1;
24299 pub const INDEX_RPAREN: usize = 2;
24300 pub fn new_green(
24301 db: &'db dyn Database,
24302 lparen: TerminalLParenGreen<'db>,
24303 elements: MacroElementsGreen<'db>,
24304 rparen: TerminalRParenGreen<'db>,
24305 ) -> ParenthesizedMacroGreen<'db> {
24306 let children = [lparen.0, elements.0, rparen.0];
24307 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24308 ParenthesizedMacroGreen(
24309 GreenNode {
24310 kind: SyntaxKind::ParenthesizedMacro,
24311 details: GreenNodeDetails::Node { children: children.into(), width },
24312 }
24313 .intern(db),
24314 )
24315 }
24316}
24317impl<'db> ParenthesizedMacro<'db> {
24318 pub fn lparen(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
24319 TerminalLParen::from_syntax_node(db, self.node.get_children(db)[0])
24320 }
24321 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24322 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24323 }
24324 pub fn rparen(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
24325 TerminalRParen::from_syntax_node(db, self.node.get_children(db)[2])
24326 }
24327}
24328#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24329pub struct ParenthesizedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24330impl<'db> ParenthesizedMacroPtr<'db> {}
24331impl<'db> TypedStablePtr<'db> for ParenthesizedMacroPtr<'db> {
24332 type SyntaxNode = ParenthesizedMacro<'db>;
24333 fn untyped(self) -> SyntaxStablePtrId<'db> {
24334 self.0
24335 }
24336 fn lookup(&self, db: &'db dyn Database) -> ParenthesizedMacro<'db> {
24337 ParenthesizedMacro::from_syntax_node(db, self.0.lookup(db))
24338 }
24339}
24340impl<'db> From<ParenthesizedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24341 fn from(ptr: ParenthesizedMacroPtr<'db>) -> Self {
24342 ptr.untyped()
24343 }
24344}
24345#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24346pub struct ParenthesizedMacroGreen<'db>(pub GreenId<'db>);
24347impl<'db> TypedSyntaxNode<'db> for ParenthesizedMacro<'db> {
24348 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::ParenthesizedMacro);
24349 type StablePtr = ParenthesizedMacroPtr<'db>;
24350 type Green = ParenthesizedMacroGreen<'db>;
24351 fn missing(db: &'db dyn Database) -> Self::Green {
24352 ParenthesizedMacroGreen(
24353 GreenNode {
24354 kind: SyntaxKind::ParenthesizedMacro,
24355 details: GreenNodeDetails::Node {
24356 children: [
24357 TerminalLParen::missing(db).0,
24358 MacroElements::missing(db).0,
24359 TerminalRParen::missing(db).0,
24360 ]
24361 .into(),
24362 width: TextWidth::default(),
24363 },
24364 }
24365 .intern(db),
24366 )
24367 }
24368 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24369 let kind = node.kind(db);
24370 assert_eq!(
24371 kind,
24372 SyntaxKind::ParenthesizedMacro,
24373 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24374 kind,
24375 SyntaxKind::ParenthesizedMacro
24376 );
24377 Self { node }
24378 }
24379 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24380 let kind = node.kind(db);
24381 if kind == SyntaxKind::ParenthesizedMacro {
24382 Some(Self::from_syntax_node(db, node))
24383 } else {
24384 None
24385 }
24386 }
24387 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24388 self.node
24389 }
24390 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24391 ParenthesizedMacroPtr(self.node.stable_ptr(db))
24392 }
24393}
24394#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24395pub struct BracedMacro<'db> {
24396 node: SyntaxNode<'db>,
24397}
24398impl<'db> BracedMacro<'db> {
24399 pub const INDEX_LBRACE: usize = 0;
24400 pub const INDEX_ELEMENTS: usize = 1;
24401 pub const INDEX_RBRACE: usize = 2;
24402 pub fn new_green(
24403 db: &'db dyn Database,
24404 lbrace: TerminalLBraceGreen<'db>,
24405 elements: MacroElementsGreen<'db>,
24406 rbrace: TerminalRBraceGreen<'db>,
24407 ) -> BracedMacroGreen<'db> {
24408 let children = [lbrace.0, elements.0, rbrace.0];
24409 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24410 BracedMacroGreen(
24411 GreenNode {
24412 kind: SyntaxKind::BracedMacro,
24413 details: GreenNodeDetails::Node { children: children.into(), width },
24414 }
24415 .intern(db),
24416 )
24417 }
24418}
24419impl<'db> BracedMacro<'db> {
24420 pub fn lbrace(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
24421 TerminalLBrace::from_syntax_node(db, self.node.get_children(db)[0])
24422 }
24423 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24424 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24425 }
24426 pub fn rbrace(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
24427 TerminalRBrace::from_syntax_node(db, self.node.get_children(db)[2])
24428 }
24429}
24430#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24431pub struct BracedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24432impl<'db> BracedMacroPtr<'db> {}
24433impl<'db> TypedStablePtr<'db> for BracedMacroPtr<'db> {
24434 type SyntaxNode = BracedMacro<'db>;
24435 fn untyped(self) -> SyntaxStablePtrId<'db> {
24436 self.0
24437 }
24438 fn lookup(&self, db: &'db dyn Database) -> BracedMacro<'db> {
24439 BracedMacro::from_syntax_node(db, self.0.lookup(db))
24440 }
24441}
24442impl<'db> From<BracedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24443 fn from(ptr: BracedMacroPtr<'db>) -> Self {
24444 ptr.untyped()
24445 }
24446}
24447#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24448pub struct BracedMacroGreen<'db>(pub GreenId<'db>);
24449impl<'db> TypedSyntaxNode<'db> for BracedMacro<'db> {
24450 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracedMacro);
24451 type StablePtr = BracedMacroPtr<'db>;
24452 type Green = BracedMacroGreen<'db>;
24453 fn missing(db: &'db dyn Database) -> Self::Green {
24454 BracedMacroGreen(
24455 GreenNode {
24456 kind: SyntaxKind::BracedMacro,
24457 details: GreenNodeDetails::Node {
24458 children: [
24459 TerminalLBrace::missing(db).0,
24460 MacroElements::missing(db).0,
24461 TerminalRBrace::missing(db).0,
24462 ]
24463 .into(),
24464 width: TextWidth::default(),
24465 },
24466 }
24467 .intern(db),
24468 )
24469 }
24470 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24471 let kind = node.kind(db);
24472 assert_eq!(
24473 kind,
24474 SyntaxKind::BracedMacro,
24475 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24476 kind,
24477 SyntaxKind::BracedMacro
24478 );
24479 Self { node }
24480 }
24481 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24482 let kind = node.kind(db);
24483 if kind == SyntaxKind::BracedMacro { Some(Self::from_syntax_node(db, node)) } else { None }
24484 }
24485 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24486 self.node
24487 }
24488 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24489 BracedMacroPtr(self.node.stable_ptr(db))
24490 }
24491}
24492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24493pub struct BracketedMacro<'db> {
24494 node: SyntaxNode<'db>,
24495}
24496impl<'db> BracketedMacro<'db> {
24497 pub const INDEX_LBRACK: usize = 0;
24498 pub const INDEX_ELEMENTS: usize = 1;
24499 pub const INDEX_RBRACK: usize = 2;
24500 pub fn new_green(
24501 db: &'db dyn Database,
24502 lbrack: TerminalLBrackGreen<'db>,
24503 elements: MacroElementsGreen<'db>,
24504 rbrack: TerminalRBrackGreen<'db>,
24505 ) -> BracketedMacroGreen<'db> {
24506 let children = [lbrack.0, elements.0, rbrack.0];
24507 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24508 BracketedMacroGreen(
24509 GreenNode {
24510 kind: SyntaxKind::BracketedMacro,
24511 details: GreenNodeDetails::Node { children: children.into(), width },
24512 }
24513 .intern(db),
24514 )
24515 }
24516}
24517impl<'db> BracketedMacro<'db> {
24518 pub fn lbrack(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
24519 TerminalLBrack::from_syntax_node(db, self.node.get_children(db)[0])
24520 }
24521 pub fn elements(&self, db: &'db dyn Database) -> MacroElements<'db> {
24522 MacroElements::from_syntax_node(db, self.node.get_children(db)[1])
24523 }
24524 pub fn rbrack(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
24525 TerminalRBrack::from_syntax_node(db, self.node.get_children(db)[2])
24526 }
24527}
24528#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24529pub struct BracketedMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24530impl<'db> BracketedMacroPtr<'db> {}
24531impl<'db> TypedStablePtr<'db> for BracketedMacroPtr<'db> {
24532 type SyntaxNode = BracketedMacro<'db>;
24533 fn untyped(self) -> SyntaxStablePtrId<'db> {
24534 self.0
24535 }
24536 fn lookup(&self, db: &'db dyn Database) -> BracketedMacro<'db> {
24537 BracketedMacro::from_syntax_node(db, self.0.lookup(db))
24538 }
24539}
24540impl<'db> From<BracketedMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24541 fn from(ptr: BracketedMacroPtr<'db>) -> Self {
24542 ptr.untyped()
24543 }
24544}
24545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24546pub struct BracketedMacroGreen<'db>(pub GreenId<'db>);
24547impl<'db> TypedSyntaxNode<'db> for BracketedMacro<'db> {
24548 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::BracketedMacro);
24549 type StablePtr = BracketedMacroPtr<'db>;
24550 type Green = BracketedMacroGreen<'db>;
24551 fn missing(db: &'db dyn Database) -> Self::Green {
24552 BracketedMacroGreen(
24553 GreenNode {
24554 kind: SyntaxKind::BracketedMacro,
24555 details: GreenNodeDetails::Node {
24556 children: [
24557 TerminalLBrack::missing(db).0,
24558 MacroElements::missing(db).0,
24559 TerminalRBrack::missing(db).0,
24560 ]
24561 .into(),
24562 width: TextWidth::default(),
24563 },
24564 }
24565 .intern(db),
24566 )
24567 }
24568 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24569 let kind = node.kind(db);
24570 assert_eq!(
24571 kind,
24572 SyntaxKind::BracketedMacro,
24573 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24574 kind,
24575 SyntaxKind::BracketedMacro
24576 );
24577 Self { node }
24578 }
24579 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24580 let kind = node.kind(db);
24581 if kind == SyntaxKind::BracketedMacro {
24582 Some(Self::from_syntax_node(db, node))
24583 } else {
24584 None
24585 }
24586 }
24587 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24588 self.node
24589 }
24590 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24591 BracketedMacroPtr(self.node.stable_ptr(db))
24592 }
24593}
24594#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24595pub struct LegacyExprInlineMacro<'db> {
24596 node: SyntaxNode<'db>,
24597}
24598impl<'db> LegacyExprInlineMacro<'db> {
24599 pub const INDEX_PATH: usize = 0;
24600 pub const INDEX_BANG: usize = 1;
24601 pub const INDEX_ARGUMENTS: usize = 2;
24602 pub fn new_green(
24603 db: &'db dyn Database,
24604 path: ExprPathGreen<'db>,
24605 bang: TerminalNotGreen<'db>,
24606 arguments: WrappedArgListGreen<'db>,
24607 ) -> LegacyExprInlineMacroGreen<'db> {
24608 let children = [path.0, bang.0, arguments.0];
24609 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24610 LegacyExprInlineMacroGreen(
24611 GreenNode {
24612 kind: SyntaxKind::LegacyExprInlineMacro,
24613 details: GreenNodeDetails::Node { children: children.into(), width },
24614 }
24615 .intern(db),
24616 )
24617 }
24618}
24619impl<'db> LegacyExprInlineMacro<'db> {
24620 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24621 ExprPath::from_syntax_node(db, self.node.get_children(db)[0])
24622 }
24623 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24624 TerminalNot::from_syntax_node(db, self.node.get_children(db)[1])
24625 }
24626 pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24627 WrappedArgList::from_syntax_node(db, self.node.get_children(db)[2])
24628 }
24629}
24630#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24631pub struct LegacyExprInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24632impl<'db> LegacyExprInlineMacroPtr<'db> {}
24633impl<'db> TypedStablePtr<'db> for LegacyExprInlineMacroPtr<'db> {
24634 type SyntaxNode = LegacyExprInlineMacro<'db>;
24635 fn untyped(self) -> SyntaxStablePtrId<'db> {
24636 self.0
24637 }
24638 fn lookup(&self, db: &'db dyn Database) -> LegacyExprInlineMacro<'db> {
24639 LegacyExprInlineMacro::from_syntax_node(db, self.0.lookup(db))
24640 }
24641}
24642impl<'db> From<LegacyExprInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24643 fn from(ptr: LegacyExprInlineMacroPtr<'db>) -> Self {
24644 ptr.untyped()
24645 }
24646}
24647#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24648pub struct LegacyExprInlineMacroGreen<'db>(pub GreenId<'db>);
24649impl<'db> TypedSyntaxNode<'db> for LegacyExprInlineMacro<'db> {
24650 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyExprInlineMacro);
24651 type StablePtr = LegacyExprInlineMacroPtr<'db>;
24652 type Green = LegacyExprInlineMacroGreen<'db>;
24653 fn missing(db: &'db dyn Database) -> Self::Green {
24654 LegacyExprInlineMacroGreen(
24655 GreenNode {
24656 kind: SyntaxKind::LegacyExprInlineMacro,
24657 details: GreenNodeDetails::Node {
24658 children: [
24659 ExprPath::missing(db).0,
24660 TerminalNot::missing(db).0,
24661 WrappedArgList::missing(db).0,
24662 ]
24663 .into(),
24664 width: TextWidth::default(),
24665 },
24666 }
24667 .intern(db),
24668 )
24669 }
24670 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24671 let kind = node.kind(db);
24672 assert_eq!(
24673 kind,
24674 SyntaxKind::LegacyExprInlineMacro,
24675 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24676 kind,
24677 SyntaxKind::LegacyExprInlineMacro
24678 );
24679 Self { node }
24680 }
24681 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24682 let kind = node.kind(db);
24683 if kind == SyntaxKind::LegacyExprInlineMacro {
24684 Some(Self::from_syntax_node(db, node))
24685 } else {
24686 None
24687 }
24688 }
24689 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24690 self.node
24691 }
24692 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24693 LegacyExprInlineMacroPtr(self.node.stable_ptr(db))
24694 }
24695}
24696#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24697pub struct LegacyItemInlineMacro<'db> {
24698 node: SyntaxNode<'db>,
24699}
24700impl<'db> LegacyItemInlineMacro<'db> {
24701 pub const INDEX_ATTRIBUTES: usize = 0;
24702 pub const INDEX_PATH: usize = 1;
24703 pub const INDEX_BANG: usize = 2;
24704 pub const INDEX_ARGUMENTS: usize = 3;
24705 pub const INDEX_SEMICOLON: usize = 4;
24706 pub fn new_green(
24707 db: &'db dyn Database,
24708 attributes: AttributeListGreen<'db>,
24709 path: ExprPathGreen<'db>,
24710 bang: TerminalNotGreen<'db>,
24711 arguments: WrappedArgListGreen<'db>,
24712 semicolon: TerminalSemicolonGreen<'db>,
24713 ) -> LegacyItemInlineMacroGreen<'db> {
24714 let children = [attributes.0, path.0, bang.0, arguments.0, semicolon.0];
24715 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24716 LegacyItemInlineMacroGreen(
24717 GreenNode {
24718 kind: SyntaxKind::LegacyItemInlineMacro,
24719 details: GreenNodeDetails::Node { children: children.into(), width },
24720 }
24721 .intern(db),
24722 )
24723 }
24724}
24725impl<'db> LegacyItemInlineMacro<'db> {
24726 pub fn attributes(&self, db: &'db dyn Database) -> AttributeList<'db> {
24727 AttributeList::from_syntax_node(db, self.node.get_children(db)[0])
24728 }
24729 pub fn path(&self, db: &'db dyn Database) -> ExprPath<'db> {
24730 ExprPath::from_syntax_node(db, self.node.get_children(db)[1])
24731 }
24732 pub fn bang(&self, db: &'db dyn Database) -> TerminalNot<'db> {
24733 TerminalNot::from_syntax_node(db, self.node.get_children(db)[2])
24734 }
24735 pub fn arguments(&self, db: &'db dyn Database) -> WrappedArgList<'db> {
24736 WrappedArgList::from_syntax_node(db, self.node.get_children(db)[3])
24737 }
24738 pub fn semicolon(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
24739 TerminalSemicolon::from_syntax_node(db, self.node.get_children(db)[4])
24740 }
24741}
24742#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24743pub struct LegacyItemInlineMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
24744impl<'db> LegacyItemInlineMacroPtr<'db> {}
24745impl<'db> TypedStablePtr<'db> for LegacyItemInlineMacroPtr<'db> {
24746 type SyntaxNode = LegacyItemInlineMacro<'db>;
24747 fn untyped(self) -> SyntaxStablePtrId<'db> {
24748 self.0
24749 }
24750 fn lookup(&self, db: &'db dyn Database) -> LegacyItemInlineMacro<'db> {
24751 LegacyItemInlineMacro::from_syntax_node(db, self.0.lookup(db))
24752 }
24753}
24754impl<'db> From<LegacyItemInlineMacroPtr<'db>> for SyntaxStablePtrId<'db> {
24755 fn from(ptr: LegacyItemInlineMacroPtr<'db>) -> Self {
24756 ptr.untyped()
24757 }
24758}
24759#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24760pub struct LegacyItemInlineMacroGreen<'db>(pub GreenId<'db>);
24761impl<'db> TypedSyntaxNode<'db> for LegacyItemInlineMacro<'db> {
24762 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::LegacyItemInlineMacro);
24763 type StablePtr = LegacyItemInlineMacroPtr<'db>;
24764 type Green = LegacyItemInlineMacroGreen<'db>;
24765 fn missing(db: &'db dyn Database) -> Self::Green {
24766 LegacyItemInlineMacroGreen(
24767 GreenNode {
24768 kind: SyntaxKind::LegacyItemInlineMacro,
24769 details: GreenNodeDetails::Node {
24770 children: [
24771 AttributeList::missing(db).0,
24772 ExprPath::missing(db).0,
24773 TerminalNot::missing(db).0,
24774 WrappedArgList::missing(db).0,
24775 TerminalSemicolon::missing(db).0,
24776 ]
24777 .into(),
24778 width: TextWidth::default(),
24779 },
24780 }
24781 .intern(db),
24782 )
24783 }
24784 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24785 let kind = node.kind(db);
24786 assert_eq!(
24787 kind,
24788 SyntaxKind::LegacyItemInlineMacro,
24789 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24790 kind,
24791 SyntaxKind::LegacyItemInlineMacro
24792 );
24793 Self { node }
24794 }
24795 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24796 let kind = node.kind(db);
24797 if kind == SyntaxKind::LegacyItemInlineMacro {
24798 Some(Self::from_syntax_node(db, node))
24799 } else {
24800 None
24801 }
24802 }
24803 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24804 self.node
24805 }
24806 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24807 LegacyItemInlineMacroPtr(self.node.stable_ptr(db))
24808 }
24809}
24810#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24811pub struct TriviumSkippedNode<'db> {
24812 node: SyntaxNode<'db>,
24813}
24814impl<'db> TriviumSkippedNode<'db> {
24815 pub const INDEX_NODE: usize = 0;
24816 pub fn new_green(
24817 db: &'db dyn Database,
24818 node: SkippedNodeGreen<'db>,
24819 ) -> TriviumSkippedNodeGreen<'db> {
24820 let children = [node.0];
24821 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
24822 TriviumSkippedNodeGreen(
24823 GreenNode {
24824 kind: SyntaxKind::TriviumSkippedNode,
24825 details: GreenNodeDetails::Node { children: children.into(), width },
24826 }
24827 .intern(db),
24828 )
24829 }
24830}
24831impl<'db> TriviumSkippedNode<'db> {
24832 pub fn node(&self, db: &'db dyn Database) -> SkippedNode<'db> {
24833 SkippedNode::from_syntax_node(db, self.node.get_children(db)[0])
24834 }
24835}
24836#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24837pub struct TriviumSkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24838impl<'db> TriviumSkippedNodePtr<'db> {}
24839impl<'db> TypedStablePtr<'db> for TriviumSkippedNodePtr<'db> {
24840 type SyntaxNode = TriviumSkippedNode<'db>;
24841 fn untyped(self) -> SyntaxStablePtrId<'db> {
24842 self.0
24843 }
24844 fn lookup(&self, db: &'db dyn Database) -> TriviumSkippedNode<'db> {
24845 TriviumSkippedNode::from_syntax_node(db, self.0.lookup(db))
24846 }
24847}
24848impl<'db> From<TriviumSkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24849 fn from(ptr: TriviumSkippedNodePtr<'db>) -> Self {
24850 ptr.untyped()
24851 }
24852}
24853#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24854pub struct TriviumSkippedNodeGreen<'db>(pub GreenId<'db>);
24855impl<'db> TypedSyntaxNode<'db> for TriviumSkippedNode<'db> {
24856 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TriviumSkippedNode);
24857 type StablePtr = TriviumSkippedNodePtr<'db>;
24858 type Green = TriviumSkippedNodeGreen<'db>;
24859 fn missing(db: &'db dyn Database) -> Self::Green {
24860 TriviumSkippedNodeGreen(
24861 GreenNode {
24862 kind: SyntaxKind::TriviumSkippedNode,
24863 details: GreenNodeDetails::Node {
24864 children: [SkippedNode::missing(db).0].into(),
24865 width: TextWidth::default(),
24866 },
24867 }
24868 .intern(db),
24869 )
24870 }
24871 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24872 let kind = node.kind(db);
24873 assert_eq!(
24874 kind,
24875 SyntaxKind::TriviumSkippedNode,
24876 "Unexpected SyntaxKind {:?}. Expected {:?}.",
24877 kind,
24878 SyntaxKind::TriviumSkippedNode
24879 );
24880 Self { node }
24881 }
24882 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24883 let kind = node.kind(db);
24884 if kind == SyntaxKind::TriviumSkippedNode {
24885 Some(Self::from_syntax_node(db, node))
24886 } else {
24887 None
24888 }
24889 }
24890 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24891 self.node
24892 }
24893 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24894 TriviumSkippedNodePtr(self.node.stable_ptr(db))
24895 }
24896}
24897#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
24898pub enum SkippedNode<'db> {
24899 AttributeList(AttributeList<'db>),
24900 VisibilityPub(VisibilityPub<'db>),
24901 ExprPath(ExprPath<'db>),
24902}
24903#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24904pub struct SkippedNodePtr<'db>(pub SyntaxStablePtrId<'db>);
24905impl<'db> TypedStablePtr<'db> for SkippedNodePtr<'db> {
24906 type SyntaxNode = SkippedNode<'db>;
24907 fn untyped(self) -> SyntaxStablePtrId<'db> {
24908 self.0
24909 }
24910 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
24911 SkippedNode::from_syntax_node(db, self.0.lookup(db))
24912 }
24913}
24914impl<'db> From<SkippedNodePtr<'db>> for SyntaxStablePtrId<'db> {
24915 fn from(ptr: SkippedNodePtr<'db>) -> Self {
24916 ptr.untyped()
24917 }
24918}
24919impl<'db> From<AttributeListPtr<'db>> for SkippedNodePtr<'db> {
24920 fn from(value: AttributeListPtr<'db>) -> Self {
24921 Self(value.0)
24922 }
24923}
24924impl<'db> From<VisibilityPubPtr<'db>> for SkippedNodePtr<'db> {
24925 fn from(value: VisibilityPubPtr<'db>) -> Self {
24926 Self(value.0)
24927 }
24928}
24929impl<'db> From<ExprPathPtr<'db>> for SkippedNodePtr<'db> {
24930 fn from(value: ExprPathPtr<'db>) -> Self {
24931 Self(value.0)
24932 }
24933}
24934impl<'db> From<AttributeListGreen<'db>> for SkippedNodeGreen<'db> {
24935 fn from(value: AttributeListGreen<'db>) -> Self {
24936 Self(value.0)
24937 }
24938}
24939impl<'db> From<VisibilityPubGreen<'db>> for SkippedNodeGreen<'db> {
24940 fn from(value: VisibilityPubGreen<'db>) -> Self {
24941 Self(value.0)
24942 }
24943}
24944impl<'db> From<ExprPathGreen<'db>> for SkippedNodeGreen<'db> {
24945 fn from(value: ExprPathGreen<'db>) -> Self {
24946 Self(value.0)
24947 }
24948}
24949#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
24950pub struct SkippedNodeGreen<'db>(pub GreenId<'db>);
24951impl<'db> TypedSyntaxNode<'db> for SkippedNode<'db> {
24952 const OPTIONAL_KIND: Option<SyntaxKind> = None;
24953 type StablePtr = SkippedNodePtr<'db>;
24954 type Green = SkippedNodeGreen<'db>;
24955 fn missing(db: &'db dyn Database) -> Self::Green {
24956 panic!("No missing variant.");
24957 }
24958 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
24959 let kind = node.kind(db);
24960 match kind {
24961 SyntaxKind::AttributeList => {
24962 SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node))
24963 }
24964 SyntaxKind::VisibilityPub => {
24965 SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node))
24966 }
24967 SyntaxKind::ExprPath => SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)),
24968 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "SkippedNode"),
24969 }
24970 }
24971 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
24972 let kind = node.kind(db);
24973 match kind {
24974 SyntaxKind::AttributeList => {
24975 Some(SkippedNode::AttributeList(AttributeList::from_syntax_node(db, node)))
24976 }
24977 SyntaxKind::VisibilityPub => {
24978 Some(SkippedNode::VisibilityPub(VisibilityPub::from_syntax_node(db, node)))
24979 }
24980 SyntaxKind::ExprPath => {
24981 Some(SkippedNode::ExprPath(ExprPath::from_syntax_node(db, node)))
24982 }
24983 _ => None,
24984 }
24985 }
24986 fn as_syntax_node(&self) -> SyntaxNode<'db> {
24987 match self {
24988 SkippedNode::AttributeList(x) => x.as_syntax_node(),
24989 SkippedNode::VisibilityPub(x) => x.as_syntax_node(),
24990 SkippedNode::ExprPath(x) => x.as_syntax_node(),
24991 }
24992 }
24993 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
24994 SkippedNodePtr(self.as_syntax_node().stable_ptr(db))
24995 }
24996}
24997impl<'db> SkippedNode<'db> {
24998 pub fn is_variant(kind: SyntaxKind) -> bool {
25000 matches!(kind, SyntaxKind::AttributeList | SyntaxKind::VisibilityPub | SyntaxKind::ExprPath)
25001 }
25002}
25003#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25004pub struct TokenIdentifier<'db> {
25005 node: SyntaxNode<'db>,
25006}
25007impl<'db> Token<'db> for TokenIdentifier<'db> {
25008 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25009 TokenIdentifierGreen(
25010 GreenNode { kind: SyntaxKind::TokenIdentifier, details: GreenNodeDetails::Token(text) }
25011 .intern(db),
25012 )
25013 }
25014 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25015 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25016 }
25017}
25018#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25019pub struct TokenIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25020impl<'db> TypedStablePtr<'db> for TokenIdentifierPtr<'db> {
25021 type SyntaxNode = TokenIdentifier<'db>;
25022 fn untyped(self) -> SyntaxStablePtrId<'db> {
25023 self.0
25024 }
25025 fn lookup(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25026 TokenIdentifier::from_syntax_node(db, self.0.lookup(db))
25027 }
25028}
25029impl<'db> From<TokenIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25030 fn from(ptr: TokenIdentifierPtr<'db>) -> Self {
25031 ptr.untyped()
25032 }
25033}
25034#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25035pub struct TokenIdentifierGreen<'db>(pub GreenId<'db>);
25036impl<'db> TokenIdentifierGreen<'db> {
25037 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25038 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25039 }
25040}
25041impl<'db> TypedSyntaxNode<'db> for TokenIdentifier<'db> {
25042 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIdentifier);
25043 type StablePtr = TokenIdentifierPtr<'db>;
25044 type Green = TokenIdentifierGreen<'db>;
25045 fn missing(db: &'db dyn Database) -> Self::Green {
25046 TokenIdentifierGreen(
25047 GreenNode {
25048 kind: SyntaxKind::TokenMissing,
25049 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25050 }
25051 .intern(db),
25052 )
25053 }
25054 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25055 match node.green_node(db).details {
25056 GreenNodeDetails::Token(_) => Self { node },
25057 GreenNodeDetails::Node { .. } => {
25058 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIdentifier)
25059 }
25060 }
25061 }
25062 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25063 match node.green_node(db).details {
25064 GreenNodeDetails::Token(_) => Some(Self { node }),
25065 GreenNodeDetails::Node { .. } => None,
25066 }
25067 }
25068 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25069 self.node
25070 }
25071 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25072 TokenIdentifierPtr(self.node.stable_ptr(db))
25073 }
25074}
25075#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25076pub struct TerminalIdentifier<'db> {
25077 node: SyntaxNode<'db>,
25078}
25079impl<'db> Terminal<'db> for TerminalIdentifier<'db> {
25080 const KIND: SyntaxKind = SyntaxKind::TerminalIdentifier;
25081 type TokenType = TokenIdentifier<'db>;
25082 fn new_green(
25083 db: &'db dyn Database,
25084 leading_trivia: TriviaGreen<'db>,
25085 token: <<TerminalIdentifier<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25086 trailing_trivia: TriviaGreen<'db>,
25087 ) -> Self::Green {
25088 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25089 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25090 TerminalIdentifierGreen(
25091 GreenNode {
25092 kind: SyntaxKind::TerminalIdentifier,
25093 details: GreenNodeDetails::Node { children: children.into(), width },
25094 }
25095 .intern(db),
25096 )
25097 }
25098 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25099 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25100 unreachable!("Expected a node, not a token");
25101 };
25102 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25103 }
25104}
25105impl<'db> TerminalIdentifier<'db> {
25106 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25107 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25108 }
25109 pub fn token(&self, db: &'db dyn Database) -> TokenIdentifier<'db> {
25110 TokenIdentifier::from_syntax_node(db, self.node.get_children(db)[1])
25111 }
25112 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25113 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25114 }
25115}
25116#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25117pub struct TerminalIdentifierPtr<'db>(pub SyntaxStablePtrId<'db>);
25118impl<'db> TerminalIdentifierPtr<'db> {}
25119impl<'db> TypedStablePtr<'db> for TerminalIdentifierPtr<'db> {
25120 type SyntaxNode = TerminalIdentifier<'db>;
25121 fn untyped(self) -> SyntaxStablePtrId<'db> {
25122 self.0
25123 }
25124 fn lookup(&self, db: &'db dyn Database) -> TerminalIdentifier<'db> {
25125 TerminalIdentifier::from_syntax_node(db, self.0.lookup(db))
25126 }
25127}
25128impl<'db> From<TerminalIdentifierPtr<'db>> for SyntaxStablePtrId<'db> {
25129 fn from(ptr: TerminalIdentifierPtr<'db>) -> Self {
25130 ptr.untyped()
25131 }
25132}
25133#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25134pub struct TerminalIdentifierGreen<'db>(pub GreenId<'db>);
25135impl<'db> TypedSyntaxNode<'db> for TerminalIdentifier<'db> {
25136 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIdentifier);
25137 type StablePtr = TerminalIdentifierPtr<'db>;
25138 type Green = TerminalIdentifierGreen<'db>;
25139 fn missing(db: &'db dyn Database) -> Self::Green {
25140 TerminalIdentifierGreen(
25141 GreenNode {
25142 kind: SyntaxKind::TerminalIdentifier,
25143 details: GreenNodeDetails::Node {
25144 children: [
25145 Trivia::missing(db).0,
25146 TokenIdentifier::missing(db).0,
25147 Trivia::missing(db).0,
25148 ]
25149 .into(),
25150 width: TextWidth::default(),
25151 },
25152 }
25153 .intern(db),
25154 )
25155 }
25156 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25157 let kind = node.kind(db);
25158 assert_eq!(
25159 kind,
25160 SyntaxKind::TerminalIdentifier,
25161 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25162 kind,
25163 SyntaxKind::TerminalIdentifier
25164 );
25165 Self { node }
25166 }
25167 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25168 let kind = node.kind(db);
25169 if kind == SyntaxKind::TerminalIdentifier {
25170 Some(Self::from_syntax_node(db, node))
25171 } else {
25172 None
25173 }
25174 }
25175 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25176 self.node
25177 }
25178 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25179 TerminalIdentifierPtr(self.node.stable_ptr(db))
25180 }
25181}
25182#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25183pub struct TokenLiteralNumber<'db> {
25184 node: SyntaxNode<'db>,
25185}
25186impl<'db> Token<'db> for TokenLiteralNumber<'db> {
25187 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25188 TokenLiteralNumberGreen(
25189 GreenNode {
25190 kind: SyntaxKind::TokenLiteralNumber,
25191 details: GreenNodeDetails::Token(text),
25192 }
25193 .intern(db),
25194 )
25195 }
25196 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25197 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25198 }
25199}
25200#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25201pub struct TokenLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25202impl<'db> TypedStablePtr<'db> for TokenLiteralNumberPtr<'db> {
25203 type SyntaxNode = TokenLiteralNumber<'db>;
25204 fn untyped(self) -> SyntaxStablePtrId<'db> {
25205 self.0
25206 }
25207 fn lookup(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25208 TokenLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25209 }
25210}
25211impl<'db> From<TokenLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25212 fn from(ptr: TokenLiteralNumberPtr<'db>) -> Self {
25213 ptr.untyped()
25214 }
25215}
25216#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25217pub struct TokenLiteralNumberGreen<'db>(pub GreenId<'db>);
25218impl<'db> TokenLiteralNumberGreen<'db> {
25219 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25220 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25221 }
25222}
25223impl<'db> TypedSyntaxNode<'db> for TokenLiteralNumber<'db> {
25224 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLiteralNumber);
25225 type StablePtr = TokenLiteralNumberPtr<'db>;
25226 type Green = TokenLiteralNumberGreen<'db>;
25227 fn missing(db: &'db dyn Database) -> Self::Green {
25228 TokenLiteralNumberGreen(
25229 GreenNode {
25230 kind: SyntaxKind::TokenMissing,
25231 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25232 }
25233 .intern(db),
25234 )
25235 }
25236 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25237 match node.green_node(db).details {
25238 GreenNodeDetails::Token(_) => Self { node },
25239 GreenNodeDetails::Node { .. } => panic!(
25240 "Expected a token {:?}, not an internal node",
25241 SyntaxKind::TokenLiteralNumber
25242 ),
25243 }
25244 }
25245 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25246 match node.green_node(db).details {
25247 GreenNodeDetails::Token(_) => Some(Self { node }),
25248 GreenNodeDetails::Node { .. } => None,
25249 }
25250 }
25251 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25252 self.node
25253 }
25254 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25255 TokenLiteralNumberPtr(self.node.stable_ptr(db))
25256 }
25257}
25258#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25259pub struct TerminalLiteralNumber<'db> {
25260 node: SyntaxNode<'db>,
25261}
25262impl<'db> Terminal<'db> for TerminalLiteralNumber<'db> {
25263 const KIND: SyntaxKind = SyntaxKind::TerminalLiteralNumber;
25264 type TokenType = TokenLiteralNumber<'db>;
25265 fn new_green(
25266 db: &'db dyn Database,
25267 leading_trivia: TriviaGreen<'db>,
25268 token: <<TerminalLiteralNumber<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25269 trailing_trivia: TriviaGreen<'db>,
25270 ) -> Self::Green {
25271 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25272 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25273 TerminalLiteralNumberGreen(
25274 GreenNode {
25275 kind: SyntaxKind::TerminalLiteralNumber,
25276 details: GreenNodeDetails::Node { children: children.into(), width },
25277 }
25278 .intern(db),
25279 )
25280 }
25281 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25282 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25283 unreachable!("Expected a node, not a token");
25284 };
25285 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25286 }
25287}
25288impl<'db> TerminalLiteralNumber<'db> {
25289 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25290 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25291 }
25292 pub fn token(&self, db: &'db dyn Database) -> TokenLiteralNumber<'db> {
25293 TokenLiteralNumber::from_syntax_node(db, self.node.get_children(db)[1])
25294 }
25295 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25296 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25297 }
25298}
25299#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25300pub struct TerminalLiteralNumberPtr<'db>(pub SyntaxStablePtrId<'db>);
25301impl<'db> TerminalLiteralNumberPtr<'db> {}
25302impl<'db> TypedStablePtr<'db> for TerminalLiteralNumberPtr<'db> {
25303 type SyntaxNode = TerminalLiteralNumber<'db>;
25304 fn untyped(self) -> SyntaxStablePtrId<'db> {
25305 self.0
25306 }
25307 fn lookup(&self, db: &'db dyn Database) -> TerminalLiteralNumber<'db> {
25308 TerminalLiteralNumber::from_syntax_node(db, self.0.lookup(db))
25309 }
25310}
25311impl<'db> From<TerminalLiteralNumberPtr<'db>> for SyntaxStablePtrId<'db> {
25312 fn from(ptr: TerminalLiteralNumberPtr<'db>) -> Self {
25313 ptr.untyped()
25314 }
25315}
25316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25317pub struct TerminalLiteralNumberGreen<'db>(pub GreenId<'db>);
25318impl<'db> TypedSyntaxNode<'db> for TerminalLiteralNumber<'db> {
25319 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLiteralNumber);
25320 type StablePtr = TerminalLiteralNumberPtr<'db>;
25321 type Green = TerminalLiteralNumberGreen<'db>;
25322 fn missing(db: &'db dyn Database) -> Self::Green {
25323 TerminalLiteralNumberGreen(
25324 GreenNode {
25325 kind: SyntaxKind::TerminalLiteralNumber,
25326 details: GreenNodeDetails::Node {
25327 children: [
25328 Trivia::missing(db).0,
25329 TokenLiteralNumber::missing(db).0,
25330 Trivia::missing(db).0,
25331 ]
25332 .into(),
25333 width: TextWidth::default(),
25334 },
25335 }
25336 .intern(db),
25337 )
25338 }
25339 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25340 let kind = node.kind(db);
25341 assert_eq!(
25342 kind,
25343 SyntaxKind::TerminalLiteralNumber,
25344 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25345 kind,
25346 SyntaxKind::TerminalLiteralNumber
25347 );
25348 Self { node }
25349 }
25350 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25351 let kind = node.kind(db);
25352 if kind == SyntaxKind::TerminalLiteralNumber {
25353 Some(Self::from_syntax_node(db, node))
25354 } else {
25355 None
25356 }
25357 }
25358 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25359 self.node
25360 }
25361 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25362 TerminalLiteralNumberPtr(self.node.stable_ptr(db))
25363 }
25364}
25365#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25366pub struct TokenShortString<'db> {
25367 node: SyntaxNode<'db>,
25368}
25369impl<'db> Token<'db> for TokenShortString<'db> {
25370 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25371 TokenShortStringGreen(
25372 GreenNode {
25373 kind: SyntaxKind::TokenShortString,
25374 details: GreenNodeDetails::Token(text),
25375 }
25376 .intern(db),
25377 )
25378 }
25379 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25380 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25381 }
25382}
25383#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25384pub struct TokenShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25385impl<'db> TypedStablePtr<'db> for TokenShortStringPtr<'db> {
25386 type SyntaxNode = TokenShortString<'db>;
25387 fn untyped(self) -> SyntaxStablePtrId<'db> {
25388 self.0
25389 }
25390 fn lookup(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25391 TokenShortString::from_syntax_node(db, self.0.lookup(db))
25392 }
25393}
25394impl<'db> From<TokenShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25395 fn from(ptr: TokenShortStringPtr<'db>) -> Self {
25396 ptr.untyped()
25397 }
25398}
25399#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25400pub struct TokenShortStringGreen<'db>(pub GreenId<'db>);
25401impl<'db> TokenShortStringGreen<'db> {
25402 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25403 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25404 }
25405}
25406impl<'db> TypedSyntaxNode<'db> for TokenShortString<'db> {
25407 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenShortString);
25408 type StablePtr = TokenShortStringPtr<'db>;
25409 type Green = TokenShortStringGreen<'db>;
25410 fn missing(db: &'db dyn Database) -> Self::Green {
25411 TokenShortStringGreen(
25412 GreenNode {
25413 kind: SyntaxKind::TokenMissing,
25414 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25415 }
25416 .intern(db),
25417 )
25418 }
25419 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25420 match node.green_node(db).details {
25421 GreenNodeDetails::Token(_) => Self { node },
25422 GreenNodeDetails::Node { .. } => {
25423 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenShortString)
25424 }
25425 }
25426 }
25427 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25428 match node.green_node(db).details {
25429 GreenNodeDetails::Token(_) => Some(Self { node }),
25430 GreenNodeDetails::Node { .. } => None,
25431 }
25432 }
25433 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25434 self.node
25435 }
25436 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25437 TokenShortStringPtr(self.node.stable_ptr(db))
25438 }
25439}
25440#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25441pub struct TerminalShortString<'db> {
25442 node: SyntaxNode<'db>,
25443}
25444impl<'db> Terminal<'db> for TerminalShortString<'db> {
25445 const KIND: SyntaxKind = SyntaxKind::TerminalShortString;
25446 type TokenType = TokenShortString<'db>;
25447 fn new_green(
25448 db: &'db dyn Database,
25449 leading_trivia: TriviaGreen<'db>,
25450 token: <<TerminalShortString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25451 trailing_trivia: TriviaGreen<'db>,
25452 ) -> Self::Green {
25453 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25454 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25455 TerminalShortStringGreen(
25456 GreenNode {
25457 kind: SyntaxKind::TerminalShortString,
25458 details: GreenNodeDetails::Node { children: children.into(), width },
25459 }
25460 .intern(db),
25461 )
25462 }
25463 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25464 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25465 unreachable!("Expected a node, not a token");
25466 };
25467 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25468 }
25469}
25470impl<'db> TerminalShortString<'db> {
25471 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25472 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25473 }
25474 pub fn token(&self, db: &'db dyn Database) -> TokenShortString<'db> {
25475 TokenShortString::from_syntax_node(db, self.node.get_children(db)[1])
25476 }
25477 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25478 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25479 }
25480}
25481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25482pub struct TerminalShortStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25483impl<'db> TerminalShortStringPtr<'db> {}
25484impl<'db> TypedStablePtr<'db> for TerminalShortStringPtr<'db> {
25485 type SyntaxNode = TerminalShortString<'db>;
25486 fn untyped(self) -> SyntaxStablePtrId<'db> {
25487 self.0
25488 }
25489 fn lookup(&self, db: &'db dyn Database) -> TerminalShortString<'db> {
25490 TerminalShortString::from_syntax_node(db, self.0.lookup(db))
25491 }
25492}
25493impl<'db> From<TerminalShortStringPtr<'db>> for SyntaxStablePtrId<'db> {
25494 fn from(ptr: TerminalShortStringPtr<'db>) -> Self {
25495 ptr.untyped()
25496 }
25497}
25498#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25499pub struct TerminalShortStringGreen<'db>(pub GreenId<'db>);
25500impl<'db> TypedSyntaxNode<'db> for TerminalShortString<'db> {
25501 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalShortString);
25502 type StablePtr = TerminalShortStringPtr<'db>;
25503 type Green = TerminalShortStringGreen<'db>;
25504 fn missing(db: &'db dyn Database) -> Self::Green {
25505 TerminalShortStringGreen(
25506 GreenNode {
25507 kind: SyntaxKind::TerminalShortString,
25508 details: GreenNodeDetails::Node {
25509 children: [
25510 Trivia::missing(db).0,
25511 TokenShortString::missing(db).0,
25512 Trivia::missing(db).0,
25513 ]
25514 .into(),
25515 width: TextWidth::default(),
25516 },
25517 }
25518 .intern(db),
25519 )
25520 }
25521 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25522 let kind = node.kind(db);
25523 assert_eq!(
25524 kind,
25525 SyntaxKind::TerminalShortString,
25526 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25527 kind,
25528 SyntaxKind::TerminalShortString
25529 );
25530 Self { node }
25531 }
25532 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25533 let kind = node.kind(db);
25534 if kind == SyntaxKind::TerminalShortString {
25535 Some(Self::from_syntax_node(db, node))
25536 } else {
25537 None
25538 }
25539 }
25540 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25541 self.node
25542 }
25543 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25544 TerminalShortStringPtr(self.node.stable_ptr(db))
25545 }
25546}
25547#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25548pub struct TokenString<'db> {
25549 node: SyntaxNode<'db>,
25550}
25551impl<'db> Token<'db> for TokenString<'db> {
25552 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25553 TokenStringGreen(
25554 GreenNode { kind: SyntaxKind::TokenString, details: GreenNodeDetails::Token(text) }
25555 .intern(db),
25556 )
25557 }
25558 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25559 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25560 }
25561}
25562#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25563pub struct TokenStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25564impl<'db> TypedStablePtr<'db> for TokenStringPtr<'db> {
25565 type SyntaxNode = TokenString<'db>;
25566 fn untyped(self) -> SyntaxStablePtrId<'db> {
25567 self.0
25568 }
25569 fn lookup(&self, db: &'db dyn Database) -> TokenString<'db> {
25570 TokenString::from_syntax_node(db, self.0.lookup(db))
25571 }
25572}
25573impl<'db> From<TokenStringPtr<'db>> for SyntaxStablePtrId<'db> {
25574 fn from(ptr: TokenStringPtr<'db>) -> Self {
25575 ptr.untyped()
25576 }
25577}
25578#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25579pub struct TokenStringGreen<'db>(pub GreenId<'db>);
25580impl<'db> TokenStringGreen<'db> {
25581 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25582 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25583 }
25584}
25585impl<'db> TypedSyntaxNode<'db> for TokenString<'db> {
25586 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenString);
25587 type StablePtr = TokenStringPtr<'db>;
25588 type Green = TokenStringGreen<'db>;
25589 fn missing(db: &'db dyn Database) -> Self::Green {
25590 TokenStringGreen(
25591 GreenNode {
25592 kind: SyntaxKind::TokenMissing,
25593 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25594 }
25595 .intern(db),
25596 )
25597 }
25598 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25599 match node.green_node(db).details {
25600 GreenNodeDetails::Token(_) => Self { node },
25601 GreenNodeDetails::Node { .. } => {
25602 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenString)
25603 }
25604 }
25605 }
25606 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25607 match node.green_node(db).details {
25608 GreenNodeDetails::Token(_) => Some(Self { node }),
25609 GreenNodeDetails::Node { .. } => None,
25610 }
25611 }
25612 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25613 self.node
25614 }
25615 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25616 TokenStringPtr(self.node.stable_ptr(db))
25617 }
25618}
25619#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25620pub struct TerminalString<'db> {
25621 node: SyntaxNode<'db>,
25622}
25623impl<'db> Terminal<'db> for TerminalString<'db> {
25624 const KIND: SyntaxKind = SyntaxKind::TerminalString;
25625 type TokenType = TokenString<'db>;
25626 fn new_green(
25627 db: &'db dyn Database,
25628 leading_trivia: TriviaGreen<'db>,
25629 token: <<TerminalString<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25630 trailing_trivia: TriviaGreen<'db>,
25631 ) -> Self::Green {
25632 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25633 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25634 TerminalStringGreen(
25635 GreenNode {
25636 kind: SyntaxKind::TerminalString,
25637 details: GreenNodeDetails::Node { children: children.into(), width },
25638 }
25639 .intern(db),
25640 )
25641 }
25642 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25643 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25644 unreachable!("Expected a node, not a token");
25645 };
25646 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25647 }
25648}
25649impl<'db> TerminalString<'db> {
25650 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25651 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25652 }
25653 pub fn token(&self, db: &'db dyn Database) -> TokenString<'db> {
25654 TokenString::from_syntax_node(db, self.node.get_children(db)[1])
25655 }
25656 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25657 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25658 }
25659}
25660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25661pub struct TerminalStringPtr<'db>(pub SyntaxStablePtrId<'db>);
25662impl<'db> TerminalStringPtr<'db> {}
25663impl<'db> TypedStablePtr<'db> for TerminalStringPtr<'db> {
25664 type SyntaxNode = TerminalString<'db>;
25665 fn untyped(self) -> SyntaxStablePtrId<'db> {
25666 self.0
25667 }
25668 fn lookup(&self, db: &'db dyn Database) -> TerminalString<'db> {
25669 TerminalString::from_syntax_node(db, self.0.lookup(db))
25670 }
25671}
25672impl<'db> From<TerminalStringPtr<'db>> for SyntaxStablePtrId<'db> {
25673 fn from(ptr: TerminalStringPtr<'db>) -> Self {
25674 ptr.untyped()
25675 }
25676}
25677#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25678pub struct TerminalStringGreen<'db>(pub GreenId<'db>);
25679impl<'db> TypedSyntaxNode<'db> for TerminalString<'db> {
25680 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalString);
25681 type StablePtr = TerminalStringPtr<'db>;
25682 type Green = TerminalStringGreen<'db>;
25683 fn missing(db: &'db dyn Database) -> Self::Green {
25684 TerminalStringGreen(
25685 GreenNode {
25686 kind: SyntaxKind::TerminalString,
25687 details: GreenNodeDetails::Node {
25688 children: [
25689 Trivia::missing(db).0,
25690 TokenString::missing(db).0,
25691 Trivia::missing(db).0,
25692 ]
25693 .into(),
25694 width: TextWidth::default(),
25695 },
25696 }
25697 .intern(db),
25698 )
25699 }
25700 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25701 let kind = node.kind(db);
25702 assert_eq!(
25703 kind,
25704 SyntaxKind::TerminalString,
25705 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25706 kind,
25707 SyntaxKind::TerminalString
25708 );
25709 Self { node }
25710 }
25711 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25712 let kind = node.kind(db);
25713 if kind == SyntaxKind::TerminalString {
25714 Some(Self::from_syntax_node(db, node))
25715 } else {
25716 None
25717 }
25718 }
25719 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25720 self.node
25721 }
25722 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25723 TerminalStringPtr(self.node.stable_ptr(db))
25724 }
25725}
25726#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25727pub struct TokenAs<'db> {
25728 node: SyntaxNode<'db>,
25729}
25730impl<'db> Token<'db> for TokenAs<'db> {
25731 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25732 TokenAsGreen(
25733 GreenNode { kind: SyntaxKind::TokenAs, details: GreenNodeDetails::Token(text) }
25734 .intern(db),
25735 )
25736 }
25737 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25738 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25739 }
25740}
25741#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25742pub struct TokenAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25743impl<'db> TypedStablePtr<'db> for TokenAsPtr<'db> {
25744 type SyntaxNode = TokenAs<'db>;
25745 fn untyped(self) -> SyntaxStablePtrId<'db> {
25746 self.0
25747 }
25748 fn lookup(&self, db: &'db dyn Database) -> TokenAs<'db> {
25749 TokenAs::from_syntax_node(db, self.0.lookup(db))
25750 }
25751}
25752impl<'db> From<TokenAsPtr<'db>> for SyntaxStablePtrId<'db> {
25753 fn from(ptr: TokenAsPtr<'db>) -> Self {
25754 ptr.untyped()
25755 }
25756}
25757#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25758pub struct TokenAsGreen<'db>(pub GreenId<'db>);
25759impl<'db> TokenAsGreen<'db> {
25760 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25761 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25762 }
25763}
25764impl<'db> TypedSyntaxNode<'db> for TokenAs<'db> {
25765 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAs);
25766 type StablePtr = TokenAsPtr<'db>;
25767 type Green = TokenAsGreen<'db>;
25768 fn missing(db: &'db dyn Database) -> Self::Green {
25769 TokenAsGreen(
25770 GreenNode {
25771 kind: SyntaxKind::TokenMissing,
25772 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25773 }
25774 .intern(db),
25775 )
25776 }
25777 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25778 match node.green_node(db).details {
25779 GreenNodeDetails::Token(_) => Self { node },
25780 GreenNodeDetails::Node { .. } => {
25781 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAs)
25782 }
25783 }
25784 }
25785 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25786 match node.green_node(db).details {
25787 GreenNodeDetails::Token(_) => Some(Self { node }),
25788 GreenNodeDetails::Node { .. } => None,
25789 }
25790 }
25791 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25792 self.node
25793 }
25794 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25795 TokenAsPtr(self.node.stable_ptr(db))
25796 }
25797}
25798#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25799pub struct TerminalAs<'db> {
25800 node: SyntaxNode<'db>,
25801}
25802impl<'db> Terminal<'db> for TerminalAs<'db> {
25803 const KIND: SyntaxKind = SyntaxKind::TerminalAs;
25804 type TokenType = TokenAs<'db>;
25805 fn new_green(
25806 db: &'db dyn Database,
25807 leading_trivia: TriviaGreen<'db>,
25808 token: <<TerminalAs<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25809 trailing_trivia: TriviaGreen<'db>,
25810 ) -> Self::Green {
25811 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25812 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25813 TerminalAsGreen(
25814 GreenNode {
25815 kind: SyntaxKind::TerminalAs,
25816 details: GreenNodeDetails::Node { children: children.into(), width },
25817 }
25818 .intern(db),
25819 )
25820 }
25821 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25822 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25823 unreachable!("Expected a node, not a token");
25824 };
25825 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
25826 }
25827}
25828impl<'db> TerminalAs<'db> {
25829 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25830 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
25831 }
25832 pub fn token(&self, db: &'db dyn Database) -> TokenAs<'db> {
25833 TokenAs::from_syntax_node(db, self.node.get_children(db)[1])
25834 }
25835 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
25836 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
25837 }
25838}
25839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25840pub struct TerminalAsPtr<'db>(pub SyntaxStablePtrId<'db>);
25841impl<'db> TerminalAsPtr<'db> {}
25842impl<'db> TypedStablePtr<'db> for TerminalAsPtr<'db> {
25843 type SyntaxNode = TerminalAs<'db>;
25844 fn untyped(self) -> SyntaxStablePtrId<'db> {
25845 self.0
25846 }
25847 fn lookup(&self, db: &'db dyn Database) -> TerminalAs<'db> {
25848 TerminalAs::from_syntax_node(db, self.0.lookup(db))
25849 }
25850}
25851impl<'db> From<TerminalAsPtr<'db>> for SyntaxStablePtrId<'db> {
25852 fn from(ptr: TerminalAsPtr<'db>) -> Self {
25853 ptr.untyped()
25854 }
25855}
25856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25857pub struct TerminalAsGreen<'db>(pub GreenId<'db>);
25858impl<'db> TypedSyntaxNode<'db> for TerminalAs<'db> {
25859 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAs);
25860 type StablePtr = TerminalAsPtr<'db>;
25861 type Green = TerminalAsGreen<'db>;
25862 fn missing(db: &'db dyn Database) -> Self::Green {
25863 TerminalAsGreen(
25864 GreenNode {
25865 kind: SyntaxKind::TerminalAs,
25866 details: GreenNodeDetails::Node {
25867 children: [
25868 Trivia::missing(db).0,
25869 TokenAs::missing(db).0,
25870 Trivia::missing(db).0,
25871 ]
25872 .into(),
25873 width: TextWidth::default(),
25874 },
25875 }
25876 .intern(db),
25877 )
25878 }
25879 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25880 let kind = node.kind(db);
25881 assert_eq!(
25882 kind,
25883 SyntaxKind::TerminalAs,
25884 "Unexpected SyntaxKind {:?}. Expected {:?}.",
25885 kind,
25886 SyntaxKind::TerminalAs
25887 );
25888 Self { node }
25889 }
25890 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25891 let kind = node.kind(db);
25892 if kind == SyntaxKind::TerminalAs { Some(Self::from_syntax_node(db, node)) } else { None }
25893 }
25894 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25895 self.node
25896 }
25897 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25898 TerminalAsPtr(self.node.stable_ptr(db))
25899 }
25900}
25901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25902pub struct TokenConst<'db> {
25903 node: SyntaxNode<'db>,
25904}
25905impl<'db> Token<'db> for TokenConst<'db> {
25906 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
25907 TokenConstGreen(
25908 GreenNode { kind: SyntaxKind::TokenConst, details: GreenNodeDetails::Token(text) }
25909 .intern(db),
25910 )
25911 }
25912 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25913 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
25914 }
25915}
25916#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25917pub struct TokenConstPtr<'db>(pub SyntaxStablePtrId<'db>);
25918impl<'db> TypedStablePtr<'db> for TokenConstPtr<'db> {
25919 type SyntaxNode = TokenConst<'db>;
25920 fn untyped(self) -> SyntaxStablePtrId<'db> {
25921 self.0
25922 }
25923 fn lookup(&self, db: &'db dyn Database) -> TokenConst<'db> {
25924 TokenConst::from_syntax_node(db, self.0.lookup(db))
25925 }
25926}
25927impl<'db> From<TokenConstPtr<'db>> for SyntaxStablePtrId<'db> {
25928 fn from(ptr: TokenConstPtr<'db>) -> Self {
25929 ptr.untyped()
25930 }
25931}
25932#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
25933pub struct TokenConstGreen<'db>(pub GreenId<'db>);
25934impl<'db> TokenConstGreen<'db> {
25935 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25936 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
25937 }
25938}
25939impl<'db> TypedSyntaxNode<'db> for TokenConst<'db> {
25940 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenConst);
25941 type StablePtr = TokenConstPtr<'db>;
25942 type Green = TokenConstGreen<'db>;
25943 fn missing(db: &'db dyn Database) -> Self::Green {
25944 TokenConstGreen(
25945 GreenNode {
25946 kind: SyntaxKind::TokenMissing,
25947 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
25948 }
25949 .intern(db),
25950 )
25951 }
25952 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
25953 match node.green_node(db).details {
25954 GreenNodeDetails::Token(_) => Self { node },
25955 GreenNodeDetails::Node { .. } => {
25956 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenConst)
25957 }
25958 }
25959 }
25960 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
25961 match node.green_node(db).details {
25962 GreenNodeDetails::Token(_) => Some(Self { node }),
25963 GreenNodeDetails::Node { .. } => None,
25964 }
25965 }
25966 fn as_syntax_node(&self) -> SyntaxNode<'db> {
25967 self.node
25968 }
25969 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
25970 TokenConstPtr(self.node.stable_ptr(db))
25971 }
25972}
25973#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
25974pub struct TerminalConst<'db> {
25975 node: SyntaxNode<'db>,
25976}
25977impl<'db> Terminal<'db> for TerminalConst<'db> {
25978 const KIND: SyntaxKind = SyntaxKind::TerminalConst;
25979 type TokenType = TokenConst<'db>;
25980 fn new_green(
25981 db: &'db dyn Database,
25982 leading_trivia: TriviaGreen<'db>,
25983 token: <<TerminalConst<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
25984 trailing_trivia: TriviaGreen<'db>,
25985 ) -> Self::Green {
25986 let children = [leading_trivia.0, token.0, trailing_trivia.0];
25987 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
25988 TerminalConstGreen(
25989 GreenNode {
25990 kind: SyntaxKind::TerminalConst,
25991 details: GreenNodeDetails::Node { children: children.into(), width },
25992 }
25993 .intern(db),
25994 )
25995 }
25996 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
25997 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
25998 unreachable!("Expected a node, not a token");
25999 };
26000 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26001 }
26002}
26003impl<'db> TerminalConst<'db> {
26004 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26005 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26006 }
26007 pub fn token(&self, db: &'db dyn Database) -> TokenConst<'db> {
26008 TokenConst::from_syntax_node(db, self.node.get_children(db)[1])
26009 }
26010 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26011 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26012 }
26013}
26014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26015pub struct TerminalConstPtr<'db>(pub SyntaxStablePtrId<'db>);
26016impl<'db> TerminalConstPtr<'db> {}
26017impl<'db> TypedStablePtr<'db> for TerminalConstPtr<'db> {
26018 type SyntaxNode = TerminalConst<'db>;
26019 fn untyped(self) -> SyntaxStablePtrId<'db> {
26020 self.0
26021 }
26022 fn lookup(&self, db: &'db dyn Database) -> TerminalConst<'db> {
26023 TerminalConst::from_syntax_node(db, self.0.lookup(db))
26024 }
26025}
26026impl<'db> From<TerminalConstPtr<'db>> for SyntaxStablePtrId<'db> {
26027 fn from(ptr: TerminalConstPtr<'db>) -> Self {
26028 ptr.untyped()
26029 }
26030}
26031#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26032pub struct TerminalConstGreen<'db>(pub GreenId<'db>);
26033impl<'db> TypedSyntaxNode<'db> for TerminalConst<'db> {
26034 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalConst);
26035 type StablePtr = TerminalConstPtr<'db>;
26036 type Green = TerminalConstGreen<'db>;
26037 fn missing(db: &'db dyn Database) -> Self::Green {
26038 TerminalConstGreen(
26039 GreenNode {
26040 kind: SyntaxKind::TerminalConst,
26041 details: GreenNodeDetails::Node {
26042 children: [
26043 Trivia::missing(db).0,
26044 TokenConst::missing(db).0,
26045 Trivia::missing(db).0,
26046 ]
26047 .into(),
26048 width: TextWidth::default(),
26049 },
26050 }
26051 .intern(db),
26052 )
26053 }
26054 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26055 let kind = node.kind(db);
26056 assert_eq!(
26057 kind,
26058 SyntaxKind::TerminalConst,
26059 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26060 kind,
26061 SyntaxKind::TerminalConst
26062 );
26063 Self { node }
26064 }
26065 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26066 let kind = node.kind(db);
26067 if kind == SyntaxKind::TerminalConst {
26068 Some(Self::from_syntax_node(db, node))
26069 } else {
26070 None
26071 }
26072 }
26073 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26074 self.node
26075 }
26076 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26077 TerminalConstPtr(self.node.stable_ptr(db))
26078 }
26079}
26080#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26081pub struct TokenElse<'db> {
26082 node: SyntaxNode<'db>,
26083}
26084impl<'db> Token<'db> for TokenElse<'db> {
26085 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26086 TokenElseGreen(
26087 GreenNode { kind: SyntaxKind::TokenElse, details: GreenNodeDetails::Token(text) }
26088 .intern(db),
26089 )
26090 }
26091 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26092 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26093 }
26094}
26095#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26096pub struct TokenElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26097impl<'db> TypedStablePtr<'db> for TokenElsePtr<'db> {
26098 type SyntaxNode = TokenElse<'db>;
26099 fn untyped(self) -> SyntaxStablePtrId<'db> {
26100 self.0
26101 }
26102 fn lookup(&self, db: &'db dyn Database) -> TokenElse<'db> {
26103 TokenElse::from_syntax_node(db, self.0.lookup(db))
26104 }
26105}
26106impl<'db> From<TokenElsePtr<'db>> for SyntaxStablePtrId<'db> {
26107 fn from(ptr: TokenElsePtr<'db>) -> Self {
26108 ptr.untyped()
26109 }
26110}
26111#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26112pub struct TokenElseGreen<'db>(pub GreenId<'db>);
26113impl<'db> TokenElseGreen<'db> {
26114 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26115 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26116 }
26117}
26118impl<'db> TypedSyntaxNode<'db> for TokenElse<'db> {
26119 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenElse);
26120 type StablePtr = TokenElsePtr<'db>;
26121 type Green = TokenElseGreen<'db>;
26122 fn missing(db: &'db dyn Database) -> Self::Green {
26123 TokenElseGreen(
26124 GreenNode {
26125 kind: SyntaxKind::TokenMissing,
26126 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26127 }
26128 .intern(db),
26129 )
26130 }
26131 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26132 match node.green_node(db).details {
26133 GreenNodeDetails::Token(_) => Self { node },
26134 GreenNodeDetails::Node { .. } => {
26135 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenElse)
26136 }
26137 }
26138 }
26139 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26140 match node.green_node(db).details {
26141 GreenNodeDetails::Token(_) => Some(Self { node }),
26142 GreenNodeDetails::Node { .. } => None,
26143 }
26144 }
26145 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26146 self.node
26147 }
26148 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26149 TokenElsePtr(self.node.stable_ptr(db))
26150 }
26151}
26152#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26153pub struct TerminalElse<'db> {
26154 node: SyntaxNode<'db>,
26155}
26156impl<'db> Terminal<'db> for TerminalElse<'db> {
26157 const KIND: SyntaxKind = SyntaxKind::TerminalElse;
26158 type TokenType = TokenElse<'db>;
26159 fn new_green(
26160 db: &'db dyn Database,
26161 leading_trivia: TriviaGreen<'db>,
26162 token: <<TerminalElse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26163 trailing_trivia: TriviaGreen<'db>,
26164 ) -> Self::Green {
26165 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26166 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26167 TerminalElseGreen(
26168 GreenNode {
26169 kind: SyntaxKind::TerminalElse,
26170 details: GreenNodeDetails::Node { children: children.into(), width },
26171 }
26172 .intern(db),
26173 )
26174 }
26175 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26176 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26177 unreachable!("Expected a node, not a token");
26178 };
26179 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26180 }
26181}
26182impl<'db> TerminalElse<'db> {
26183 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26184 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26185 }
26186 pub fn token(&self, db: &'db dyn Database) -> TokenElse<'db> {
26187 TokenElse::from_syntax_node(db, self.node.get_children(db)[1])
26188 }
26189 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26190 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26191 }
26192}
26193#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26194pub struct TerminalElsePtr<'db>(pub SyntaxStablePtrId<'db>);
26195impl<'db> TerminalElsePtr<'db> {}
26196impl<'db> TypedStablePtr<'db> for TerminalElsePtr<'db> {
26197 type SyntaxNode = TerminalElse<'db>;
26198 fn untyped(self) -> SyntaxStablePtrId<'db> {
26199 self.0
26200 }
26201 fn lookup(&self, db: &'db dyn Database) -> TerminalElse<'db> {
26202 TerminalElse::from_syntax_node(db, self.0.lookup(db))
26203 }
26204}
26205impl<'db> From<TerminalElsePtr<'db>> for SyntaxStablePtrId<'db> {
26206 fn from(ptr: TerminalElsePtr<'db>) -> Self {
26207 ptr.untyped()
26208 }
26209}
26210#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26211pub struct TerminalElseGreen<'db>(pub GreenId<'db>);
26212impl<'db> TypedSyntaxNode<'db> for TerminalElse<'db> {
26213 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalElse);
26214 type StablePtr = TerminalElsePtr<'db>;
26215 type Green = TerminalElseGreen<'db>;
26216 fn missing(db: &'db dyn Database) -> Self::Green {
26217 TerminalElseGreen(
26218 GreenNode {
26219 kind: SyntaxKind::TerminalElse,
26220 details: GreenNodeDetails::Node {
26221 children: [
26222 Trivia::missing(db).0,
26223 TokenElse::missing(db).0,
26224 Trivia::missing(db).0,
26225 ]
26226 .into(),
26227 width: TextWidth::default(),
26228 },
26229 }
26230 .intern(db),
26231 )
26232 }
26233 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26234 let kind = node.kind(db);
26235 assert_eq!(
26236 kind,
26237 SyntaxKind::TerminalElse,
26238 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26239 kind,
26240 SyntaxKind::TerminalElse
26241 );
26242 Self { node }
26243 }
26244 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26245 let kind = node.kind(db);
26246 if kind == SyntaxKind::TerminalElse { Some(Self::from_syntax_node(db, node)) } else { None }
26247 }
26248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26249 self.node
26250 }
26251 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26252 TerminalElsePtr(self.node.stable_ptr(db))
26253 }
26254}
26255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26256pub struct TokenEnum<'db> {
26257 node: SyntaxNode<'db>,
26258}
26259impl<'db> Token<'db> for TokenEnum<'db> {
26260 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26261 TokenEnumGreen(
26262 GreenNode { kind: SyntaxKind::TokenEnum, details: GreenNodeDetails::Token(text) }
26263 .intern(db),
26264 )
26265 }
26266 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26267 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26268 }
26269}
26270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26271pub struct TokenEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26272impl<'db> TypedStablePtr<'db> for TokenEnumPtr<'db> {
26273 type SyntaxNode = TokenEnum<'db>;
26274 fn untyped(self) -> SyntaxStablePtrId<'db> {
26275 self.0
26276 }
26277 fn lookup(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26278 TokenEnum::from_syntax_node(db, self.0.lookup(db))
26279 }
26280}
26281impl<'db> From<TokenEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26282 fn from(ptr: TokenEnumPtr<'db>) -> Self {
26283 ptr.untyped()
26284 }
26285}
26286#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26287pub struct TokenEnumGreen<'db>(pub GreenId<'db>);
26288impl<'db> TokenEnumGreen<'db> {
26289 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26290 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26291 }
26292}
26293impl<'db> TypedSyntaxNode<'db> for TokenEnum<'db> {
26294 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEnum);
26295 type StablePtr = TokenEnumPtr<'db>;
26296 type Green = TokenEnumGreen<'db>;
26297 fn missing(db: &'db dyn Database) -> Self::Green {
26298 TokenEnumGreen(
26299 GreenNode {
26300 kind: SyntaxKind::TokenMissing,
26301 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26302 }
26303 .intern(db),
26304 )
26305 }
26306 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26307 match node.green_node(db).details {
26308 GreenNodeDetails::Token(_) => Self { node },
26309 GreenNodeDetails::Node { .. } => {
26310 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEnum)
26311 }
26312 }
26313 }
26314 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26315 match node.green_node(db).details {
26316 GreenNodeDetails::Token(_) => Some(Self { node }),
26317 GreenNodeDetails::Node { .. } => None,
26318 }
26319 }
26320 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26321 self.node
26322 }
26323 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26324 TokenEnumPtr(self.node.stable_ptr(db))
26325 }
26326}
26327#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26328pub struct TerminalEnum<'db> {
26329 node: SyntaxNode<'db>,
26330}
26331impl<'db> Terminal<'db> for TerminalEnum<'db> {
26332 const KIND: SyntaxKind = SyntaxKind::TerminalEnum;
26333 type TokenType = TokenEnum<'db>;
26334 fn new_green(
26335 db: &'db dyn Database,
26336 leading_trivia: TriviaGreen<'db>,
26337 token: <<TerminalEnum<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26338 trailing_trivia: TriviaGreen<'db>,
26339 ) -> Self::Green {
26340 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26341 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26342 TerminalEnumGreen(
26343 GreenNode {
26344 kind: SyntaxKind::TerminalEnum,
26345 details: GreenNodeDetails::Node { children: children.into(), width },
26346 }
26347 .intern(db),
26348 )
26349 }
26350 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26351 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26352 unreachable!("Expected a node, not a token");
26353 };
26354 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26355 }
26356}
26357impl<'db> TerminalEnum<'db> {
26358 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26359 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26360 }
26361 pub fn token(&self, db: &'db dyn Database) -> TokenEnum<'db> {
26362 TokenEnum::from_syntax_node(db, self.node.get_children(db)[1])
26363 }
26364 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26365 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26366 }
26367}
26368#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26369pub struct TerminalEnumPtr<'db>(pub SyntaxStablePtrId<'db>);
26370impl<'db> TerminalEnumPtr<'db> {}
26371impl<'db> TypedStablePtr<'db> for TerminalEnumPtr<'db> {
26372 type SyntaxNode = TerminalEnum<'db>;
26373 fn untyped(self) -> SyntaxStablePtrId<'db> {
26374 self.0
26375 }
26376 fn lookup(&self, db: &'db dyn Database) -> TerminalEnum<'db> {
26377 TerminalEnum::from_syntax_node(db, self.0.lookup(db))
26378 }
26379}
26380impl<'db> From<TerminalEnumPtr<'db>> for SyntaxStablePtrId<'db> {
26381 fn from(ptr: TerminalEnumPtr<'db>) -> Self {
26382 ptr.untyped()
26383 }
26384}
26385#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26386pub struct TerminalEnumGreen<'db>(pub GreenId<'db>);
26387impl<'db> TypedSyntaxNode<'db> for TerminalEnum<'db> {
26388 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEnum);
26389 type StablePtr = TerminalEnumPtr<'db>;
26390 type Green = TerminalEnumGreen<'db>;
26391 fn missing(db: &'db dyn Database) -> Self::Green {
26392 TerminalEnumGreen(
26393 GreenNode {
26394 kind: SyntaxKind::TerminalEnum,
26395 details: GreenNodeDetails::Node {
26396 children: [
26397 Trivia::missing(db).0,
26398 TokenEnum::missing(db).0,
26399 Trivia::missing(db).0,
26400 ]
26401 .into(),
26402 width: TextWidth::default(),
26403 },
26404 }
26405 .intern(db),
26406 )
26407 }
26408 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26409 let kind = node.kind(db);
26410 assert_eq!(
26411 kind,
26412 SyntaxKind::TerminalEnum,
26413 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26414 kind,
26415 SyntaxKind::TerminalEnum
26416 );
26417 Self { node }
26418 }
26419 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26420 let kind = node.kind(db);
26421 if kind == SyntaxKind::TerminalEnum { Some(Self::from_syntax_node(db, node)) } else { None }
26422 }
26423 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26424 self.node
26425 }
26426 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26427 TerminalEnumPtr(self.node.stable_ptr(db))
26428 }
26429}
26430#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26431pub struct TokenExtern<'db> {
26432 node: SyntaxNode<'db>,
26433}
26434impl<'db> Token<'db> for TokenExtern<'db> {
26435 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26436 TokenExternGreen(
26437 GreenNode { kind: SyntaxKind::TokenExtern, details: GreenNodeDetails::Token(text) }
26438 .intern(db),
26439 )
26440 }
26441 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26442 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26443 }
26444}
26445#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26446pub struct TokenExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26447impl<'db> TypedStablePtr<'db> for TokenExternPtr<'db> {
26448 type SyntaxNode = TokenExtern<'db>;
26449 fn untyped(self) -> SyntaxStablePtrId<'db> {
26450 self.0
26451 }
26452 fn lookup(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26453 TokenExtern::from_syntax_node(db, self.0.lookup(db))
26454 }
26455}
26456impl<'db> From<TokenExternPtr<'db>> for SyntaxStablePtrId<'db> {
26457 fn from(ptr: TokenExternPtr<'db>) -> Self {
26458 ptr.untyped()
26459 }
26460}
26461#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26462pub struct TokenExternGreen<'db>(pub GreenId<'db>);
26463impl<'db> TokenExternGreen<'db> {
26464 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26465 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26466 }
26467}
26468impl<'db> TypedSyntaxNode<'db> for TokenExtern<'db> {
26469 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenExtern);
26470 type StablePtr = TokenExternPtr<'db>;
26471 type Green = TokenExternGreen<'db>;
26472 fn missing(db: &'db dyn Database) -> Self::Green {
26473 TokenExternGreen(
26474 GreenNode {
26475 kind: SyntaxKind::TokenMissing,
26476 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26477 }
26478 .intern(db),
26479 )
26480 }
26481 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26482 match node.green_node(db).details {
26483 GreenNodeDetails::Token(_) => Self { node },
26484 GreenNodeDetails::Node { .. } => {
26485 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenExtern)
26486 }
26487 }
26488 }
26489 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26490 match node.green_node(db).details {
26491 GreenNodeDetails::Token(_) => Some(Self { node }),
26492 GreenNodeDetails::Node { .. } => None,
26493 }
26494 }
26495 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26496 self.node
26497 }
26498 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26499 TokenExternPtr(self.node.stable_ptr(db))
26500 }
26501}
26502#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26503pub struct TerminalExtern<'db> {
26504 node: SyntaxNode<'db>,
26505}
26506impl<'db> Terminal<'db> for TerminalExtern<'db> {
26507 const KIND: SyntaxKind = SyntaxKind::TerminalExtern;
26508 type TokenType = TokenExtern<'db>;
26509 fn new_green(
26510 db: &'db dyn Database,
26511 leading_trivia: TriviaGreen<'db>,
26512 token: <<TerminalExtern<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26513 trailing_trivia: TriviaGreen<'db>,
26514 ) -> Self::Green {
26515 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26516 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26517 TerminalExternGreen(
26518 GreenNode {
26519 kind: SyntaxKind::TerminalExtern,
26520 details: GreenNodeDetails::Node { children: children.into(), width },
26521 }
26522 .intern(db),
26523 )
26524 }
26525 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26526 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26527 unreachable!("Expected a node, not a token");
26528 };
26529 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26530 }
26531}
26532impl<'db> TerminalExtern<'db> {
26533 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26534 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26535 }
26536 pub fn token(&self, db: &'db dyn Database) -> TokenExtern<'db> {
26537 TokenExtern::from_syntax_node(db, self.node.get_children(db)[1])
26538 }
26539 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26540 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26541 }
26542}
26543#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26544pub struct TerminalExternPtr<'db>(pub SyntaxStablePtrId<'db>);
26545impl<'db> TerminalExternPtr<'db> {}
26546impl<'db> TypedStablePtr<'db> for TerminalExternPtr<'db> {
26547 type SyntaxNode = TerminalExtern<'db>;
26548 fn untyped(self) -> SyntaxStablePtrId<'db> {
26549 self.0
26550 }
26551 fn lookup(&self, db: &'db dyn Database) -> TerminalExtern<'db> {
26552 TerminalExtern::from_syntax_node(db, self.0.lookup(db))
26553 }
26554}
26555impl<'db> From<TerminalExternPtr<'db>> for SyntaxStablePtrId<'db> {
26556 fn from(ptr: TerminalExternPtr<'db>) -> Self {
26557 ptr.untyped()
26558 }
26559}
26560#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26561pub struct TerminalExternGreen<'db>(pub GreenId<'db>);
26562impl<'db> TypedSyntaxNode<'db> for TerminalExtern<'db> {
26563 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalExtern);
26564 type StablePtr = TerminalExternPtr<'db>;
26565 type Green = TerminalExternGreen<'db>;
26566 fn missing(db: &'db dyn Database) -> Self::Green {
26567 TerminalExternGreen(
26568 GreenNode {
26569 kind: SyntaxKind::TerminalExtern,
26570 details: GreenNodeDetails::Node {
26571 children: [
26572 Trivia::missing(db).0,
26573 TokenExtern::missing(db).0,
26574 Trivia::missing(db).0,
26575 ]
26576 .into(),
26577 width: TextWidth::default(),
26578 },
26579 }
26580 .intern(db),
26581 )
26582 }
26583 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26584 let kind = node.kind(db);
26585 assert_eq!(
26586 kind,
26587 SyntaxKind::TerminalExtern,
26588 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26589 kind,
26590 SyntaxKind::TerminalExtern
26591 );
26592 Self { node }
26593 }
26594 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26595 let kind = node.kind(db);
26596 if kind == SyntaxKind::TerminalExtern {
26597 Some(Self::from_syntax_node(db, node))
26598 } else {
26599 None
26600 }
26601 }
26602 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26603 self.node
26604 }
26605 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26606 TerminalExternPtr(self.node.stable_ptr(db))
26607 }
26608}
26609#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26610pub struct TokenFalse<'db> {
26611 node: SyntaxNode<'db>,
26612}
26613impl<'db> Token<'db> for TokenFalse<'db> {
26614 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26615 TokenFalseGreen(
26616 GreenNode { kind: SyntaxKind::TokenFalse, details: GreenNodeDetails::Token(text) }
26617 .intern(db),
26618 )
26619 }
26620 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26621 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26622 }
26623}
26624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26625pub struct TokenFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26626impl<'db> TypedStablePtr<'db> for TokenFalsePtr<'db> {
26627 type SyntaxNode = TokenFalse<'db>;
26628 fn untyped(self) -> SyntaxStablePtrId<'db> {
26629 self.0
26630 }
26631 fn lookup(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26632 TokenFalse::from_syntax_node(db, self.0.lookup(db))
26633 }
26634}
26635impl<'db> From<TokenFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26636 fn from(ptr: TokenFalsePtr<'db>) -> Self {
26637 ptr.untyped()
26638 }
26639}
26640#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26641pub struct TokenFalseGreen<'db>(pub GreenId<'db>);
26642impl<'db> TokenFalseGreen<'db> {
26643 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26644 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26645 }
26646}
26647impl<'db> TypedSyntaxNode<'db> for TokenFalse<'db> {
26648 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFalse);
26649 type StablePtr = TokenFalsePtr<'db>;
26650 type Green = TokenFalseGreen<'db>;
26651 fn missing(db: &'db dyn Database) -> Self::Green {
26652 TokenFalseGreen(
26653 GreenNode {
26654 kind: SyntaxKind::TokenMissing,
26655 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26656 }
26657 .intern(db),
26658 )
26659 }
26660 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26661 match node.green_node(db).details {
26662 GreenNodeDetails::Token(_) => Self { node },
26663 GreenNodeDetails::Node { .. } => {
26664 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFalse)
26665 }
26666 }
26667 }
26668 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26669 match node.green_node(db).details {
26670 GreenNodeDetails::Token(_) => Some(Self { node }),
26671 GreenNodeDetails::Node { .. } => None,
26672 }
26673 }
26674 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26675 self.node
26676 }
26677 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26678 TokenFalsePtr(self.node.stable_ptr(db))
26679 }
26680}
26681#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26682pub struct TerminalFalse<'db> {
26683 node: SyntaxNode<'db>,
26684}
26685impl<'db> Terminal<'db> for TerminalFalse<'db> {
26686 const KIND: SyntaxKind = SyntaxKind::TerminalFalse;
26687 type TokenType = TokenFalse<'db>;
26688 fn new_green(
26689 db: &'db dyn Database,
26690 leading_trivia: TriviaGreen<'db>,
26691 token: <<TerminalFalse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26692 trailing_trivia: TriviaGreen<'db>,
26693 ) -> Self::Green {
26694 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26695 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26696 TerminalFalseGreen(
26697 GreenNode {
26698 kind: SyntaxKind::TerminalFalse,
26699 details: GreenNodeDetails::Node { children: children.into(), width },
26700 }
26701 .intern(db),
26702 )
26703 }
26704 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26705 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26706 unreachable!("Expected a node, not a token");
26707 };
26708 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26709 }
26710}
26711impl<'db> TerminalFalse<'db> {
26712 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26713 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26714 }
26715 pub fn token(&self, db: &'db dyn Database) -> TokenFalse<'db> {
26716 TokenFalse::from_syntax_node(db, self.node.get_children(db)[1])
26717 }
26718 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26719 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26720 }
26721}
26722#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26723pub struct TerminalFalsePtr<'db>(pub SyntaxStablePtrId<'db>);
26724impl<'db> TerminalFalsePtr<'db> {}
26725impl<'db> TypedStablePtr<'db> for TerminalFalsePtr<'db> {
26726 type SyntaxNode = TerminalFalse<'db>;
26727 fn untyped(self) -> SyntaxStablePtrId<'db> {
26728 self.0
26729 }
26730 fn lookup(&self, db: &'db dyn Database) -> TerminalFalse<'db> {
26731 TerminalFalse::from_syntax_node(db, self.0.lookup(db))
26732 }
26733}
26734impl<'db> From<TerminalFalsePtr<'db>> for SyntaxStablePtrId<'db> {
26735 fn from(ptr: TerminalFalsePtr<'db>) -> Self {
26736 ptr.untyped()
26737 }
26738}
26739#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26740pub struct TerminalFalseGreen<'db>(pub GreenId<'db>);
26741impl<'db> TypedSyntaxNode<'db> for TerminalFalse<'db> {
26742 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFalse);
26743 type StablePtr = TerminalFalsePtr<'db>;
26744 type Green = TerminalFalseGreen<'db>;
26745 fn missing(db: &'db dyn Database) -> Self::Green {
26746 TerminalFalseGreen(
26747 GreenNode {
26748 kind: SyntaxKind::TerminalFalse,
26749 details: GreenNodeDetails::Node {
26750 children: [
26751 Trivia::missing(db).0,
26752 TokenFalse::missing(db).0,
26753 Trivia::missing(db).0,
26754 ]
26755 .into(),
26756 width: TextWidth::default(),
26757 },
26758 }
26759 .intern(db),
26760 )
26761 }
26762 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26763 let kind = node.kind(db);
26764 assert_eq!(
26765 kind,
26766 SyntaxKind::TerminalFalse,
26767 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26768 kind,
26769 SyntaxKind::TerminalFalse
26770 );
26771 Self { node }
26772 }
26773 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26774 let kind = node.kind(db);
26775 if kind == SyntaxKind::TerminalFalse {
26776 Some(Self::from_syntax_node(db, node))
26777 } else {
26778 None
26779 }
26780 }
26781 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26782 self.node
26783 }
26784 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26785 TerminalFalsePtr(self.node.stable_ptr(db))
26786 }
26787}
26788#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26789pub struct TokenFunction<'db> {
26790 node: SyntaxNode<'db>,
26791}
26792impl<'db> Token<'db> for TokenFunction<'db> {
26793 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26794 TokenFunctionGreen(
26795 GreenNode { kind: SyntaxKind::TokenFunction, details: GreenNodeDetails::Token(text) }
26796 .intern(db),
26797 )
26798 }
26799 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26800 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26801 }
26802}
26803#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26804pub struct TokenFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26805impl<'db> TypedStablePtr<'db> for TokenFunctionPtr<'db> {
26806 type SyntaxNode = TokenFunction<'db>;
26807 fn untyped(self) -> SyntaxStablePtrId<'db> {
26808 self.0
26809 }
26810 fn lookup(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26811 TokenFunction::from_syntax_node(db, self.0.lookup(db))
26812 }
26813}
26814impl<'db> From<TokenFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26815 fn from(ptr: TokenFunctionPtr<'db>) -> Self {
26816 ptr.untyped()
26817 }
26818}
26819#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26820pub struct TokenFunctionGreen<'db>(pub GreenId<'db>);
26821impl<'db> TokenFunctionGreen<'db> {
26822 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26823 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
26824 }
26825}
26826impl<'db> TypedSyntaxNode<'db> for TokenFunction<'db> {
26827 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFunction);
26828 type StablePtr = TokenFunctionPtr<'db>;
26829 type Green = TokenFunctionGreen<'db>;
26830 fn missing(db: &'db dyn Database) -> Self::Green {
26831 TokenFunctionGreen(
26832 GreenNode {
26833 kind: SyntaxKind::TokenMissing,
26834 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
26835 }
26836 .intern(db),
26837 )
26838 }
26839 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26840 match node.green_node(db).details {
26841 GreenNodeDetails::Token(_) => Self { node },
26842 GreenNodeDetails::Node { .. } => {
26843 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFunction)
26844 }
26845 }
26846 }
26847 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26848 match node.green_node(db).details {
26849 GreenNodeDetails::Token(_) => Some(Self { node }),
26850 GreenNodeDetails::Node { .. } => None,
26851 }
26852 }
26853 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26854 self.node
26855 }
26856 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26857 TokenFunctionPtr(self.node.stable_ptr(db))
26858 }
26859}
26860#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26861pub struct TerminalFunction<'db> {
26862 node: SyntaxNode<'db>,
26863}
26864impl<'db> Terminal<'db> for TerminalFunction<'db> {
26865 const KIND: SyntaxKind = SyntaxKind::TerminalFunction;
26866 type TokenType = TokenFunction<'db>;
26867 fn new_green(
26868 db: &'db dyn Database,
26869 leading_trivia: TriviaGreen<'db>,
26870 token: <<TerminalFunction<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
26871 trailing_trivia: TriviaGreen<'db>,
26872 ) -> Self::Green {
26873 let children = [leading_trivia.0, token.0, trailing_trivia.0];
26874 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
26875 TerminalFunctionGreen(
26876 GreenNode {
26877 kind: SyntaxKind::TerminalFunction,
26878 details: GreenNodeDetails::Node { children: children.into(), width },
26879 }
26880 .intern(db),
26881 )
26882 }
26883 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26884 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
26885 unreachable!("Expected a node, not a token");
26886 };
26887 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
26888 }
26889}
26890impl<'db> TerminalFunction<'db> {
26891 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26892 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
26893 }
26894 pub fn token(&self, db: &'db dyn Database) -> TokenFunction<'db> {
26895 TokenFunction::from_syntax_node(db, self.node.get_children(db)[1])
26896 }
26897 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
26898 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
26899 }
26900}
26901#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26902pub struct TerminalFunctionPtr<'db>(pub SyntaxStablePtrId<'db>);
26903impl<'db> TerminalFunctionPtr<'db> {}
26904impl<'db> TypedStablePtr<'db> for TerminalFunctionPtr<'db> {
26905 type SyntaxNode = TerminalFunction<'db>;
26906 fn untyped(self) -> SyntaxStablePtrId<'db> {
26907 self.0
26908 }
26909 fn lookup(&self, db: &'db dyn Database) -> TerminalFunction<'db> {
26910 TerminalFunction::from_syntax_node(db, self.0.lookup(db))
26911 }
26912}
26913impl<'db> From<TerminalFunctionPtr<'db>> for SyntaxStablePtrId<'db> {
26914 fn from(ptr: TerminalFunctionPtr<'db>) -> Self {
26915 ptr.untyped()
26916 }
26917}
26918#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26919pub struct TerminalFunctionGreen<'db>(pub GreenId<'db>);
26920impl<'db> TypedSyntaxNode<'db> for TerminalFunction<'db> {
26921 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFunction);
26922 type StablePtr = TerminalFunctionPtr<'db>;
26923 type Green = TerminalFunctionGreen<'db>;
26924 fn missing(db: &'db dyn Database) -> Self::Green {
26925 TerminalFunctionGreen(
26926 GreenNode {
26927 kind: SyntaxKind::TerminalFunction,
26928 details: GreenNodeDetails::Node {
26929 children: [
26930 Trivia::missing(db).0,
26931 TokenFunction::missing(db).0,
26932 Trivia::missing(db).0,
26933 ]
26934 .into(),
26935 width: TextWidth::default(),
26936 },
26937 }
26938 .intern(db),
26939 )
26940 }
26941 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
26942 let kind = node.kind(db);
26943 assert_eq!(
26944 kind,
26945 SyntaxKind::TerminalFunction,
26946 "Unexpected SyntaxKind {:?}. Expected {:?}.",
26947 kind,
26948 SyntaxKind::TerminalFunction
26949 );
26950 Self { node }
26951 }
26952 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
26953 let kind = node.kind(db);
26954 if kind == SyntaxKind::TerminalFunction {
26955 Some(Self::from_syntax_node(db, node))
26956 } else {
26957 None
26958 }
26959 }
26960 fn as_syntax_node(&self) -> SyntaxNode<'db> {
26961 self.node
26962 }
26963 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
26964 TerminalFunctionPtr(self.node.stable_ptr(db))
26965 }
26966}
26967#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
26968pub struct TokenIf<'db> {
26969 node: SyntaxNode<'db>,
26970}
26971impl<'db> Token<'db> for TokenIf<'db> {
26972 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
26973 TokenIfGreen(
26974 GreenNode { kind: SyntaxKind::TokenIf, details: GreenNodeDetails::Token(text) }
26975 .intern(db),
26976 )
26977 }
26978 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
26979 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
26980 }
26981}
26982#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26983pub struct TokenIfPtr<'db>(pub SyntaxStablePtrId<'db>);
26984impl<'db> TypedStablePtr<'db> for TokenIfPtr<'db> {
26985 type SyntaxNode = TokenIf<'db>;
26986 fn untyped(self) -> SyntaxStablePtrId<'db> {
26987 self.0
26988 }
26989 fn lookup(&self, db: &'db dyn Database) -> TokenIf<'db> {
26990 TokenIf::from_syntax_node(db, self.0.lookup(db))
26991 }
26992}
26993impl<'db> From<TokenIfPtr<'db>> for SyntaxStablePtrId<'db> {
26994 fn from(ptr: TokenIfPtr<'db>) -> Self {
26995 ptr.untyped()
26996 }
26997}
26998#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
26999pub struct TokenIfGreen<'db>(pub GreenId<'db>);
27000impl<'db> TokenIfGreen<'db> {
27001 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27002 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27003 }
27004}
27005impl<'db> TypedSyntaxNode<'db> for TokenIf<'db> {
27006 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenIf);
27007 type StablePtr = TokenIfPtr<'db>;
27008 type Green = TokenIfGreen<'db>;
27009 fn missing(db: &'db dyn Database) -> Self::Green {
27010 TokenIfGreen(
27011 GreenNode {
27012 kind: SyntaxKind::TokenMissing,
27013 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27014 }
27015 .intern(db),
27016 )
27017 }
27018 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27019 match node.green_node(db).details {
27020 GreenNodeDetails::Token(_) => Self { node },
27021 GreenNodeDetails::Node { .. } => {
27022 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenIf)
27023 }
27024 }
27025 }
27026 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27027 match node.green_node(db).details {
27028 GreenNodeDetails::Token(_) => Some(Self { node }),
27029 GreenNodeDetails::Node { .. } => None,
27030 }
27031 }
27032 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27033 self.node
27034 }
27035 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27036 TokenIfPtr(self.node.stable_ptr(db))
27037 }
27038}
27039#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27040pub struct TerminalIf<'db> {
27041 node: SyntaxNode<'db>,
27042}
27043impl<'db> Terminal<'db> for TerminalIf<'db> {
27044 const KIND: SyntaxKind = SyntaxKind::TerminalIf;
27045 type TokenType = TokenIf<'db>;
27046 fn new_green(
27047 db: &'db dyn Database,
27048 leading_trivia: TriviaGreen<'db>,
27049 token: <<TerminalIf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27050 trailing_trivia: TriviaGreen<'db>,
27051 ) -> Self::Green {
27052 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27053 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27054 TerminalIfGreen(
27055 GreenNode {
27056 kind: SyntaxKind::TerminalIf,
27057 details: GreenNodeDetails::Node { children: children.into(), width },
27058 }
27059 .intern(db),
27060 )
27061 }
27062 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27063 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27064 unreachable!("Expected a node, not a token");
27065 };
27066 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27067 }
27068}
27069impl<'db> TerminalIf<'db> {
27070 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27071 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27072 }
27073 pub fn token(&self, db: &'db dyn Database) -> TokenIf<'db> {
27074 TokenIf::from_syntax_node(db, self.node.get_children(db)[1])
27075 }
27076 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27077 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27078 }
27079}
27080#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27081pub struct TerminalIfPtr<'db>(pub SyntaxStablePtrId<'db>);
27082impl<'db> TerminalIfPtr<'db> {}
27083impl<'db> TypedStablePtr<'db> for TerminalIfPtr<'db> {
27084 type SyntaxNode = TerminalIf<'db>;
27085 fn untyped(self) -> SyntaxStablePtrId<'db> {
27086 self.0
27087 }
27088 fn lookup(&self, db: &'db dyn Database) -> TerminalIf<'db> {
27089 TerminalIf::from_syntax_node(db, self.0.lookup(db))
27090 }
27091}
27092impl<'db> From<TerminalIfPtr<'db>> for SyntaxStablePtrId<'db> {
27093 fn from(ptr: TerminalIfPtr<'db>) -> Self {
27094 ptr.untyped()
27095 }
27096}
27097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27098pub struct TerminalIfGreen<'db>(pub GreenId<'db>);
27099impl<'db> TypedSyntaxNode<'db> for TerminalIf<'db> {
27100 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalIf);
27101 type StablePtr = TerminalIfPtr<'db>;
27102 type Green = TerminalIfGreen<'db>;
27103 fn missing(db: &'db dyn Database) -> Self::Green {
27104 TerminalIfGreen(
27105 GreenNode {
27106 kind: SyntaxKind::TerminalIf,
27107 details: GreenNodeDetails::Node {
27108 children: [
27109 Trivia::missing(db).0,
27110 TokenIf::missing(db).0,
27111 Trivia::missing(db).0,
27112 ]
27113 .into(),
27114 width: TextWidth::default(),
27115 },
27116 }
27117 .intern(db),
27118 )
27119 }
27120 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27121 let kind = node.kind(db);
27122 assert_eq!(
27123 kind,
27124 SyntaxKind::TerminalIf,
27125 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27126 kind,
27127 SyntaxKind::TerminalIf
27128 );
27129 Self { node }
27130 }
27131 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27132 let kind = node.kind(db);
27133 if kind == SyntaxKind::TerminalIf { Some(Self::from_syntax_node(db, node)) } else { None }
27134 }
27135 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27136 self.node
27137 }
27138 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27139 TerminalIfPtr(self.node.stable_ptr(db))
27140 }
27141}
27142#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27143pub struct TokenWhile<'db> {
27144 node: SyntaxNode<'db>,
27145}
27146impl<'db> Token<'db> for TokenWhile<'db> {
27147 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27148 TokenWhileGreen(
27149 GreenNode { kind: SyntaxKind::TokenWhile, details: GreenNodeDetails::Token(text) }
27150 .intern(db),
27151 )
27152 }
27153 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27154 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27155 }
27156}
27157#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27158pub struct TokenWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27159impl<'db> TypedStablePtr<'db> for TokenWhilePtr<'db> {
27160 type SyntaxNode = TokenWhile<'db>;
27161 fn untyped(self) -> SyntaxStablePtrId<'db> {
27162 self.0
27163 }
27164 fn lookup(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27165 TokenWhile::from_syntax_node(db, self.0.lookup(db))
27166 }
27167}
27168impl<'db> From<TokenWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27169 fn from(ptr: TokenWhilePtr<'db>) -> Self {
27170 ptr.untyped()
27171 }
27172}
27173#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27174pub struct TokenWhileGreen<'db>(pub GreenId<'db>);
27175impl<'db> TokenWhileGreen<'db> {
27176 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27177 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27178 }
27179}
27180impl<'db> TypedSyntaxNode<'db> for TokenWhile<'db> {
27181 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhile);
27182 type StablePtr = TokenWhilePtr<'db>;
27183 type Green = TokenWhileGreen<'db>;
27184 fn missing(db: &'db dyn Database) -> Self::Green {
27185 TokenWhileGreen(
27186 GreenNode {
27187 kind: SyntaxKind::TokenMissing,
27188 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27189 }
27190 .intern(db),
27191 )
27192 }
27193 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27194 match node.green_node(db).details {
27195 GreenNodeDetails::Token(_) => Self { node },
27196 GreenNodeDetails::Node { .. } => {
27197 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhile)
27198 }
27199 }
27200 }
27201 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27202 match node.green_node(db).details {
27203 GreenNodeDetails::Token(_) => Some(Self { node }),
27204 GreenNodeDetails::Node { .. } => None,
27205 }
27206 }
27207 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27208 self.node
27209 }
27210 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27211 TokenWhilePtr(self.node.stable_ptr(db))
27212 }
27213}
27214#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27215pub struct TerminalWhile<'db> {
27216 node: SyntaxNode<'db>,
27217}
27218impl<'db> Terminal<'db> for TerminalWhile<'db> {
27219 const KIND: SyntaxKind = SyntaxKind::TerminalWhile;
27220 type TokenType = TokenWhile<'db>;
27221 fn new_green(
27222 db: &'db dyn Database,
27223 leading_trivia: TriviaGreen<'db>,
27224 token: <<TerminalWhile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27225 trailing_trivia: TriviaGreen<'db>,
27226 ) -> Self::Green {
27227 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27228 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27229 TerminalWhileGreen(
27230 GreenNode {
27231 kind: SyntaxKind::TerminalWhile,
27232 details: GreenNodeDetails::Node { children: children.into(), width },
27233 }
27234 .intern(db),
27235 )
27236 }
27237 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27238 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27239 unreachable!("Expected a node, not a token");
27240 };
27241 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27242 }
27243}
27244impl<'db> TerminalWhile<'db> {
27245 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27246 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27247 }
27248 pub fn token(&self, db: &'db dyn Database) -> TokenWhile<'db> {
27249 TokenWhile::from_syntax_node(db, self.node.get_children(db)[1])
27250 }
27251 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27252 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27253 }
27254}
27255#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27256pub struct TerminalWhilePtr<'db>(pub SyntaxStablePtrId<'db>);
27257impl<'db> TerminalWhilePtr<'db> {}
27258impl<'db> TypedStablePtr<'db> for TerminalWhilePtr<'db> {
27259 type SyntaxNode = TerminalWhile<'db>;
27260 fn untyped(self) -> SyntaxStablePtrId<'db> {
27261 self.0
27262 }
27263 fn lookup(&self, db: &'db dyn Database) -> TerminalWhile<'db> {
27264 TerminalWhile::from_syntax_node(db, self.0.lookup(db))
27265 }
27266}
27267impl<'db> From<TerminalWhilePtr<'db>> for SyntaxStablePtrId<'db> {
27268 fn from(ptr: TerminalWhilePtr<'db>) -> Self {
27269 ptr.untyped()
27270 }
27271}
27272#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27273pub struct TerminalWhileGreen<'db>(pub GreenId<'db>);
27274impl<'db> TypedSyntaxNode<'db> for TerminalWhile<'db> {
27275 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalWhile);
27276 type StablePtr = TerminalWhilePtr<'db>;
27277 type Green = TerminalWhileGreen<'db>;
27278 fn missing(db: &'db dyn Database) -> Self::Green {
27279 TerminalWhileGreen(
27280 GreenNode {
27281 kind: SyntaxKind::TerminalWhile,
27282 details: GreenNodeDetails::Node {
27283 children: [
27284 Trivia::missing(db).0,
27285 TokenWhile::missing(db).0,
27286 Trivia::missing(db).0,
27287 ]
27288 .into(),
27289 width: TextWidth::default(),
27290 },
27291 }
27292 .intern(db),
27293 )
27294 }
27295 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27296 let kind = node.kind(db);
27297 assert_eq!(
27298 kind,
27299 SyntaxKind::TerminalWhile,
27300 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27301 kind,
27302 SyntaxKind::TerminalWhile
27303 );
27304 Self { node }
27305 }
27306 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27307 let kind = node.kind(db);
27308 if kind == SyntaxKind::TerminalWhile {
27309 Some(Self::from_syntax_node(db, node))
27310 } else {
27311 None
27312 }
27313 }
27314 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27315 self.node
27316 }
27317 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27318 TerminalWhilePtr(self.node.stable_ptr(db))
27319 }
27320}
27321#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27322pub struct TokenFor<'db> {
27323 node: SyntaxNode<'db>,
27324}
27325impl<'db> Token<'db> for TokenFor<'db> {
27326 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27327 TokenForGreen(
27328 GreenNode { kind: SyntaxKind::TokenFor, details: GreenNodeDetails::Token(text) }
27329 .intern(db),
27330 )
27331 }
27332 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27333 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27334 }
27335}
27336#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27337pub struct TokenForPtr<'db>(pub SyntaxStablePtrId<'db>);
27338impl<'db> TypedStablePtr<'db> for TokenForPtr<'db> {
27339 type SyntaxNode = TokenFor<'db>;
27340 fn untyped(self) -> SyntaxStablePtrId<'db> {
27341 self.0
27342 }
27343 fn lookup(&self, db: &'db dyn Database) -> TokenFor<'db> {
27344 TokenFor::from_syntax_node(db, self.0.lookup(db))
27345 }
27346}
27347impl<'db> From<TokenForPtr<'db>> for SyntaxStablePtrId<'db> {
27348 fn from(ptr: TokenForPtr<'db>) -> Self {
27349 ptr.untyped()
27350 }
27351}
27352#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27353pub struct TokenForGreen<'db>(pub GreenId<'db>);
27354impl<'db> TokenForGreen<'db> {
27355 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27356 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27357 }
27358}
27359impl<'db> TypedSyntaxNode<'db> for TokenFor<'db> {
27360 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenFor);
27361 type StablePtr = TokenForPtr<'db>;
27362 type Green = TokenForGreen<'db>;
27363 fn missing(db: &'db dyn Database) -> Self::Green {
27364 TokenForGreen(
27365 GreenNode {
27366 kind: SyntaxKind::TokenMissing,
27367 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27368 }
27369 .intern(db),
27370 )
27371 }
27372 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27373 match node.green_node(db).details {
27374 GreenNodeDetails::Token(_) => Self { node },
27375 GreenNodeDetails::Node { .. } => {
27376 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenFor)
27377 }
27378 }
27379 }
27380 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27381 match node.green_node(db).details {
27382 GreenNodeDetails::Token(_) => Some(Self { node }),
27383 GreenNodeDetails::Node { .. } => None,
27384 }
27385 }
27386 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27387 self.node
27388 }
27389 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27390 TokenForPtr(self.node.stable_ptr(db))
27391 }
27392}
27393#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27394pub struct TerminalFor<'db> {
27395 node: SyntaxNode<'db>,
27396}
27397impl<'db> Terminal<'db> for TerminalFor<'db> {
27398 const KIND: SyntaxKind = SyntaxKind::TerminalFor;
27399 type TokenType = TokenFor<'db>;
27400 fn new_green(
27401 db: &'db dyn Database,
27402 leading_trivia: TriviaGreen<'db>,
27403 token: <<TerminalFor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27404 trailing_trivia: TriviaGreen<'db>,
27405 ) -> Self::Green {
27406 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27407 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27408 TerminalForGreen(
27409 GreenNode {
27410 kind: SyntaxKind::TerminalFor,
27411 details: GreenNodeDetails::Node { children: children.into(), width },
27412 }
27413 .intern(db),
27414 )
27415 }
27416 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27417 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27418 unreachable!("Expected a node, not a token");
27419 };
27420 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27421 }
27422}
27423impl<'db> TerminalFor<'db> {
27424 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27425 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27426 }
27427 pub fn token(&self, db: &'db dyn Database) -> TokenFor<'db> {
27428 TokenFor::from_syntax_node(db, self.node.get_children(db)[1])
27429 }
27430 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27431 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27432 }
27433}
27434#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27435pub struct TerminalForPtr<'db>(pub SyntaxStablePtrId<'db>);
27436impl<'db> TerminalForPtr<'db> {}
27437impl<'db> TypedStablePtr<'db> for TerminalForPtr<'db> {
27438 type SyntaxNode = TerminalFor<'db>;
27439 fn untyped(self) -> SyntaxStablePtrId<'db> {
27440 self.0
27441 }
27442 fn lookup(&self, db: &'db dyn Database) -> TerminalFor<'db> {
27443 TerminalFor::from_syntax_node(db, self.0.lookup(db))
27444 }
27445}
27446impl<'db> From<TerminalForPtr<'db>> for SyntaxStablePtrId<'db> {
27447 fn from(ptr: TerminalForPtr<'db>) -> Self {
27448 ptr.untyped()
27449 }
27450}
27451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27452pub struct TerminalForGreen<'db>(pub GreenId<'db>);
27453impl<'db> TypedSyntaxNode<'db> for TerminalFor<'db> {
27454 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalFor);
27455 type StablePtr = TerminalForPtr<'db>;
27456 type Green = TerminalForGreen<'db>;
27457 fn missing(db: &'db dyn Database) -> Self::Green {
27458 TerminalForGreen(
27459 GreenNode {
27460 kind: SyntaxKind::TerminalFor,
27461 details: GreenNodeDetails::Node {
27462 children: [
27463 Trivia::missing(db).0,
27464 TokenFor::missing(db).0,
27465 Trivia::missing(db).0,
27466 ]
27467 .into(),
27468 width: TextWidth::default(),
27469 },
27470 }
27471 .intern(db),
27472 )
27473 }
27474 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27475 let kind = node.kind(db);
27476 assert_eq!(
27477 kind,
27478 SyntaxKind::TerminalFor,
27479 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27480 kind,
27481 SyntaxKind::TerminalFor
27482 );
27483 Self { node }
27484 }
27485 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27486 let kind = node.kind(db);
27487 if kind == SyntaxKind::TerminalFor { Some(Self::from_syntax_node(db, node)) } else { None }
27488 }
27489 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27490 self.node
27491 }
27492 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27493 TerminalForPtr(self.node.stable_ptr(db))
27494 }
27495}
27496#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27497pub struct TokenLoop<'db> {
27498 node: SyntaxNode<'db>,
27499}
27500impl<'db> Token<'db> for TokenLoop<'db> {
27501 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27502 TokenLoopGreen(
27503 GreenNode { kind: SyntaxKind::TokenLoop, details: GreenNodeDetails::Token(text) }
27504 .intern(db),
27505 )
27506 }
27507 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27508 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27509 }
27510}
27511#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27512pub struct TokenLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27513impl<'db> TypedStablePtr<'db> for TokenLoopPtr<'db> {
27514 type SyntaxNode = TokenLoop<'db>;
27515 fn untyped(self) -> SyntaxStablePtrId<'db> {
27516 self.0
27517 }
27518 fn lookup(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27519 TokenLoop::from_syntax_node(db, self.0.lookup(db))
27520 }
27521}
27522impl<'db> From<TokenLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27523 fn from(ptr: TokenLoopPtr<'db>) -> Self {
27524 ptr.untyped()
27525 }
27526}
27527#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27528pub struct TokenLoopGreen<'db>(pub GreenId<'db>);
27529impl<'db> TokenLoopGreen<'db> {
27530 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27531 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27532 }
27533}
27534impl<'db> TypedSyntaxNode<'db> for TokenLoop<'db> {
27535 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLoop);
27536 type StablePtr = TokenLoopPtr<'db>;
27537 type Green = TokenLoopGreen<'db>;
27538 fn missing(db: &'db dyn Database) -> Self::Green {
27539 TokenLoopGreen(
27540 GreenNode {
27541 kind: SyntaxKind::TokenMissing,
27542 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27543 }
27544 .intern(db),
27545 )
27546 }
27547 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27548 match node.green_node(db).details {
27549 GreenNodeDetails::Token(_) => Self { node },
27550 GreenNodeDetails::Node { .. } => {
27551 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLoop)
27552 }
27553 }
27554 }
27555 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27556 match node.green_node(db).details {
27557 GreenNodeDetails::Token(_) => Some(Self { node }),
27558 GreenNodeDetails::Node { .. } => None,
27559 }
27560 }
27561 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27562 self.node
27563 }
27564 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27565 TokenLoopPtr(self.node.stable_ptr(db))
27566 }
27567}
27568#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27569pub struct TerminalLoop<'db> {
27570 node: SyntaxNode<'db>,
27571}
27572impl<'db> Terminal<'db> for TerminalLoop<'db> {
27573 const KIND: SyntaxKind = SyntaxKind::TerminalLoop;
27574 type TokenType = TokenLoop<'db>;
27575 fn new_green(
27576 db: &'db dyn Database,
27577 leading_trivia: TriviaGreen<'db>,
27578 token: <<TerminalLoop<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27579 trailing_trivia: TriviaGreen<'db>,
27580 ) -> Self::Green {
27581 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27582 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27583 TerminalLoopGreen(
27584 GreenNode {
27585 kind: SyntaxKind::TerminalLoop,
27586 details: GreenNodeDetails::Node { children: children.into(), width },
27587 }
27588 .intern(db),
27589 )
27590 }
27591 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27592 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27593 unreachable!("Expected a node, not a token");
27594 };
27595 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27596 }
27597}
27598impl<'db> TerminalLoop<'db> {
27599 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27600 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27601 }
27602 pub fn token(&self, db: &'db dyn Database) -> TokenLoop<'db> {
27603 TokenLoop::from_syntax_node(db, self.node.get_children(db)[1])
27604 }
27605 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27606 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27607 }
27608}
27609#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27610pub struct TerminalLoopPtr<'db>(pub SyntaxStablePtrId<'db>);
27611impl<'db> TerminalLoopPtr<'db> {}
27612impl<'db> TypedStablePtr<'db> for TerminalLoopPtr<'db> {
27613 type SyntaxNode = TerminalLoop<'db>;
27614 fn untyped(self) -> SyntaxStablePtrId<'db> {
27615 self.0
27616 }
27617 fn lookup(&self, db: &'db dyn Database) -> TerminalLoop<'db> {
27618 TerminalLoop::from_syntax_node(db, self.0.lookup(db))
27619 }
27620}
27621impl<'db> From<TerminalLoopPtr<'db>> for SyntaxStablePtrId<'db> {
27622 fn from(ptr: TerminalLoopPtr<'db>) -> Self {
27623 ptr.untyped()
27624 }
27625}
27626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27627pub struct TerminalLoopGreen<'db>(pub GreenId<'db>);
27628impl<'db> TypedSyntaxNode<'db> for TerminalLoop<'db> {
27629 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLoop);
27630 type StablePtr = TerminalLoopPtr<'db>;
27631 type Green = TerminalLoopGreen<'db>;
27632 fn missing(db: &'db dyn Database) -> Self::Green {
27633 TerminalLoopGreen(
27634 GreenNode {
27635 kind: SyntaxKind::TerminalLoop,
27636 details: GreenNodeDetails::Node {
27637 children: [
27638 Trivia::missing(db).0,
27639 TokenLoop::missing(db).0,
27640 Trivia::missing(db).0,
27641 ]
27642 .into(),
27643 width: TextWidth::default(),
27644 },
27645 }
27646 .intern(db),
27647 )
27648 }
27649 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27650 let kind = node.kind(db);
27651 assert_eq!(
27652 kind,
27653 SyntaxKind::TerminalLoop,
27654 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27655 kind,
27656 SyntaxKind::TerminalLoop
27657 );
27658 Self { node }
27659 }
27660 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27661 let kind = node.kind(db);
27662 if kind == SyntaxKind::TerminalLoop { Some(Self::from_syntax_node(db, node)) } else { None }
27663 }
27664 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27665 self.node
27666 }
27667 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27668 TerminalLoopPtr(self.node.stable_ptr(db))
27669 }
27670}
27671#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27672pub struct TokenImpl<'db> {
27673 node: SyntaxNode<'db>,
27674}
27675impl<'db> Token<'db> for TokenImpl<'db> {
27676 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27677 TokenImplGreen(
27678 GreenNode { kind: SyntaxKind::TokenImpl, details: GreenNodeDetails::Token(text) }
27679 .intern(db),
27680 )
27681 }
27682 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27683 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27684 }
27685}
27686#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27687pub struct TokenImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27688impl<'db> TypedStablePtr<'db> for TokenImplPtr<'db> {
27689 type SyntaxNode = TokenImpl<'db>;
27690 fn untyped(self) -> SyntaxStablePtrId<'db> {
27691 self.0
27692 }
27693 fn lookup(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27694 TokenImpl::from_syntax_node(db, self.0.lookup(db))
27695 }
27696}
27697impl<'db> From<TokenImplPtr<'db>> for SyntaxStablePtrId<'db> {
27698 fn from(ptr: TokenImplPtr<'db>) -> Self {
27699 ptr.untyped()
27700 }
27701}
27702#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27703pub struct TokenImplGreen<'db>(pub GreenId<'db>);
27704impl<'db> TokenImplGreen<'db> {
27705 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27706 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27707 }
27708}
27709impl<'db> TypedSyntaxNode<'db> for TokenImpl<'db> {
27710 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImpl);
27711 type StablePtr = TokenImplPtr<'db>;
27712 type Green = TokenImplGreen<'db>;
27713 fn missing(db: &'db dyn Database) -> Self::Green {
27714 TokenImplGreen(
27715 GreenNode {
27716 kind: SyntaxKind::TokenMissing,
27717 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27718 }
27719 .intern(db),
27720 )
27721 }
27722 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27723 match node.green_node(db).details {
27724 GreenNodeDetails::Token(_) => Self { node },
27725 GreenNodeDetails::Node { .. } => {
27726 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImpl)
27727 }
27728 }
27729 }
27730 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27731 match node.green_node(db).details {
27732 GreenNodeDetails::Token(_) => Some(Self { node }),
27733 GreenNodeDetails::Node { .. } => None,
27734 }
27735 }
27736 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27737 self.node
27738 }
27739 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27740 TokenImplPtr(self.node.stable_ptr(db))
27741 }
27742}
27743#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27744pub struct TerminalImpl<'db> {
27745 node: SyntaxNode<'db>,
27746}
27747impl<'db> Terminal<'db> for TerminalImpl<'db> {
27748 const KIND: SyntaxKind = SyntaxKind::TerminalImpl;
27749 type TokenType = TokenImpl<'db>;
27750 fn new_green(
27751 db: &'db dyn Database,
27752 leading_trivia: TriviaGreen<'db>,
27753 token: <<TerminalImpl<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27754 trailing_trivia: TriviaGreen<'db>,
27755 ) -> Self::Green {
27756 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27757 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27758 TerminalImplGreen(
27759 GreenNode {
27760 kind: SyntaxKind::TerminalImpl,
27761 details: GreenNodeDetails::Node { children: children.into(), width },
27762 }
27763 .intern(db),
27764 )
27765 }
27766 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27767 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27768 unreachable!("Expected a node, not a token");
27769 };
27770 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27771 }
27772}
27773impl<'db> TerminalImpl<'db> {
27774 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27775 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27776 }
27777 pub fn token(&self, db: &'db dyn Database) -> TokenImpl<'db> {
27778 TokenImpl::from_syntax_node(db, self.node.get_children(db)[1])
27779 }
27780 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27781 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27782 }
27783}
27784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27785pub struct TerminalImplPtr<'db>(pub SyntaxStablePtrId<'db>);
27786impl<'db> TerminalImplPtr<'db> {}
27787impl<'db> TypedStablePtr<'db> for TerminalImplPtr<'db> {
27788 type SyntaxNode = TerminalImpl<'db>;
27789 fn untyped(self) -> SyntaxStablePtrId<'db> {
27790 self.0
27791 }
27792 fn lookup(&self, db: &'db dyn Database) -> TerminalImpl<'db> {
27793 TerminalImpl::from_syntax_node(db, self.0.lookup(db))
27794 }
27795}
27796impl<'db> From<TerminalImplPtr<'db>> for SyntaxStablePtrId<'db> {
27797 fn from(ptr: TerminalImplPtr<'db>) -> Self {
27798 ptr.untyped()
27799 }
27800}
27801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27802pub struct TerminalImplGreen<'db>(pub GreenId<'db>);
27803impl<'db> TypedSyntaxNode<'db> for TerminalImpl<'db> {
27804 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImpl);
27805 type StablePtr = TerminalImplPtr<'db>;
27806 type Green = TerminalImplGreen<'db>;
27807 fn missing(db: &'db dyn Database) -> Self::Green {
27808 TerminalImplGreen(
27809 GreenNode {
27810 kind: SyntaxKind::TerminalImpl,
27811 details: GreenNodeDetails::Node {
27812 children: [
27813 Trivia::missing(db).0,
27814 TokenImpl::missing(db).0,
27815 Trivia::missing(db).0,
27816 ]
27817 .into(),
27818 width: TextWidth::default(),
27819 },
27820 }
27821 .intern(db),
27822 )
27823 }
27824 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27825 let kind = node.kind(db);
27826 assert_eq!(
27827 kind,
27828 SyntaxKind::TerminalImpl,
27829 "Unexpected SyntaxKind {:?}. Expected {:?}.",
27830 kind,
27831 SyntaxKind::TerminalImpl
27832 );
27833 Self { node }
27834 }
27835 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27836 let kind = node.kind(db);
27837 if kind == SyntaxKind::TerminalImpl { Some(Self::from_syntax_node(db, node)) } else { None }
27838 }
27839 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27840 self.node
27841 }
27842 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27843 TerminalImplPtr(self.node.stable_ptr(db))
27844 }
27845}
27846#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27847pub struct TokenImplicits<'db> {
27848 node: SyntaxNode<'db>,
27849}
27850impl<'db> Token<'db> for TokenImplicits<'db> {
27851 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
27852 TokenImplicitsGreen(
27853 GreenNode { kind: SyntaxKind::TokenImplicits, details: GreenNodeDetails::Token(text) }
27854 .intern(db),
27855 )
27856 }
27857 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27858 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
27859 }
27860}
27861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27862pub struct TokenImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27863impl<'db> TypedStablePtr<'db> for TokenImplicitsPtr<'db> {
27864 type SyntaxNode = TokenImplicits<'db>;
27865 fn untyped(self) -> SyntaxStablePtrId<'db> {
27866 self.0
27867 }
27868 fn lookup(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27869 TokenImplicits::from_syntax_node(db, self.0.lookup(db))
27870 }
27871}
27872impl<'db> From<TokenImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27873 fn from(ptr: TokenImplicitsPtr<'db>) -> Self {
27874 ptr.untyped()
27875 }
27876}
27877#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27878pub struct TokenImplicitsGreen<'db>(pub GreenId<'db>);
27879impl<'db> TokenImplicitsGreen<'db> {
27880 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27881 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
27882 }
27883}
27884impl<'db> TypedSyntaxNode<'db> for TokenImplicits<'db> {
27885 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenImplicits);
27886 type StablePtr = TokenImplicitsPtr<'db>;
27887 type Green = TokenImplicitsGreen<'db>;
27888 fn missing(db: &'db dyn Database) -> Self::Green {
27889 TokenImplicitsGreen(
27890 GreenNode {
27891 kind: SyntaxKind::TokenMissing,
27892 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
27893 }
27894 .intern(db),
27895 )
27896 }
27897 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
27898 match node.green_node(db).details {
27899 GreenNodeDetails::Token(_) => Self { node },
27900 GreenNodeDetails::Node { .. } => {
27901 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenImplicits)
27902 }
27903 }
27904 }
27905 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
27906 match node.green_node(db).details {
27907 GreenNodeDetails::Token(_) => Some(Self { node }),
27908 GreenNodeDetails::Node { .. } => None,
27909 }
27910 }
27911 fn as_syntax_node(&self) -> SyntaxNode<'db> {
27912 self.node
27913 }
27914 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
27915 TokenImplicitsPtr(self.node.stable_ptr(db))
27916 }
27917}
27918#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
27919pub struct TerminalImplicits<'db> {
27920 node: SyntaxNode<'db>,
27921}
27922impl<'db> Terminal<'db> for TerminalImplicits<'db> {
27923 const KIND: SyntaxKind = SyntaxKind::TerminalImplicits;
27924 type TokenType = TokenImplicits<'db>;
27925 fn new_green(
27926 db: &'db dyn Database,
27927 leading_trivia: TriviaGreen<'db>,
27928 token: <<TerminalImplicits<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
27929 trailing_trivia: TriviaGreen<'db>,
27930 ) -> Self::Green {
27931 let children = [leading_trivia.0, token.0, trailing_trivia.0];
27932 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
27933 TerminalImplicitsGreen(
27934 GreenNode {
27935 kind: SyntaxKind::TerminalImplicits,
27936 details: GreenNodeDetails::Node { children: children.into(), width },
27937 }
27938 .intern(db),
27939 )
27940 }
27941 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
27942 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
27943 unreachable!("Expected a node, not a token");
27944 };
27945 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
27946 }
27947}
27948impl<'db> TerminalImplicits<'db> {
27949 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27950 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
27951 }
27952 pub fn token(&self, db: &'db dyn Database) -> TokenImplicits<'db> {
27953 TokenImplicits::from_syntax_node(db, self.node.get_children(db)[1])
27954 }
27955 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
27956 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
27957 }
27958}
27959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27960pub struct TerminalImplicitsPtr<'db>(pub SyntaxStablePtrId<'db>);
27961impl<'db> TerminalImplicitsPtr<'db> {}
27962impl<'db> TypedStablePtr<'db> for TerminalImplicitsPtr<'db> {
27963 type SyntaxNode = TerminalImplicits<'db>;
27964 fn untyped(self) -> SyntaxStablePtrId<'db> {
27965 self.0
27966 }
27967 fn lookup(&self, db: &'db dyn Database) -> TerminalImplicits<'db> {
27968 TerminalImplicits::from_syntax_node(db, self.0.lookup(db))
27969 }
27970}
27971impl<'db> From<TerminalImplicitsPtr<'db>> for SyntaxStablePtrId<'db> {
27972 fn from(ptr: TerminalImplicitsPtr<'db>) -> Self {
27973 ptr.untyped()
27974 }
27975}
27976#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
27977pub struct TerminalImplicitsGreen<'db>(pub GreenId<'db>);
27978impl<'db> TypedSyntaxNode<'db> for TerminalImplicits<'db> {
27979 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalImplicits);
27980 type StablePtr = TerminalImplicitsPtr<'db>;
27981 type Green = TerminalImplicitsGreen<'db>;
27982 fn missing(db: &'db dyn Database) -> Self::Green {
27983 TerminalImplicitsGreen(
27984 GreenNode {
27985 kind: SyntaxKind::TerminalImplicits,
27986 details: GreenNodeDetails::Node {
27987 children: [
27988 Trivia::missing(db).0,
27989 TokenImplicits::missing(db).0,
27990 Trivia::missing(db).0,
27991 ]
27992 .into(),
27993 width: TextWidth::default(),
27994 },
27995 }
27996 .intern(db),
27997 )
27998 }
27999 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28000 let kind = node.kind(db);
28001 assert_eq!(
28002 kind,
28003 SyntaxKind::TerminalImplicits,
28004 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28005 kind,
28006 SyntaxKind::TerminalImplicits
28007 );
28008 Self { node }
28009 }
28010 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28011 let kind = node.kind(db);
28012 if kind == SyntaxKind::TerminalImplicits {
28013 Some(Self::from_syntax_node(db, node))
28014 } else {
28015 None
28016 }
28017 }
28018 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28019 self.node
28020 }
28021 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28022 TerminalImplicitsPtr(self.node.stable_ptr(db))
28023 }
28024}
28025#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28026pub struct TokenLet<'db> {
28027 node: SyntaxNode<'db>,
28028}
28029impl<'db> Token<'db> for TokenLet<'db> {
28030 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28031 TokenLetGreen(
28032 GreenNode { kind: SyntaxKind::TokenLet, details: GreenNodeDetails::Token(text) }
28033 .intern(db),
28034 )
28035 }
28036 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28037 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28038 }
28039}
28040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28041pub struct TokenLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28042impl<'db> TypedStablePtr<'db> for TokenLetPtr<'db> {
28043 type SyntaxNode = TokenLet<'db>;
28044 fn untyped(self) -> SyntaxStablePtrId<'db> {
28045 self.0
28046 }
28047 fn lookup(&self, db: &'db dyn Database) -> TokenLet<'db> {
28048 TokenLet::from_syntax_node(db, self.0.lookup(db))
28049 }
28050}
28051impl<'db> From<TokenLetPtr<'db>> for SyntaxStablePtrId<'db> {
28052 fn from(ptr: TokenLetPtr<'db>) -> Self {
28053 ptr.untyped()
28054 }
28055}
28056#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28057pub struct TokenLetGreen<'db>(pub GreenId<'db>);
28058impl<'db> TokenLetGreen<'db> {
28059 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28060 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28061 }
28062}
28063impl<'db> TypedSyntaxNode<'db> for TokenLet<'db> {
28064 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLet);
28065 type StablePtr = TokenLetPtr<'db>;
28066 type Green = TokenLetGreen<'db>;
28067 fn missing(db: &'db dyn Database) -> Self::Green {
28068 TokenLetGreen(
28069 GreenNode {
28070 kind: SyntaxKind::TokenMissing,
28071 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28072 }
28073 .intern(db),
28074 )
28075 }
28076 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28077 match node.green_node(db).details {
28078 GreenNodeDetails::Token(_) => Self { node },
28079 GreenNodeDetails::Node { .. } => {
28080 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLet)
28081 }
28082 }
28083 }
28084 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28085 match node.green_node(db).details {
28086 GreenNodeDetails::Token(_) => Some(Self { node }),
28087 GreenNodeDetails::Node { .. } => None,
28088 }
28089 }
28090 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28091 self.node
28092 }
28093 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28094 TokenLetPtr(self.node.stable_ptr(db))
28095 }
28096}
28097#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28098pub struct TerminalLet<'db> {
28099 node: SyntaxNode<'db>,
28100}
28101impl<'db> Terminal<'db> for TerminalLet<'db> {
28102 const KIND: SyntaxKind = SyntaxKind::TerminalLet;
28103 type TokenType = TokenLet<'db>;
28104 fn new_green(
28105 db: &'db dyn Database,
28106 leading_trivia: TriviaGreen<'db>,
28107 token: <<TerminalLet<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28108 trailing_trivia: TriviaGreen<'db>,
28109 ) -> Self::Green {
28110 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28111 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28112 TerminalLetGreen(
28113 GreenNode {
28114 kind: SyntaxKind::TerminalLet,
28115 details: GreenNodeDetails::Node { children: children.into(), width },
28116 }
28117 .intern(db),
28118 )
28119 }
28120 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28121 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28122 unreachable!("Expected a node, not a token");
28123 };
28124 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28125 }
28126}
28127impl<'db> TerminalLet<'db> {
28128 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28129 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28130 }
28131 pub fn token(&self, db: &'db dyn Database) -> TokenLet<'db> {
28132 TokenLet::from_syntax_node(db, self.node.get_children(db)[1])
28133 }
28134 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28135 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28136 }
28137}
28138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28139pub struct TerminalLetPtr<'db>(pub SyntaxStablePtrId<'db>);
28140impl<'db> TerminalLetPtr<'db> {}
28141impl<'db> TypedStablePtr<'db> for TerminalLetPtr<'db> {
28142 type SyntaxNode = TerminalLet<'db>;
28143 fn untyped(self) -> SyntaxStablePtrId<'db> {
28144 self.0
28145 }
28146 fn lookup(&self, db: &'db dyn Database) -> TerminalLet<'db> {
28147 TerminalLet::from_syntax_node(db, self.0.lookup(db))
28148 }
28149}
28150impl<'db> From<TerminalLetPtr<'db>> for SyntaxStablePtrId<'db> {
28151 fn from(ptr: TerminalLetPtr<'db>) -> Self {
28152 ptr.untyped()
28153 }
28154}
28155#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28156pub struct TerminalLetGreen<'db>(pub GreenId<'db>);
28157impl<'db> TypedSyntaxNode<'db> for TerminalLet<'db> {
28158 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLet);
28159 type StablePtr = TerminalLetPtr<'db>;
28160 type Green = TerminalLetGreen<'db>;
28161 fn missing(db: &'db dyn Database) -> Self::Green {
28162 TerminalLetGreen(
28163 GreenNode {
28164 kind: SyntaxKind::TerminalLet,
28165 details: GreenNodeDetails::Node {
28166 children: [
28167 Trivia::missing(db).0,
28168 TokenLet::missing(db).0,
28169 Trivia::missing(db).0,
28170 ]
28171 .into(),
28172 width: TextWidth::default(),
28173 },
28174 }
28175 .intern(db),
28176 )
28177 }
28178 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28179 let kind = node.kind(db);
28180 assert_eq!(
28181 kind,
28182 SyntaxKind::TerminalLet,
28183 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28184 kind,
28185 SyntaxKind::TerminalLet
28186 );
28187 Self { node }
28188 }
28189 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28190 let kind = node.kind(db);
28191 if kind == SyntaxKind::TerminalLet { Some(Self::from_syntax_node(db, node)) } else { None }
28192 }
28193 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28194 self.node
28195 }
28196 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28197 TerminalLetPtr(self.node.stable_ptr(db))
28198 }
28199}
28200#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28201pub struct TokenMacro<'db> {
28202 node: SyntaxNode<'db>,
28203}
28204impl<'db> Token<'db> for TokenMacro<'db> {
28205 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28206 TokenMacroGreen(
28207 GreenNode { kind: SyntaxKind::TokenMacro, details: GreenNodeDetails::Token(text) }
28208 .intern(db),
28209 )
28210 }
28211 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28212 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28213 }
28214}
28215#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28216pub struct TokenMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28217impl<'db> TypedStablePtr<'db> for TokenMacroPtr<'db> {
28218 type SyntaxNode = TokenMacro<'db>;
28219 fn untyped(self) -> SyntaxStablePtrId<'db> {
28220 self.0
28221 }
28222 fn lookup(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28223 TokenMacro::from_syntax_node(db, self.0.lookup(db))
28224 }
28225}
28226impl<'db> From<TokenMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28227 fn from(ptr: TokenMacroPtr<'db>) -> Self {
28228 ptr.untyped()
28229 }
28230}
28231#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28232pub struct TokenMacroGreen<'db>(pub GreenId<'db>);
28233impl<'db> TokenMacroGreen<'db> {
28234 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28235 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28236 }
28237}
28238impl<'db> TypedSyntaxNode<'db> for TokenMacro<'db> {
28239 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMacro);
28240 type StablePtr = TokenMacroPtr<'db>;
28241 type Green = TokenMacroGreen<'db>;
28242 fn missing(db: &'db dyn Database) -> Self::Green {
28243 TokenMacroGreen(
28244 GreenNode {
28245 kind: SyntaxKind::TokenMissing,
28246 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28247 }
28248 .intern(db),
28249 )
28250 }
28251 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28252 match node.green_node(db).details {
28253 GreenNodeDetails::Token(_) => Self { node },
28254 GreenNodeDetails::Node { .. } => {
28255 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMacro)
28256 }
28257 }
28258 }
28259 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28260 match node.green_node(db).details {
28261 GreenNodeDetails::Token(_) => Some(Self { node }),
28262 GreenNodeDetails::Node { .. } => None,
28263 }
28264 }
28265 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28266 self.node
28267 }
28268 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28269 TokenMacroPtr(self.node.stable_ptr(db))
28270 }
28271}
28272#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28273pub struct TerminalMacro<'db> {
28274 node: SyntaxNode<'db>,
28275}
28276impl<'db> Terminal<'db> for TerminalMacro<'db> {
28277 const KIND: SyntaxKind = SyntaxKind::TerminalMacro;
28278 type TokenType = TokenMacro<'db>;
28279 fn new_green(
28280 db: &'db dyn Database,
28281 leading_trivia: TriviaGreen<'db>,
28282 token: <<TerminalMacro<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28283 trailing_trivia: TriviaGreen<'db>,
28284 ) -> Self::Green {
28285 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28286 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28287 TerminalMacroGreen(
28288 GreenNode {
28289 kind: SyntaxKind::TerminalMacro,
28290 details: GreenNodeDetails::Node { children: children.into(), width },
28291 }
28292 .intern(db),
28293 )
28294 }
28295 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28296 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28297 unreachable!("Expected a node, not a token");
28298 };
28299 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28300 }
28301}
28302impl<'db> TerminalMacro<'db> {
28303 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28304 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28305 }
28306 pub fn token(&self, db: &'db dyn Database) -> TokenMacro<'db> {
28307 TokenMacro::from_syntax_node(db, self.node.get_children(db)[1])
28308 }
28309 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28310 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28311 }
28312}
28313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28314pub struct TerminalMacroPtr<'db>(pub SyntaxStablePtrId<'db>);
28315impl<'db> TerminalMacroPtr<'db> {}
28316impl<'db> TypedStablePtr<'db> for TerminalMacroPtr<'db> {
28317 type SyntaxNode = TerminalMacro<'db>;
28318 fn untyped(self) -> SyntaxStablePtrId<'db> {
28319 self.0
28320 }
28321 fn lookup(&self, db: &'db dyn Database) -> TerminalMacro<'db> {
28322 TerminalMacro::from_syntax_node(db, self.0.lookup(db))
28323 }
28324}
28325impl<'db> From<TerminalMacroPtr<'db>> for SyntaxStablePtrId<'db> {
28326 fn from(ptr: TerminalMacroPtr<'db>) -> Self {
28327 ptr.untyped()
28328 }
28329}
28330#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28331pub struct TerminalMacroGreen<'db>(pub GreenId<'db>);
28332impl<'db> TypedSyntaxNode<'db> for TerminalMacro<'db> {
28333 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMacro);
28334 type StablePtr = TerminalMacroPtr<'db>;
28335 type Green = TerminalMacroGreen<'db>;
28336 fn missing(db: &'db dyn Database) -> Self::Green {
28337 TerminalMacroGreen(
28338 GreenNode {
28339 kind: SyntaxKind::TerminalMacro,
28340 details: GreenNodeDetails::Node {
28341 children: [
28342 Trivia::missing(db).0,
28343 TokenMacro::missing(db).0,
28344 Trivia::missing(db).0,
28345 ]
28346 .into(),
28347 width: TextWidth::default(),
28348 },
28349 }
28350 .intern(db),
28351 )
28352 }
28353 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28354 let kind = node.kind(db);
28355 assert_eq!(
28356 kind,
28357 SyntaxKind::TerminalMacro,
28358 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28359 kind,
28360 SyntaxKind::TerminalMacro
28361 );
28362 Self { node }
28363 }
28364 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28365 let kind = node.kind(db);
28366 if kind == SyntaxKind::TerminalMacro {
28367 Some(Self::from_syntax_node(db, node))
28368 } else {
28369 None
28370 }
28371 }
28372 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28373 self.node
28374 }
28375 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28376 TerminalMacroPtr(self.node.stable_ptr(db))
28377 }
28378}
28379#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28380pub struct TokenMatch<'db> {
28381 node: SyntaxNode<'db>,
28382}
28383impl<'db> Token<'db> for TokenMatch<'db> {
28384 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28385 TokenMatchGreen(
28386 GreenNode { kind: SyntaxKind::TokenMatch, details: GreenNodeDetails::Token(text) }
28387 .intern(db),
28388 )
28389 }
28390 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28391 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28392 }
28393}
28394#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28395pub struct TokenMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28396impl<'db> TypedStablePtr<'db> for TokenMatchPtr<'db> {
28397 type SyntaxNode = TokenMatch<'db>;
28398 fn untyped(self) -> SyntaxStablePtrId<'db> {
28399 self.0
28400 }
28401 fn lookup(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28402 TokenMatch::from_syntax_node(db, self.0.lookup(db))
28403 }
28404}
28405impl<'db> From<TokenMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28406 fn from(ptr: TokenMatchPtr<'db>) -> Self {
28407 ptr.untyped()
28408 }
28409}
28410#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28411pub struct TokenMatchGreen<'db>(pub GreenId<'db>);
28412impl<'db> TokenMatchGreen<'db> {
28413 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28414 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28415 }
28416}
28417impl<'db> TypedSyntaxNode<'db> for TokenMatch<'db> {
28418 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatch);
28419 type StablePtr = TokenMatchPtr<'db>;
28420 type Green = TokenMatchGreen<'db>;
28421 fn missing(db: &'db dyn Database) -> Self::Green {
28422 TokenMatchGreen(
28423 GreenNode {
28424 kind: SyntaxKind::TokenMissing,
28425 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28426 }
28427 .intern(db),
28428 )
28429 }
28430 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28431 match node.green_node(db).details {
28432 GreenNodeDetails::Token(_) => Self { node },
28433 GreenNodeDetails::Node { .. } => {
28434 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatch)
28435 }
28436 }
28437 }
28438 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28439 match node.green_node(db).details {
28440 GreenNodeDetails::Token(_) => Some(Self { node }),
28441 GreenNodeDetails::Node { .. } => None,
28442 }
28443 }
28444 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28445 self.node
28446 }
28447 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28448 TokenMatchPtr(self.node.stable_ptr(db))
28449 }
28450}
28451#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28452pub struct TerminalMatch<'db> {
28453 node: SyntaxNode<'db>,
28454}
28455impl<'db> Terminal<'db> for TerminalMatch<'db> {
28456 const KIND: SyntaxKind = SyntaxKind::TerminalMatch;
28457 type TokenType = TokenMatch<'db>;
28458 fn new_green(
28459 db: &'db dyn Database,
28460 leading_trivia: TriviaGreen<'db>,
28461 token: <<TerminalMatch<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28462 trailing_trivia: TriviaGreen<'db>,
28463 ) -> Self::Green {
28464 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28465 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28466 TerminalMatchGreen(
28467 GreenNode {
28468 kind: SyntaxKind::TerminalMatch,
28469 details: GreenNodeDetails::Node { children: children.into(), width },
28470 }
28471 .intern(db),
28472 )
28473 }
28474 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28475 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28476 unreachable!("Expected a node, not a token");
28477 };
28478 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28479 }
28480}
28481impl<'db> TerminalMatch<'db> {
28482 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28483 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28484 }
28485 pub fn token(&self, db: &'db dyn Database) -> TokenMatch<'db> {
28486 TokenMatch::from_syntax_node(db, self.node.get_children(db)[1])
28487 }
28488 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28489 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28490 }
28491}
28492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28493pub struct TerminalMatchPtr<'db>(pub SyntaxStablePtrId<'db>);
28494impl<'db> TerminalMatchPtr<'db> {}
28495impl<'db> TypedStablePtr<'db> for TerminalMatchPtr<'db> {
28496 type SyntaxNode = TerminalMatch<'db>;
28497 fn untyped(self) -> SyntaxStablePtrId<'db> {
28498 self.0
28499 }
28500 fn lookup(&self, db: &'db dyn Database) -> TerminalMatch<'db> {
28501 TerminalMatch::from_syntax_node(db, self.0.lookup(db))
28502 }
28503}
28504impl<'db> From<TerminalMatchPtr<'db>> for SyntaxStablePtrId<'db> {
28505 fn from(ptr: TerminalMatchPtr<'db>) -> Self {
28506 ptr.untyped()
28507 }
28508}
28509#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28510pub struct TerminalMatchGreen<'db>(pub GreenId<'db>);
28511impl<'db> TypedSyntaxNode<'db> for TerminalMatch<'db> {
28512 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatch);
28513 type StablePtr = TerminalMatchPtr<'db>;
28514 type Green = TerminalMatchGreen<'db>;
28515 fn missing(db: &'db dyn Database) -> Self::Green {
28516 TerminalMatchGreen(
28517 GreenNode {
28518 kind: SyntaxKind::TerminalMatch,
28519 details: GreenNodeDetails::Node {
28520 children: [
28521 Trivia::missing(db).0,
28522 TokenMatch::missing(db).0,
28523 Trivia::missing(db).0,
28524 ]
28525 .into(),
28526 width: TextWidth::default(),
28527 },
28528 }
28529 .intern(db),
28530 )
28531 }
28532 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28533 let kind = node.kind(db);
28534 assert_eq!(
28535 kind,
28536 SyntaxKind::TerminalMatch,
28537 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28538 kind,
28539 SyntaxKind::TerminalMatch
28540 );
28541 Self { node }
28542 }
28543 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28544 let kind = node.kind(db);
28545 if kind == SyntaxKind::TerminalMatch {
28546 Some(Self::from_syntax_node(db, node))
28547 } else {
28548 None
28549 }
28550 }
28551 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28552 self.node
28553 }
28554 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28555 TerminalMatchPtr(self.node.stable_ptr(db))
28556 }
28557}
28558#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28559pub struct TokenModule<'db> {
28560 node: SyntaxNode<'db>,
28561}
28562impl<'db> Token<'db> for TokenModule<'db> {
28563 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28564 TokenModuleGreen(
28565 GreenNode { kind: SyntaxKind::TokenModule, details: GreenNodeDetails::Token(text) }
28566 .intern(db),
28567 )
28568 }
28569 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28570 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28571 }
28572}
28573#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28574pub struct TokenModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28575impl<'db> TypedStablePtr<'db> for TokenModulePtr<'db> {
28576 type SyntaxNode = TokenModule<'db>;
28577 fn untyped(self) -> SyntaxStablePtrId<'db> {
28578 self.0
28579 }
28580 fn lookup(&self, db: &'db dyn Database) -> TokenModule<'db> {
28581 TokenModule::from_syntax_node(db, self.0.lookup(db))
28582 }
28583}
28584impl<'db> From<TokenModulePtr<'db>> for SyntaxStablePtrId<'db> {
28585 fn from(ptr: TokenModulePtr<'db>) -> Self {
28586 ptr.untyped()
28587 }
28588}
28589#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28590pub struct TokenModuleGreen<'db>(pub GreenId<'db>);
28591impl<'db> TokenModuleGreen<'db> {
28592 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28593 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28594 }
28595}
28596impl<'db> TypedSyntaxNode<'db> for TokenModule<'db> {
28597 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModule);
28598 type StablePtr = TokenModulePtr<'db>;
28599 type Green = TokenModuleGreen<'db>;
28600 fn missing(db: &'db dyn Database) -> Self::Green {
28601 TokenModuleGreen(
28602 GreenNode {
28603 kind: SyntaxKind::TokenMissing,
28604 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28605 }
28606 .intern(db),
28607 )
28608 }
28609 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28610 match node.green_node(db).details {
28611 GreenNodeDetails::Token(_) => Self { node },
28612 GreenNodeDetails::Node { .. } => {
28613 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModule)
28614 }
28615 }
28616 }
28617 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28618 match node.green_node(db).details {
28619 GreenNodeDetails::Token(_) => Some(Self { node }),
28620 GreenNodeDetails::Node { .. } => None,
28621 }
28622 }
28623 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28624 self.node
28625 }
28626 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28627 TokenModulePtr(self.node.stable_ptr(db))
28628 }
28629}
28630#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28631pub struct TerminalModule<'db> {
28632 node: SyntaxNode<'db>,
28633}
28634impl<'db> Terminal<'db> for TerminalModule<'db> {
28635 const KIND: SyntaxKind = SyntaxKind::TerminalModule;
28636 type TokenType = TokenModule<'db>;
28637 fn new_green(
28638 db: &'db dyn Database,
28639 leading_trivia: TriviaGreen<'db>,
28640 token: <<TerminalModule<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28641 trailing_trivia: TriviaGreen<'db>,
28642 ) -> Self::Green {
28643 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28644 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28645 TerminalModuleGreen(
28646 GreenNode {
28647 kind: SyntaxKind::TerminalModule,
28648 details: GreenNodeDetails::Node { children: children.into(), width },
28649 }
28650 .intern(db),
28651 )
28652 }
28653 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28654 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28655 unreachable!("Expected a node, not a token");
28656 };
28657 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28658 }
28659}
28660impl<'db> TerminalModule<'db> {
28661 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28662 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28663 }
28664 pub fn token(&self, db: &'db dyn Database) -> TokenModule<'db> {
28665 TokenModule::from_syntax_node(db, self.node.get_children(db)[1])
28666 }
28667 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28668 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28669 }
28670}
28671#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28672pub struct TerminalModulePtr<'db>(pub SyntaxStablePtrId<'db>);
28673impl<'db> TerminalModulePtr<'db> {}
28674impl<'db> TypedStablePtr<'db> for TerminalModulePtr<'db> {
28675 type SyntaxNode = TerminalModule<'db>;
28676 fn untyped(self) -> SyntaxStablePtrId<'db> {
28677 self.0
28678 }
28679 fn lookup(&self, db: &'db dyn Database) -> TerminalModule<'db> {
28680 TerminalModule::from_syntax_node(db, self.0.lookup(db))
28681 }
28682}
28683impl<'db> From<TerminalModulePtr<'db>> for SyntaxStablePtrId<'db> {
28684 fn from(ptr: TerminalModulePtr<'db>) -> Self {
28685 ptr.untyped()
28686 }
28687}
28688#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28689pub struct TerminalModuleGreen<'db>(pub GreenId<'db>);
28690impl<'db> TypedSyntaxNode<'db> for TerminalModule<'db> {
28691 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModule);
28692 type StablePtr = TerminalModulePtr<'db>;
28693 type Green = TerminalModuleGreen<'db>;
28694 fn missing(db: &'db dyn Database) -> Self::Green {
28695 TerminalModuleGreen(
28696 GreenNode {
28697 kind: SyntaxKind::TerminalModule,
28698 details: GreenNodeDetails::Node {
28699 children: [
28700 Trivia::missing(db).0,
28701 TokenModule::missing(db).0,
28702 Trivia::missing(db).0,
28703 ]
28704 .into(),
28705 width: TextWidth::default(),
28706 },
28707 }
28708 .intern(db),
28709 )
28710 }
28711 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28712 let kind = node.kind(db);
28713 assert_eq!(
28714 kind,
28715 SyntaxKind::TerminalModule,
28716 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28717 kind,
28718 SyntaxKind::TerminalModule
28719 );
28720 Self { node }
28721 }
28722 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28723 let kind = node.kind(db);
28724 if kind == SyntaxKind::TerminalModule {
28725 Some(Self::from_syntax_node(db, node))
28726 } else {
28727 None
28728 }
28729 }
28730 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28731 self.node
28732 }
28733 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28734 TerminalModulePtr(self.node.stable_ptr(db))
28735 }
28736}
28737#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28738pub struct TokenMut<'db> {
28739 node: SyntaxNode<'db>,
28740}
28741impl<'db> Token<'db> for TokenMut<'db> {
28742 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28743 TokenMutGreen(
28744 GreenNode { kind: SyntaxKind::TokenMut, details: GreenNodeDetails::Token(text) }
28745 .intern(db),
28746 )
28747 }
28748 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28749 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28750 }
28751}
28752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28753pub struct TokenMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28754impl<'db> TypedStablePtr<'db> for TokenMutPtr<'db> {
28755 type SyntaxNode = TokenMut<'db>;
28756 fn untyped(self) -> SyntaxStablePtrId<'db> {
28757 self.0
28758 }
28759 fn lookup(&self, db: &'db dyn Database) -> TokenMut<'db> {
28760 TokenMut::from_syntax_node(db, self.0.lookup(db))
28761 }
28762}
28763impl<'db> From<TokenMutPtr<'db>> for SyntaxStablePtrId<'db> {
28764 fn from(ptr: TokenMutPtr<'db>) -> Self {
28765 ptr.untyped()
28766 }
28767}
28768#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28769pub struct TokenMutGreen<'db>(pub GreenId<'db>);
28770impl<'db> TokenMutGreen<'db> {
28771 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28772 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28773 }
28774}
28775impl<'db> TypedSyntaxNode<'db> for TokenMut<'db> {
28776 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMut);
28777 type StablePtr = TokenMutPtr<'db>;
28778 type Green = TokenMutGreen<'db>;
28779 fn missing(db: &'db dyn Database) -> Self::Green {
28780 TokenMutGreen(
28781 GreenNode {
28782 kind: SyntaxKind::TokenMissing,
28783 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28784 }
28785 .intern(db),
28786 )
28787 }
28788 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28789 match node.green_node(db).details {
28790 GreenNodeDetails::Token(_) => Self { node },
28791 GreenNodeDetails::Node { .. } => {
28792 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMut)
28793 }
28794 }
28795 }
28796 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28797 match node.green_node(db).details {
28798 GreenNodeDetails::Token(_) => Some(Self { node }),
28799 GreenNodeDetails::Node { .. } => None,
28800 }
28801 }
28802 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28803 self.node
28804 }
28805 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28806 TokenMutPtr(self.node.stable_ptr(db))
28807 }
28808}
28809#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28810pub struct TerminalMut<'db> {
28811 node: SyntaxNode<'db>,
28812}
28813impl<'db> Terminal<'db> for TerminalMut<'db> {
28814 const KIND: SyntaxKind = SyntaxKind::TerminalMut;
28815 type TokenType = TokenMut<'db>;
28816 fn new_green(
28817 db: &'db dyn Database,
28818 leading_trivia: TriviaGreen<'db>,
28819 token: <<TerminalMut<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28820 trailing_trivia: TriviaGreen<'db>,
28821 ) -> Self::Green {
28822 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28823 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28824 TerminalMutGreen(
28825 GreenNode {
28826 kind: SyntaxKind::TerminalMut,
28827 details: GreenNodeDetails::Node { children: children.into(), width },
28828 }
28829 .intern(db),
28830 )
28831 }
28832 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28833 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
28834 unreachable!("Expected a node, not a token");
28835 };
28836 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
28837 }
28838}
28839impl<'db> TerminalMut<'db> {
28840 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28841 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
28842 }
28843 pub fn token(&self, db: &'db dyn Database) -> TokenMut<'db> {
28844 TokenMut::from_syntax_node(db, self.node.get_children(db)[1])
28845 }
28846 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
28847 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
28848 }
28849}
28850#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28851pub struct TerminalMutPtr<'db>(pub SyntaxStablePtrId<'db>);
28852impl<'db> TerminalMutPtr<'db> {}
28853impl<'db> TypedStablePtr<'db> for TerminalMutPtr<'db> {
28854 type SyntaxNode = TerminalMut<'db>;
28855 fn untyped(self) -> SyntaxStablePtrId<'db> {
28856 self.0
28857 }
28858 fn lookup(&self, db: &'db dyn Database) -> TerminalMut<'db> {
28859 TerminalMut::from_syntax_node(db, self.0.lookup(db))
28860 }
28861}
28862impl<'db> From<TerminalMutPtr<'db>> for SyntaxStablePtrId<'db> {
28863 fn from(ptr: TerminalMutPtr<'db>) -> Self {
28864 ptr.untyped()
28865 }
28866}
28867#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28868pub struct TerminalMutGreen<'db>(pub GreenId<'db>);
28869impl<'db> TypedSyntaxNode<'db> for TerminalMut<'db> {
28870 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMut);
28871 type StablePtr = TerminalMutPtr<'db>;
28872 type Green = TerminalMutGreen<'db>;
28873 fn missing(db: &'db dyn Database) -> Self::Green {
28874 TerminalMutGreen(
28875 GreenNode {
28876 kind: SyntaxKind::TerminalMut,
28877 details: GreenNodeDetails::Node {
28878 children: [
28879 Trivia::missing(db).0,
28880 TokenMut::missing(db).0,
28881 Trivia::missing(db).0,
28882 ]
28883 .into(),
28884 width: TextWidth::default(),
28885 },
28886 }
28887 .intern(db),
28888 )
28889 }
28890 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28891 let kind = node.kind(db);
28892 assert_eq!(
28893 kind,
28894 SyntaxKind::TerminalMut,
28895 "Unexpected SyntaxKind {:?}. Expected {:?}.",
28896 kind,
28897 SyntaxKind::TerminalMut
28898 );
28899 Self { node }
28900 }
28901 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28902 let kind = node.kind(db);
28903 if kind == SyntaxKind::TerminalMut { Some(Self::from_syntax_node(db, node)) } else { None }
28904 }
28905 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28906 self.node
28907 }
28908 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28909 TerminalMutPtr(self.node.stable_ptr(db))
28910 }
28911}
28912#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28913pub struct TokenNoPanic<'db> {
28914 node: SyntaxNode<'db>,
28915}
28916impl<'db> Token<'db> for TokenNoPanic<'db> {
28917 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
28918 TokenNoPanicGreen(
28919 GreenNode { kind: SyntaxKind::TokenNoPanic, details: GreenNodeDetails::Token(text) }
28920 .intern(db),
28921 )
28922 }
28923 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28924 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
28925 }
28926}
28927#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28928pub struct TokenNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
28929impl<'db> TypedStablePtr<'db> for TokenNoPanicPtr<'db> {
28930 type SyntaxNode = TokenNoPanic<'db>;
28931 fn untyped(self) -> SyntaxStablePtrId<'db> {
28932 self.0
28933 }
28934 fn lookup(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
28935 TokenNoPanic::from_syntax_node(db, self.0.lookup(db))
28936 }
28937}
28938impl<'db> From<TokenNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
28939 fn from(ptr: TokenNoPanicPtr<'db>) -> Self {
28940 ptr.untyped()
28941 }
28942}
28943#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
28944pub struct TokenNoPanicGreen<'db>(pub GreenId<'db>);
28945impl<'db> TokenNoPanicGreen<'db> {
28946 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
28947 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
28948 }
28949}
28950impl<'db> TypedSyntaxNode<'db> for TokenNoPanic<'db> {
28951 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNoPanic);
28952 type StablePtr = TokenNoPanicPtr<'db>;
28953 type Green = TokenNoPanicGreen<'db>;
28954 fn missing(db: &'db dyn Database) -> Self::Green {
28955 TokenNoPanicGreen(
28956 GreenNode {
28957 kind: SyntaxKind::TokenMissing,
28958 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
28959 }
28960 .intern(db),
28961 )
28962 }
28963 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
28964 match node.green_node(db).details {
28965 GreenNodeDetails::Token(_) => Self { node },
28966 GreenNodeDetails::Node { .. } => {
28967 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNoPanic)
28968 }
28969 }
28970 }
28971 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
28972 match node.green_node(db).details {
28973 GreenNodeDetails::Token(_) => Some(Self { node }),
28974 GreenNodeDetails::Node { .. } => None,
28975 }
28976 }
28977 fn as_syntax_node(&self) -> SyntaxNode<'db> {
28978 self.node
28979 }
28980 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
28981 TokenNoPanicPtr(self.node.stable_ptr(db))
28982 }
28983}
28984#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
28985pub struct TerminalNoPanic<'db> {
28986 node: SyntaxNode<'db>,
28987}
28988impl<'db> Terminal<'db> for TerminalNoPanic<'db> {
28989 const KIND: SyntaxKind = SyntaxKind::TerminalNoPanic;
28990 type TokenType = TokenNoPanic<'db>;
28991 fn new_green(
28992 db: &'db dyn Database,
28993 leading_trivia: TriviaGreen<'db>,
28994 token: <<TerminalNoPanic<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
28995 trailing_trivia: TriviaGreen<'db>,
28996 ) -> Self::Green {
28997 let children = [leading_trivia.0, token.0, trailing_trivia.0];
28998 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
28999 TerminalNoPanicGreen(
29000 GreenNode {
29001 kind: SyntaxKind::TerminalNoPanic,
29002 details: GreenNodeDetails::Node { children: children.into(), width },
29003 }
29004 .intern(db),
29005 )
29006 }
29007 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29008 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29009 unreachable!("Expected a node, not a token");
29010 };
29011 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29012 }
29013}
29014impl<'db> TerminalNoPanic<'db> {
29015 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29016 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29017 }
29018 pub fn token(&self, db: &'db dyn Database) -> TokenNoPanic<'db> {
29019 TokenNoPanic::from_syntax_node(db, self.node.get_children(db)[1])
29020 }
29021 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29022 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29023 }
29024}
29025#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29026pub struct TerminalNoPanicPtr<'db>(pub SyntaxStablePtrId<'db>);
29027impl<'db> TerminalNoPanicPtr<'db> {}
29028impl<'db> TypedStablePtr<'db> for TerminalNoPanicPtr<'db> {
29029 type SyntaxNode = TerminalNoPanic<'db>;
29030 fn untyped(self) -> SyntaxStablePtrId<'db> {
29031 self.0
29032 }
29033 fn lookup(&self, db: &'db dyn Database) -> TerminalNoPanic<'db> {
29034 TerminalNoPanic::from_syntax_node(db, self.0.lookup(db))
29035 }
29036}
29037impl<'db> From<TerminalNoPanicPtr<'db>> for SyntaxStablePtrId<'db> {
29038 fn from(ptr: TerminalNoPanicPtr<'db>) -> Self {
29039 ptr.untyped()
29040 }
29041}
29042#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29043pub struct TerminalNoPanicGreen<'db>(pub GreenId<'db>);
29044impl<'db> TypedSyntaxNode<'db> for TerminalNoPanic<'db> {
29045 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNoPanic);
29046 type StablePtr = TerminalNoPanicPtr<'db>;
29047 type Green = TerminalNoPanicGreen<'db>;
29048 fn missing(db: &'db dyn Database) -> Self::Green {
29049 TerminalNoPanicGreen(
29050 GreenNode {
29051 kind: SyntaxKind::TerminalNoPanic,
29052 details: GreenNodeDetails::Node {
29053 children: [
29054 Trivia::missing(db).0,
29055 TokenNoPanic::missing(db).0,
29056 Trivia::missing(db).0,
29057 ]
29058 .into(),
29059 width: TextWidth::default(),
29060 },
29061 }
29062 .intern(db),
29063 )
29064 }
29065 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29066 let kind = node.kind(db);
29067 assert_eq!(
29068 kind,
29069 SyntaxKind::TerminalNoPanic,
29070 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29071 kind,
29072 SyntaxKind::TerminalNoPanic
29073 );
29074 Self { node }
29075 }
29076 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29077 let kind = node.kind(db);
29078 if kind == SyntaxKind::TerminalNoPanic {
29079 Some(Self::from_syntax_node(db, node))
29080 } else {
29081 None
29082 }
29083 }
29084 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29085 self.node
29086 }
29087 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29088 TerminalNoPanicPtr(self.node.stable_ptr(db))
29089 }
29090}
29091#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29092pub struct TokenOf<'db> {
29093 node: SyntaxNode<'db>,
29094}
29095impl<'db> Token<'db> for TokenOf<'db> {
29096 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29097 TokenOfGreen(
29098 GreenNode { kind: SyntaxKind::TokenOf, details: GreenNodeDetails::Token(text) }
29099 .intern(db),
29100 )
29101 }
29102 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29103 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29104 }
29105}
29106#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29107pub struct TokenOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29108impl<'db> TypedStablePtr<'db> for TokenOfPtr<'db> {
29109 type SyntaxNode = TokenOf<'db>;
29110 fn untyped(self) -> SyntaxStablePtrId<'db> {
29111 self.0
29112 }
29113 fn lookup(&self, db: &'db dyn Database) -> TokenOf<'db> {
29114 TokenOf::from_syntax_node(db, self.0.lookup(db))
29115 }
29116}
29117impl<'db> From<TokenOfPtr<'db>> for SyntaxStablePtrId<'db> {
29118 fn from(ptr: TokenOfPtr<'db>) -> Self {
29119 ptr.untyped()
29120 }
29121}
29122#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29123pub struct TokenOfGreen<'db>(pub GreenId<'db>);
29124impl<'db> TokenOfGreen<'db> {
29125 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29126 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29127 }
29128}
29129impl<'db> TypedSyntaxNode<'db> for TokenOf<'db> {
29130 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOf);
29131 type StablePtr = TokenOfPtr<'db>;
29132 type Green = TokenOfGreen<'db>;
29133 fn missing(db: &'db dyn Database) -> Self::Green {
29134 TokenOfGreen(
29135 GreenNode {
29136 kind: SyntaxKind::TokenMissing,
29137 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29138 }
29139 .intern(db),
29140 )
29141 }
29142 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29143 match node.green_node(db).details {
29144 GreenNodeDetails::Token(_) => Self { node },
29145 GreenNodeDetails::Node { .. } => {
29146 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOf)
29147 }
29148 }
29149 }
29150 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29151 match node.green_node(db).details {
29152 GreenNodeDetails::Token(_) => Some(Self { node }),
29153 GreenNodeDetails::Node { .. } => None,
29154 }
29155 }
29156 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29157 self.node
29158 }
29159 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29160 TokenOfPtr(self.node.stable_ptr(db))
29161 }
29162}
29163#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29164pub struct TerminalOf<'db> {
29165 node: SyntaxNode<'db>,
29166}
29167impl<'db> Terminal<'db> for TerminalOf<'db> {
29168 const KIND: SyntaxKind = SyntaxKind::TerminalOf;
29169 type TokenType = TokenOf<'db>;
29170 fn new_green(
29171 db: &'db dyn Database,
29172 leading_trivia: TriviaGreen<'db>,
29173 token: <<TerminalOf<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29174 trailing_trivia: TriviaGreen<'db>,
29175 ) -> Self::Green {
29176 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29177 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29178 TerminalOfGreen(
29179 GreenNode {
29180 kind: SyntaxKind::TerminalOf,
29181 details: GreenNodeDetails::Node { children: children.into(), width },
29182 }
29183 .intern(db),
29184 )
29185 }
29186 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29187 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29188 unreachable!("Expected a node, not a token");
29189 };
29190 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29191 }
29192}
29193impl<'db> TerminalOf<'db> {
29194 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29195 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29196 }
29197 pub fn token(&self, db: &'db dyn Database) -> TokenOf<'db> {
29198 TokenOf::from_syntax_node(db, self.node.get_children(db)[1])
29199 }
29200 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29201 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29202 }
29203}
29204#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29205pub struct TerminalOfPtr<'db>(pub SyntaxStablePtrId<'db>);
29206impl<'db> TerminalOfPtr<'db> {}
29207impl<'db> TypedStablePtr<'db> for TerminalOfPtr<'db> {
29208 type SyntaxNode = TerminalOf<'db>;
29209 fn untyped(self) -> SyntaxStablePtrId<'db> {
29210 self.0
29211 }
29212 fn lookup(&self, db: &'db dyn Database) -> TerminalOf<'db> {
29213 TerminalOf::from_syntax_node(db, self.0.lookup(db))
29214 }
29215}
29216impl<'db> From<TerminalOfPtr<'db>> for SyntaxStablePtrId<'db> {
29217 fn from(ptr: TerminalOfPtr<'db>) -> Self {
29218 ptr.untyped()
29219 }
29220}
29221#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29222pub struct TerminalOfGreen<'db>(pub GreenId<'db>);
29223impl<'db> TypedSyntaxNode<'db> for TerminalOf<'db> {
29224 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOf);
29225 type StablePtr = TerminalOfPtr<'db>;
29226 type Green = TerminalOfGreen<'db>;
29227 fn missing(db: &'db dyn Database) -> Self::Green {
29228 TerminalOfGreen(
29229 GreenNode {
29230 kind: SyntaxKind::TerminalOf,
29231 details: GreenNodeDetails::Node {
29232 children: [
29233 Trivia::missing(db).0,
29234 TokenOf::missing(db).0,
29235 Trivia::missing(db).0,
29236 ]
29237 .into(),
29238 width: TextWidth::default(),
29239 },
29240 }
29241 .intern(db),
29242 )
29243 }
29244 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29245 let kind = node.kind(db);
29246 assert_eq!(
29247 kind,
29248 SyntaxKind::TerminalOf,
29249 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29250 kind,
29251 SyntaxKind::TerminalOf
29252 );
29253 Self { node }
29254 }
29255 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29256 let kind = node.kind(db);
29257 if kind == SyntaxKind::TerminalOf { Some(Self::from_syntax_node(db, node)) } else { None }
29258 }
29259 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29260 self.node
29261 }
29262 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29263 TerminalOfPtr(self.node.stable_ptr(db))
29264 }
29265}
29266#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29267pub struct TokenRef<'db> {
29268 node: SyntaxNode<'db>,
29269}
29270impl<'db> Token<'db> for TokenRef<'db> {
29271 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29272 TokenRefGreen(
29273 GreenNode { kind: SyntaxKind::TokenRef, details: GreenNodeDetails::Token(text) }
29274 .intern(db),
29275 )
29276 }
29277 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29278 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29279 }
29280}
29281#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29282pub struct TokenRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29283impl<'db> TypedStablePtr<'db> for TokenRefPtr<'db> {
29284 type SyntaxNode = TokenRef<'db>;
29285 fn untyped(self) -> SyntaxStablePtrId<'db> {
29286 self.0
29287 }
29288 fn lookup(&self, db: &'db dyn Database) -> TokenRef<'db> {
29289 TokenRef::from_syntax_node(db, self.0.lookup(db))
29290 }
29291}
29292impl<'db> From<TokenRefPtr<'db>> for SyntaxStablePtrId<'db> {
29293 fn from(ptr: TokenRefPtr<'db>) -> Self {
29294 ptr.untyped()
29295 }
29296}
29297#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29298pub struct TokenRefGreen<'db>(pub GreenId<'db>);
29299impl<'db> TokenRefGreen<'db> {
29300 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29301 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29302 }
29303}
29304impl<'db> TypedSyntaxNode<'db> for TokenRef<'db> {
29305 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRef);
29306 type StablePtr = TokenRefPtr<'db>;
29307 type Green = TokenRefGreen<'db>;
29308 fn missing(db: &'db dyn Database) -> Self::Green {
29309 TokenRefGreen(
29310 GreenNode {
29311 kind: SyntaxKind::TokenMissing,
29312 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29313 }
29314 .intern(db),
29315 )
29316 }
29317 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29318 match node.green_node(db).details {
29319 GreenNodeDetails::Token(_) => Self { node },
29320 GreenNodeDetails::Node { .. } => {
29321 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRef)
29322 }
29323 }
29324 }
29325 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29326 match node.green_node(db).details {
29327 GreenNodeDetails::Token(_) => Some(Self { node }),
29328 GreenNodeDetails::Node { .. } => None,
29329 }
29330 }
29331 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29332 self.node
29333 }
29334 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29335 TokenRefPtr(self.node.stable_ptr(db))
29336 }
29337}
29338#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29339pub struct TerminalRef<'db> {
29340 node: SyntaxNode<'db>,
29341}
29342impl<'db> Terminal<'db> for TerminalRef<'db> {
29343 const KIND: SyntaxKind = SyntaxKind::TerminalRef;
29344 type TokenType = TokenRef<'db>;
29345 fn new_green(
29346 db: &'db dyn Database,
29347 leading_trivia: TriviaGreen<'db>,
29348 token: <<TerminalRef<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29349 trailing_trivia: TriviaGreen<'db>,
29350 ) -> Self::Green {
29351 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29352 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29353 TerminalRefGreen(
29354 GreenNode {
29355 kind: SyntaxKind::TerminalRef,
29356 details: GreenNodeDetails::Node { children: children.into(), width },
29357 }
29358 .intern(db),
29359 )
29360 }
29361 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29362 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29363 unreachable!("Expected a node, not a token");
29364 };
29365 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29366 }
29367}
29368impl<'db> TerminalRef<'db> {
29369 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29370 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29371 }
29372 pub fn token(&self, db: &'db dyn Database) -> TokenRef<'db> {
29373 TokenRef::from_syntax_node(db, self.node.get_children(db)[1])
29374 }
29375 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29376 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29377 }
29378}
29379#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29380pub struct TerminalRefPtr<'db>(pub SyntaxStablePtrId<'db>);
29381impl<'db> TerminalRefPtr<'db> {}
29382impl<'db> TypedStablePtr<'db> for TerminalRefPtr<'db> {
29383 type SyntaxNode = TerminalRef<'db>;
29384 fn untyped(self) -> SyntaxStablePtrId<'db> {
29385 self.0
29386 }
29387 fn lookup(&self, db: &'db dyn Database) -> TerminalRef<'db> {
29388 TerminalRef::from_syntax_node(db, self.0.lookup(db))
29389 }
29390}
29391impl<'db> From<TerminalRefPtr<'db>> for SyntaxStablePtrId<'db> {
29392 fn from(ptr: TerminalRefPtr<'db>) -> Self {
29393 ptr.untyped()
29394 }
29395}
29396#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29397pub struct TerminalRefGreen<'db>(pub GreenId<'db>);
29398impl<'db> TypedSyntaxNode<'db> for TerminalRef<'db> {
29399 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRef);
29400 type StablePtr = TerminalRefPtr<'db>;
29401 type Green = TerminalRefGreen<'db>;
29402 fn missing(db: &'db dyn Database) -> Self::Green {
29403 TerminalRefGreen(
29404 GreenNode {
29405 kind: SyntaxKind::TerminalRef,
29406 details: GreenNodeDetails::Node {
29407 children: [
29408 Trivia::missing(db).0,
29409 TokenRef::missing(db).0,
29410 Trivia::missing(db).0,
29411 ]
29412 .into(),
29413 width: TextWidth::default(),
29414 },
29415 }
29416 .intern(db),
29417 )
29418 }
29419 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29420 let kind = node.kind(db);
29421 assert_eq!(
29422 kind,
29423 SyntaxKind::TerminalRef,
29424 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29425 kind,
29426 SyntaxKind::TerminalRef
29427 );
29428 Self { node }
29429 }
29430 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29431 let kind = node.kind(db);
29432 if kind == SyntaxKind::TerminalRef { Some(Self::from_syntax_node(db, node)) } else { None }
29433 }
29434 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29435 self.node
29436 }
29437 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29438 TerminalRefPtr(self.node.stable_ptr(db))
29439 }
29440}
29441#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29442pub struct TokenContinue<'db> {
29443 node: SyntaxNode<'db>,
29444}
29445impl<'db> Token<'db> for TokenContinue<'db> {
29446 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29447 TokenContinueGreen(
29448 GreenNode { kind: SyntaxKind::TokenContinue, details: GreenNodeDetails::Token(text) }
29449 .intern(db),
29450 )
29451 }
29452 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29453 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29454 }
29455}
29456#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29457pub struct TokenContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29458impl<'db> TypedStablePtr<'db> for TokenContinuePtr<'db> {
29459 type SyntaxNode = TokenContinue<'db>;
29460 fn untyped(self) -> SyntaxStablePtrId<'db> {
29461 self.0
29462 }
29463 fn lookup(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29464 TokenContinue::from_syntax_node(db, self.0.lookup(db))
29465 }
29466}
29467impl<'db> From<TokenContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29468 fn from(ptr: TokenContinuePtr<'db>) -> Self {
29469 ptr.untyped()
29470 }
29471}
29472#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29473pub struct TokenContinueGreen<'db>(pub GreenId<'db>);
29474impl<'db> TokenContinueGreen<'db> {
29475 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29476 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29477 }
29478}
29479impl<'db> TypedSyntaxNode<'db> for TokenContinue<'db> {
29480 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenContinue);
29481 type StablePtr = TokenContinuePtr<'db>;
29482 type Green = TokenContinueGreen<'db>;
29483 fn missing(db: &'db dyn Database) -> Self::Green {
29484 TokenContinueGreen(
29485 GreenNode {
29486 kind: SyntaxKind::TokenMissing,
29487 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29488 }
29489 .intern(db),
29490 )
29491 }
29492 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29493 match node.green_node(db).details {
29494 GreenNodeDetails::Token(_) => Self { node },
29495 GreenNodeDetails::Node { .. } => {
29496 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenContinue)
29497 }
29498 }
29499 }
29500 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29501 match node.green_node(db).details {
29502 GreenNodeDetails::Token(_) => Some(Self { node }),
29503 GreenNodeDetails::Node { .. } => None,
29504 }
29505 }
29506 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29507 self.node
29508 }
29509 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29510 TokenContinuePtr(self.node.stable_ptr(db))
29511 }
29512}
29513#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29514pub struct TerminalContinue<'db> {
29515 node: SyntaxNode<'db>,
29516}
29517impl<'db> Terminal<'db> for TerminalContinue<'db> {
29518 const KIND: SyntaxKind = SyntaxKind::TerminalContinue;
29519 type TokenType = TokenContinue<'db>;
29520 fn new_green(
29521 db: &'db dyn Database,
29522 leading_trivia: TriviaGreen<'db>,
29523 token: <<TerminalContinue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29524 trailing_trivia: TriviaGreen<'db>,
29525 ) -> Self::Green {
29526 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29527 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29528 TerminalContinueGreen(
29529 GreenNode {
29530 kind: SyntaxKind::TerminalContinue,
29531 details: GreenNodeDetails::Node { children: children.into(), width },
29532 }
29533 .intern(db),
29534 )
29535 }
29536 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29537 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29538 unreachable!("Expected a node, not a token");
29539 };
29540 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29541 }
29542}
29543impl<'db> TerminalContinue<'db> {
29544 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29545 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29546 }
29547 pub fn token(&self, db: &'db dyn Database) -> TokenContinue<'db> {
29548 TokenContinue::from_syntax_node(db, self.node.get_children(db)[1])
29549 }
29550 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29551 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29552 }
29553}
29554#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29555pub struct TerminalContinuePtr<'db>(pub SyntaxStablePtrId<'db>);
29556impl<'db> TerminalContinuePtr<'db> {}
29557impl<'db> TypedStablePtr<'db> for TerminalContinuePtr<'db> {
29558 type SyntaxNode = TerminalContinue<'db>;
29559 fn untyped(self) -> SyntaxStablePtrId<'db> {
29560 self.0
29561 }
29562 fn lookup(&self, db: &'db dyn Database) -> TerminalContinue<'db> {
29563 TerminalContinue::from_syntax_node(db, self.0.lookup(db))
29564 }
29565}
29566impl<'db> From<TerminalContinuePtr<'db>> for SyntaxStablePtrId<'db> {
29567 fn from(ptr: TerminalContinuePtr<'db>) -> Self {
29568 ptr.untyped()
29569 }
29570}
29571#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29572pub struct TerminalContinueGreen<'db>(pub GreenId<'db>);
29573impl<'db> TypedSyntaxNode<'db> for TerminalContinue<'db> {
29574 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalContinue);
29575 type StablePtr = TerminalContinuePtr<'db>;
29576 type Green = TerminalContinueGreen<'db>;
29577 fn missing(db: &'db dyn Database) -> Self::Green {
29578 TerminalContinueGreen(
29579 GreenNode {
29580 kind: SyntaxKind::TerminalContinue,
29581 details: GreenNodeDetails::Node {
29582 children: [
29583 Trivia::missing(db).0,
29584 TokenContinue::missing(db).0,
29585 Trivia::missing(db).0,
29586 ]
29587 .into(),
29588 width: TextWidth::default(),
29589 },
29590 }
29591 .intern(db),
29592 )
29593 }
29594 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29595 let kind = node.kind(db);
29596 assert_eq!(
29597 kind,
29598 SyntaxKind::TerminalContinue,
29599 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29600 kind,
29601 SyntaxKind::TerminalContinue
29602 );
29603 Self { node }
29604 }
29605 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29606 let kind = node.kind(db);
29607 if kind == SyntaxKind::TerminalContinue {
29608 Some(Self::from_syntax_node(db, node))
29609 } else {
29610 None
29611 }
29612 }
29613 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29614 self.node
29615 }
29616 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29617 TerminalContinuePtr(self.node.stable_ptr(db))
29618 }
29619}
29620#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29621pub struct TokenReturn<'db> {
29622 node: SyntaxNode<'db>,
29623}
29624impl<'db> Token<'db> for TokenReturn<'db> {
29625 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29626 TokenReturnGreen(
29627 GreenNode { kind: SyntaxKind::TokenReturn, details: GreenNodeDetails::Token(text) }
29628 .intern(db),
29629 )
29630 }
29631 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29632 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29633 }
29634}
29635#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29636pub struct TokenReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29637impl<'db> TypedStablePtr<'db> for TokenReturnPtr<'db> {
29638 type SyntaxNode = TokenReturn<'db>;
29639 fn untyped(self) -> SyntaxStablePtrId<'db> {
29640 self.0
29641 }
29642 fn lookup(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29643 TokenReturn::from_syntax_node(db, self.0.lookup(db))
29644 }
29645}
29646impl<'db> From<TokenReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29647 fn from(ptr: TokenReturnPtr<'db>) -> Self {
29648 ptr.untyped()
29649 }
29650}
29651#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29652pub struct TokenReturnGreen<'db>(pub GreenId<'db>);
29653impl<'db> TokenReturnGreen<'db> {
29654 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29655 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29656 }
29657}
29658impl<'db> TypedSyntaxNode<'db> for TokenReturn<'db> {
29659 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenReturn);
29660 type StablePtr = TokenReturnPtr<'db>;
29661 type Green = TokenReturnGreen<'db>;
29662 fn missing(db: &'db dyn Database) -> Self::Green {
29663 TokenReturnGreen(
29664 GreenNode {
29665 kind: SyntaxKind::TokenMissing,
29666 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29667 }
29668 .intern(db),
29669 )
29670 }
29671 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29672 match node.green_node(db).details {
29673 GreenNodeDetails::Token(_) => Self { node },
29674 GreenNodeDetails::Node { .. } => {
29675 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenReturn)
29676 }
29677 }
29678 }
29679 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29680 match node.green_node(db).details {
29681 GreenNodeDetails::Token(_) => Some(Self { node }),
29682 GreenNodeDetails::Node { .. } => None,
29683 }
29684 }
29685 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29686 self.node
29687 }
29688 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29689 TokenReturnPtr(self.node.stable_ptr(db))
29690 }
29691}
29692#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29693pub struct TerminalReturn<'db> {
29694 node: SyntaxNode<'db>,
29695}
29696impl<'db> Terminal<'db> for TerminalReturn<'db> {
29697 const KIND: SyntaxKind = SyntaxKind::TerminalReturn;
29698 type TokenType = TokenReturn<'db>;
29699 fn new_green(
29700 db: &'db dyn Database,
29701 leading_trivia: TriviaGreen<'db>,
29702 token: <<TerminalReturn<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29703 trailing_trivia: TriviaGreen<'db>,
29704 ) -> Self::Green {
29705 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29706 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29707 TerminalReturnGreen(
29708 GreenNode {
29709 kind: SyntaxKind::TerminalReturn,
29710 details: GreenNodeDetails::Node { children: children.into(), width },
29711 }
29712 .intern(db),
29713 )
29714 }
29715 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29716 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29717 unreachable!("Expected a node, not a token");
29718 };
29719 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29720 }
29721}
29722impl<'db> TerminalReturn<'db> {
29723 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29724 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29725 }
29726 pub fn token(&self, db: &'db dyn Database) -> TokenReturn<'db> {
29727 TokenReturn::from_syntax_node(db, self.node.get_children(db)[1])
29728 }
29729 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29730 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29731 }
29732}
29733#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29734pub struct TerminalReturnPtr<'db>(pub SyntaxStablePtrId<'db>);
29735impl<'db> TerminalReturnPtr<'db> {}
29736impl<'db> TypedStablePtr<'db> for TerminalReturnPtr<'db> {
29737 type SyntaxNode = TerminalReturn<'db>;
29738 fn untyped(self) -> SyntaxStablePtrId<'db> {
29739 self.0
29740 }
29741 fn lookup(&self, db: &'db dyn Database) -> TerminalReturn<'db> {
29742 TerminalReturn::from_syntax_node(db, self.0.lookup(db))
29743 }
29744}
29745impl<'db> From<TerminalReturnPtr<'db>> for SyntaxStablePtrId<'db> {
29746 fn from(ptr: TerminalReturnPtr<'db>) -> Self {
29747 ptr.untyped()
29748 }
29749}
29750#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29751pub struct TerminalReturnGreen<'db>(pub GreenId<'db>);
29752impl<'db> TypedSyntaxNode<'db> for TerminalReturn<'db> {
29753 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalReturn);
29754 type StablePtr = TerminalReturnPtr<'db>;
29755 type Green = TerminalReturnGreen<'db>;
29756 fn missing(db: &'db dyn Database) -> Self::Green {
29757 TerminalReturnGreen(
29758 GreenNode {
29759 kind: SyntaxKind::TerminalReturn,
29760 details: GreenNodeDetails::Node {
29761 children: [
29762 Trivia::missing(db).0,
29763 TokenReturn::missing(db).0,
29764 Trivia::missing(db).0,
29765 ]
29766 .into(),
29767 width: TextWidth::default(),
29768 },
29769 }
29770 .intern(db),
29771 )
29772 }
29773 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29774 let kind = node.kind(db);
29775 assert_eq!(
29776 kind,
29777 SyntaxKind::TerminalReturn,
29778 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29779 kind,
29780 SyntaxKind::TerminalReturn
29781 );
29782 Self { node }
29783 }
29784 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29785 let kind = node.kind(db);
29786 if kind == SyntaxKind::TerminalReturn {
29787 Some(Self::from_syntax_node(db, node))
29788 } else {
29789 None
29790 }
29791 }
29792 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29793 self.node
29794 }
29795 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29796 TerminalReturnPtr(self.node.stable_ptr(db))
29797 }
29798}
29799#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29800pub struct TokenBreak<'db> {
29801 node: SyntaxNode<'db>,
29802}
29803impl<'db> Token<'db> for TokenBreak<'db> {
29804 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29805 TokenBreakGreen(
29806 GreenNode { kind: SyntaxKind::TokenBreak, details: GreenNodeDetails::Token(text) }
29807 .intern(db),
29808 )
29809 }
29810 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29811 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29812 }
29813}
29814#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29815pub struct TokenBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29816impl<'db> TypedStablePtr<'db> for TokenBreakPtr<'db> {
29817 type SyntaxNode = TokenBreak<'db>;
29818 fn untyped(self) -> SyntaxStablePtrId<'db> {
29819 self.0
29820 }
29821 fn lookup(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29822 TokenBreak::from_syntax_node(db, self.0.lookup(db))
29823 }
29824}
29825impl<'db> From<TokenBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29826 fn from(ptr: TokenBreakPtr<'db>) -> Self {
29827 ptr.untyped()
29828 }
29829}
29830#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29831pub struct TokenBreakGreen<'db>(pub GreenId<'db>);
29832impl<'db> TokenBreakGreen<'db> {
29833 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29834 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
29835 }
29836}
29837impl<'db> TypedSyntaxNode<'db> for TokenBreak<'db> {
29838 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBreak);
29839 type StablePtr = TokenBreakPtr<'db>;
29840 type Green = TokenBreakGreen<'db>;
29841 fn missing(db: &'db dyn Database) -> Self::Green {
29842 TokenBreakGreen(
29843 GreenNode {
29844 kind: SyntaxKind::TokenMissing,
29845 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
29846 }
29847 .intern(db),
29848 )
29849 }
29850 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29851 match node.green_node(db).details {
29852 GreenNodeDetails::Token(_) => Self { node },
29853 GreenNodeDetails::Node { .. } => {
29854 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBreak)
29855 }
29856 }
29857 }
29858 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29859 match node.green_node(db).details {
29860 GreenNodeDetails::Token(_) => Some(Self { node }),
29861 GreenNodeDetails::Node { .. } => None,
29862 }
29863 }
29864 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29865 self.node
29866 }
29867 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29868 TokenBreakPtr(self.node.stable_ptr(db))
29869 }
29870}
29871#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29872pub struct TerminalBreak<'db> {
29873 node: SyntaxNode<'db>,
29874}
29875impl<'db> Terminal<'db> for TerminalBreak<'db> {
29876 const KIND: SyntaxKind = SyntaxKind::TerminalBreak;
29877 type TokenType = TokenBreak<'db>;
29878 fn new_green(
29879 db: &'db dyn Database,
29880 leading_trivia: TriviaGreen<'db>,
29881 token: <<TerminalBreak<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
29882 trailing_trivia: TriviaGreen<'db>,
29883 ) -> Self::Green {
29884 let children = [leading_trivia.0, token.0, trailing_trivia.0];
29885 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
29886 TerminalBreakGreen(
29887 GreenNode {
29888 kind: SyntaxKind::TerminalBreak,
29889 details: GreenNodeDetails::Node { children: children.into(), width },
29890 }
29891 .intern(db),
29892 )
29893 }
29894 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29895 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
29896 unreachable!("Expected a node, not a token");
29897 };
29898 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
29899 }
29900}
29901impl<'db> TerminalBreak<'db> {
29902 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29903 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
29904 }
29905 pub fn token(&self, db: &'db dyn Database) -> TokenBreak<'db> {
29906 TokenBreak::from_syntax_node(db, self.node.get_children(db)[1])
29907 }
29908 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
29909 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
29910 }
29911}
29912#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29913pub struct TerminalBreakPtr<'db>(pub SyntaxStablePtrId<'db>);
29914impl<'db> TerminalBreakPtr<'db> {}
29915impl<'db> TypedStablePtr<'db> for TerminalBreakPtr<'db> {
29916 type SyntaxNode = TerminalBreak<'db>;
29917 fn untyped(self) -> SyntaxStablePtrId<'db> {
29918 self.0
29919 }
29920 fn lookup(&self, db: &'db dyn Database) -> TerminalBreak<'db> {
29921 TerminalBreak::from_syntax_node(db, self.0.lookup(db))
29922 }
29923}
29924impl<'db> From<TerminalBreakPtr<'db>> for SyntaxStablePtrId<'db> {
29925 fn from(ptr: TerminalBreakPtr<'db>) -> Self {
29926 ptr.untyped()
29927 }
29928}
29929#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29930pub struct TerminalBreakGreen<'db>(pub GreenId<'db>);
29931impl<'db> TypedSyntaxNode<'db> for TerminalBreak<'db> {
29932 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBreak);
29933 type StablePtr = TerminalBreakPtr<'db>;
29934 type Green = TerminalBreakGreen<'db>;
29935 fn missing(db: &'db dyn Database) -> Self::Green {
29936 TerminalBreakGreen(
29937 GreenNode {
29938 kind: SyntaxKind::TerminalBreak,
29939 details: GreenNodeDetails::Node {
29940 children: [
29941 Trivia::missing(db).0,
29942 TokenBreak::missing(db).0,
29943 Trivia::missing(db).0,
29944 ]
29945 .into(),
29946 width: TextWidth::default(),
29947 },
29948 }
29949 .intern(db),
29950 )
29951 }
29952 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
29953 let kind = node.kind(db);
29954 assert_eq!(
29955 kind,
29956 SyntaxKind::TerminalBreak,
29957 "Unexpected SyntaxKind {:?}. Expected {:?}.",
29958 kind,
29959 SyntaxKind::TerminalBreak
29960 );
29961 Self { node }
29962 }
29963 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
29964 let kind = node.kind(db);
29965 if kind == SyntaxKind::TerminalBreak {
29966 Some(Self::from_syntax_node(db, node))
29967 } else {
29968 None
29969 }
29970 }
29971 fn as_syntax_node(&self) -> SyntaxNode<'db> {
29972 self.node
29973 }
29974 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
29975 TerminalBreakPtr(self.node.stable_ptr(db))
29976 }
29977}
29978#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
29979pub struct TokenStruct<'db> {
29980 node: SyntaxNode<'db>,
29981}
29982impl<'db> Token<'db> for TokenStruct<'db> {
29983 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
29984 TokenStructGreen(
29985 GreenNode { kind: SyntaxKind::TokenStruct, details: GreenNodeDetails::Token(text) }
29986 .intern(db),
29987 )
29988 }
29989 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
29990 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
29991 }
29992}
29993#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
29994pub struct TokenStructPtr<'db>(pub SyntaxStablePtrId<'db>);
29995impl<'db> TypedStablePtr<'db> for TokenStructPtr<'db> {
29996 type SyntaxNode = TokenStruct<'db>;
29997 fn untyped(self) -> SyntaxStablePtrId<'db> {
29998 self.0
29999 }
30000 fn lookup(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30001 TokenStruct::from_syntax_node(db, self.0.lookup(db))
30002 }
30003}
30004impl<'db> From<TokenStructPtr<'db>> for SyntaxStablePtrId<'db> {
30005 fn from(ptr: TokenStructPtr<'db>) -> Self {
30006 ptr.untyped()
30007 }
30008}
30009#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30010pub struct TokenStructGreen<'db>(pub GreenId<'db>);
30011impl<'db> TokenStructGreen<'db> {
30012 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30013 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30014 }
30015}
30016impl<'db> TypedSyntaxNode<'db> for TokenStruct<'db> {
30017 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenStruct);
30018 type StablePtr = TokenStructPtr<'db>;
30019 type Green = TokenStructGreen<'db>;
30020 fn missing(db: &'db dyn Database) -> Self::Green {
30021 TokenStructGreen(
30022 GreenNode {
30023 kind: SyntaxKind::TokenMissing,
30024 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30025 }
30026 .intern(db),
30027 )
30028 }
30029 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30030 match node.green_node(db).details {
30031 GreenNodeDetails::Token(_) => Self { node },
30032 GreenNodeDetails::Node { .. } => {
30033 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenStruct)
30034 }
30035 }
30036 }
30037 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30038 match node.green_node(db).details {
30039 GreenNodeDetails::Token(_) => Some(Self { node }),
30040 GreenNodeDetails::Node { .. } => None,
30041 }
30042 }
30043 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30044 self.node
30045 }
30046 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30047 TokenStructPtr(self.node.stable_ptr(db))
30048 }
30049}
30050#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30051pub struct TerminalStruct<'db> {
30052 node: SyntaxNode<'db>,
30053}
30054impl<'db> Terminal<'db> for TerminalStruct<'db> {
30055 const KIND: SyntaxKind = SyntaxKind::TerminalStruct;
30056 type TokenType = TokenStruct<'db>;
30057 fn new_green(
30058 db: &'db dyn Database,
30059 leading_trivia: TriviaGreen<'db>,
30060 token: <<TerminalStruct<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30061 trailing_trivia: TriviaGreen<'db>,
30062 ) -> Self::Green {
30063 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30064 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30065 TerminalStructGreen(
30066 GreenNode {
30067 kind: SyntaxKind::TerminalStruct,
30068 details: GreenNodeDetails::Node { children: children.into(), width },
30069 }
30070 .intern(db),
30071 )
30072 }
30073 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30074 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30075 unreachable!("Expected a node, not a token");
30076 };
30077 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30078 }
30079}
30080impl<'db> TerminalStruct<'db> {
30081 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30082 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30083 }
30084 pub fn token(&self, db: &'db dyn Database) -> TokenStruct<'db> {
30085 TokenStruct::from_syntax_node(db, self.node.get_children(db)[1])
30086 }
30087 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30088 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30089 }
30090}
30091#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30092pub struct TerminalStructPtr<'db>(pub SyntaxStablePtrId<'db>);
30093impl<'db> TerminalStructPtr<'db> {}
30094impl<'db> TypedStablePtr<'db> for TerminalStructPtr<'db> {
30095 type SyntaxNode = TerminalStruct<'db>;
30096 fn untyped(self) -> SyntaxStablePtrId<'db> {
30097 self.0
30098 }
30099 fn lookup(&self, db: &'db dyn Database) -> TerminalStruct<'db> {
30100 TerminalStruct::from_syntax_node(db, self.0.lookup(db))
30101 }
30102}
30103impl<'db> From<TerminalStructPtr<'db>> for SyntaxStablePtrId<'db> {
30104 fn from(ptr: TerminalStructPtr<'db>) -> Self {
30105 ptr.untyped()
30106 }
30107}
30108#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30109pub struct TerminalStructGreen<'db>(pub GreenId<'db>);
30110impl<'db> TypedSyntaxNode<'db> for TerminalStruct<'db> {
30111 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalStruct);
30112 type StablePtr = TerminalStructPtr<'db>;
30113 type Green = TerminalStructGreen<'db>;
30114 fn missing(db: &'db dyn Database) -> Self::Green {
30115 TerminalStructGreen(
30116 GreenNode {
30117 kind: SyntaxKind::TerminalStruct,
30118 details: GreenNodeDetails::Node {
30119 children: [
30120 Trivia::missing(db).0,
30121 TokenStruct::missing(db).0,
30122 Trivia::missing(db).0,
30123 ]
30124 .into(),
30125 width: TextWidth::default(),
30126 },
30127 }
30128 .intern(db),
30129 )
30130 }
30131 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30132 let kind = node.kind(db);
30133 assert_eq!(
30134 kind,
30135 SyntaxKind::TerminalStruct,
30136 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30137 kind,
30138 SyntaxKind::TerminalStruct
30139 );
30140 Self { node }
30141 }
30142 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30143 let kind = node.kind(db);
30144 if kind == SyntaxKind::TerminalStruct {
30145 Some(Self::from_syntax_node(db, node))
30146 } else {
30147 None
30148 }
30149 }
30150 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30151 self.node
30152 }
30153 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30154 TerminalStructPtr(self.node.stable_ptr(db))
30155 }
30156}
30157#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30158pub struct TokenTrait<'db> {
30159 node: SyntaxNode<'db>,
30160}
30161impl<'db> Token<'db> for TokenTrait<'db> {
30162 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30163 TokenTraitGreen(
30164 GreenNode { kind: SyntaxKind::TokenTrait, details: GreenNodeDetails::Token(text) }
30165 .intern(db),
30166 )
30167 }
30168 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30169 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30170 }
30171}
30172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30173pub struct TokenTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30174impl<'db> TypedStablePtr<'db> for TokenTraitPtr<'db> {
30175 type SyntaxNode = TokenTrait<'db>;
30176 fn untyped(self) -> SyntaxStablePtrId<'db> {
30177 self.0
30178 }
30179 fn lookup(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30180 TokenTrait::from_syntax_node(db, self.0.lookup(db))
30181 }
30182}
30183impl<'db> From<TokenTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30184 fn from(ptr: TokenTraitPtr<'db>) -> Self {
30185 ptr.untyped()
30186 }
30187}
30188#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30189pub struct TokenTraitGreen<'db>(pub GreenId<'db>);
30190impl<'db> TokenTraitGreen<'db> {
30191 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30192 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30193 }
30194}
30195impl<'db> TypedSyntaxNode<'db> for TokenTrait<'db> {
30196 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrait);
30197 type StablePtr = TokenTraitPtr<'db>;
30198 type Green = TokenTraitGreen<'db>;
30199 fn missing(db: &'db dyn Database) -> Self::Green {
30200 TokenTraitGreen(
30201 GreenNode {
30202 kind: SyntaxKind::TokenMissing,
30203 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30204 }
30205 .intern(db),
30206 )
30207 }
30208 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30209 match node.green_node(db).details {
30210 GreenNodeDetails::Token(_) => Self { node },
30211 GreenNodeDetails::Node { .. } => {
30212 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrait)
30213 }
30214 }
30215 }
30216 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30217 match node.green_node(db).details {
30218 GreenNodeDetails::Token(_) => Some(Self { node }),
30219 GreenNodeDetails::Node { .. } => None,
30220 }
30221 }
30222 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30223 self.node
30224 }
30225 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30226 TokenTraitPtr(self.node.stable_ptr(db))
30227 }
30228}
30229#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30230pub struct TerminalTrait<'db> {
30231 node: SyntaxNode<'db>,
30232}
30233impl<'db> Terminal<'db> for TerminalTrait<'db> {
30234 const KIND: SyntaxKind = SyntaxKind::TerminalTrait;
30235 type TokenType = TokenTrait<'db>;
30236 fn new_green(
30237 db: &'db dyn Database,
30238 leading_trivia: TriviaGreen<'db>,
30239 token: <<TerminalTrait<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30240 trailing_trivia: TriviaGreen<'db>,
30241 ) -> Self::Green {
30242 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30243 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30244 TerminalTraitGreen(
30245 GreenNode {
30246 kind: SyntaxKind::TerminalTrait,
30247 details: GreenNodeDetails::Node { children: children.into(), width },
30248 }
30249 .intern(db),
30250 )
30251 }
30252 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30253 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30254 unreachable!("Expected a node, not a token");
30255 };
30256 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30257 }
30258}
30259impl<'db> TerminalTrait<'db> {
30260 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30261 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30262 }
30263 pub fn token(&self, db: &'db dyn Database) -> TokenTrait<'db> {
30264 TokenTrait::from_syntax_node(db, self.node.get_children(db)[1])
30265 }
30266 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30267 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30268 }
30269}
30270#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30271pub struct TerminalTraitPtr<'db>(pub SyntaxStablePtrId<'db>);
30272impl<'db> TerminalTraitPtr<'db> {}
30273impl<'db> TypedStablePtr<'db> for TerminalTraitPtr<'db> {
30274 type SyntaxNode = TerminalTrait<'db>;
30275 fn untyped(self) -> SyntaxStablePtrId<'db> {
30276 self.0
30277 }
30278 fn lookup(&self, db: &'db dyn Database) -> TerminalTrait<'db> {
30279 TerminalTrait::from_syntax_node(db, self.0.lookup(db))
30280 }
30281}
30282impl<'db> From<TerminalTraitPtr<'db>> for SyntaxStablePtrId<'db> {
30283 fn from(ptr: TerminalTraitPtr<'db>) -> Self {
30284 ptr.untyped()
30285 }
30286}
30287#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30288pub struct TerminalTraitGreen<'db>(pub GreenId<'db>);
30289impl<'db> TypedSyntaxNode<'db> for TerminalTrait<'db> {
30290 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrait);
30291 type StablePtr = TerminalTraitPtr<'db>;
30292 type Green = TerminalTraitGreen<'db>;
30293 fn missing(db: &'db dyn Database) -> Self::Green {
30294 TerminalTraitGreen(
30295 GreenNode {
30296 kind: SyntaxKind::TerminalTrait,
30297 details: GreenNodeDetails::Node {
30298 children: [
30299 Trivia::missing(db).0,
30300 TokenTrait::missing(db).0,
30301 Trivia::missing(db).0,
30302 ]
30303 .into(),
30304 width: TextWidth::default(),
30305 },
30306 }
30307 .intern(db),
30308 )
30309 }
30310 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30311 let kind = node.kind(db);
30312 assert_eq!(
30313 kind,
30314 SyntaxKind::TerminalTrait,
30315 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30316 kind,
30317 SyntaxKind::TerminalTrait
30318 );
30319 Self { node }
30320 }
30321 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30322 let kind = node.kind(db);
30323 if kind == SyntaxKind::TerminalTrait {
30324 Some(Self::from_syntax_node(db, node))
30325 } else {
30326 None
30327 }
30328 }
30329 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30330 self.node
30331 }
30332 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30333 TerminalTraitPtr(self.node.stable_ptr(db))
30334 }
30335}
30336#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30337pub struct TokenTrue<'db> {
30338 node: SyntaxNode<'db>,
30339}
30340impl<'db> Token<'db> for TokenTrue<'db> {
30341 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30342 TokenTrueGreen(
30343 GreenNode { kind: SyntaxKind::TokenTrue, details: GreenNodeDetails::Token(text) }
30344 .intern(db),
30345 )
30346 }
30347 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30348 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30349 }
30350}
30351#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30352pub struct TokenTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30353impl<'db> TypedStablePtr<'db> for TokenTruePtr<'db> {
30354 type SyntaxNode = TokenTrue<'db>;
30355 fn untyped(self) -> SyntaxStablePtrId<'db> {
30356 self.0
30357 }
30358 fn lookup(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30359 TokenTrue::from_syntax_node(db, self.0.lookup(db))
30360 }
30361}
30362impl<'db> From<TokenTruePtr<'db>> for SyntaxStablePtrId<'db> {
30363 fn from(ptr: TokenTruePtr<'db>) -> Self {
30364 ptr.untyped()
30365 }
30366}
30367#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30368pub struct TokenTrueGreen<'db>(pub GreenId<'db>);
30369impl<'db> TokenTrueGreen<'db> {
30370 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30371 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30372 }
30373}
30374impl<'db> TypedSyntaxNode<'db> for TokenTrue<'db> {
30375 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenTrue);
30376 type StablePtr = TokenTruePtr<'db>;
30377 type Green = TokenTrueGreen<'db>;
30378 fn missing(db: &'db dyn Database) -> Self::Green {
30379 TokenTrueGreen(
30380 GreenNode {
30381 kind: SyntaxKind::TokenMissing,
30382 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30383 }
30384 .intern(db),
30385 )
30386 }
30387 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30388 match node.green_node(db).details {
30389 GreenNodeDetails::Token(_) => Self { node },
30390 GreenNodeDetails::Node { .. } => {
30391 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenTrue)
30392 }
30393 }
30394 }
30395 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30396 match node.green_node(db).details {
30397 GreenNodeDetails::Token(_) => Some(Self { node }),
30398 GreenNodeDetails::Node { .. } => None,
30399 }
30400 }
30401 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30402 self.node
30403 }
30404 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30405 TokenTruePtr(self.node.stable_ptr(db))
30406 }
30407}
30408#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30409pub struct TerminalTrue<'db> {
30410 node: SyntaxNode<'db>,
30411}
30412impl<'db> Terminal<'db> for TerminalTrue<'db> {
30413 const KIND: SyntaxKind = SyntaxKind::TerminalTrue;
30414 type TokenType = TokenTrue<'db>;
30415 fn new_green(
30416 db: &'db dyn Database,
30417 leading_trivia: TriviaGreen<'db>,
30418 token: <<TerminalTrue<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30419 trailing_trivia: TriviaGreen<'db>,
30420 ) -> Self::Green {
30421 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30422 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30423 TerminalTrueGreen(
30424 GreenNode {
30425 kind: SyntaxKind::TerminalTrue,
30426 details: GreenNodeDetails::Node { children: children.into(), width },
30427 }
30428 .intern(db),
30429 )
30430 }
30431 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30432 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30433 unreachable!("Expected a node, not a token");
30434 };
30435 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30436 }
30437}
30438impl<'db> TerminalTrue<'db> {
30439 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30440 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30441 }
30442 pub fn token(&self, db: &'db dyn Database) -> TokenTrue<'db> {
30443 TokenTrue::from_syntax_node(db, self.node.get_children(db)[1])
30444 }
30445 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30446 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30447 }
30448}
30449#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30450pub struct TerminalTruePtr<'db>(pub SyntaxStablePtrId<'db>);
30451impl<'db> TerminalTruePtr<'db> {}
30452impl<'db> TypedStablePtr<'db> for TerminalTruePtr<'db> {
30453 type SyntaxNode = TerminalTrue<'db>;
30454 fn untyped(self) -> SyntaxStablePtrId<'db> {
30455 self.0
30456 }
30457 fn lookup(&self, db: &'db dyn Database) -> TerminalTrue<'db> {
30458 TerminalTrue::from_syntax_node(db, self.0.lookup(db))
30459 }
30460}
30461impl<'db> From<TerminalTruePtr<'db>> for SyntaxStablePtrId<'db> {
30462 fn from(ptr: TerminalTruePtr<'db>) -> Self {
30463 ptr.untyped()
30464 }
30465}
30466#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30467pub struct TerminalTrueGreen<'db>(pub GreenId<'db>);
30468impl<'db> TypedSyntaxNode<'db> for TerminalTrue<'db> {
30469 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalTrue);
30470 type StablePtr = TerminalTruePtr<'db>;
30471 type Green = TerminalTrueGreen<'db>;
30472 fn missing(db: &'db dyn Database) -> Self::Green {
30473 TerminalTrueGreen(
30474 GreenNode {
30475 kind: SyntaxKind::TerminalTrue,
30476 details: GreenNodeDetails::Node {
30477 children: [
30478 Trivia::missing(db).0,
30479 TokenTrue::missing(db).0,
30480 Trivia::missing(db).0,
30481 ]
30482 .into(),
30483 width: TextWidth::default(),
30484 },
30485 }
30486 .intern(db),
30487 )
30488 }
30489 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30490 let kind = node.kind(db);
30491 assert_eq!(
30492 kind,
30493 SyntaxKind::TerminalTrue,
30494 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30495 kind,
30496 SyntaxKind::TerminalTrue
30497 );
30498 Self { node }
30499 }
30500 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30501 let kind = node.kind(db);
30502 if kind == SyntaxKind::TerminalTrue { Some(Self::from_syntax_node(db, node)) } else { None }
30503 }
30504 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30505 self.node
30506 }
30507 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30508 TerminalTruePtr(self.node.stable_ptr(db))
30509 }
30510}
30511#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30512pub struct TokenType<'db> {
30513 node: SyntaxNode<'db>,
30514}
30515impl<'db> Token<'db> for TokenType<'db> {
30516 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30517 TokenTypeGreen(
30518 GreenNode { kind: SyntaxKind::TokenType, details: GreenNodeDetails::Token(text) }
30519 .intern(db),
30520 )
30521 }
30522 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30523 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30524 }
30525}
30526#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30527pub struct TokenTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30528impl<'db> TypedStablePtr<'db> for TokenTypePtr<'db> {
30529 type SyntaxNode = TokenType<'db>;
30530 fn untyped(self) -> SyntaxStablePtrId<'db> {
30531 self.0
30532 }
30533 fn lookup(&self, db: &'db dyn Database) -> TokenType<'db> {
30534 TokenType::from_syntax_node(db, self.0.lookup(db))
30535 }
30536}
30537impl<'db> From<TokenTypePtr<'db>> for SyntaxStablePtrId<'db> {
30538 fn from(ptr: TokenTypePtr<'db>) -> Self {
30539 ptr.untyped()
30540 }
30541}
30542#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30543pub struct TokenTypeGreen<'db>(pub GreenId<'db>);
30544impl<'db> TokenTypeGreen<'db> {
30545 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30546 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30547 }
30548}
30549impl<'db> TypedSyntaxNode<'db> for TokenType<'db> {
30550 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenType);
30551 type StablePtr = TokenTypePtr<'db>;
30552 type Green = TokenTypeGreen<'db>;
30553 fn missing(db: &'db dyn Database) -> Self::Green {
30554 TokenTypeGreen(
30555 GreenNode {
30556 kind: SyntaxKind::TokenMissing,
30557 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30558 }
30559 .intern(db),
30560 )
30561 }
30562 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30563 match node.green_node(db).details {
30564 GreenNodeDetails::Token(_) => Self { node },
30565 GreenNodeDetails::Node { .. } => {
30566 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenType)
30567 }
30568 }
30569 }
30570 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30571 match node.green_node(db).details {
30572 GreenNodeDetails::Token(_) => Some(Self { node }),
30573 GreenNodeDetails::Node { .. } => None,
30574 }
30575 }
30576 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30577 self.node
30578 }
30579 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30580 TokenTypePtr(self.node.stable_ptr(db))
30581 }
30582}
30583#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30584pub struct TerminalType<'db> {
30585 node: SyntaxNode<'db>,
30586}
30587impl<'db> Terminal<'db> for TerminalType<'db> {
30588 const KIND: SyntaxKind = SyntaxKind::TerminalType;
30589 type TokenType = TokenType<'db>;
30590 fn new_green(
30591 db: &'db dyn Database,
30592 leading_trivia: TriviaGreen<'db>,
30593 token: <<TerminalType<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30594 trailing_trivia: TriviaGreen<'db>,
30595 ) -> Self::Green {
30596 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30597 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30598 TerminalTypeGreen(
30599 GreenNode {
30600 kind: SyntaxKind::TerminalType,
30601 details: GreenNodeDetails::Node { children: children.into(), width },
30602 }
30603 .intern(db),
30604 )
30605 }
30606 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30607 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30608 unreachable!("Expected a node, not a token");
30609 };
30610 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30611 }
30612}
30613impl<'db> TerminalType<'db> {
30614 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30615 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30616 }
30617 pub fn token(&self, db: &'db dyn Database) -> TokenType<'db> {
30618 TokenType::from_syntax_node(db, self.node.get_children(db)[1])
30619 }
30620 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30621 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30622 }
30623}
30624#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30625pub struct TerminalTypePtr<'db>(pub SyntaxStablePtrId<'db>);
30626impl<'db> TerminalTypePtr<'db> {}
30627impl<'db> TypedStablePtr<'db> for TerminalTypePtr<'db> {
30628 type SyntaxNode = TerminalType<'db>;
30629 fn untyped(self) -> SyntaxStablePtrId<'db> {
30630 self.0
30631 }
30632 fn lookup(&self, db: &'db dyn Database) -> TerminalType<'db> {
30633 TerminalType::from_syntax_node(db, self.0.lookup(db))
30634 }
30635}
30636impl<'db> From<TerminalTypePtr<'db>> for SyntaxStablePtrId<'db> {
30637 fn from(ptr: TerminalTypePtr<'db>) -> Self {
30638 ptr.untyped()
30639 }
30640}
30641#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30642pub struct TerminalTypeGreen<'db>(pub GreenId<'db>);
30643impl<'db> TypedSyntaxNode<'db> for TerminalType<'db> {
30644 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalType);
30645 type StablePtr = TerminalTypePtr<'db>;
30646 type Green = TerminalTypeGreen<'db>;
30647 fn missing(db: &'db dyn Database) -> Self::Green {
30648 TerminalTypeGreen(
30649 GreenNode {
30650 kind: SyntaxKind::TerminalType,
30651 details: GreenNodeDetails::Node {
30652 children: [
30653 Trivia::missing(db).0,
30654 TokenType::missing(db).0,
30655 Trivia::missing(db).0,
30656 ]
30657 .into(),
30658 width: TextWidth::default(),
30659 },
30660 }
30661 .intern(db),
30662 )
30663 }
30664 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30665 let kind = node.kind(db);
30666 assert_eq!(
30667 kind,
30668 SyntaxKind::TerminalType,
30669 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30670 kind,
30671 SyntaxKind::TerminalType
30672 );
30673 Self { node }
30674 }
30675 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30676 let kind = node.kind(db);
30677 if kind == SyntaxKind::TerminalType { Some(Self::from_syntax_node(db, node)) } else { None }
30678 }
30679 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30680 self.node
30681 }
30682 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30683 TerminalTypePtr(self.node.stable_ptr(db))
30684 }
30685}
30686#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30687pub struct TokenUse<'db> {
30688 node: SyntaxNode<'db>,
30689}
30690impl<'db> Token<'db> for TokenUse<'db> {
30691 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30692 TokenUseGreen(
30693 GreenNode { kind: SyntaxKind::TokenUse, details: GreenNodeDetails::Token(text) }
30694 .intern(db),
30695 )
30696 }
30697 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30698 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30699 }
30700}
30701#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30702pub struct TokenUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30703impl<'db> TypedStablePtr<'db> for TokenUsePtr<'db> {
30704 type SyntaxNode = TokenUse<'db>;
30705 fn untyped(self) -> SyntaxStablePtrId<'db> {
30706 self.0
30707 }
30708 fn lookup(&self, db: &'db dyn Database) -> TokenUse<'db> {
30709 TokenUse::from_syntax_node(db, self.0.lookup(db))
30710 }
30711}
30712impl<'db> From<TokenUsePtr<'db>> for SyntaxStablePtrId<'db> {
30713 fn from(ptr: TokenUsePtr<'db>) -> Self {
30714 ptr.untyped()
30715 }
30716}
30717#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30718pub struct TokenUseGreen<'db>(pub GreenId<'db>);
30719impl<'db> TokenUseGreen<'db> {
30720 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30721 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30722 }
30723}
30724impl<'db> TypedSyntaxNode<'db> for TokenUse<'db> {
30725 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUse);
30726 type StablePtr = TokenUsePtr<'db>;
30727 type Green = TokenUseGreen<'db>;
30728 fn missing(db: &'db dyn Database) -> Self::Green {
30729 TokenUseGreen(
30730 GreenNode {
30731 kind: SyntaxKind::TokenMissing,
30732 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30733 }
30734 .intern(db),
30735 )
30736 }
30737 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30738 match node.green_node(db).details {
30739 GreenNodeDetails::Token(_) => Self { node },
30740 GreenNodeDetails::Node { .. } => {
30741 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUse)
30742 }
30743 }
30744 }
30745 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30746 match node.green_node(db).details {
30747 GreenNodeDetails::Token(_) => Some(Self { node }),
30748 GreenNodeDetails::Node { .. } => None,
30749 }
30750 }
30751 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30752 self.node
30753 }
30754 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30755 TokenUsePtr(self.node.stable_ptr(db))
30756 }
30757}
30758#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30759pub struct TerminalUse<'db> {
30760 node: SyntaxNode<'db>,
30761}
30762impl<'db> Terminal<'db> for TerminalUse<'db> {
30763 const KIND: SyntaxKind = SyntaxKind::TerminalUse;
30764 type TokenType = TokenUse<'db>;
30765 fn new_green(
30766 db: &'db dyn Database,
30767 leading_trivia: TriviaGreen<'db>,
30768 token: <<TerminalUse<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30769 trailing_trivia: TriviaGreen<'db>,
30770 ) -> Self::Green {
30771 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30772 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30773 TerminalUseGreen(
30774 GreenNode {
30775 kind: SyntaxKind::TerminalUse,
30776 details: GreenNodeDetails::Node { children: children.into(), width },
30777 }
30778 .intern(db),
30779 )
30780 }
30781 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30782 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30783 unreachable!("Expected a node, not a token");
30784 };
30785 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30786 }
30787}
30788impl<'db> TerminalUse<'db> {
30789 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30790 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30791 }
30792 pub fn token(&self, db: &'db dyn Database) -> TokenUse<'db> {
30793 TokenUse::from_syntax_node(db, self.node.get_children(db)[1])
30794 }
30795 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30796 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30797 }
30798}
30799#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30800pub struct TerminalUsePtr<'db>(pub SyntaxStablePtrId<'db>);
30801impl<'db> TerminalUsePtr<'db> {}
30802impl<'db> TypedStablePtr<'db> for TerminalUsePtr<'db> {
30803 type SyntaxNode = TerminalUse<'db>;
30804 fn untyped(self) -> SyntaxStablePtrId<'db> {
30805 self.0
30806 }
30807 fn lookup(&self, db: &'db dyn Database) -> TerminalUse<'db> {
30808 TerminalUse::from_syntax_node(db, self.0.lookup(db))
30809 }
30810}
30811impl<'db> From<TerminalUsePtr<'db>> for SyntaxStablePtrId<'db> {
30812 fn from(ptr: TerminalUsePtr<'db>) -> Self {
30813 ptr.untyped()
30814 }
30815}
30816#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30817pub struct TerminalUseGreen<'db>(pub GreenId<'db>);
30818impl<'db> TypedSyntaxNode<'db> for TerminalUse<'db> {
30819 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUse);
30820 type StablePtr = TerminalUsePtr<'db>;
30821 type Green = TerminalUseGreen<'db>;
30822 fn missing(db: &'db dyn Database) -> Self::Green {
30823 TerminalUseGreen(
30824 GreenNode {
30825 kind: SyntaxKind::TerminalUse,
30826 details: GreenNodeDetails::Node {
30827 children: [
30828 Trivia::missing(db).0,
30829 TokenUse::missing(db).0,
30830 Trivia::missing(db).0,
30831 ]
30832 .into(),
30833 width: TextWidth::default(),
30834 },
30835 }
30836 .intern(db),
30837 )
30838 }
30839 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30840 let kind = node.kind(db);
30841 assert_eq!(
30842 kind,
30843 SyntaxKind::TerminalUse,
30844 "Unexpected SyntaxKind {:?}. Expected {:?}.",
30845 kind,
30846 SyntaxKind::TerminalUse
30847 );
30848 Self { node }
30849 }
30850 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30851 let kind = node.kind(db);
30852 if kind == SyntaxKind::TerminalUse { Some(Self::from_syntax_node(db, node)) } else { None }
30853 }
30854 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30855 self.node
30856 }
30857 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30858 TerminalUsePtr(self.node.stable_ptr(db))
30859 }
30860}
30861#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30862pub struct TokenPub<'db> {
30863 node: SyntaxNode<'db>,
30864}
30865impl<'db> Token<'db> for TokenPub<'db> {
30866 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
30867 TokenPubGreen(
30868 GreenNode { kind: SyntaxKind::TokenPub, details: GreenNodeDetails::Token(text) }
30869 .intern(db),
30870 )
30871 }
30872 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30873 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
30874 }
30875}
30876#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30877pub struct TokenPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30878impl<'db> TypedStablePtr<'db> for TokenPubPtr<'db> {
30879 type SyntaxNode = TokenPub<'db>;
30880 fn untyped(self) -> SyntaxStablePtrId<'db> {
30881 self.0
30882 }
30883 fn lookup(&self, db: &'db dyn Database) -> TokenPub<'db> {
30884 TokenPub::from_syntax_node(db, self.0.lookup(db))
30885 }
30886}
30887impl<'db> From<TokenPubPtr<'db>> for SyntaxStablePtrId<'db> {
30888 fn from(ptr: TokenPubPtr<'db>) -> Self {
30889 ptr.untyped()
30890 }
30891}
30892#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30893pub struct TokenPubGreen<'db>(pub GreenId<'db>);
30894impl<'db> TokenPubGreen<'db> {
30895 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30896 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
30897 }
30898}
30899impl<'db> TypedSyntaxNode<'db> for TokenPub<'db> {
30900 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPub);
30901 type StablePtr = TokenPubPtr<'db>;
30902 type Green = TokenPubGreen<'db>;
30903 fn missing(db: &'db dyn Database) -> Self::Green {
30904 TokenPubGreen(
30905 GreenNode {
30906 kind: SyntaxKind::TokenMissing,
30907 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
30908 }
30909 .intern(db),
30910 )
30911 }
30912 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
30913 match node.green_node(db).details {
30914 GreenNodeDetails::Token(_) => Self { node },
30915 GreenNodeDetails::Node { .. } => {
30916 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPub)
30917 }
30918 }
30919 }
30920 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
30921 match node.green_node(db).details {
30922 GreenNodeDetails::Token(_) => Some(Self { node }),
30923 GreenNodeDetails::Node { .. } => None,
30924 }
30925 }
30926 fn as_syntax_node(&self) -> SyntaxNode<'db> {
30927 self.node
30928 }
30929 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
30930 TokenPubPtr(self.node.stable_ptr(db))
30931 }
30932}
30933#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
30934pub struct TerminalPub<'db> {
30935 node: SyntaxNode<'db>,
30936}
30937impl<'db> Terminal<'db> for TerminalPub<'db> {
30938 const KIND: SyntaxKind = SyntaxKind::TerminalPub;
30939 type TokenType = TokenPub<'db>;
30940 fn new_green(
30941 db: &'db dyn Database,
30942 leading_trivia: TriviaGreen<'db>,
30943 token: <<TerminalPub<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
30944 trailing_trivia: TriviaGreen<'db>,
30945 ) -> Self::Green {
30946 let children = [leading_trivia.0, token.0, trailing_trivia.0];
30947 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
30948 TerminalPubGreen(
30949 GreenNode {
30950 kind: SyntaxKind::TerminalPub,
30951 details: GreenNodeDetails::Node { children: children.into(), width },
30952 }
30953 .intern(db),
30954 )
30955 }
30956 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
30957 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
30958 unreachable!("Expected a node, not a token");
30959 };
30960 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
30961 }
30962}
30963impl<'db> TerminalPub<'db> {
30964 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30965 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
30966 }
30967 pub fn token(&self, db: &'db dyn Database) -> TokenPub<'db> {
30968 TokenPub::from_syntax_node(db, self.node.get_children(db)[1])
30969 }
30970 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
30971 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
30972 }
30973}
30974#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30975pub struct TerminalPubPtr<'db>(pub SyntaxStablePtrId<'db>);
30976impl<'db> TerminalPubPtr<'db> {}
30977impl<'db> TypedStablePtr<'db> for TerminalPubPtr<'db> {
30978 type SyntaxNode = TerminalPub<'db>;
30979 fn untyped(self) -> SyntaxStablePtrId<'db> {
30980 self.0
30981 }
30982 fn lookup(&self, db: &'db dyn Database) -> TerminalPub<'db> {
30983 TerminalPub::from_syntax_node(db, self.0.lookup(db))
30984 }
30985}
30986impl<'db> From<TerminalPubPtr<'db>> for SyntaxStablePtrId<'db> {
30987 fn from(ptr: TerminalPubPtr<'db>) -> Self {
30988 ptr.untyped()
30989 }
30990}
30991#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
30992pub struct TerminalPubGreen<'db>(pub GreenId<'db>);
30993impl<'db> TypedSyntaxNode<'db> for TerminalPub<'db> {
30994 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPub);
30995 type StablePtr = TerminalPubPtr<'db>;
30996 type Green = TerminalPubGreen<'db>;
30997 fn missing(db: &'db dyn Database) -> Self::Green {
30998 TerminalPubGreen(
30999 GreenNode {
31000 kind: SyntaxKind::TerminalPub,
31001 details: GreenNodeDetails::Node {
31002 children: [
31003 Trivia::missing(db).0,
31004 TokenPub::missing(db).0,
31005 Trivia::missing(db).0,
31006 ]
31007 .into(),
31008 width: TextWidth::default(),
31009 },
31010 }
31011 .intern(db),
31012 )
31013 }
31014 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31015 let kind = node.kind(db);
31016 assert_eq!(
31017 kind,
31018 SyntaxKind::TerminalPub,
31019 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31020 kind,
31021 SyntaxKind::TerminalPub
31022 );
31023 Self { node }
31024 }
31025 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31026 let kind = node.kind(db);
31027 if kind == SyntaxKind::TerminalPub { Some(Self::from_syntax_node(db, node)) } else { None }
31028 }
31029 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31030 self.node
31031 }
31032 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31033 TerminalPubPtr(self.node.stable_ptr(db))
31034 }
31035}
31036#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31037pub struct TokenAnd<'db> {
31038 node: SyntaxNode<'db>,
31039}
31040impl<'db> Token<'db> for TokenAnd<'db> {
31041 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31042 TokenAndGreen(
31043 GreenNode { kind: SyntaxKind::TokenAnd, details: GreenNodeDetails::Token(text) }
31044 .intern(db),
31045 )
31046 }
31047 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31048 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31049 }
31050}
31051#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31052pub struct TokenAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31053impl<'db> TypedStablePtr<'db> for TokenAndPtr<'db> {
31054 type SyntaxNode = TokenAnd<'db>;
31055 fn untyped(self) -> SyntaxStablePtrId<'db> {
31056 self.0
31057 }
31058 fn lookup(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31059 TokenAnd::from_syntax_node(db, self.0.lookup(db))
31060 }
31061}
31062impl<'db> From<TokenAndPtr<'db>> for SyntaxStablePtrId<'db> {
31063 fn from(ptr: TokenAndPtr<'db>) -> Self {
31064 ptr.untyped()
31065 }
31066}
31067#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31068pub struct TokenAndGreen<'db>(pub GreenId<'db>);
31069impl<'db> TokenAndGreen<'db> {
31070 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31071 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31072 }
31073}
31074impl<'db> TypedSyntaxNode<'db> for TokenAnd<'db> {
31075 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAnd);
31076 type StablePtr = TokenAndPtr<'db>;
31077 type Green = TokenAndGreen<'db>;
31078 fn missing(db: &'db dyn Database) -> Self::Green {
31079 TokenAndGreen(
31080 GreenNode {
31081 kind: SyntaxKind::TokenMissing,
31082 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31083 }
31084 .intern(db),
31085 )
31086 }
31087 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31088 match node.green_node(db).details {
31089 GreenNodeDetails::Token(_) => Self { node },
31090 GreenNodeDetails::Node { .. } => {
31091 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAnd)
31092 }
31093 }
31094 }
31095 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31096 match node.green_node(db).details {
31097 GreenNodeDetails::Token(_) => Some(Self { node }),
31098 GreenNodeDetails::Node { .. } => None,
31099 }
31100 }
31101 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31102 self.node
31103 }
31104 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31105 TokenAndPtr(self.node.stable_ptr(db))
31106 }
31107}
31108#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31109pub struct TerminalAnd<'db> {
31110 node: SyntaxNode<'db>,
31111}
31112impl<'db> Terminal<'db> for TerminalAnd<'db> {
31113 const KIND: SyntaxKind = SyntaxKind::TerminalAnd;
31114 type TokenType = TokenAnd<'db>;
31115 fn new_green(
31116 db: &'db dyn Database,
31117 leading_trivia: TriviaGreen<'db>,
31118 token: <<TerminalAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31119 trailing_trivia: TriviaGreen<'db>,
31120 ) -> Self::Green {
31121 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31122 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31123 TerminalAndGreen(
31124 GreenNode {
31125 kind: SyntaxKind::TerminalAnd,
31126 details: GreenNodeDetails::Node { children: children.into(), width },
31127 }
31128 .intern(db),
31129 )
31130 }
31131 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31132 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31133 unreachable!("Expected a node, not a token");
31134 };
31135 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31136 }
31137}
31138impl<'db> TerminalAnd<'db> {
31139 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31140 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31141 }
31142 pub fn token(&self, db: &'db dyn Database) -> TokenAnd<'db> {
31143 TokenAnd::from_syntax_node(db, self.node.get_children(db)[1])
31144 }
31145 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31146 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31147 }
31148}
31149#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31150pub struct TerminalAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31151impl<'db> TerminalAndPtr<'db> {}
31152impl<'db> TypedStablePtr<'db> for TerminalAndPtr<'db> {
31153 type SyntaxNode = TerminalAnd<'db>;
31154 fn untyped(self) -> SyntaxStablePtrId<'db> {
31155 self.0
31156 }
31157 fn lookup(&self, db: &'db dyn Database) -> TerminalAnd<'db> {
31158 TerminalAnd::from_syntax_node(db, self.0.lookup(db))
31159 }
31160}
31161impl<'db> From<TerminalAndPtr<'db>> for SyntaxStablePtrId<'db> {
31162 fn from(ptr: TerminalAndPtr<'db>) -> Self {
31163 ptr.untyped()
31164 }
31165}
31166#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31167pub struct TerminalAndGreen<'db>(pub GreenId<'db>);
31168impl<'db> TypedSyntaxNode<'db> for TerminalAnd<'db> {
31169 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAnd);
31170 type StablePtr = TerminalAndPtr<'db>;
31171 type Green = TerminalAndGreen<'db>;
31172 fn missing(db: &'db dyn Database) -> Self::Green {
31173 TerminalAndGreen(
31174 GreenNode {
31175 kind: SyntaxKind::TerminalAnd,
31176 details: GreenNodeDetails::Node {
31177 children: [
31178 Trivia::missing(db).0,
31179 TokenAnd::missing(db).0,
31180 Trivia::missing(db).0,
31181 ]
31182 .into(),
31183 width: TextWidth::default(),
31184 },
31185 }
31186 .intern(db),
31187 )
31188 }
31189 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31190 let kind = node.kind(db);
31191 assert_eq!(
31192 kind,
31193 SyntaxKind::TerminalAnd,
31194 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31195 kind,
31196 SyntaxKind::TerminalAnd
31197 );
31198 Self { node }
31199 }
31200 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31201 let kind = node.kind(db);
31202 if kind == SyntaxKind::TerminalAnd { Some(Self::from_syntax_node(db, node)) } else { None }
31203 }
31204 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31205 self.node
31206 }
31207 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31208 TerminalAndPtr(self.node.stable_ptr(db))
31209 }
31210}
31211#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31212pub struct TokenAndAnd<'db> {
31213 node: SyntaxNode<'db>,
31214}
31215impl<'db> Token<'db> for TokenAndAnd<'db> {
31216 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31217 TokenAndAndGreen(
31218 GreenNode { kind: SyntaxKind::TokenAndAnd, details: GreenNodeDetails::Token(text) }
31219 .intern(db),
31220 )
31221 }
31222 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31223 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31224 }
31225}
31226#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31227pub struct TokenAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31228impl<'db> TypedStablePtr<'db> for TokenAndAndPtr<'db> {
31229 type SyntaxNode = TokenAndAnd<'db>;
31230 fn untyped(self) -> SyntaxStablePtrId<'db> {
31231 self.0
31232 }
31233 fn lookup(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31234 TokenAndAnd::from_syntax_node(db, self.0.lookup(db))
31235 }
31236}
31237impl<'db> From<TokenAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31238 fn from(ptr: TokenAndAndPtr<'db>) -> Self {
31239 ptr.untyped()
31240 }
31241}
31242#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31243pub struct TokenAndAndGreen<'db>(pub GreenId<'db>);
31244impl<'db> TokenAndAndGreen<'db> {
31245 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31246 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31247 }
31248}
31249impl<'db> TypedSyntaxNode<'db> for TokenAndAnd<'db> {
31250 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAndAnd);
31251 type StablePtr = TokenAndAndPtr<'db>;
31252 type Green = TokenAndAndGreen<'db>;
31253 fn missing(db: &'db dyn Database) -> Self::Green {
31254 TokenAndAndGreen(
31255 GreenNode {
31256 kind: SyntaxKind::TokenMissing,
31257 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31258 }
31259 .intern(db),
31260 )
31261 }
31262 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31263 match node.green_node(db).details {
31264 GreenNodeDetails::Token(_) => Self { node },
31265 GreenNodeDetails::Node { .. } => {
31266 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAndAnd)
31267 }
31268 }
31269 }
31270 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31271 match node.green_node(db).details {
31272 GreenNodeDetails::Token(_) => Some(Self { node }),
31273 GreenNodeDetails::Node { .. } => None,
31274 }
31275 }
31276 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31277 self.node
31278 }
31279 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31280 TokenAndAndPtr(self.node.stable_ptr(db))
31281 }
31282}
31283#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31284pub struct TerminalAndAnd<'db> {
31285 node: SyntaxNode<'db>,
31286}
31287impl<'db> Terminal<'db> for TerminalAndAnd<'db> {
31288 const KIND: SyntaxKind = SyntaxKind::TerminalAndAnd;
31289 type TokenType = TokenAndAnd<'db>;
31290 fn new_green(
31291 db: &'db dyn Database,
31292 leading_trivia: TriviaGreen<'db>,
31293 token: <<TerminalAndAnd<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31294 trailing_trivia: TriviaGreen<'db>,
31295 ) -> Self::Green {
31296 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31297 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31298 TerminalAndAndGreen(
31299 GreenNode {
31300 kind: SyntaxKind::TerminalAndAnd,
31301 details: GreenNodeDetails::Node { children: children.into(), width },
31302 }
31303 .intern(db),
31304 )
31305 }
31306 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31307 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31308 unreachable!("Expected a node, not a token");
31309 };
31310 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31311 }
31312}
31313impl<'db> TerminalAndAnd<'db> {
31314 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31315 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31316 }
31317 pub fn token(&self, db: &'db dyn Database) -> TokenAndAnd<'db> {
31318 TokenAndAnd::from_syntax_node(db, self.node.get_children(db)[1])
31319 }
31320 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31321 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31322 }
31323}
31324#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31325pub struct TerminalAndAndPtr<'db>(pub SyntaxStablePtrId<'db>);
31326impl<'db> TerminalAndAndPtr<'db> {}
31327impl<'db> TypedStablePtr<'db> for TerminalAndAndPtr<'db> {
31328 type SyntaxNode = TerminalAndAnd<'db>;
31329 fn untyped(self) -> SyntaxStablePtrId<'db> {
31330 self.0
31331 }
31332 fn lookup(&self, db: &'db dyn Database) -> TerminalAndAnd<'db> {
31333 TerminalAndAnd::from_syntax_node(db, self.0.lookup(db))
31334 }
31335}
31336impl<'db> From<TerminalAndAndPtr<'db>> for SyntaxStablePtrId<'db> {
31337 fn from(ptr: TerminalAndAndPtr<'db>) -> Self {
31338 ptr.untyped()
31339 }
31340}
31341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31342pub struct TerminalAndAndGreen<'db>(pub GreenId<'db>);
31343impl<'db> TypedSyntaxNode<'db> for TerminalAndAnd<'db> {
31344 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAndAnd);
31345 type StablePtr = TerminalAndAndPtr<'db>;
31346 type Green = TerminalAndAndGreen<'db>;
31347 fn missing(db: &'db dyn Database) -> Self::Green {
31348 TerminalAndAndGreen(
31349 GreenNode {
31350 kind: SyntaxKind::TerminalAndAnd,
31351 details: GreenNodeDetails::Node {
31352 children: [
31353 Trivia::missing(db).0,
31354 TokenAndAnd::missing(db).0,
31355 Trivia::missing(db).0,
31356 ]
31357 .into(),
31358 width: TextWidth::default(),
31359 },
31360 }
31361 .intern(db),
31362 )
31363 }
31364 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31365 let kind = node.kind(db);
31366 assert_eq!(
31367 kind,
31368 SyntaxKind::TerminalAndAnd,
31369 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31370 kind,
31371 SyntaxKind::TerminalAndAnd
31372 );
31373 Self { node }
31374 }
31375 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31376 let kind = node.kind(db);
31377 if kind == SyntaxKind::TerminalAndAnd {
31378 Some(Self::from_syntax_node(db, node))
31379 } else {
31380 None
31381 }
31382 }
31383 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31384 self.node
31385 }
31386 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31387 TerminalAndAndPtr(self.node.stable_ptr(db))
31388 }
31389}
31390#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31391pub struct TokenArrow<'db> {
31392 node: SyntaxNode<'db>,
31393}
31394impl<'db> Token<'db> for TokenArrow<'db> {
31395 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31396 TokenArrowGreen(
31397 GreenNode { kind: SyntaxKind::TokenArrow, details: GreenNodeDetails::Token(text) }
31398 .intern(db),
31399 )
31400 }
31401 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31402 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31403 }
31404}
31405#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31406pub struct TokenArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31407impl<'db> TypedStablePtr<'db> for TokenArrowPtr<'db> {
31408 type SyntaxNode = TokenArrow<'db>;
31409 fn untyped(self) -> SyntaxStablePtrId<'db> {
31410 self.0
31411 }
31412 fn lookup(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31413 TokenArrow::from_syntax_node(db, self.0.lookup(db))
31414 }
31415}
31416impl<'db> From<TokenArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31417 fn from(ptr: TokenArrowPtr<'db>) -> Self {
31418 ptr.untyped()
31419 }
31420}
31421#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31422pub struct TokenArrowGreen<'db>(pub GreenId<'db>);
31423impl<'db> TokenArrowGreen<'db> {
31424 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31425 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31426 }
31427}
31428impl<'db> TypedSyntaxNode<'db> for TokenArrow<'db> {
31429 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenArrow);
31430 type StablePtr = TokenArrowPtr<'db>;
31431 type Green = TokenArrowGreen<'db>;
31432 fn missing(db: &'db dyn Database) -> Self::Green {
31433 TokenArrowGreen(
31434 GreenNode {
31435 kind: SyntaxKind::TokenMissing,
31436 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31437 }
31438 .intern(db),
31439 )
31440 }
31441 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31442 match node.green_node(db).details {
31443 GreenNodeDetails::Token(_) => Self { node },
31444 GreenNodeDetails::Node { .. } => {
31445 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenArrow)
31446 }
31447 }
31448 }
31449 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31450 match node.green_node(db).details {
31451 GreenNodeDetails::Token(_) => Some(Self { node }),
31452 GreenNodeDetails::Node { .. } => None,
31453 }
31454 }
31455 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31456 self.node
31457 }
31458 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31459 TokenArrowPtr(self.node.stable_ptr(db))
31460 }
31461}
31462#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31463pub struct TerminalArrow<'db> {
31464 node: SyntaxNode<'db>,
31465}
31466impl<'db> Terminal<'db> for TerminalArrow<'db> {
31467 const KIND: SyntaxKind = SyntaxKind::TerminalArrow;
31468 type TokenType = TokenArrow<'db>;
31469 fn new_green(
31470 db: &'db dyn Database,
31471 leading_trivia: TriviaGreen<'db>,
31472 token: <<TerminalArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31473 trailing_trivia: TriviaGreen<'db>,
31474 ) -> Self::Green {
31475 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31476 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31477 TerminalArrowGreen(
31478 GreenNode {
31479 kind: SyntaxKind::TerminalArrow,
31480 details: GreenNodeDetails::Node { children: children.into(), width },
31481 }
31482 .intern(db),
31483 )
31484 }
31485 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31486 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31487 unreachable!("Expected a node, not a token");
31488 };
31489 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31490 }
31491}
31492impl<'db> TerminalArrow<'db> {
31493 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31494 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31495 }
31496 pub fn token(&self, db: &'db dyn Database) -> TokenArrow<'db> {
31497 TokenArrow::from_syntax_node(db, self.node.get_children(db)[1])
31498 }
31499 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31500 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31501 }
31502}
31503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31504pub struct TerminalArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
31505impl<'db> TerminalArrowPtr<'db> {}
31506impl<'db> TypedStablePtr<'db> for TerminalArrowPtr<'db> {
31507 type SyntaxNode = TerminalArrow<'db>;
31508 fn untyped(self) -> SyntaxStablePtrId<'db> {
31509 self.0
31510 }
31511 fn lookup(&self, db: &'db dyn Database) -> TerminalArrow<'db> {
31512 TerminalArrow::from_syntax_node(db, self.0.lookup(db))
31513 }
31514}
31515impl<'db> From<TerminalArrowPtr<'db>> for SyntaxStablePtrId<'db> {
31516 fn from(ptr: TerminalArrowPtr<'db>) -> Self {
31517 ptr.untyped()
31518 }
31519}
31520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31521pub struct TerminalArrowGreen<'db>(pub GreenId<'db>);
31522impl<'db> TypedSyntaxNode<'db> for TerminalArrow<'db> {
31523 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalArrow);
31524 type StablePtr = TerminalArrowPtr<'db>;
31525 type Green = TerminalArrowGreen<'db>;
31526 fn missing(db: &'db dyn Database) -> Self::Green {
31527 TerminalArrowGreen(
31528 GreenNode {
31529 kind: SyntaxKind::TerminalArrow,
31530 details: GreenNodeDetails::Node {
31531 children: [
31532 Trivia::missing(db).0,
31533 TokenArrow::missing(db).0,
31534 Trivia::missing(db).0,
31535 ]
31536 .into(),
31537 width: TextWidth::default(),
31538 },
31539 }
31540 .intern(db),
31541 )
31542 }
31543 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31544 let kind = node.kind(db);
31545 assert_eq!(
31546 kind,
31547 SyntaxKind::TerminalArrow,
31548 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31549 kind,
31550 SyntaxKind::TerminalArrow
31551 );
31552 Self { node }
31553 }
31554 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31555 let kind = node.kind(db);
31556 if kind == SyntaxKind::TerminalArrow {
31557 Some(Self::from_syntax_node(db, node))
31558 } else {
31559 None
31560 }
31561 }
31562 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31563 self.node
31564 }
31565 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31566 TerminalArrowPtr(self.node.stable_ptr(db))
31567 }
31568}
31569#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31570pub struct TokenAt<'db> {
31571 node: SyntaxNode<'db>,
31572}
31573impl<'db> Token<'db> for TokenAt<'db> {
31574 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31575 TokenAtGreen(
31576 GreenNode { kind: SyntaxKind::TokenAt, details: GreenNodeDetails::Token(text) }
31577 .intern(db),
31578 )
31579 }
31580 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31581 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31582 }
31583}
31584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31585pub struct TokenAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31586impl<'db> TypedStablePtr<'db> for TokenAtPtr<'db> {
31587 type SyntaxNode = TokenAt<'db>;
31588 fn untyped(self) -> SyntaxStablePtrId<'db> {
31589 self.0
31590 }
31591 fn lookup(&self, db: &'db dyn Database) -> TokenAt<'db> {
31592 TokenAt::from_syntax_node(db, self.0.lookup(db))
31593 }
31594}
31595impl<'db> From<TokenAtPtr<'db>> for SyntaxStablePtrId<'db> {
31596 fn from(ptr: TokenAtPtr<'db>) -> Self {
31597 ptr.untyped()
31598 }
31599}
31600#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31601pub struct TokenAtGreen<'db>(pub GreenId<'db>);
31602impl<'db> TokenAtGreen<'db> {
31603 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31604 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31605 }
31606}
31607impl<'db> TypedSyntaxNode<'db> for TokenAt<'db> {
31608 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenAt);
31609 type StablePtr = TokenAtPtr<'db>;
31610 type Green = TokenAtGreen<'db>;
31611 fn missing(db: &'db dyn Database) -> Self::Green {
31612 TokenAtGreen(
31613 GreenNode {
31614 kind: SyntaxKind::TokenMissing,
31615 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31616 }
31617 .intern(db),
31618 )
31619 }
31620 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31621 match node.green_node(db).details {
31622 GreenNodeDetails::Token(_) => Self { node },
31623 GreenNodeDetails::Node { .. } => {
31624 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenAt)
31625 }
31626 }
31627 }
31628 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31629 match node.green_node(db).details {
31630 GreenNodeDetails::Token(_) => Some(Self { node }),
31631 GreenNodeDetails::Node { .. } => None,
31632 }
31633 }
31634 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31635 self.node
31636 }
31637 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31638 TokenAtPtr(self.node.stable_ptr(db))
31639 }
31640}
31641#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31642pub struct TerminalAt<'db> {
31643 node: SyntaxNode<'db>,
31644}
31645impl<'db> Terminal<'db> for TerminalAt<'db> {
31646 const KIND: SyntaxKind = SyntaxKind::TerminalAt;
31647 type TokenType = TokenAt<'db>;
31648 fn new_green(
31649 db: &'db dyn Database,
31650 leading_trivia: TriviaGreen<'db>,
31651 token: <<TerminalAt<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31652 trailing_trivia: TriviaGreen<'db>,
31653 ) -> Self::Green {
31654 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31655 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31656 TerminalAtGreen(
31657 GreenNode {
31658 kind: SyntaxKind::TerminalAt,
31659 details: GreenNodeDetails::Node { children: children.into(), width },
31660 }
31661 .intern(db),
31662 )
31663 }
31664 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31665 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31666 unreachable!("Expected a node, not a token");
31667 };
31668 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31669 }
31670}
31671impl<'db> TerminalAt<'db> {
31672 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31673 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31674 }
31675 pub fn token(&self, db: &'db dyn Database) -> TokenAt<'db> {
31676 TokenAt::from_syntax_node(db, self.node.get_children(db)[1])
31677 }
31678 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31679 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31680 }
31681}
31682#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31683pub struct TerminalAtPtr<'db>(pub SyntaxStablePtrId<'db>);
31684impl<'db> TerminalAtPtr<'db> {}
31685impl<'db> TypedStablePtr<'db> for TerminalAtPtr<'db> {
31686 type SyntaxNode = TerminalAt<'db>;
31687 fn untyped(self) -> SyntaxStablePtrId<'db> {
31688 self.0
31689 }
31690 fn lookup(&self, db: &'db dyn Database) -> TerminalAt<'db> {
31691 TerminalAt::from_syntax_node(db, self.0.lookup(db))
31692 }
31693}
31694impl<'db> From<TerminalAtPtr<'db>> for SyntaxStablePtrId<'db> {
31695 fn from(ptr: TerminalAtPtr<'db>) -> Self {
31696 ptr.untyped()
31697 }
31698}
31699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31700pub struct TerminalAtGreen<'db>(pub GreenId<'db>);
31701impl<'db> TypedSyntaxNode<'db> for TerminalAt<'db> {
31702 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalAt);
31703 type StablePtr = TerminalAtPtr<'db>;
31704 type Green = TerminalAtGreen<'db>;
31705 fn missing(db: &'db dyn Database) -> Self::Green {
31706 TerminalAtGreen(
31707 GreenNode {
31708 kind: SyntaxKind::TerminalAt,
31709 details: GreenNodeDetails::Node {
31710 children: [
31711 Trivia::missing(db).0,
31712 TokenAt::missing(db).0,
31713 Trivia::missing(db).0,
31714 ]
31715 .into(),
31716 width: TextWidth::default(),
31717 },
31718 }
31719 .intern(db),
31720 )
31721 }
31722 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31723 let kind = node.kind(db);
31724 assert_eq!(
31725 kind,
31726 SyntaxKind::TerminalAt,
31727 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31728 kind,
31729 SyntaxKind::TerminalAt
31730 );
31731 Self { node }
31732 }
31733 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31734 let kind = node.kind(db);
31735 if kind == SyntaxKind::TerminalAt { Some(Self::from_syntax_node(db, node)) } else { None }
31736 }
31737 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31738 self.node
31739 }
31740 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31741 TerminalAtPtr(self.node.stable_ptr(db))
31742 }
31743}
31744#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31745pub struct TokenBadCharacters<'db> {
31746 node: SyntaxNode<'db>,
31747}
31748impl<'db> Token<'db> for TokenBadCharacters<'db> {
31749 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31750 TokenBadCharactersGreen(
31751 GreenNode {
31752 kind: SyntaxKind::TokenBadCharacters,
31753 details: GreenNodeDetails::Token(text),
31754 }
31755 .intern(db),
31756 )
31757 }
31758 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31759 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31760 }
31761}
31762#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31763pub struct TokenBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31764impl<'db> TypedStablePtr<'db> for TokenBadCharactersPtr<'db> {
31765 type SyntaxNode = TokenBadCharacters<'db>;
31766 fn untyped(self) -> SyntaxStablePtrId<'db> {
31767 self.0
31768 }
31769 fn lookup(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31770 TokenBadCharacters::from_syntax_node(db, self.0.lookup(db))
31771 }
31772}
31773impl<'db> From<TokenBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31774 fn from(ptr: TokenBadCharactersPtr<'db>) -> Self {
31775 ptr.untyped()
31776 }
31777}
31778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31779pub struct TokenBadCharactersGreen<'db>(pub GreenId<'db>);
31780impl<'db> TokenBadCharactersGreen<'db> {
31781 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31782 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31783 }
31784}
31785impl<'db> TypedSyntaxNode<'db> for TokenBadCharacters<'db> {
31786 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBadCharacters);
31787 type StablePtr = TokenBadCharactersPtr<'db>;
31788 type Green = TokenBadCharactersGreen<'db>;
31789 fn missing(db: &'db dyn Database) -> Self::Green {
31790 TokenBadCharactersGreen(
31791 GreenNode {
31792 kind: SyntaxKind::TokenMissing,
31793 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31794 }
31795 .intern(db),
31796 )
31797 }
31798 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31799 match node.green_node(db).details {
31800 GreenNodeDetails::Token(_) => Self { node },
31801 GreenNodeDetails::Node { .. } => panic!(
31802 "Expected a token {:?}, not an internal node",
31803 SyntaxKind::TokenBadCharacters
31804 ),
31805 }
31806 }
31807 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31808 match node.green_node(db).details {
31809 GreenNodeDetails::Token(_) => Some(Self { node }),
31810 GreenNodeDetails::Node { .. } => None,
31811 }
31812 }
31813 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31814 self.node
31815 }
31816 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31817 TokenBadCharactersPtr(self.node.stable_ptr(db))
31818 }
31819}
31820#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31821pub struct TerminalBadCharacters<'db> {
31822 node: SyntaxNode<'db>,
31823}
31824impl<'db> Terminal<'db> for TerminalBadCharacters<'db> {
31825 const KIND: SyntaxKind = SyntaxKind::TerminalBadCharacters;
31826 type TokenType = TokenBadCharacters<'db>;
31827 fn new_green(
31828 db: &'db dyn Database,
31829 leading_trivia: TriviaGreen<'db>,
31830 token: <<TerminalBadCharacters<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
31831 trailing_trivia: TriviaGreen<'db>,
31832 ) -> Self::Green {
31833 let children = [leading_trivia.0, token.0, trailing_trivia.0];
31834 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
31835 TerminalBadCharactersGreen(
31836 GreenNode {
31837 kind: SyntaxKind::TerminalBadCharacters,
31838 details: GreenNodeDetails::Node { children: children.into(), width },
31839 }
31840 .intern(db),
31841 )
31842 }
31843 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31844 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
31845 unreachable!("Expected a node, not a token");
31846 };
31847 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
31848 }
31849}
31850impl<'db> TerminalBadCharacters<'db> {
31851 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31852 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
31853 }
31854 pub fn token(&self, db: &'db dyn Database) -> TokenBadCharacters<'db> {
31855 TokenBadCharacters::from_syntax_node(db, self.node.get_children(db)[1])
31856 }
31857 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
31858 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
31859 }
31860}
31861#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31862pub struct TerminalBadCharactersPtr<'db>(pub SyntaxStablePtrId<'db>);
31863impl<'db> TerminalBadCharactersPtr<'db> {}
31864impl<'db> TypedStablePtr<'db> for TerminalBadCharactersPtr<'db> {
31865 type SyntaxNode = TerminalBadCharacters<'db>;
31866 fn untyped(self) -> SyntaxStablePtrId<'db> {
31867 self.0
31868 }
31869 fn lookup(&self, db: &'db dyn Database) -> TerminalBadCharacters<'db> {
31870 TerminalBadCharacters::from_syntax_node(db, self.0.lookup(db))
31871 }
31872}
31873impl<'db> From<TerminalBadCharactersPtr<'db>> for SyntaxStablePtrId<'db> {
31874 fn from(ptr: TerminalBadCharactersPtr<'db>) -> Self {
31875 ptr.untyped()
31876 }
31877}
31878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31879pub struct TerminalBadCharactersGreen<'db>(pub GreenId<'db>);
31880impl<'db> TypedSyntaxNode<'db> for TerminalBadCharacters<'db> {
31881 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBadCharacters);
31882 type StablePtr = TerminalBadCharactersPtr<'db>;
31883 type Green = TerminalBadCharactersGreen<'db>;
31884 fn missing(db: &'db dyn Database) -> Self::Green {
31885 TerminalBadCharactersGreen(
31886 GreenNode {
31887 kind: SyntaxKind::TerminalBadCharacters,
31888 details: GreenNodeDetails::Node {
31889 children: [
31890 Trivia::missing(db).0,
31891 TokenBadCharacters::missing(db).0,
31892 Trivia::missing(db).0,
31893 ]
31894 .into(),
31895 width: TextWidth::default(),
31896 },
31897 }
31898 .intern(db),
31899 )
31900 }
31901 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31902 let kind = node.kind(db);
31903 assert_eq!(
31904 kind,
31905 SyntaxKind::TerminalBadCharacters,
31906 "Unexpected SyntaxKind {:?}. Expected {:?}.",
31907 kind,
31908 SyntaxKind::TerminalBadCharacters
31909 );
31910 Self { node }
31911 }
31912 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31913 let kind = node.kind(db);
31914 if kind == SyntaxKind::TerminalBadCharacters {
31915 Some(Self::from_syntax_node(db, node))
31916 } else {
31917 None
31918 }
31919 }
31920 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31921 self.node
31922 }
31923 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31924 TerminalBadCharactersPtr(self.node.stable_ptr(db))
31925 }
31926}
31927#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
31928pub struct TokenColon<'db> {
31929 node: SyntaxNode<'db>,
31930}
31931impl<'db> Token<'db> for TokenColon<'db> {
31932 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
31933 TokenColonGreen(
31934 GreenNode { kind: SyntaxKind::TokenColon, details: GreenNodeDetails::Token(text) }
31935 .intern(db),
31936 )
31937 }
31938 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31939 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
31940 }
31941}
31942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31943pub struct TokenColonPtr<'db>(pub SyntaxStablePtrId<'db>);
31944impl<'db> TypedStablePtr<'db> for TokenColonPtr<'db> {
31945 type SyntaxNode = TokenColon<'db>;
31946 fn untyped(self) -> SyntaxStablePtrId<'db> {
31947 self.0
31948 }
31949 fn lookup(&self, db: &'db dyn Database) -> TokenColon<'db> {
31950 TokenColon::from_syntax_node(db, self.0.lookup(db))
31951 }
31952}
31953impl<'db> From<TokenColonPtr<'db>> for SyntaxStablePtrId<'db> {
31954 fn from(ptr: TokenColonPtr<'db>) -> Self {
31955 ptr.untyped()
31956 }
31957}
31958#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
31959pub struct TokenColonGreen<'db>(pub GreenId<'db>);
31960impl<'db> TokenColonGreen<'db> {
31961 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
31962 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
31963 }
31964}
31965impl<'db> TypedSyntaxNode<'db> for TokenColon<'db> {
31966 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColon);
31967 type StablePtr = TokenColonPtr<'db>;
31968 type Green = TokenColonGreen<'db>;
31969 fn missing(db: &'db dyn Database) -> Self::Green {
31970 TokenColonGreen(
31971 GreenNode {
31972 kind: SyntaxKind::TokenMissing,
31973 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
31974 }
31975 .intern(db),
31976 )
31977 }
31978 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
31979 match node.green_node(db).details {
31980 GreenNodeDetails::Token(_) => Self { node },
31981 GreenNodeDetails::Node { .. } => {
31982 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColon)
31983 }
31984 }
31985 }
31986 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
31987 match node.green_node(db).details {
31988 GreenNodeDetails::Token(_) => Some(Self { node }),
31989 GreenNodeDetails::Node { .. } => None,
31990 }
31991 }
31992 fn as_syntax_node(&self) -> SyntaxNode<'db> {
31993 self.node
31994 }
31995 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
31996 TokenColonPtr(self.node.stable_ptr(db))
31997 }
31998}
31999#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32000pub struct TerminalColon<'db> {
32001 node: SyntaxNode<'db>,
32002}
32003impl<'db> Terminal<'db> for TerminalColon<'db> {
32004 const KIND: SyntaxKind = SyntaxKind::TerminalColon;
32005 type TokenType = TokenColon<'db>;
32006 fn new_green(
32007 db: &'db dyn Database,
32008 leading_trivia: TriviaGreen<'db>,
32009 token: <<TerminalColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32010 trailing_trivia: TriviaGreen<'db>,
32011 ) -> Self::Green {
32012 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32013 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32014 TerminalColonGreen(
32015 GreenNode {
32016 kind: SyntaxKind::TerminalColon,
32017 details: GreenNodeDetails::Node { children: children.into(), width },
32018 }
32019 .intern(db),
32020 )
32021 }
32022 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32023 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32024 unreachable!("Expected a node, not a token");
32025 };
32026 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32027 }
32028}
32029impl<'db> TerminalColon<'db> {
32030 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32031 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32032 }
32033 pub fn token(&self, db: &'db dyn Database) -> TokenColon<'db> {
32034 TokenColon::from_syntax_node(db, self.node.get_children(db)[1])
32035 }
32036 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32037 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32038 }
32039}
32040#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32041pub struct TerminalColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32042impl<'db> TerminalColonPtr<'db> {}
32043impl<'db> TypedStablePtr<'db> for TerminalColonPtr<'db> {
32044 type SyntaxNode = TerminalColon<'db>;
32045 fn untyped(self) -> SyntaxStablePtrId<'db> {
32046 self.0
32047 }
32048 fn lookup(&self, db: &'db dyn Database) -> TerminalColon<'db> {
32049 TerminalColon::from_syntax_node(db, self.0.lookup(db))
32050 }
32051}
32052impl<'db> From<TerminalColonPtr<'db>> for SyntaxStablePtrId<'db> {
32053 fn from(ptr: TerminalColonPtr<'db>) -> Self {
32054 ptr.untyped()
32055 }
32056}
32057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32058pub struct TerminalColonGreen<'db>(pub GreenId<'db>);
32059impl<'db> TypedSyntaxNode<'db> for TerminalColon<'db> {
32060 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColon);
32061 type StablePtr = TerminalColonPtr<'db>;
32062 type Green = TerminalColonGreen<'db>;
32063 fn missing(db: &'db dyn Database) -> Self::Green {
32064 TerminalColonGreen(
32065 GreenNode {
32066 kind: SyntaxKind::TerminalColon,
32067 details: GreenNodeDetails::Node {
32068 children: [
32069 Trivia::missing(db).0,
32070 TokenColon::missing(db).0,
32071 Trivia::missing(db).0,
32072 ]
32073 .into(),
32074 width: TextWidth::default(),
32075 },
32076 }
32077 .intern(db),
32078 )
32079 }
32080 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32081 let kind = node.kind(db);
32082 assert_eq!(
32083 kind,
32084 SyntaxKind::TerminalColon,
32085 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32086 kind,
32087 SyntaxKind::TerminalColon
32088 );
32089 Self { node }
32090 }
32091 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32092 let kind = node.kind(db);
32093 if kind == SyntaxKind::TerminalColon {
32094 Some(Self::from_syntax_node(db, node))
32095 } else {
32096 None
32097 }
32098 }
32099 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32100 self.node
32101 }
32102 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32103 TerminalColonPtr(self.node.stable_ptr(db))
32104 }
32105}
32106#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32107pub struct TokenColonColon<'db> {
32108 node: SyntaxNode<'db>,
32109}
32110impl<'db> Token<'db> for TokenColonColon<'db> {
32111 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32112 TokenColonColonGreen(
32113 GreenNode { kind: SyntaxKind::TokenColonColon, details: GreenNodeDetails::Token(text) }
32114 .intern(db),
32115 )
32116 }
32117 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32118 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32119 }
32120}
32121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32122pub struct TokenColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32123impl<'db> TypedStablePtr<'db> for TokenColonColonPtr<'db> {
32124 type SyntaxNode = TokenColonColon<'db>;
32125 fn untyped(self) -> SyntaxStablePtrId<'db> {
32126 self.0
32127 }
32128 fn lookup(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32129 TokenColonColon::from_syntax_node(db, self.0.lookup(db))
32130 }
32131}
32132impl<'db> From<TokenColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32133 fn from(ptr: TokenColonColonPtr<'db>) -> Self {
32134 ptr.untyped()
32135 }
32136}
32137#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32138pub struct TokenColonColonGreen<'db>(pub GreenId<'db>);
32139impl<'db> TokenColonColonGreen<'db> {
32140 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32141 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32142 }
32143}
32144impl<'db> TypedSyntaxNode<'db> for TokenColonColon<'db> {
32145 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenColonColon);
32146 type StablePtr = TokenColonColonPtr<'db>;
32147 type Green = TokenColonColonGreen<'db>;
32148 fn missing(db: &'db dyn Database) -> Self::Green {
32149 TokenColonColonGreen(
32150 GreenNode {
32151 kind: SyntaxKind::TokenMissing,
32152 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32153 }
32154 .intern(db),
32155 )
32156 }
32157 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32158 match node.green_node(db).details {
32159 GreenNodeDetails::Token(_) => Self { node },
32160 GreenNodeDetails::Node { .. } => {
32161 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenColonColon)
32162 }
32163 }
32164 }
32165 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32166 match node.green_node(db).details {
32167 GreenNodeDetails::Token(_) => Some(Self { node }),
32168 GreenNodeDetails::Node { .. } => None,
32169 }
32170 }
32171 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32172 self.node
32173 }
32174 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32175 TokenColonColonPtr(self.node.stable_ptr(db))
32176 }
32177}
32178#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32179pub struct TerminalColonColon<'db> {
32180 node: SyntaxNode<'db>,
32181}
32182impl<'db> Terminal<'db> for TerminalColonColon<'db> {
32183 const KIND: SyntaxKind = SyntaxKind::TerminalColonColon;
32184 type TokenType = TokenColonColon<'db>;
32185 fn new_green(
32186 db: &'db dyn Database,
32187 leading_trivia: TriviaGreen<'db>,
32188 token: <<TerminalColonColon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32189 trailing_trivia: TriviaGreen<'db>,
32190 ) -> Self::Green {
32191 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32192 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32193 TerminalColonColonGreen(
32194 GreenNode {
32195 kind: SyntaxKind::TerminalColonColon,
32196 details: GreenNodeDetails::Node { children: children.into(), width },
32197 }
32198 .intern(db),
32199 )
32200 }
32201 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32202 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32203 unreachable!("Expected a node, not a token");
32204 };
32205 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32206 }
32207}
32208impl<'db> TerminalColonColon<'db> {
32209 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32210 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32211 }
32212 pub fn token(&self, db: &'db dyn Database) -> TokenColonColon<'db> {
32213 TokenColonColon::from_syntax_node(db, self.node.get_children(db)[1])
32214 }
32215 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32216 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32217 }
32218}
32219#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32220pub struct TerminalColonColonPtr<'db>(pub SyntaxStablePtrId<'db>);
32221impl<'db> TerminalColonColonPtr<'db> {}
32222impl<'db> TypedStablePtr<'db> for TerminalColonColonPtr<'db> {
32223 type SyntaxNode = TerminalColonColon<'db>;
32224 fn untyped(self) -> SyntaxStablePtrId<'db> {
32225 self.0
32226 }
32227 fn lookup(&self, db: &'db dyn Database) -> TerminalColonColon<'db> {
32228 TerminalColonColon::from_syntax_node(db, self.0.lookup(db))
32229 }
32230}
32231impl<'db> From<TerminalColonColonPtr<'db>> for SyntaxStablePtrId<'db> {
32232 fn from(ptr: TerminalColonColonPtr<'db>) -> Self {
32233 ptr.untyped()
32234 }
32235}
32236#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32237pub struct TerminalColonColonGreen<'db>(pub GreenId<'db>);
32238impl<'db> TypedSyntaxNode<'db> for TerminalColonColon<'db> {
32239 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalColonColon);
32240 type StablePtr = TerminalColonColonPtr<'db>;
32241 type Green = TerminalColonColonGreen<'db>;
32242 fn missing(db: &'db dyn Database) -> Self::Green {
32243 TerminalColonColonGreen(
32244 GreenNode {
32245 kind: SyntaxKind::TerminalColonColon,
32246 details: GreenNodeDetails::Node {
32247 children: [
32248 Trivia::missing(db).0,
32249 TokenColonColon::missing(db).0,
32250 Trivia::missing(db).0,
32251 ]
32252 .into(),
32253 width: TextWidth::default(),
32254 },
32255 }
32256 .intern(db),
32257 )
32258 }
32259 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32260 let kind = node.kind(db);
32261 assert_eq!(
32262 kind,
32263 SyntaxKind::TerminalColonColon,
32264 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32265 kind,
32266 SyntaxKind::TerminalColonColon
32267 );
32268 Self { node }
32269 }
32270 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32271 let kind = node.kind(db);
32272 if kind == SyntaxKind::TerminalColonColon {
32273 Some(Self::from_syntax_node(db, node))
32274 } else {
32275 None
32276 }
32277 }
32278 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32279 self.node
32280 }
32281 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32282 TerminalColonColonPtr(self.node.stable_ptr(db))
32283 }
32284}
32285#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32286pub struct TokenComma<'db> {
32287 node: SyntaxNode<'db>,
32288}
32289impl<'db> Token<'db> for TokenComma<'db> {
32290 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32291 TokenCommaGreen(
32292 GreenNode { kind: SyntaxKind::TokenComma, details: GreenNodeDetails::Token(text) }
32293 .intern(db),
32294 )
32295 }
32296 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32297 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32298 }
32299}
32300#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32301pub struct TokenCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32302impl<'db> TypedStablePtr<'db> for TokenCommaPtr<'db> {
32303 type SyntaxNode = TokenComma<'db>;
32304 fn untyped(self) -> SyntaxStablePtrId<'db> {
32305 self.0
32306 }
32307 fn lookup(&self, db: &'db dyn Database) -> TokenComma<'db> {
32308 TokenComma::from_syntax_node(db, self.0.lookup(db))
32309 }
32310}
32311impl<'db> From<TokenCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32312 fn from(ptr: TokenCommaPtr<'db>) -> Self {
32313 ptr.untyped()
32314 }
32315}
32316#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32317pub struct TokenCommaGreen<'db>(pub GreenId<'db>);
32318impl<'db> TokenCommaGreen<'db> {
32319 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32320 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32321 }
32322}
32323impl<'db> TypedSyntaxNode<'db> for TokenComma<'db> {
32324 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenComma);
32325 type StablePtr = TokenCommaPtr<'db>;
32326 type Green = TokenCommaGreen<'db>;
32327 fn missing(db: &'db dyn Database) -> Self::Green {
32328 TokenCommaGreen(
32329 GreenNode {
32330 kind: SyntaxKind::TokenMissing,
32331 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32332 }
32333 .intern(db),
32334 )
32335 }
32336 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32337 match node.green_node(db).details {
32338 GreenNodeDetails::Token(_) => Self { node },
32339 GreenNodeDetails::Node { .. } => {
32340 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenComma)
32341 }
32342 }
32343 }
32344 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32345 match node.green_node(db).details {
32346 GreenNodeDetails::Token(_) => Some(Self { node }),
32347 GreenNodeDetails::Node { .. } => None,
32348 }
32349 }
32350 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32351 self.node
32352 }
32353 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32354 TokenCommaPtr(self.node.stable_ptr(db))
32355 }
32356}
32357#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32358pub struct TerminalComma<'db> {
32359 node: SyntaxNode<'db>,
32360}
32361impl<'db> Terminal<'db> for TerminalComma<'db> {
32362 const KIND: SyntaxKind = SyntaxKind::TerminalComma;
32363 type TokenType = TokenComma<'db>;
32364 fn new_green(
32365 db: &'db dyn Database,
32366 leading_trivia: TriviaGreen<'db>,
32367 token: <<TerminalComma<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32368 trailing_trivia: TriviaGreen<'db>,
32369 ) -> Self::Green {
32370 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32371 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32372 TerminalCommaGreen(
32373 GreenNode {
32374 kind: SyntaxKind::TerminalComma,
32375 details: GreenNodeDetails::Node { children: children.into(), width },
32376 }
32377 .intern(db),
32378 )
32379 }
32380 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32381 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32382 unreachable!("Expected a node, not a token");
32383 };
32384 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32385 }
32386}
32387impl<'db> TerminalComma<'db> {
32388 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32389 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32390 }
32391 pub fn token(&self, db: &'db dyn Database) -> TokenComma<'db> {
32392 TokenComma::from_syntax_node(db, self.node.get_children(db)[1])
32393 }
32394 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32395 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32396 }
32397}
32398#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32399pub struct TerminalCommaPtr<'db>(pub SyntaxStablePtrId<'db>);
32400impl<'db> TerminalCommaPtr<'db> {}
32401impl<'db> TypedStablePtr<'db> for TerminalCommaPtr<'db> {
32402 type SyntaxNode = TerminalComma<'db>;
32403 fn untyped(self) -> SyntaxStablePtrId<'db> {
32404 self.0
32405 }
32406 fn lookup(&self, db: &'db dyn Database) -> TerminalComma<'db> {
32407 TerminalComma::from_syntax_node(db, self.0.lookup(db))
32408 }
32409}
32410impl<'db> From<TerminalCommaPtr<'db>> for SyntaxStablePtrId<'db> {
32411 fn from(ptr: TerminalCommaPtr<'db>) -> Self {
32412 ptr.untyped()
32413 }
32414}
32415#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32416pub struct TerminalCommaGreen<'db>(pub GreenId<'db>);
32417impl<'db> TypedSyntaxNode<'db> for TerminalComma<'db> {
32418 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalComma);
32419 type StablePtr = TerminalCommaPtr<'db>;
32420 type Green = TerminalCommaGreen<'db>;
32421 fn missing(db: &'db dyn Database) -> Self::Green {
32422 TerminalCommaGreen(
32423 GreenNode {
32424 kind: SyntaxKind::TerminalComma,
32425 details: GreenNodeDetails::Node {
32426 children: [
32427 Trivia::missing(db).0,
32428 TokenComma::missing(db).0,
32429 Trivia::missing(db).0,
32430 ]
32431 .into(),
32432 width: TextWidth::default(),
32433 },
32434 }
32435 .intern(db),
32436 )
32437 }
32438 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32439 let kind = node.kind(db);
32440 assert_eq!(
32441 kind,
32442 SyntaxKind::TerminalComma,
32443 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32444 kind,
32445 SyntaxKind::TerminalComma
32446 );
32447 Self { node }
32448 }
32449 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32450 let kind = node.kind(db);
32451 if kind == SyntaxKind::TerminalComma {
32452 Some(Self::from_syntax_node(db, node))
32453 } else {
32454 None
32455 }
32456 }
32457 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32458 self.node
32459 }
32460 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32461 TerminalCommaPtr(self.node.stable_ptr(db))
32462 }
32463}
32464#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32465pub struct TokenDiv<'db> {
32466 node: SyntaxNode<'db>,
32467}
32468impl<'db> Token<'db> for TokenDiv<'db> {
32469 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32470 TokenDivGreen(
32471 GreenNode { kind: SyntaxKind::TokenDiv, details: GreenNodeDetails::Token(text) }
32472 .intern(db),
32473 )
32474 }
32475 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32476 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32477 }
32478}
32479#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32480pub struct TokenDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32481impl<'db> TypedStablePtr<'db> for TokenDivPtr<'db> {
32482 type SyntaxNode = TokenDiv<'db>;
32483 fn untyped(self) -> SyntaxStablePtrId<'db> {
32484 self.0
32485 }
32486 fn lookup(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32487 TokenDiv::from_syntax_node(db, self.0.lookup(db))
32488 }
32489}
32490impl<'db> From<TokenDivPtr<'db>> for SyntaxStablePtrId<'db> {
32491 fn from(ptr: TokenDivPtr<'db>) -> Self {
32492 ptr.untyped()
32493 }
32494}
32495#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32496pub struct TokenDivGreen<'db>(pub GreenId<'db>);
32497impl<'db> TokenDivGreen<'db> {
32498 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32499 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32500 }
32501}
32502impl<'db> TypedSyntaxNode<'db> for TokenDiv<'db> {
32503 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDiv);
32504 type StablePtr = TokenDivPtr<'db>;
32505 type Green = TokenDivGreen<'db>;
32506 fn missing(db: &'db dyn Database) -> Self::Green {
32507 TokenDivGreen(
32508 GreenNode {
32509 kind: SyntaxKind::TokenMissing,
32510 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32511 }
32512 .intern(db),
32513 )
32514 }
32515 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32516 match node.green_node(db).details {
32517 GreenNodeDetails::Token(_) => Self { node },
32518 GreenNodeDetails::Node { .. } => {
32519 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDiv)
32520 }
32521 }
32522 }
32523 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32524 match node.green_node(db).details {
32525 GreenNodeDetails::Token(_) => Some(Self { node }),
32526 GreenNodeDetails::Node { .. } => None,
32527 }
32528 }
32529 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32530 self.node
32531 }
32532 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32533 TokenDivPtr(self.node.stable_ptr(db))
32534 }
32535}
32536#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32537pub struct TerminalDiv<'db> {
32538 node: SyntaxNode<'db>,
32539}
32540impl<'db> Terminal<'db> for TerminalDiv<'db> {
32541 const KIND: SyntaxKind = SyntaxKind::TerminalDiv;
32542 type TokenType = TokenDiv<'db>;
32543 fn new_green(
32544 db: &'db dyn Database,
32545 leading_trivia: TriviaGreen<'db>,
32546 token: <<TerminalDiv<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32547 trailing_trivia: TriviaGreen<'db>,
32548 ) -> Self::Green {
32549 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32550 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32551 TerminalDivGreen(
32552 GreenNode {
32553 kind: SyntaxKind::TerminalDiv,
32554 details: GreenNodeDetails::Node { children: children.into(), width },
32555 }
32556 .intern(db),
32557 )
32558 }
32559 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32560 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32561 unreachable!("Expected a node, not a token");
32562 };
32563 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32564 }
32565}
32566impl<'db> TerminalDiv<'db> {
32567 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32568 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32569 }
32570 pub fn token(&self, db: &'db dyn Database) -> TokenDiv<'db> {
32571 TokenDiv::from_syntax_node(db, self.node.get_children(db)[1])
32572 }
32573 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32574 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32575 }
32576}
32577#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32578pub struct TerminalDivPtr<'db>(pub SyntaxStablePtrId<'db>);
32579impl<'db> TerminalDivPtr<'db> {}
32580impl<'db> TypedStablePtr<'db> for TerminalDivPtr<'db> {
32581 type SyntaxNode = TerminalDiv<'db>;
32582 fn untyped(self) -> SyntaxStablePtrId<'db> {
32583 self.0
32584 }
32585 fn lookup(&self, db: &'db dyn Database) -> TerminalDiv<'db> {
32586 TerminalDiv::from_syntax_node(db, self.0.lookup(db))
32587 }
32588}
32589impl<'db> From<TerminalDivPtr<'db>> for SyntaxStablePtrId<'db> {
32590 fn from(ptr: TerminalDivPtr<'db>) -> Self {
32591 ptr.untyped()
32592 }
32593}
32594#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32595pub struct TerminalDivGreen<'db>(pub GreenId<'db>);
32596impl<'db> TypedSyntaxNode<'db> for TerminalDiv<'db> {
32597 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDiv);
32598 type StablePtr = TerminalDivPtr<'db>;
32599 type Green = TerminalDivGreen<'db>;
32600 fn missing(db: &'db dyn Database) -> Self::Green {
32601 TerminalDivGreen(
32602 GreenNode {
32603 kind: SyntaxKind::TerminalDiv,
32604 details: GreenNodeDetails::Node {
32605 children: [
32606 Trivia::missing(db).0,
32607 TokenDiv::missing(db).0,
32608 Trivia::missing(db).0,
32609 ]
32610 .into(),
32611 width: TextWidth::default(),
32612 },
32613 }
32614 .intern(db),
32615 )
32616 }
32617 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32618 let kind = node.kind(db);
32619 assert_eq!(
32620 kind,
32621 SyntaxKind::TerminalDiv,
32622 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32623 kind,
32624 SyntaxKind::TerminalDiv
32625 );
32626 Self { node }
32627 }
32628 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32629 let kind = node.kind(db);
32630 if kind == SyntaxKind::TerminalDiv { Some(Self::from_syntax_node(db, node)) } else { None }
32631 }
32632 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32633 self.node
32634 }
32635 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32636 TerminalDivPtr(self.node.stable_ptr(db))
32637 }
32638}
32639#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32640pub struct TokenDivEq<'db> {
32641 node: SyntaxNode<'db>,
32642}
32643impl<'db> Token<'db> for TokenDivEq<'db> {
32644 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32645 TokenDivEqGreen(
32646 GreenNode { kind: SyntaxKind::TokenDivEq, details: GreenNodeDetails::Token(text) }
32647 .intern(db),
32648 )
32649 }
32650 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32651 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32652 }
32653}
32654#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32655pub struct TokenDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32656impl<'db> TypedStablePtr<'db> for TokenDivEqPtr<'db> {
32657 type SyntaxNode = TokenDivEq<'db>;
32658 fn untyped(self) -> SyntaxStablePtrId<'db> {
32659 self.0
32660 }
32661 fn lookup(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32662 TokenDivEq::from_syntax_node(db, self.0.lookup(db))
32663 }
32664}
32665impl<'db> From<TokenDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32666 fn from(ptr: TokenDivEqPtr<'db>) -> Self {
32667 ptr.untyped()
32668 }
32669}
32670#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32671pub struct TokenDivEqGreen<'db>(pub GreenId<'db>);
32672impl<'db> TokenDivEqGreen<'db> {
32673 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32674 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32675 }
32676}
32677impl<'db> TypedSyntaxNode<'db> for TokenDivEq<'db> {
32678 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDivEq);
32679 type StablePtr = TokenDivEqPtr<'db>;
32680 type Green = TokenDivEqGreen<'db>;
32681 fn missing(db: &'db dyn Database) -> Self::Green {
32682 TokenDivEqGreen(
32683 GreenNode {
32684 kind: SyntaxKind::TokenMissing,
32685 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32686 }
32687 .intern(db),
32688 )
32689 }
32690 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32691 match node.green_node(db).details {
32692 GreenNodeDetails::Token(_) => Self { node },
32693 GreenNodeDetails::Node { .. } => {
32694 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDivEq)
32695 }
32696 }
32697 }
32698 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32699 match node.green_node(db).details {
32700 GreenNodeDetails::Token(_) => Some(Self { node }),
32701 GreenNodeDetails::Node { .. } => None,
32702 }
32703 }
32704 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32705 self.node
32706 }
32707 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32708 TokenDivEqPtr(self.node.stable_ptr(db))
32709 }
32710}
32711#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32712pub struct TerminalDivEq<'db> {
32713 node: SyntaxNode<'db>,
32714}
32715impl<'db> Terminal<'db> for TerminalDivEq<'db> {
32716 const KIND: SyntaxKind = SyntaxKind::TerminalDivEq;
32717 type TokenType = TokenDivEq<'db>;
32718 fn new_green(
32719 db: &'db dyn Database,
32720 leading_trivia: TriviaGreen<'db>,
32721 token: <<TerminalDivEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32722 trailing_trivia: TriviaGreen<'db>,
32723 ) -> Self::Green {
32724 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32725 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32726 TerminalDivEqGreen(
32727 GreenNode {
32728 kind: SyntaxKind::TerminalDivEq,
32729 details: GreenNodeDetails::Node { children: children.into(), width },
32730 }
32731 .intern(db),
32732 )
32733 }
32734 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32735 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32736 unreachable!("Expected a node, not a token");
32737 };
32738 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32739 }
32740}
32741impl<'db> TerminalDivEq<'db> {
32742 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32743 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32744 }
32745 pub fn token(&self, db: &'db dyn Database) -> TokenDivEq<'db> {
32746 TokenDivEq::from_syntax_node(db, self.node.get_children(db)[1])
32747 }
32748 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32749 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32750 }
32751}
32752#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32753pub struct TerminalDivEqPtr<'db>(pub SyntaxStablePtrId<'db>);
32754impl<'db> TerminalDivEqPtr<'db> {}
32755impl<'db> TypedStablePtr<'db> for TerminalDivEqPtr<'db> {
32756 type SyntaxNode = TerminalDivEq<'db>;
32757 fn untyped(self) -> SyntaxStablePtrId<'db> {
32758 self.0
32759 }
32760 fn lookup(&self, db: &'db dyn Database) -> TerminalDivEq<'db> {
32761 TerminalDivEq::from_syntax_node(db, self.0.lookup(db))
32762 }
32763}
32764impl<'db> From<TerminalDivEqPtr<'db>> for SyntaxStablePtrId<'db> {
32765 fn from(ptr: TerminalDivEqPtr<'db>) -> Self {
32766 ptr.untyped()
32767 }
32768}
32769#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32770pub struct TerminalDivEqGreen<'db>(pub GreenId<'db>);
32771impl<'db> TypedSyntaxNode<'db> for TerminalDivEq<'db> {
32772 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDivEq);
32773 type StablePtr = TerminalDivEqPtr<'db>;
32774 type Green = TerminalDivEqGreen<'db>;
32775 fn missing(db: &'db dyn Database) -> Self::Green {
32776 TerminalDivEqGreen(
32777 GreenNode {
32778 kind: SyntaxKind::TerminalDivEq,
32779 details: GreenNodeDetails::Node {
32780 children: [
32781 Trivia::missing(db).0,
32782 TokenDivEq::missing(db).0,
32783 Trivia::missing(db).0,
32784 ]
32785 .into(),
32786 width: TextWidth::default(),
32787 },
32788 }
32789 .intern(db),
32790 )
32791 }
32792 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32793 let kind = node.kind(db);
32794 assert_eq!(
32795 kind,
32796 SyntaxKind::TerminalDivEq,
32797 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32798 kind,
32799 SyntaxKind::TerminalDivEq
32800 );
32801 Self { node }
32802 }
32803 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32804 let kind = node.kind(db);
32805 if kind == SyntaxKind::TerminalDivEq {
32806 Some(Self::from_syntax_node(db, node))
32807 } else {
32808 None
32809 }
32810 }
32811 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32812 self.node
32813 }
32814 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32815 TerminalDivEqPtr(self.node.stable_ptr(db))
32816 }
32817}
32818#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32819pub struct TokenDollar<'db> {
32820 node: SyntaxNode<'db>,
32821}
32822impl<'db> Token<'db> for TokenDollar<'db> {
32823 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
32824 TokenDollarGreen(
32825 GreenNode { kind: SyntaxKind::TokenDollar, details: GreenNodeDetails::Token(text) }
32826 .intern(db),
32827 )
32828 }
32829 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32830 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
32831 }
32832}
32833#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32834pub struct TokenDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32835impl<'db> TypedStablePtr<'db> for TokenDollarPtr<'db> {
32836 type SyntaxNode = TokenDollar<'db>;
32837 fn untyped(self) -> SyntaxStablePtrId<'db> {
32838 self.0
32839 }
32840 fn lookup(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32841 TokenDollar::from_syntax_node(db, self.0.lookup(db))
32842 }
32843}
32844impl<'db> From<TokenDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32845 fn from(ptr: TokenDollarPtr<'db>) -> Self {
32846 ptr.untyped()
32847 }
32848}
32849#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32850pub struct TokenDollarGreen<'db>(pub GreenId<'db>);
32851impl<'db> TokenDollarGreen<'db> {
32852 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32853 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
32854 }
32855}
32856impl<'db> TypedSyntaxNode<'db> for TokenDollar<'db> {
32857 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDollar);
32858 type StablePtr = TokenDollarPtr<'db>;
32859 type Green = TokenDollarGreen<'db>;
32860 fn missing(db: &'db dyn Database) -> Self::Green {
32861 TokenDollarGreen(
32862 GreenNode {
32863 kind: SyntaxKind::TokenMissing,
32864 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
32865 }
32866 .intern(db),
32867 )
32868 }
32869 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32870 match node.green_node(db).details {
32871 GreenNodeDetails::Token(_) => Self { node },
32872 GreenNodeDetails::Node { .. } => {
32873 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDollar)
32874 }
32875 }
32876 }
32877 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32878 match node.green_node(db).details {
32879 GreenNodeDetails::Token(_) => Some(Self { node }),
32880 GreenNodeDetails::Node { .. } => None,
32881 }
32882 }
32883 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32884 self.node
32885 }
32886 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32887 TokenDollarPtr(self.node.stable_ptr(db))
32888 }
32889}
32890#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32891pub struct TerminalDollar<'db> {
32892 node: SyntaxNode<'db>,
32893}
32894impl<'db> Terminal<'db> for TerminalDollar<'db> {
32895 const KIND: SyntaxKind = SyntaxKind::TerminalDollar;
32896 type TokenType = TokenDollar<'db>;
32897 fn new_green(
32898 db: &'db dyn Database,
32899 leading_trivia: TriviaGreen<'db>,
32900 token: <<TerminalDollar<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
32901 trailing_trivia: TriviaGreen<'db>,
32902 ) -> Self::Green {
32903 let children = [leading_trivia.0, token.0, trailing_trivia.0];
32904 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
32905 TerminalDollarGreen(
32906 GreenNode {
32907 kind: SyntaxKind::TerminalDollar,
32908 details: GreenNodeDetails::Node { children: children.into(), width },
32909 }
32910 .intern(db),
32911 )
32912 }
32913 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
32914 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
32915 unreachable!("Expected a node, not a token");
32916 };
32917 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
32918 }
32919}
32920impl<'db> TerminalDollar<'db> {
32921 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32922 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
32923 }
32924 pub fn token(&self, db: &'db dyn Database) -> TokenDollar<'db> {
32925 TokenDollar::from_syntax_node(db, self.node.get_children(db)[1])
32926 }
32927 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
32928 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
32929 }
32930}
32931#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32932pub struct TerminalDollarPtr<'db>(pub SyntaxStablePtrId<'db>);
32933impl<'db> TerminalDollarPtr<'db> {}
32934impl<'db> TypedStablePtr<'db> for TerminalDollarPtr<'db> {
32935 type SyntaxNode = TerminalDollar<'db>;
32936 fn untyped(self) -> SyntaxStablePtrId<'db> {
32937 self.0
32938 }
32939 fn lookup(&self, db: &'db dyn Database) -> TerminalDollar<'db> {
32940 TerminalDollar::from_syntax_node(db, self.0.lookup(db))
32941 }
32942}
32943impl<'db> From<TerminalDollarPtr<'db>> for SyntaxStablePtrId<'db> {
32944 fn from(ptr: TerminalDollarPtr<'db>) -> Self {
32945 ptr.untyped()
32946 }
32947}
32948#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
32949pub struct TerminalDollarGreen<'db>(pub GreenId<'db>);
32950impl<'db> TypedSyntaxNode<'db> for TerminalDollar<'db> {
32951 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDollar);
32952 type StablePtr = TerminalDollarPtr<'db>;
32953 type Green = TerminalDollarGreen<'db>;
32954 fn missing(db: &'db dyn Database) -> Self::Green {
32955 TerminalDollarGreen(
32956 GreenNode {
32957 kind: SyntaxKind::TerminalDollar,
32958 details: GreenNodeDetails::Node {
32959 children: [
32960 Trivia::missing(db).0,
32961 TokenDollar::missing(db).0,
32962 Trivia::missing(db).0,
32963 ]
32964 .into(),
32965 width: TextWidth::default(),
32966 },
32967 }
32968 .intern(db),
32969 )
32970 }
32971 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
32972 let kind = node.kind(db);
32973 assert_eq!(
32974 kind,
32975 SyntaxKind::TerminalDollar,
32976 "Unexpected SyntaxKind {:?}. Expected {:?}.",
32977 kind,
32978 SyntaxKind::TerminalDollar
32979 );
32980 Self { node }
32981 }
32982 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
32983 let kind = node.kind(db);
32984 if kind == SyntaxKind::TerminalDollar {
32985 Some(Self::from_syntax_node(db, node))
32986 } else {
32987 None
32988 }
32989 }
32990 fn as_syntax_node(&self) -> SyntaxNode<'db> {
32991 self.node
32992 }
32993 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
32994 TerminalDollarPtr(self.node.stable_ptr(db))
32995 }
32996}
32997#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
32998pub struct TokenDot<'db> {
32999 node: SyntaxNode<'db>,
33000}
33001impl<'db> Token<'db> for TokenDot<'db> {
33002 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33003 TokenDotGreen(
33004 GreenNode { kind: SyntaxKind::TokenDot, details: GreenNodeDetails::Token(text) }
33005 .intern(db),
33006 )
33007 }
33008 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33009 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33010 }
33011}
33012#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33013pub struct TokenDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33014impl<'db> TypedStablePtr<'db> for TokenDotPtr<'db> {
33015 type SyntaxNode = TokenDot<'db>;
33016 fn untyped(self) -> SyntaxStablePtrId<'db> {
33017 self.0
33018 }
33019 fn lookup(&self, db: &'db dyn Database) -> TokenDot<'db> {
33020 TokenDot::from_syntax_node(db, self.0.lookup(db))
33021 }
33022}
33023impl<'db> From<TokenDotPtr<'db>> for SyntaxStablePtrId<'db> {
33024 fn from(ptr: TokenDotPtr<'db>) -> Self {
33025 ptr.untyped()
33026 }
33027}
33028#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33029pub struct TokenDotGreen<'db>(pub GreenId<'db>);
33030impl<'db> TokenDotGreen<'db> {
33031 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33032 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33033 }
33034}
33035impl<'db> TypedSyntaxNode<'db> for TokenDot<'db> {
33036 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDot);
33037 type StablePtr = TokenDotPtr<'db>;
33038 type Green = TokenDotGreen<'db>;
33039 fn missing(db: &'db dyn Database) -> Self::Green {
33040 TokenDotGreen(
33041 GreenNode {
33042 kind: SyntaxKind::TokenMissing,
33043 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33044 }
33045 .intern(db),
33046 )
33047 }
33048 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33049 match node.green_node(db).details {
33050 GreenNodeDetails::Token(_) => Self { node },
33051 GreenNodeDetails::Node { .. } => {
33052 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDot)
33053 }
33054 }
33055 }
33056 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33057 match node.green_node(db).details {
33058 GreenNodeDetails::Token(_) => Some(Self { node }),
33059 GreenNodeDetails::Node { .. } => None,
33060 }
33061 }
33062 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33063 self.node
33064 }
33065 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33066 TokenDotPtr(self.node.stable_ptr(db))
33067 }
33068}
33069#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33070pub struct TerminalDot<'db> {
33071 node: SyntaxNode<'db>,
33072}
33073impl<'db> Terminal<'db> for TerminalDot<'db> {
33074 const KIND: SyntaxKind = SyntaxKind::TerminalDot;
33075 type TokenType = TokenDot<'db>;
33076 fn new_green(
33077 db: &'db dyn Database,
33078 leading_trivia: TriviaGreen<'db>,
33079 token: <<TerminalDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33080 trailing_trivia: TriviaGreen<'db>,
33081 ) -> Self::Green {
33082 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33083 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33084 TerminalDotGreen(
33085 GreenNode {
33086 kind: SyntaxKind::TerminalDot,
33087 details: GreenNodeDetails::Node { children: children.into(), width },
33088 }
33089 .intern(db),
33090 )
33091 }
33092 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33093 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33094 unreachable!("Expected a node, not a token");
33095 };
33096 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33097 }
33098}
33099impl<'db> TerminalDot<'db> {
33100 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33101 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33102 }
33103 pub fn token(&self, db: &'db dyn Database) -> TokenDot<'db> {
33104 TokenDot::from_syntax_node(db, self.node.get_children(db)[1])
33105 }
33106 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33107 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33108 }
33109}
33110#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33111pub struct TerminalDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33112impl<'db> TerminalDotPtr<'db> {}
33113impl<'db> TypedStablePtr<'db> for TerminalDotPtr<'db> {
33114 type SyntaxNode = TerminalDot<'db>;
33115 fn untyped(self) -> SyntaxStablePtrId<'db> {
33116 self.0
33117 }
33118 fn lookup(&self, db: &'db dyn Database) -> TerminalDot<'db> {
33119 TerminalDot::from_syntax_node(db, self.0.lookup(db))
33120 }
33121}
33122impl<'db> From<TerminalDotPtr<'db>> for SyntaxStablePtrId<'db> {
33123 fn from(ptr: TerminalDotPtr<'db>) -> Self {
33124 ptr.untyped()
33125 }
33126}
33127#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33128pub struct TerminalDotGreen<'db>(pub GreenId<'db>);
33129impl<'db> TypedSyntaxNode<'db> for TerminalDot<'db> {
33130 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDot);
33131 type StablePtr = TerminalDotPtr<'db>;
33132 type Green = TerminalDotGreen<'db>;
33133 fn missing(db: &'db dyn Database) -> Self::Green {
33134 TerminalDotGreen(
33135 GreenNode {
33136 kind: SyntaxKind::TerminalDot,
33137 details: GreenNodeDetails::Node {
33138 children: [
33139 Trivia::missing(db).0,
33140 TokenDot::missing(db).0,
33141 Trivia::missing(db).0,
33142 ]
33143 .into(),
33144 width: TextWidth::default(),
33145 },
33146 }
33147 .intern(db),
33148 )
33149 }
33150 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33151 let kind = node.kind(db);
33152 assert_eq!(
33153 kind,
33154 SyntaxKind::TerminalDot,
33155 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33156 kind,
33157 SyntaxKind::TerminalDot
33158 );
33159 Self { node }
33160 }
33161 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33162 let kind = node.kind(db);
33163 if kind == SyntaxKind::TerminalDot { Some(Self::from_syntax_node(db, node)) } else { None }
33164 }
33165 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33166 self.node
33167 }
33168 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33169 TerminalDotPtr(self.node.stable_ptr(db))
33170 }
33171}
33172#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33173pub struct TokenDotDot<'db> {
33174 node: SyntaxNode<'db>,
33175}
33176impl<'db> Token<'db> for TokenDotDot<'db> {
33177 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33178 TokenDotDotGreen(
33179 GreenNode { kind: SyntaxKind::TokenDotDot, details: GreenNodeDetails::Token(text) }
33180 .intern(db),
33181 )
33182 }
33183 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33184 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33185 }
33186}
33187#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33188pub struct TokenDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33189impl<'db> TypedStablePtr<'db> for TokenDotDotPtr<'db> {
33190 type SyntaxNode = TokenDotDot<'db>;
33191 fn untyped(self) -> SyntaxStablePtrId<'db> {
33192 self.0
33193 }
33194 fn lookup(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33195 TokenDotDot::from_syntax_node(db, self.0.lookup(db))
33196 }
33197}
33198impl<'db> From<TokenDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33199 fn from(ptr: TokenDotDotPtr<'db>) -> Self {
33200 ptr.untyped()
33201 }
33202}
33203#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33204pub struct TokenDotDotGreen<'db>(pub GreenId<'db>);
33205impl<'db> TokenDotDotGreen<'db> {
33206 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33207 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33208 }
33209}
33210impl<'db> TypedSyntaxNode<'db> for TokenDotDot<'db> {
33211 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDot);
33212 type StablePtr = TokenDotDotPtr<'db>;
33213 type Green = TokenDotDotGreen<'db>;
33214 fn missing(db: &'db dyn Database) -> Self::Green {
33215 TokenDotDotGreen(
33216 GreenNode {
33217 kind: SyntaxKind::TokenMissing,
33218 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33219 }
33220 .intern(db),
33221 )
33222 }
33223 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33224 match node.green_node(db).details {
33225 GreenNodeDetails::Token(_) => Self { node },
33226 GreenNodeDetails::Node { .. } => {
33227 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDot)
33228 }
33229 }
33230 }
33231 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33232 match node.green_node(db).details {
33233 GreenNodeDetails::Token(_) => Some(Self { node }),
33234 GreenNodeDetails::Node { .. } => None,
33235 }
33236 }
33237 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33238 self.node
33239 }
33240 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33241 TokenDotDotPtr(self.node.stable_ptr(db))
33242 }
33243}
33244#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33245pub struct TerminalDotDot<'db> {
33246 node: SyntaxNode<'db>,
33247}
33248impl<'db> Terminal<'db> for TerminalDotDot<'db> {
33249 const KIND: SyntaxKind = SyntaxKind::TerminalDotDot;
33250 type TokenType = TokenDotDot<'db>;
33251 fn new_green(
33252 db: &'db dyn Database,
33253 leading_trivia: TriviaGreen<'db>,
33254 token: <<TerminalDotDot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33255 trailing_trivia: TriviaGreen<'db>,
33256 ) -> Self::Green {
33257 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33258 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33259 TerminalDotDotGreen(
33260 GreenNode {
33261 kind: SyntaxKind::TerminalDotDot,
33262 details: GreenNodeDetails::Node { children: children.into(), width },
33263 }
33264 .intern(db),
33265 )
33266 }
33267 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33268 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33269 unreachable!("Expected a node, not a token");
33270 };
33271 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33272 }
33273}
33274impl<'db> TerminalDotDot<'db> {
33275 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33276 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33277 }
33278 pub fn token(&self, db: &'db dyn Database) -> TokenDotDot<'db> {
33279 TokenDotDot::from_syntax_node(db, self.node.get_children(db)[1])
33280 }
33281 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33282 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33283 }
33284}
33285#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33286pub struct TerminalDotDotPtr<'db>(pub SyntaxStablePtrId<'db>);
33287impl<'db> TerminalDotDotPtr<'db> {}
33288impl<'db> TypedStablePtr<'db> for TerminalDotDotPtr<'db> {
33289 type SyntaxNode = TerminalDotDot<'db>;
33290 fn untyped(self) -> SyntaxStablePtrId<'db> {
33291 self.0
33292 }
33293 fn lookup(&self, db: &'db dyn Database) -> TerminalDotDot<'db> {
33294 TerminalDotDot::from_syntax_node(db, self.0.lookup(db))
33295 }
33296}
33297impl<'db> From<TerminalDotDotPtr<'db>> for SyntaxStablePtrId<'db> {
33298 fn from(ptr: TerminalDotDotPtr<'db>) -> Self {
33299 ptr.untyped()
33300 }
33301}
33302#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33303pub struct TerminalDotDotGreen<'db>(pub GreenId<'db>);
33304impl<'db> TypedSyntaxNode<'db> for TerminalDotDot<'db> {
33305 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDot);
33306 type StablePtr = TerminalDotDotPtr<'db>;
33307 type Green = TerminalDotDotGreen<'db>;
33308 fn missing(db: &'db dyn Database) -> Self::Green {
33309 TerminalDotDotGreen(
33310 GreenNode {
33311 kind: SyntaxKind::TerminalDotDot,
33312 details: GreenNodeDetails::Node {
33313 children: [
33314 Trivia::missing(db).0,
33315 TokenDotDot::missing(db).0,
33316 Trivia::missing(db).0,
33317 ]
33318 .into(),
33319 width: TextWidth::default(),
33320 },
33321 }
33322 .intern(db),
33323 )
33324 }
33325 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33326 let kind = node.kind(db);
33327 assert_eq!(
33328 kind,
33329 SyntaxKind::TerminalDotDot,
33330 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33331 kind,
33332 SyntaxKind::TerminalDotDot
33333 );
33334 Self { node }
33335 }
33336 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33337 let kind = node.kind(db);
33338 if kind == SyntaxKind::TerminalDotDot {
33339 Some(Self::from_syntax_node(db, node))
33340 } else {
33341 None
33342 }
33343 }
33344 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33345 self.node
33346 }
33347 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33348 TerminalDotDotPtr(self.node.stable_ptr(db))
33349 }
33350}
33351#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33352pub struct TokenDotDotEq<'db> {
33353 node: SyntaxNode<'db>,
33354}
33355impl<'db> Token<'db> for TokenDotDotEq<'db> {
33356 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33357 TokenDotDotEqGreen(
33358 GreenNode { kind: SyntaxKind::TokenDotDotEq, details: GreenNodeDetails::Token(text) }
33359 .intern(db),
33360 )
33361 }
33362 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33363 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33364 }
33365}
33366#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33367pub struct TokenDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33368impl<'db> TypedStablePtr<'db> for TokenDotDotEqPtr<'db> {
33369 type SyntaxNode = TokenDotDotEq<'db>;
33370 fn untyped(self) -> SyntaxStablePtrId<'db> {
33371 self.0
33372 }
33373 fn lookup(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33374 TokenDotDotEq::from_syntax_node(db, self.0.lookup(db))
33375 }
33376}
33377impl<'db> From<TokenDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33378 fn from(ptr: TokenDotDotEqPtr<'db>) -> Self {
33379 ptr.untyped()
33380 }
33381}
33382#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33383pub struct TokenDotDotEqGreen<'db>(pub GreenId<'db>);
33384impl<'db> TokenDotDotEqGreen<'db> {
33385 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33386 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33387 }
33388}
33389impl<'db> TypedSyntaxNode<'db> for TokenDotDotEq<'db> {
33390 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenDotDotEq);
33391 type StablePtr = TokenDotDotEqPtr<'db>;
33392 type Green = TokenDotDotEqGreen<'db>;
33393 fn missing(db: &'db dyn Database) -> Self::Green {
33394 TokenDotDotEqGreen(
33395 GreenNode {
33396 kind: SyntaxKind::TokenMissing,
33397 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33398 }
33399 .intern(db),
33400 )
33401 }
33402 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33403 match node.green_node(db).details {
33404 GreenNodeDetails::Token(_) => Self { node },
33405 GreenNodeDetails::Node { .. } => {
33406 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenDotDotEq)
33407 }
33408 }
33409 }
33410 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33411 match node.green_node(db).details {
33412 GreenNodeDetails::Token(_) => Some(Self { node }),
33413 GreenNodeDetails::Node { .. } => None,
33414 }
33415 }
33416 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33417 self.node
33418 }
33419 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33420 TokenDotDotEqPtr(self.node.stable_ptr(db))
33421 }
33422}
33423#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33424pub struct TerminalDotDotEq<'db> {
33425 node: SyntaxNode<'db>,
33426}
33427impl<'db> Terminal<'db> for TerminalDotDotEq<'db> {
33428 const KIND: SyntaxKind = SyntaxKind::TerminalDotDotEq;
33429 type TokenType = TokenDotDotEq<'db>;
33430 fn new_green(
33431 db: &'db dyn Database,
33432 leading_trivia: TriviaGreen<'db>,
33433 token: <<TerminalDotDotEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33434 trailing_trivia: TriviaGreen<'db>,
33435 ) -> Self::Green {
33436 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33437 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33438 TerminalDotDotEqGreen(
33439 GreenNode {
33440 kind: SyntaxKind::TerminalDotDotEq,
33441 details: GreenNodeDetails::Node { children: children.into(), width },
33442 }
33443 .intern(db),
33444 )
33445 }
33446 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33447 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33448 unreachable!("Expected a node, not a token");
33449 };
33450 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33451 }
33452}
33453impl<'db> TerminalDotDotEq<'db> {
33454 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33455 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33456 }
33457 pub fn token(&self, db: &'db dyn Database) -> TokenDotDotEq<'db> {
33458 TokenDotDotEq::from_syntax_node(db, self.node.get_children(db)[1])
33459 }
33460 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33461 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33462 }
33463}
33464#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33465pub struct TerminalDotDotEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33466impl<'db> TerminalDotDotEqPtr<'db> {}
33467impl<'db> TypedStablePtr<'db> for TerminalDotDotEqPtr<'db> {
33468 type SyntaxNode = TerminalDotDotEq<'db>;
33469 fn untyped(self) -> SyntaxStablePtrId<'db> {
33470 self.0
33471 }
33472 fn lookup(&self, db: &'db dyn Database) -> TerminalDotDotEq<'db> {
33473 TerminalDotDotEq::from_syntax_node(db, self.0.lookup(db))
33474 }
33475}
33476impl<'db> From<TerminalDotDotEqPtr<'db>> for SyntaxStablePtrId<'db> {
33477 fn from(ptr: TerminalDotDotEqPtr<'db>) -> Self {
33478 ptr.untyped()
33479 }
33480}
33481#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33482pub struct TerminalDotDotEqGreen<'db>(pub GreenId<'db>);
33483impl<'db> TypedSyntaxNode<'db> for TerminalDotDotEq<'db> {
33484 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalDotDotEq);
33485 type StablePtr = TerminalDotDotEqPtr<'db>;
33486 type Green = TerminalDotDotEqGreen<'db>;
33487 fn missing(db: &'db dyn Database) -> Self::Green {
33488 TerminalDotDotEqGreen(
33489 GreenNode {
33490 kind: SyntaxKind::TerminalDotDotEq,
33491 details: GreenNodeDetails::Node {
33492 children: [
33493 Trivia::missing(db).0,
33494 TokenDotDotEq::missing(db).0,
33495 Trivia::missing(db).0,
33496 ]
33497 .into(),
33498 width: TextWidth::default(),
33499 },
33500 }
33501 .intern(db),
33502 )
33503 }
33504 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33505 let kind = node.kind(db);
33506 assert_eq!(
33507 kind,
33508 SyntaxKind::TerminalDotDotEq,
33509 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33510 kind,
33511 SyntaxKind::TerminalDotDotEq
33512 );
33513 Self { node }
33514 }
33515 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33516 let kind = node.kind(db);
33517 if kind == SyntaxKind::TerminalDotDotEq {
33518 Some(Self::from_syntax_node(db, node))
33519 } else {
33520 None
33521 }
33522 }
33523 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33524 self.node
33525 }
33526 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33527 TerminalDotDotEqPtr(self.node.stable_ptr(db))
33528 }
33529}
33530#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33531pub struct TokenEndOfFile<'db> {
33532 node: SyntaxNode<'db>,
33533}
33534impl<'db> Token<'db> for TokenEndOfFile<'db> {
33535 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33536 TokenEndOfFileGreen(
33537 GreenNode { kind: SyntaxKind::TokenEndOfFile, details: GreenNodeDetails::Token(text) }
33538 .intern(db),
33539 )
33540 }
33541 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33542 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33543 }
33544}
33545#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33546pub struct TokenEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33547impl<'db> TypedStablePtr<'db> for TokenEndOfFilePtr<'db> {
33548 type SyntaxNode = TokenEndOfFile<'db>;
33549 fn untyped(self) -> SyntaxStablePtrId<'db> {
33550 self.0
33551 }
33552 fn lookup(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33553 TokenEndOfFile::from_syntax_node(db, self.0.lookup(db))
33554 }
33555}
33556impl<'db> From<TokenEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33557 fn from(ptr: TokenEndOfFilePtr<'db>) -> Self {
33558 ptr.untyped()
33559 }
33560}
33561#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33562pub struct TokenEndOfFileGreen<'db>(pub GreenId<'db>);
33563impl<'db> TokenEndOfFileGreen<'db> {
33564 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33565 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33566 }
33567}
33568impl<'db> TypedSyntaxNode<'db> for TokenEndOfFile<'db> {
33569 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEndOfFile);
33570 type StablePtr = TokenEndOfFilePtr<'db>;
33571 type Green = TokenEndOfFileGreen<'db>;
33572 fn missing(db: &'db dyn Database) -> Self::Green {
33573 TokenEndOfFileGreen(
33574 GreenNode {
33575 kind: SyntaxKind::TokenMissing,
33576 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33577 }
33578 .intern(db),
33579 )
33580 }
33581 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33582 match node.green_node(db).details {
33583 GreenNodeDetails::Token(_) => Self { node },
33584 GreenNodeDetails::Node { .. } => {
33585 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEndOfFile)
33586 }
33587 }
33588 }
33589 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33590 match node.green_node(db).details {
33591 GreenNodeDetails::Token(_) => Some(Self { node }),
33592 GreenNodeDetails::Node { .. } => None,
33593 }
33594 }
33595 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33596 self.node
33597 }
33598 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33599 TokenEndOfFilePtr(self.node.stable_ptr(db))
33600 }
33601}
33602#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33603pub struct TerminalEndOfFile<'db> {
33604 node: SyntaxNode<'db>,
33605}
33606impl<'db> Terminal<'db> for TerminalEndOfFile<'db> {
33607 const KIND: SyntaxKind = SyntaxKind::TerminalEndOfFile;
33608 type TokenType = TokenEndOfFile<'db>;
33609 fn new_green(
33610 db: &'db dyn Database,
33611 leading_trivia: TriviaGreen<'db>,
33612 token: <<TerminalEndOfFile<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33613 trailing_trivia: TriviaGreen<'db>,
33614 ) -> Self::Green {
33615 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33616 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33617 TerminalEndOfFileGreen(
33618 GreenNode {
33619 kind: SyntaxKind::TerminalEndOfFile,
33620 details: GreenNodeDetails::Node { children: children.into(), width },
33621 }
33622 .intern(db),
33623 )
33624 }
33625 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33626 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33627 unreachable!("Expected a node, not a token");
33628 };
33629 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33630 }
33631}
33632impl<'db> TerminalEndOfFile<'db> {
33633 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33634 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33635 }
33636 pub fn token(&self, db: &'db dyn Database) -> TokenEndOfFile<'db> {
33637 TokenEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
33638 }
33639 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33640 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33641 }
33642}
33643#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33644pub struct TerminalEndOfFilePtr<'db>(pub SyntaxStablePtrId<'db>);
33645impl<'db> TerminalEndOfFilePtr<'db> {}
33646impl<'db> TypedStablePtr<'db> for TerminalEndOfFilePtr<'db> {
33647 type SyntaxNode = TerminalEndOfFile<'db>;
33648 fn untyped(self) -> SyntaxStablePtrId<'db> {
33649 self.0
33650 }
33651 fn lookup(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
33652 TerminalEndOfFile::from_syntax_node(db, self.0.lookup(db))
33653 }
33654}
33655impl<'db> From<TerminalEndOfFilePtr<'db>> for SyntaxStablePtrId<'db> {
33656 fn from(ptr: TerminalEndOfFilePtr<'db>) -> Self {
33657 ptr.untyped()
33658 }
33659}
33660#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33661pub struct TerminalEndOfFileGreen<'db>(pub GreenId<'db>);
33662impl<'db> TypedSyntaxNode<'db> for TerminalEndOfFile<'db> {
33663 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEndOfFile);
33664 type StablePtr = TerminalEndOfFilePtr<'db>;
33665 type Green = TerminalEndOfFileGreen<'db>;
33666 fn missing(db: &'db dyn Database) -> Self::Green {
33667 TerminalEndOfFileGreen(
33668 GreenNode {
33669 kind: SyntaxKind::TerminalEndOfFile,
33670 details: GreenNodeDetails::Node {
33671 children: [
33672 Trivia::missing(db).0,
33673 TokenEndOfFile::missing(db).0,
33674 Trivia::missing(db).0,
33675 ]
33676 .into(),
33677 width: TextWidth::default(),
33678 },
33679 }
33680 .intern(db),
33681 )
33682 }
33683 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33684 let kind = node.kind(db);
33685 assert_eq!(
33686 kind,
33687 SyntaxKind::TerminalEndOfFile,
33688 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33689 kind,
33690 SyntaxKind::TerminalEndOfFile
33691 );
33692 Self { node }
33693 }
33694 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33695 let kind = node.kind(db);
33696 if kind == SyntaxKind::TerminalEndOfFile {
33697 Some(Self::from_syntax_node(db, node))
33698 } else {
33699 None
33700 }
33701 }
33702 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33703 self.node
33704 }
33705 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33706 TerminalEndOfFilePtr(self.node.stable_ptr(db))
33707 }
33708}
33709#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33710pub struct TokenEq<'db> {
33711 node: SyntaxNode<'db>,
33712}
33713impl<'db> Token<'db> for TokenEq<'db> {
33714 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33715 TokenEqGreen(
33716 GreenNode { kind: SyntaxKind::TokenEq, details: GreenNodeDetails::Token(text) }
33717 .intern(db),
33718 )
33719 }
33720 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33721 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33722 }
33723}
33724#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33725pub struct TokenEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33726impl<'db> TypedStablePtr<'db> for TokenEqPtr<'db> {
33727 type SyntaxNode = TokenEq<'db>;
33728 fn untyped(self) -> SyntaxStablePtrId<'db> {
33729 self.0
33730 }
33731 fn lookup(&self, db: &'db dyn Database) -> TokenEq<'db> {
33732 TokenEq::from_syntax_node(db, self.0.lookup(db))
33733 }
33734}
33735impl<'db> From<TokenEqPtr<'db>> for SyntaxStablePtrId<'db> {
33736 fn from(ptr: TokenEqPtr<'db>) -> Self {
33737 ptr.untyped()
33738 }
33739}
33740#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33741pub struct TokenEqGreen<'db>(pub GreenId<'db>);
33742impl<'db> TokenEqGreen<'db> {
33743 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33744 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33745 }
33746}
33747impl<'db> TypedSyntaxNode<'db> for TokenEq<'db> {
33748 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEq);
33749 type StablePtr = TokenEqPtr<'db>;
33750 type Green = TokenEqGreen<'db>;
33751 fn missing(db: &'db dyn Database) -> Self::Green {
33752 TokenEqGreen(
33753 GreenNode {
33754 kind: SyntaxKind::TokenMissing,
33755 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33756 }
33757 .intern(db),
33758 )
33759 }
33760 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33761 match node.green_node(db).details {
33762 GreenNodeDetails::Token(_) => Self { node },
33763 GreenNodeDetails::Node { .. } => {
33764 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEq)
33765 }
33766 }
33767 }
33768 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33769 match node.green_node(db).details {
33770 GreenNodeDetails::Token(_) => Some(Self { node }),
33771 GreenNodeDetails::Node { .. } => None,
33772 }
33773 }
33774 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33775 self.node
33776 }
33777 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33778 TokenEqPtr(self.node.stable_ptr(db))
33779 }
33780}
33781#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33782pub struct TerminalEq<'db> {
33783 node: SyntaxNode<'db>,
33784}
33785impl<'db> Terminal<'db> for TerminalEq<'db> {
33786 const KIND: SyntaxKind = SyntaxKind::TerminalEq;
33787 type TokenType = TokenEq<'db>;
33788 fn new_green(
33789 db: &'db dyn Database,
33790 leading_trivia: TriviaGreen<'db>,
33791 token: <<TerminalEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33792 trailing_trivia: TriviaGreen<'db>,
33793 ) -> Self::Green {
33794 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33795 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33796 TerminalEqGreen(
33797 GreenNode {
33798 kind: SyntaxKind::TerminalEq,
33799 details: GreenNodeDetails::Node { children: children.into(), width },
33800 }
33801 .intern(db),
33802 )
33803 }
33804 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33805 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33806 unreachable!("Expected a node, not a token");
33807 };
33808 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33809 }
33810}
33811impl<'db> TerminalEq<'db> {
33812 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33813 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33814 }
33815 pub fn token(&self, db: &'db dyn Database) -> TokenEq<'db> {
33816 TokenEq::from_syntax_node(db, self.node.get_children(db)[1])
33817 }
33818 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33819 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33820 }
33821}
33822#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33823pub struct TerminalEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33824impl<'db> TerminalEqPtr<'db> {}
33825impl<'db> TypedStablePtr<'db> for TerminalEqPtr<'db> {
33826 type SyntaxNode = TerminalEq<'db>;
33827 fn untyped(self) -> SyntaxStablePtrId<'db> {
33828 self.0
33829 }
33830 fn lookup(&self, db: &'db dyn Database) -> TerminalEq<'db> {
33831 TerminalEq::from_syntax_node(db, self.0.lookup(db))
33832 }
33833}
33834impl<'db> From<TerminalEqPtr<'db>> for SyntaxStablePtrId<'db> {
33835 fn from(ptr: TerminalEqPtr<'db>) -> Self {
33836 ptr.untyped()
33837 }
33838}
33839#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33840pub struct TerminalEqGreen<'db>(pub GreenId<'db>);
33841impl<'db> TypedSyntaxNode<'db> for TerminalEq<'db> {
33842 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEq);
33843 type StablePtr = TerminalEqPtr<'db>;
33844 type Green = TerminalEqGreen<'db>;
33845 fn missing(db: &'db dyn Database) -> Self::Green {
33846 TerminalEqGreen(
33847 GreenNode {
33848 kind: SyntaxKind::TerminalEq,
33849 details: GreenNodeDetails::Node {
33850 children: [
33851 Trivia::missing(db).0,
33852 TokenEq::missing(db).0,
33853 Trivia::missing(db).0,
33854 ]
33855 .into(),
33856 width: TextWidth::default(),
33857 },
33858 }
33859 .intern(db),
33860 )
33861 }
33862 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33863 let kind = node.kind(db);
33864 assert_eq!(
33865 kind,
33866 SyntaxKind::TerminalEq,
33867 "Unexpected SyntaxKind {:?}. Expected {:?}.",
33868 kind,
33869 SyntaxKind::TerminalEq
33870 );
33871 Self { node }
33872 }
33873 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33874 let kind = node.kind(db);
33875 if kind == SyntaxKind::TerminalEq { Some(Self::from_syntax_node(db, node)) } else { None }
33876 }
33877 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33878 self.node
33879 }
33880 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33881 TerminalEqPtr(self.node.stable_ptr(db))
33882 }
33883}
33884#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33885pub struct TokenEqEq<'db> {
33886 node: SyntaxNode<'db>,
33887}
33888impl<'db> Token<'db> for TokenEqEq<'db> {
33889 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
33890 TokenEqEqGreen(
33891 GreenNode { kind: SyntaxKind::TokenEqEq, details: GreenNodeDetails::Token(text) }
33892 .intern(db),
33893 )
33894 }
33895 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33896 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
33897 }
33898}
33899#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33900pub struct TokenEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33901impl<'db> TypedStablePtr<'db> for TokenEqEqPtr<'db> {
33902 type SyntaxNode = TokenEqEq<'db>;
33903 fn untyped(self) -> SyntaxStablePtrId<'db> {
33904 self.0
33905 }
33906 fn lookup(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33907 TokenEqEq::from_syntax_node(db, self.0.lookup(db))
33908 }
33909}
33910impl<'db> From<TokenEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
33911 fn from(ptr: TokenEqEqPtr<'db>) -> Self {
33912 ptr.untyped()
33913 }
33914}
33915#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33916pub struct TokenEqEqGreen<'db>(pub GreenId<'db>);
33917impl<'db> TokenEqEqGreen<'db> {
33918 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33919 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
33920 }
33921}
33922impl<'db> TypedSyntaxNode<'db> for TokenEqEq<'db> {
33923 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEqEq);
33924 type StablePtr = TokenEqEqPtr<'db>;
33925 type Green = TokenEqEqGreen<'db>;
33926 fn missing(db: &'db dyn Database) -> Self::Green {
33927 TokenEqEqGreen(
33928 GreenNode {
33929 kind: SyntaxKind::TokenMissing,
33930 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
33931 }
33932 .intern(db),
33933 )
33934 }
33935 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
33936 match node.green_node(db).details {
33937 GreenNodeDetails::Token(_) => Self { node },
33938 GreenNodeDetails::Node { .. } => {
33939 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEqEq)
33940 }
33941 }
33942 }
33943 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
33944 match node.green_node(db).details {
33945 GreenNodeDetails::Token(_) => Some(Self { node }),
33946 GreenNodeDetails::Node { .. } => None,
33947 }
33948 }
33949 fn as_syntax_node(&self) -> SyntaxNode<'db> {
33950 self.node
33951 }
33952 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
33953 TokenEqEqPtr(self.node.stable_ptr(db))
33954 }
33955}
33956#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
33957pub struct TerminalEqEq<'db> {
33958 node: SyntaxNode<'db>,
33959}
33960impl<'db> Terminal<'db> for TerminalEqEq<'db> {
33961 const KIND: SyntaxKind = SyntaxKind::TerminalEqEq;
33962 type TokenType = TokenEqEq<'db>;
33963 fn new_green(
33964 db: &'db dyn Database,
33965 leading_trivia: TriviaGreen<'db>,
33966 token: <<TerminalEqEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
33967 trailing_trivia: TriviaGreen<'db>,
33968 ) -> Self::Green {
33969 let children = [leading_trivia.0, token.0, trailing_trivia.0];
33970 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
33971 TerminalEqEqGreen(
33972 GreenNode {
33973 kind: SyntaxKind::TerminalEqEq,
33974 details: GreenNodeDetails::Node { children: children.into(), width },
33975 }
33976 .intern(db),
33977 )
33978 }
33979 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
33980 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
33981 unreachable!("Expected a node, not a token");
33982 };
33983 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
33984 }
33985}
33986impl<'db> TerminalEqEq<'db> {
33987 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33988 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
33989 }
33990 pub fn token(&self, db: &'db dyn Database) -> TokenEqEq<'db> {
33991 TokenEqEq::from_syntax_node(db, self.node.get_children(db)[1])
33992 }
33993 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
33994 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
33995 }
33996}
33997#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
33998pub struct TerminalEqEqPtr<'db>(pub SyntaxStablePtrId<'db>);
33999impl<'db> TerminalEqEqPtr<'db> {}
34000impl<'db> TypedStablePtr<'db> for TerminalEqEqPtr<'db> {
34001 type SyntaxNode = TerminalEqEq<'db>;
34002 fn untyped(self) -> SyntaxStablePtrId<'db> {
34003 self.0
34004 }
34005 fn lookup(&self, db: &'db dyn Database) -> TerminalEqEq<'db> {
34006 TerminalEqEq::from_syntax_node(db, self.0.lookup(db))
34007 }
34008}
34009impl<'db> From<TerminalEqEqPtr<'db>> for SyntaxStablePtrId<'db> {
34010 fn from(ptr: TerminalEqEqPtr<'db>) -> Self {
34011 ptr.untyped()
34012 }
34013}
34014#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34015pub struct TerminalEqEqGreen<'db>(pub GreenId<'db>);
34016impl<'db> TypedSyntaxNode<'db> for TerminalEqEq<'db> {
34017 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEqEq);
34018 type StablePtr = TerminalEqEqPtr<'db>;
34019 type Green = TerminalEqEqGreen<'db>;
34020 fn missing(db: &'db dyn Database) -> Self::Green {
34021 TerminalEqEqGreen(
34022 GreenNode {
34023 kind: SyntaxKind::TerminalEqEq,
34024 details: GreenNodeDetails::Node {
34025 children: [
34026 Trivia::missing(db).0,
34027 TokenEqEq::missing(db).0,
34028 Trivia::missing(db).0,
34029 ]
34030 .into(),
34031 width: TextWidth::default(),
34032 },
34033 }
34034 .intern(db),
34035 )
34036 }
34037 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34038 let kind = node.kind(db);
34039 assert_eq!(
34040 kind,
34041 SyntaxKind::TerminalEqEq,
34042 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34043 kind,
34044 SyntaxKind::TerminalEqEq
34045 );
34046 Self { node }
34047 }
34048 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34049 let kind = node.kind(db);
34050 if kind == SyntaxKind::TerminalEqEq { Some(Self::from_syntax_node(db, node)) } else { None }
34051 }
34052 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34053 self.node
34054 }
34055 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34056 TerminalEqEqPtr(self.node.stable_ptr(db))
34057 }
34058}
34059#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34060pub struct TokenGE<'db> {
34061 node: SyntaxNode<'db>,
34062}
34063impl<'db> Token<'db> for TokenGE<'db> {
34064 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34065 TokenGEGreen(
34066 GreenNode { kind: SyntaxKind::TokenGE, details: GreenNodeDetails::Token(text) }
34067 .intern(db),
34068 )
34069 }
34070 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34071 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34072 }
34073}
34074#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34075pub struct TokenGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34076impl<'db> TypedStablePtr<'db> for TokenGEPtr<'db> {
34077 type SyntaxNode = TokenGE<'db>;
34078 fn untyped(self) -> SyntaxStablePtrId<'db> {
34079 self.0
34080 }
34081 fn lookup(&self, db: &'db dyn Database) -> TokenGE<'db> {
34082 TokenGE::from_syntax_node(db, self.0.lookup(db))
34083 }
34084}
34085impl<'db> From<TokenGEPtr<'db>> for SyntaxStablePtrId<'db> {
34086 fn from(ptr: TokenGEPtr<'db>) -> Self {
34087 ptr.untyped()
34088 }
34089}
34090#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34091pub struct TokenGEGreen<'db>(pub GreenId<'db>);
34092impl<'db> TokenGEGreen<'db> {
34093 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34094 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34095 }
34096}
34097impl<'db> TypedSyntaxNode<'db> for TokenGE<'db> {
34098 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGE);
34099 type StablePtr = TokenGEPtr<'db>;
34100 type Green = TokenGEGreen<'db>;
34101 fn missing(db: &'db dyn Database) -> Self::Green {
34102 TokenGEGreen(
34103 GreenNode {
34104 kind: SyntaxKind::TokenMissing,
34105 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34106 }
34107 .intern(db),
34108 )
34109 }
34110 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34111 match node.green_node(db).details {
34112 GreenNodeDetails::Token(_) => Self { node },
34113 GreenNodeDetails::Node { .. } => {
34114 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGE)
34115 }
34116 }
34117 }
34118 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34119 match node.green_node(db).details {
34120 GreenNodeDetails::Token(_) => Some(Self { node }),
34121 GreenNodeDetails::Node { .. } => None,
34122 }
34123 }
34124 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34125 self.node
34126 }
34127 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34128 TokenGEPtr(self.node.stable_ptr(db))
34129 }
34130}
34131#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34132pub struct TerminalGE<'db> {
34133 node: SyntaxNode<'db>,
34134}
34135impl<'db> Terminal<'db> for TerminalGE<'db> {
34136 const KIND: SyntaxKind = SyntaxKind::TerminalGE;
34137 type TokenType = TokenGE<'db>;
34138 fn new_green(
34139 db: &'db dyn Database,
34140 leading_trivia: TriviaGreen<'db>,
34141 token: <<TerminalGE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34142 trailing_trivia: TriviaGreen<'db>,
34143 ) -> Self::Green {
34144 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34145 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34146 TerminalGEGreen(
34147 GreenNode {
34148 kind: SyntaxKind::TerminalGE,
34149 details: GreenNodeDetails::Node { children: children.into(), width },
34150 }
34151 .intern(db),
34152 )
34153 }
34154 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34155 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34156 unreachable!("Expected a node, not a token");
34157 };
34158 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34159 }
34160}
34161impl<'db> TerminalGE<'db> {
34162 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34163 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34164 }
34165 pub fn token(&self, db: &'db dyn Database) -> TokenGE<'db> {
34166 TokenGE::from_syntax_node(db, self.node.get_children(db)[1])
34167 }
34168 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34169 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34170 }
34171}
34172#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34173pub struct TerminalGEPtr<'db>(pub SyntaxStablePtrId<'db>);
34174impl<'db> TerminalGEPtr<'db> {}
34175impl<'db> TypedStablePtr<'db> for TerminalGEPtr<'db> {
34176 type SyntaxNode = TerminalGE<'db>;
34177 fn untyped(self) -> SyntaxStablePtrId<'db> {
34178 self.0
34179 }
34180 fn lookup(&self, db: &'db dyn Database) -> TerminalGE<'db> {
34181 TerminalGE::from_syntax_node(db, self.0.lookup(db))
34182 }
34183}
34184impl<'db> From<TerminalGEPtr<'db>> for SyntaxStablePtrId<'db> {
34185 fn from(ptr: TerminalGEPtr<'db>) -> Self {
34186 ptr.untyped()
34187 }
34188}
34189#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34190pub struct TerminalGEGreen<'db>(pub GreenId<'db>);
34191impl<'db> TypedSyntaxNode<'db> for TerminalGE<'db> {
34192 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGE);
34193 type StablePtr = TerminalGEPtr<'db>;
34194 type Green = TerminalGEGreen<'db>;
34195 fn missing(db: &'db dyn Database) -> Self::Green {
34196 TerminalGEGreen(
34197 GreenNode {
34198 kind: SyntaxKind::TerminalGE,
34199 details: GreenNodeDetails::Node {
34200 children: [
34201 Trivia::missing(db).0,
34202 TokenGE::missing(db).0,
34203 Trivia::missing(db).0,
34204 ]
34205 .into(),
34206 width: TextWidth::default(),
34207 },
34208 }
34209 .intern(db),
34210 )
34211 }
34212 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34213 let kind = node.kind(db);
34214 assert_eq!(
34215 kind,
34216 SyntaxKind::TerminalGE,
34217 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34218 kind,
34219 SyntaxKind::TerminalGE
34220 );
34221 Self { node }
34222 }
34223 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34224 let kind = node.kind(db);
34225 if kind == SyntaxKind::TerminalGE { Some(Self::from_syntax_node(db, node)) } else { None }
34226 }
34227 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34228 self.node
34229 }
34230 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34231 TerminalGEPtr(self.node.stable_ptr(db))
34232 }
34233}
34234#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34235pub struct TokenGT<'db> {
34236 node: SyntaxNode<'db>,
34237}
34238impl<'db> Token<'db> for TokenGT<'db> {
34239 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34240 TokenGTGreen(
34241 GreenNode { kind: SyntaxKind::TokenGT, details: GreenNodeDetails::Token(text) }
34242 .intern(db),
34243 )
34244 }
34245 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34246 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34247 }
34248}
34249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34250pub struct TokenGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34251impl<'db> TypedStablePtr<'db> for TokenGTPtr<'db> {
34252 type SyntaxNode = TokenGT<'db>;
34253 fn untyped(self) -> SyntaxStablePtrId<'db> {
34254 self.0
34255 }
34256 fn lookup(&self, db: &'db dyn Database) -> TokenGT<'db> {
34257 TokenGT::from_syntax_node(db, self.0.lookup(db))
34258 }
34259}
34260impl<'db> From<TokenGTPtr<'db>> for SyntaxStablePtrId<'db> {
34261 fn from(ptr: TokenGTPtr<'db>) -> Self {
34262 ptr.untyped()
34263 }
34264}
34265#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34266pub struct TokenGTGreen<'db>(pub GreenId<'db>);
34267impl<'db> TokenGTGreen<'db> {
34268 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34269 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34270 }
34271}
34272impl<'db> TypedSyntaxNode<'db> for TokenGT<'db> {
34273 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenGT);
34274 type StablePtr = TokenGTPtr<'db>;
34275 type Green = TokenGTGreen<'db>;
34276 fn missing(db: &'db dyn Database) -> Self::Green {
34277 TokenGTGreen(
34278 GreenNode {
34279 kind: SyntaxKind::TokenMissing,
34280 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34281 }
34282 .intern(db),
34283 )
34284 }
34285 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34286 match node.green_node(db).details {
34287 GreenNodeDetails::Token(_) => Self { node },
34288 GreenNodeDetails::Node { .. } => {
34289 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenGT)
34290 }
34291 }
34292 }
34293 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34294 match node.green_node(db).details {
34295 GreenNodeDetails::Token(_) => Some(Self { node }),
34296 GreenNodeDetails::Node { .. } => None,
34297 }
34298 }
34299 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34300 self.node
34301 }
34302 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34303 TokenGTPtr(self.node.stable_ptr(db))
34304 }
34305}
34306#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34307pub struct TerminalGT<'db> {
34308 node: SyntaxNode<'db>,
34309}
34310impl<'db> Terminal<'db> for TerminalGT<'db> {
34311 const KIND: SyntaxKind = SyntaxKind::TerminalGT;
34312 type TokenType = TokenGT<'db>;
34313 fn new_green(
34314 db: &'db dyn Database,
34315 leading_trivia: TriviaGreen<'db>,
34316 token: <<TerminalGT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34317 trailing_trivia: TriviaGreen<'db>,
34318 ) -> Self::Green {
34319 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34320 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34321 TerminalGTGreen(
34322 GreenNode {
34323 kind: SyntaxKind::TerminalGT,
34324 details: GreenNodeDetails::Node { children: children.into(), width },
34325 }
34326 .intern(db),
34327 )
34328 }
34329 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34330 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34331 unreachable!("Expected a node, not a token");
34332 };
34333 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34334 }
34335}
34336impl<'db> TerminalGT<'db> {
34337 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34338 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34339 }
34340 pub fn token(&self, db: &'db dyn Database) -> TokenGT<'db> {
34341 TokenGT::from_syntax_node(db, self.node.get_children(db)[1])
34342 }
34343 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34344 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34345 }
34346}
34347#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34348pub struct TerminalGTPtr<'db>(pub SyntaxStablePtrId<'db>);
34349impl<'db> TerminalGTPtr<'db> {}
34350impl<'db> TypedStablePtr<'db> for TerminalGTPtr<'db> {
34351 type SyntaxNode = TerminalGT<'db>;
34352 fn untyped(self) -> SyntaxStablePtrId<'db> {
34353 self.0
34354 }
34355 fn lookup(&self, db: &'db dyn Database) -> TerminalGT<'db> {
34356 TerminalGT::from_syntax_node(db, self.0.lookup(db))
34357 }
34358}
34359impl<'db> From<TerminalGTPtr<'db>> for SyntaxStablePtrId<'db> {
34360 fn from(ptr: TerminalGTPtr<'db>) -> Self {
34361 ptr.untyped()
34362 }
34363}
34364#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34365pub struct TerminalGTGreen<'db>(pub GreenId<'db>);
34366impl<'db> TypedSyntaxNode<'db> for TerminalGT<'db> {
34367 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalGT);
34368 type StablePtr = TerminalGTPtr<'db>;
34369 type Green = TerminalGTGreen<'db>;
34370 fn missing(db: &'db dyn Database) -> Self::Green {
34371 TerminalGTGreen(
34372 GreenNode {
34373 kind: SyntaxKind::TerminalGT,
34374 details: GreenNodeDetails::Node {
34375 children: [
34376 Trivia::missing(db).0,
34377 TokenGT::missing(db).0,
34378 Trivia::missing(db).0,
34379 ]
34380 .into(),
34381 width: TextWidth::default(),
34382 },
34383 }
34384 .intern(db),
34385 )
34386 }
34387 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34388 let kind = node.kind(db);
34389 assert_eq!(
34390 kind,
34391 SyntaxKind::TerminalGT,
34392 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34393 kind,
34394 SyntaxKind::TerminalGT
34395 );
34396 Self { node }
34397 }
34398 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34399 let kind = node.kind(db);
34400 if kind == SyntaxKind::TerminalGT { Some(Self::from_syntax_node(db, node)) } else { None }
34401 }
34402 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34403 self.node
34404 }
34405 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34406 TerminalGTPtr(self.node.stable_ptr(db))
34407 }
34408}
34409#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34410pub struct TokenHash<'db> {
34411 node: SyntaxNode<'db>,
34412}
34413impl<'db> Token<'db> for TokenHash<'db> {
34414 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34415 TokenHashGreen(
34416 GreenNode { kind: SyntaxKind::TokenHash, details: GreenNodeDetails::Token(text) }
34417 .intern(db),
34418 )
34419 }
34420 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34421 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34422 }
34423}
34424#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34425pub struct TokenHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34426impl<'db> TypedStablePtr<'db> for TokenHashPtr<'db> {
34427 type SyntaxNode = TokenHash<'db>;
34428 fn untyped(self) -> SyntaxStablePtrId<'db> {
34429 self.0
34430 }
34431 fn lookup(&self, db: &'db dyn Database) -> TokenHash<'db> {
34432 TokenHash::from_syntax_node(db, self.0.lookup(db))
34433 }
34434}
34435impl<'db> From<TokenHashPtr<'db>> for SyntaxStablePtrId<'db> {
34436 fn from(ptr: TokenHashPtr<'db>) -> Self {
34437 ptr.untyped()
34438 }
34439}
34440#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34441pub struct TokenHashGreen<'db>(pub GreenId<'db>);
34442impl<'db> TokenHashGreen<'db> {
34443 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34444 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34445 }
34446}
34447impl<'db> TypedSyntaxNode<'db> for TokenHash<'db> {
34448 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenHash);
34449 type StablePtr = TokenHashPtr<'db>;
34450 type Green = TokenHashGreen<'db>;
34451 fn missing(db: &'db dyn Database) -> Self::Green {
34452 TokenHashGreen(
34453 GreenNode {
34454 kind: SyntaxKind::TokenMissing,
34455 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34456 }
34457 .intern(db),
34458 )
34459 }
34460 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34461 match node.green_node(db).details {
34462 GreenNodeDetails::Token(_) => Self { node },
34463 GreenNodeDetails::Node { .. } => {
34464 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenHash)
34465 }
34466 }
34467 }
34468 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34469 match node.green_node(db).details {
34470 GreenNodeDetails::Token(_) => Some(Self { node }),
34471 GreenNodeDetails::Node { .. } => None,
34472 }
34473 }
34474 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34475 self.node
34476 }
34477 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34478 TokenHashPtr(self.node.stable_ptr(db))
34479 }
34480}
34481#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34482pub struct TerminalHash<'db> {
34483 node: SyntaxNode<'db>,
34484}
34485impl<'db> Terminal<'db> for TerminalHash<'db> {
34486 const KIND: SyntaxKind = SyntaxKind::TerminalHash;
34487 type TokenType = TokenHash<'db>;
34488 fn new_green(
34489 db: &'db dyn Database,
34490 leading_trivia: TriviaGreen<'db>,
34491 token: <<TerminalHash<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34492 trailing_trivia: TriviaGreen<'db>,
34493 ) -> Self::Green {
34494 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34495 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34496 TerminalHashGreen(
34497 GreenNode {
34498 kind: SyntaxKind::TerminalHash,
34499 details: GreenNodeDetails::Node { children: children.into(), width },
34500 }
34501 .intern(db),
34502 )
34503 }
34504 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34505 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34506 unreachable!("Expected a node, not a token");
34507 };
34508 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34509 }
34510}
34511impl<'db> TerminalHash<'db> {
34512 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34513 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34514 }
34515 pub fn token(&self, db: &'db dyn Database) -> TokenHash<'db> {
34516 TokenHash::from_syntax_node(db, self.node.get_children(db)[1])
34517 }
34518 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34519 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34520 }
34521}
34522#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34523pub struct TerminalHashPtr<'db>(pub SyntaxStablePtrId<'db>);
34524impl<'db> TerminalHashPtr<'db> {}
34525impl<'db> TypedStablePtr<'db> for TerminalHashPtr<'db> {
34526 type SyntaxNode = TerminalHash<'db>;
34527 fn untyped(self) -> SyntaxStablePtrId<'db> {
34528 self.0
34529 }
34530 fn lookup(&self, db: &'db dyn Database) -> TerminalHash<'db> {
34531 TerminalHash::from_syntax_node(db, self.0.lookup(db))
34532 }
34533}
34534impl<'db> From<TerminalHashPtr<'db>> for SyntaxStablePtrId<'db> {
34535 fn from(ptr: TerminalHashPtr<'db>) -> Self {
34536 ptr.untyped()
34537 }
34538}
34539#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34540pub struct TerminalHashGreen<'db>(pub GreenId<'db>);
34541impl<'db> TypedSyntaxNode<'db> for TerminalHash<'db> {
34542 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalHash);
34543 type StablePtr = TerminalHashPtr<'db>;
34544 type Green = TerminalHashGreen<'db>;
34545 fn missing(db: &'db dyn Database) -> Self::Green {
34546 TerminalHashGreen(
34547 GreenNode {
34548 kind: SyntaxKind::TerminalHash,
34549 details: GreenNodeDetails::Node {
34550 children: [
34551 Trivia::missing(db).0,
34552 TokenHash::missing(db).0,
34553 Trivia::missing(db).0,
34554 ]
34555 .into(),
34556 width: TextWidth::default(),
34557 },
34558 }
34559 .intern(db),
34560 )
34561 }
34562 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34563 let kind = node.kind(db);
34564 assert_eq!(
34565 kind,
34566 SyntaxKind::TerminalHash,
34567 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34568 kind,
34569 SyntaxKind::TerminalHash
34570 );
34571 Self { node }
34572 }
34573 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34574 let kind = node.kind(db);
34575 if kind == SyntaxKind::TerminalHash { Some(Self::from_syntax_node(db, node)) } else { None }
34576 }
34577 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34578 self.node
34579 }
34580 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34581 TerminalHashPtr(self.node.stable_ptr(db))
34582 }
34583}
34584#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34585pub struct TokenLBrace<'db> {
34586 node: SyntaxNode<'db>,
34587}
34588impl<'db> Token<'db> for TokenLBrace<'db> {
34589 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34590 TokenLBraceGreen(
34591 GreenNode { kind: SyntaxKind::TokenLBrace, details: GreenNodeDetails::Token(text) }
34592 .intern(db),
34593 )
34594 }
34595 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34596 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34597 }
34598}
34599#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34600pub struct TokenLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34601impl<'db> TypedStablePtr<'db> for TokenLBracePtr<'db> {
34602 type SyntaxNode = TokenLBrace<'db>;
34603 fn untyped(self) -> SyntaxStablePtrId<'db> {
34604 self.0
34605 }
34606 fn lookup(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34607 TokenLBrace::from_syntax_node(db, self.0.lookup(db))
34608 }
34609}
34610impl<'db> From<TokenLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34611 fn from(ptr: TokenLBracePtr<'db>) -> Self {
34612 ptr.untyped()
34613 }
34614}
34615#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34616pub struct TokenLBraceGreen<'db>(pub GreenId<'db>);
34617impl<'db> TokenLBraceGreen<'db> {
34618 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34619 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34620 }
34621}
34622impl<'db> TypedSyntaxNode<'db> for TokenLBrace<'db> {
34623 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrace);
34624 type StablePtr = TokenLBracePtr<'db>;
34625 type Green = TokenLBraceGreen<'db>;
34626 fn missing(db: &'db dyn Database) -> Self::Green {
34627 TokenLBraceGreen(
34628 GreenNode {
34629 kind: SyntaxKind::TokenMissing,
34630 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34631 }
34632 .intern(db),
34633 )
34634 }
34635 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34636 match node.green_node(db).details {
34637 GreenNodeDetails::Token(_) => Self { node },
34638 GreenNodeDetails::Node { .. } => {
34639 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrace)
34640 }
34641 }
34642 }
34643 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34644 match node.green_node(db).details {
34645 GreenNodeDetails::Token(_) => Some(Self { node }),
34646 GreenNodeDetails::Node { .. } => None,
34647 }
34648 }
34649 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34650 self.node
34651 }
34652 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34653 TokenLBracePtr(self.node.stable_ptr(db))
34654 }
34655}
34656#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34657pub struct TerminalLBrace<'db> {
34658 node: SyntaxNode<'db>,
34659}
34660impl<'db> Terminal<'db> for TerminalLBrace<'db> {
34661 const KIND: SyntaxKind = SyntaxKind::TerminalLBrace;
34662 type TokenType = TokenLBrace<'db>;
34663 fn new_green(
34664 db: &'db dyn Database,
34665 leading_trivia: TriviaGreen<'db>,
34666 token: <<TerminalLBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34667 trailing_trivia: TriviaGreen<'db>,
34668 ) -> Self::Green {
34669 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34670 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34671 TerminalLBraceGreen(
34672 GreenNode {
34673 kind: SyntaxKind::TerminalLBrace,
34674 details: GreenNodeDetails::Node { children: children.into(), width },
34675 }
34676 .intern(db),
34677 )
34678 }
34679 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34680 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34681 unreachable!("Expected a node, not a token");
34682 };
34683 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34684 }
34685}
34686impl<'db> TerminalLBrace<'db> {
34687 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34688 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34689 }
34690 pub fn token(&self, db: &'db dyn Database) -> TokenLBrace<'db> {
34691 TokenLBrace::from_syntax_node(db, self.node.get_children(db)[1])
34692 }
34693 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34694 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34695 }
34696}
34697#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34698pub struct TerminalLBracePtr<'db>(pub SyntaxStablePtrId<'db>);
34699impl<'db> TerminalLBracePtr<'db> {}
34700impl<'db> TypedStablePtr<'db> for TerminalLBracePtr<'db> {
34701 type SyntaxNode = TerminalLBrace<'db>;
34702 fn untyped(self) -> SyntaxStablePtrId<'db> {
34703 self.0
34704 }
34705 fn lookup(&self, db: &'db dyn Database) -> TerminalLBrace<'db> {
34706 TerminalLBrace::from_syntax_node(db, self.0.lookup(db))
34707 }
34708}
34709impl<'db> From<TerminalLBracePtr<'db>> for SyntaxStablePtrId<'db> {
34710 fn from(ptr: TerminalLBracePtr<'db>) -> Self {
34711 ptr.untyped()
34712 }
34713}
34714#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34715pub struct TerminalLBraceGreen<'db>(pub GreenId<'db>);
34716impl<'db> TypedSyntaxNode<'db> for TerminalLBrace<'db> {
34717 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrace);
34718 type StablePtr = TerminalLBracePtr<'db>;
34719 type Green = TerminalLBraceGreen<'db>;
34720 fn missing(db: &'db dyn Database) -> Self::Green {
34721 TerminalLBraceGreen(
34722 GreenNode {
34723 kind: SyntaxKind::TerminalLBrace,
34724 details: GreenNodeDetails::Node {
34725 children: [
34726 Trivia::missing(db).0,
34727 TokenLBrace::missing(db).0,
34728 Trivia::missing(db).0,
34729 ]
34730 .into(),
34731 width: TextWidth::default(),
34732 },
34733 }
34734 .intern(db),
34735 )
34736 }
34737 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34738 let kind = node.kind(db);
34739 assert_eq!(
34740 kind,
34741 SyntaxKind::TerminalLBrace,
34742 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34743 kind,
34744 SyntaxKind::TerminalLBrace
34745 );
34746 Self { node }
34747 }
34748 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34749 let kind = node.kind(db);
34750 if kind == SyntaxKind::TerminalLBrace {
34751 Some(Self::from_syntax_node(db, node))
34752 } else {
34753 None
34754 }
34755 }
34756 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34757 self.node
34758 }
34759 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34760 TerminalLBracePtr(self.node.stable_ptr(db))
34761 }
34762}
34763#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34764pub struct TokenLBrack<'db> {
34765 node: SyntaxNode<'db>,
34766}
34767impl<'db> Token<'db> for TokenLBrack<'db> {
34768 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34769 TokenLBrackGreen(
34770 GreenNode { kind: SyntaxKind::TokenLBrack, details: GreenNodeDetails::Token(text) }
34771 .intern(db),
34772 )
34773 }
34774 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34775 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34776 }
34777}
34778#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34779pub struct TokenLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34780impl<'db> TypedStablePtr<'db> for TokenLBrackPtr<'db> {
34781 type SyntaxNode = TokenLBrack<'db>;
34782 fn untyped(self) -> SyntaxStablePtrId<'db> {
34783 self.0
34784 }
34785 fn lookup(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34786 TokenLBrack::from_syntax_node(db, self.0.lookup(db))
34787 }
34788}
34789impl<'db> From<TokenLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34790 fn from(ptr: TokenLBrackPtr<'db>) -> Self {
34791 ptr.untyped()
34792 }
34793}
34794#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34795pub struct TokenLBrackGreen<'db>(pub GreenId<'db>);
34796impl<'db> TokenLBrackGreen<'db> {
34797 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34798 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34799 }
34800}
34801impl<'db> TypedSyntaxNode<'db> for TokenLBrack<'db> {
34802 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLBrack);
34803 type StablePtr = TokenLBrackPtr<'db>;
34804 type Green = TokenLBrackGreen<'db>;
34805 fn missing(db: &'db dyn Database) -> Self::Green {
34806 TokenLBrackGreen(
34807 GreenNode {
34808 kind: SyntaxKind::TokenMissing,
34809 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34810 }
34811 .intern(db),
34812 )
34813 }
34814 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34815 match node.green_node(db).details {
34816 GreenNodeDetails::Token(_) => Self { node },
34817 GreenNodeDetails::Node { .. } => {
34818 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLBrack)
34819 }
34820 }
34821 }
34822 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34823 match node.green_node(db).details {
34824 GreenNodeDetails::Token(_) => Some(Self { node }),
34825 GreenNodeDetails::Node { .. } => None,
34826 }
34827 }
34828 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34829 self.node
34830 }
34831 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34832 TokenLBrackPtr(self.node.stable_ptr(db))
34833 }
34834}
34835#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34836pub struct TerminalLBrack<'db> {
34837 node: SyntaxNode<'db>,
34838}
34839impl<'db> Terminal<'db> for TerminalLBrack<'db> {
34840 const KIND: SyntaxKind = SyntaxKind::TerminalLBrack;
34841 type TokenType = TokenLBrack<'db>;
34842 fn new_green(
34843 db: &'db dyn Database,
34844 leading_trivia: TriviaGreen<'db>,
34845 token: <<TerminalLBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
34846 trailing_trivia: TriviaGreen<'db>,
34847 ) -> Self::Green {
34848 let children = [leading_trivia.0, token.0, trailing_trivia.0];
34849 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
34850 TerminalLBrackGreen(
34851 GreenNode {
34852 kind: SyntaxKind::TerminalLBrack,
34853 details: GreenNodeDetails::Node { children: children.into(), width },
34854 }
34855 .intern(db),
34856 )
34857 }
34858 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34859 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
34860 unreachable!("Expected a node, not a token");
34861 };
34862 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
34863 }
34864}
34865impl<'db> TerminalLBrack<'db> {
34866 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34867 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
34868 }
34869 pub fn token(&self, db: &'db dyn Database) -> TokenLBrack<'db> {
34870 TokenLBrack::from_syntax_node(db, self.node.get_children(db)[1])
34871 }
34872 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
34873 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
34874 }
34875}
34876#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34877pub struct TerminalLBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
34878impl<'db> TerminalLBrackPtr<'db> {}
34879impl<'db> TypedStablePtr<'db> for TerminalLBrackPtr<'db> {
34880 type SyntaxNode = TerminalLBrack<'db>;
34881 fn untyped(self) -> SyntaxStablePtrId<'db> {
34882 self.0
34883 }
34884 fn lookup(&self, db: &'db dyn Database) -> TerminalLBrack<'db> {
34885 TerminalLBrack::from_syntax_node(db, self.0.lookup(db))
34886 }
34887}
34888impl<'db> From<TerminalLBrackPtr<'db>> for SyntaxStablePtrId<'db> {
34889 fn from(ptr: TerminalLBrackPtr<'db>) -> Self {
34890 ptr.untyped()
34891 }
34892}
34893#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34894pub struct TerminalLBrackGreen<'db>(pub GreenId<'db>);
34895impl<'db> TypedSyntaxNode<'db> for TerminalLBrack<'db> {
34896 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLBrack);
34897 type StablePtr = TerminalLBrackPtr<'db>;
34898 type Green = TerminalLBrackGreen<'db>;
34899 fn missing(db: &'db dyn Database) -> Self::Green {
34900 TerminalLBrackGreen(
34901 GreenNode {
34902 kind: SyntaxKind::TerminalLBrack,
34903 details: GreenNodeDetails::Node {
34904 children: [
34905 Trivia::missing(db).0,
34906 TokenLBrack::missing(db).0,
34907 Trivia::missing(db).0,
34908 ]
34909 .into(),
34910 width: TextWidth::default(),
34911 },
34912 }
34913 .intern(db),
34914 )
34915 }
34916 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34917 let kind = node.kind(db);
34918 assert_eq!(
34919 kind,
34920 SyntaxKind::TerminalLBrack,
34921 "Unexpected SyntaxKind {:?}. Expected {:?}.",
34922 kind,
34923 SyntaxKind::TerminalLBrack
34924 );
34925 Self { node }
34926 }
34927 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
34928 let kind = node.kind(db);
34929 if kind == SyntaxKind::TerminalLBrack {
34930 Some(Self::from_syntax_node(db, node))
34931 } else {
34932 None
34933 }
34934 }
34935 fn as_syntax_node(&self) -> SyntaxNode<'db> {
34936 self.node
34937 }
34938 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
34939 TerminalLBrackPtr(self.node.stable_ptr(db))
34940 }
34941}
34942#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
34943pub struct TokenLE<'db> {
34944 node: SyntaxNode<'db>,
34945}
34946impl<'db> Token<'db> for TokenLE<'db> {
34947 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
34948 TokenLEGreen(
34949 GreenNode { kind: SyntaxKind::TokenLE, details: GreenNodeDetails::Token(text) }
34950 .intern(db),
34951 )
34952 }
34953 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34954 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
34955 }
34956}
34957#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34958pub struct TokenLEPtr<'db>(pub SyntaxStablePtrId<'db>);
34959impl<'db> TypedStablePtr<'db> for TokenLEPtr<'db> {
34960 type SyntaxNode = TokenLE<'db>;
34961 fn untyped(self) -> SyntaxStablePtrId<'db> {
34962 self.0
34963 }
34964 fn lookup(&self, db: &'db dyn Database) -> TokenLE<'db> {
34965 TokenLE::from_syntax_node(db, self.0.lookup(db))
34966 }
34967}
34968impl<'db> From<TokenLEPtr<'db>> for SyntaxStablePtrId<'db> {
34969 fn from(ptr: TokenLEPtr<'db>) -> Self {
34970 ptr.untyped()
34971 }
34972}
34973#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
34974pub struct TokenLEGreen<'db>(pub GreenId<'db>);
34975impl<'db> TokenLEGreen<'db> {
34976 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
34977 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
34978 }
34979}
34980impl<'db> TypedSyntaxNode<'db> for TokenLE<'db> {
34981 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLE);
34982 type StablePtr = TokenLEPtr<'db>;
34983 type Green = TokenLEGreen<'db>;
34984 fn missing(db: &'db dyn Database) -> Self::Green {
34985 TokenLEGreen(
34986 GreenNode {
34987 kind: SyntaxKind::TokenMissing,
34988 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
34989 }
34990 .intern(db),
34991 )
34992 }
34993 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
34994 match node.green_node(db).details {
34995 GreenNodeDetails::Token(_) => Self { node },
34996 GreenNodeDetails::Node { .. } => {
34997 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLE)
34998 }
34999 }
35000 }
35001 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35002 match node.green_node(db).details {
35003 GreenNodeDetails::Token(_) => Some(Self { node }),
35004 GreenNodeDetails::Node { .. } => None,
35005 }
35006 }
35007 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35008 self.node
35009 }
35010 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35011 TokenLEPtr(self.node.stable_ptr(db))
35012 }
35013}
35014#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35015pub struct TerminalLE<'db> {
35016 node: SyntaxNode<'db>,
35017}
35018impl<'db> Terminal<'db> for TerminalLE<'db> {
35019 const KIND: SyntaxKind = SyntaxKind::TerminalLE;
35020 type TokenType = TokenLE<'db>;
35021 fn new_green(
35022 db: &'db dyn Database,
35023 leading_trivia: TriviaGreen<'db>,
35024 token: <<TerminalLE<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35025 trailing_trivia: TriviaGreen<'db>,
35026 ) -> Self::Green {
35027 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35028 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35029 TerminalLEGreen(
35030 GreenNode {
35031 kind: SyntaxKind::TerminalLE,
35032 details: GreenNodeDetails::Node { children: children.into(), width },
35033 }
35034 .intern(db),
35035 )
35036 }
35037 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35038 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35039 unreachable!("Expected a node, not a token");
35040 };
35041 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35042 }
35043}
35044impl<'db> TerminalLE<'db> {
35045 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35046 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35047 }
35048 pub fn token(&self, db: &'db dyn Database) -> TokenLE<'db> {
35049 TokenLE::from_syntax_node(db, self.node.get_children(db)[1])
35050 }
35051 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35052 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35053 }
35054}
35055#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35056pub struct TerminalLEPtr<'db>(pub SyntaxStablePtrId<'db>);
35057impl<'db> TerminalLEPtr<'db> {}
35058impl<'db> TypedStablePtr<'db> for TerminalLEPtr<'db> {
35059 type SyntaxNode = TerminalLE<'db>;
35060 fn untyped(self) -> SyntaxStablePtrId<'db> {
35061 self.0
35062 }
35063 fn lookup(&self, db: &'db dyn Database) -> TerminalLE<'db> {
35064 TerminalLE::from_syntax_node(db, self.0.lookup(db))
35065 }
35066}
35067impl<'db> From<TerminalLEPtr<'db>> for SyntaxStablePtrId<'db> {
35068 fn from(ptr: TerminalLEPtr<'db>) -> Self {
35069 ptr.untyped()
35070 }
35071}
35072#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35073pub struct TerminalLEGreen<'db>(pub GreenId<'db>);
35074impl<'db> TypedSyntaxNode<'db> for TerminalLE<'db> {
35075 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLE);
35076 type StablePtr = TerminalLEPtr<'db>;
35077 type Green = TerminalLEGreen<'db>;
35078 fn missing(db: &'db dyn Database) -> Self::Green {
35079 TerminalLEGreen(
35080 GreenNode {
35081 kind: SyntaxKind::TerminalLE,
35082 details: GreenNodeDetails::Node {
35083 children: [
35084 Trivia::missing(db).0,
35085 TokenLE::missing(db).0,
35086 Trivia::missing(db).0,
35087 ]
35088 .into(),
35089 width: TextWidth::default(),
35090 },
35091 }
35092 .intern(db),
35093 )
35094 }
35095 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35096 let kind = node.kind(db);
35097 assert_eq!(
35098 kind,
35099 SyntaxKind::TerminalLE,
35100 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35101 kind,
35102 SyntaxKind::TerminalLE
35103 );
35104 Self { node }
35105 }
35106 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35107 let kind = node.kind(db);
35108 if kind == SyntaxKind::TerminalLE { Some(Self::from_syntax_node(db, node)) } else { None }
35109 }
35110 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35111 self.node
35112 }
35113 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35114 TerminalLEPtr(self.node.stable_ptr(db))
35115 }
35116}
35117#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35118pub struct TokenLParen<'db> {
35119 node: SyntaxNode<'db>,
35120}
35121impl<'db> Token<'db> for TokenLParen<'db> {
35122 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35123 TokenLParenGreen(
35124 GreenNode { kind: SyntaxKind::TokenLParen, details: GreenNodeDetails::Token(text) }
35125 .intern(db),
35126 )
35127 }
35128 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35129 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35130 }
35131}
35132#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35133pub struct TokenLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35134impl<'db> TypedStablePtr<'db> for TokenLParenPtr<'db> {
35135 type SyntaxNode = TokenLParen<'db>;
35136 fn untyped(self) -> SyntaxStablePtrId<'db> {
35137 self.0
35138 }
35139 fn lookup(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35140 TokenLParen::from_syntax_node(db, self.0.lookup(db))
35141 }
35142}
35143impl<'db> From<TokenLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35144 fn from(ptr: TokenLParenPtr<'db>) -> Self {
35145 ptr.untyped()
35146 }
35147}
35148#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35149pub struct TokenLParenGreen<'db>(pub GreenId<'db>);
35150impl<'db> TokenLParenGreen<'db> {
35151 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35152 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35153 }
35154}
35155impl<'db> TypedSyntaxNode<'db> for TokenLParen<'db> {
35156 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLParen);
35157 type StablePtr = TokenLParenPtr<'db>;
35158 type Green = TokenLParenGreen<'db>;
35159 fn missing(db: &'db dyn Database) -> Self::Green {
35160 TokenLParenGreen(
35161 GreenNode {
35162 kind: SyntaxKind::TokenMissing,
35163 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35164 }
35165 .intern(db),
35166 )
35167 }
35168 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35169 match node.green_node(db).details {
35170 GreenNodeDetails::Token(_) => Self { node },
35171 GreenNodeDetails::Node { .. } => {
35172 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLParen)
35173 }
35174 }
35175 }
35176 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35177 match node.green_node(db).details {
35178 GreenNodeDetails::Token(_) => Some(Self { node }),
35179 GreenNodeDetails::Node { .. } => None,
35180 }
35181 }
35182 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35183 self.node
35184 }
35185 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35186 TokenLParenPtr(self.node.stable_ptr(db))
35187 }
35188}
35189#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35190pub struct TerminalLParen<'db> {
35191 node: SyntaxNode<'db>,
35192}
35193impl<'db> Terminal<'db> for TerminalLParen<'db> {
35194 const KIND: SyntaxKind = SyntaxKind::TerminalLParen;
35195 type TokenType = TokenLParen<'db>;
35196 fn new_green(
35197 db: &'db dyn Database,
35198 leading_trivia: TriviaGreen<'db>,
35199 token: <<TerminalLParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35200 trailing_trivia: TriviaGreen<'db>,
35201 ) -> Self::Green {
35202 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35203 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35204 TerminalLParenGreen(
35205 GreenNode {
35206 kind: SyntaxKind::TerminalLParen,
35207 details: GreenNodeDetails::Node { children: children.into(), width },
35208 }
35209 .intern(db),
35210 )
35211 }
35212 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35213 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35214 unreachable!("Expected a node, not a token");
35215 };
35216 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35217 }
35218}
35219impl<'db> TerminalLParen<'db> {
35220 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35221 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35222 }
35223 pub fn token(&self, db: &'db dyn Database) -> TokenLParen<'db> {
35224 TokenLParen::from_syntax_node(db, self.node.get_children(db)[1])
35225 }
35226 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35227 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35228 }
35229}
35230#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35231pub struct TerminalLParenPtr<'db>(pub SyntaxStablePtrId<'db>);
35232impl<'db> TerminalLParenPtr<'db> {}
35233impl<'db> TypedStablePtr<'db> for TerminalLParenPtr<'db> {
35234 type SyntaxNode = TerminalLParen<'db>;
35235 fn untyped(self) -> SyntaxStablePtrId<'db> {
35236 self.0
35237 }
35238 fn lookup(&self, db: &'db dyn Database) -> TerminalLParen<'db> {
35239 TerminalLParen::from_syntax_node(db, self.0.lookup(db))
35240 }
35241}
35242impl<'db> From<TerminalLParenPtr<'db>> for SyntaxStablePtrId<'db> {
35243 fn from(ptr: TerminalLParenPtr<'db>) -> Self {
35244 ptr.untyped()
35245 }
35246}
35247#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35248pub struct TerminalLParenGreen<'db>(pub GreenId<'db>);
35249impl<'db> TypedSyntaxNode<'db> for TerminalLParen<'db> {
35250 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLParen);
35251 type StablePtr = TerminalLParenPtr<'db>;
35252 type Green = TerminalLParenGreen<'db>;
35253 fn missing(db: &'db dyn Database) -> Self::Green {
35254 TerminalLParenGreen(
35255 GreenNode {
35256 kind: SyntaxKind::TerminalLParen,
35257 details: GreenNodeDetails::Node {
35258 children: [
35259 Trivia::missing(db).0,
35260 TokenLParen::missing(db).0,
35261 Trivia::missing(db).0,
35262 ]
35263 .into(),
35264 width: TextWidth::default(),
35265 },
35266 }
35267 .intern(db),
35268 )
35269 }
35270 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35271 let kind = node.kind(db);
35272 assert_eq!(
35273 kind,
35274 SyntaxKind::TerminalLParen,
35275 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35276 kind,
35277 SyntaxKind::TerminalLParen
35278 );
35279 Self { node }
35280 }
35281 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35282 let kind = node.kind(db);
35283 if kind == SyntaxKind::TerminalLParen {
35284 Some(Self::from_syntax_node(db, node))
35285 } else {
35286 None
35287 }
35288 }
35289 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35290 self.node
35291 }
35292 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35293 TerminalLParenPtr(self.node.stable_ptr(db))
35294 }
35295}
35296#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35297pub struct TokenLT<'db> {
35298 node: SyntaxNode<'db>,
35299}
35300impl<'db> Token<'db> for TokenLT<'db> {
35301 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35302 TokenLTGreen(
35303 GreenNode { kind: SyntaxKind::TokenLT, details: GreenNodeDetails::Token(text) }
35304 .intern(db),
35305 )
35306 }
35307 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35308 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35309 }
35310}
35311#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35312pub struct TokenLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35313impl<'db> TypedStablePtr<'db> for TokenLTPtr<'db> {
35314 type SyntaxNode = TokenLT<'db>;
35315 fn untyped(self) -> SyntaxStablePtrId<'db> {
35316 self.0
35317 }
35318 fn lookup(&self, db: &'db dyn Database) -> TokenLT<'db> {
35319 TokenLT::from_syntax_node(db, self.0.lookup(db))
35320 }
35321}
35322impl<'db> From<TokenLTPtr<'db>> for SyntaxStablePtrId<'db> {
35323 fn from(ptr: TokenLTPtr<'db>) -> Self {
35324 ptr.untyped()
35325 }
35326}
35327#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35328pub struct TokenLTGreen<'db>(pub GreenId<'db>);
35329impl<'db> TokenLTGreen<'db> {
35330 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35331 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35332 }
35333}
35334impl<'db> TypedSyntaxNode<'db> for TokenLT<'db> {
35335 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenLT);
35336 type StablePtr = TokenLTPtr<'db>;
35337 type Green = TokenLTGreen<'db>;
35338 fn missing(db: &'db dyn Database) -> Self::Green {
35339 TokenLTGreen(
35340 GreenNode {
35341 kind: SyntaxKind::TokenMissing,
35342 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35343 }
35344 .intern(db),
35345 )
35346 }
35347 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35348 match node.green_node(db).details {
35349 GreenNodeDetails::Token(_) => Self { node },
35350 GreenNodeDetails::Node { .. } => {
35351 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenLT)
35352 }
35353 }
35354 }
35355 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35356 match node.green_node(db).details {
35357 GreenNodeDetails::Token(_) => Some(Self { node }),
35358 GreenNodeDetails::Node { .. } => None,
35359 }
35360 }
35361 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35362 self.node
35363 }
35364 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35365 TokenLTPtr(self.node.stable_ptr(db))
35366 }
35367}
35368#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35369pub struct TerminalLT<'db> {
35370 node: SyntaxNode<'db>,
35371}
35372impl<'db> Terminal<'db> for TerminalLT<'db> {
35373 const KIND: SyntaxKind = SyntaxKind::TerminalLT;
35374 type TokenType = TokenLT<'db>;
35375 fn new_green(
35376 db: &'db dyn Database,
35377 leading_trivia: TriviaGreen<'db>,
35378 token: <<TerminalLT<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35379 trailing_trivia: TriviaGreen<'db>,
35380 ) -> Self::Green {
35381 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35382 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35383 TerminalLTGreen(
35384 GreenNode {
35385 kind: SyntaxKind::TerminalLT,
35386 details: GreenNodeDetails::Node { children: children.into(), width },
35387 }
35388 .intern(db),
35389 )
35390 }
35391 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35392 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35393 unreachable!("Expected a node, not a token");
35394 };
35395 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35396 }
35397}
35398impl<'db> TerminalLT<'db> {
35399 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35400 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35401 }
35402 pub fn token(&self, db: &'db dyn Database) -> TokenLT<'db> {
35403 TokenLT::from_syntax_node(db, self.node.get_children(db)[1])
35404 }
35405 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35406 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35407 }
35408}
35409#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35410pub struct TerminalLTPtr<'db>(pub SyntaxStablePtrId<'db>);
35411impl<'db> TerminalLTPtr<'db> {}
35412impl<'db> TypedStablePtr<'db> for TerminalLTPtr<'db> {
35413 type SyntaxNode = TerminalLT<'db>;
35414 fn untyped(self) -> SyntaxStablePtrId<'db> {
35415 self.0
35416 }
35417 fn lookup(&self, db: &'db dyn Database) -> TerminalLT<'db> {
35418 TerminalLT::from_syntax_node(db, self.0.lookup(db))
35419 }
35420}
35421impl<'db> From<TerminalLTPtr<'db>> for SyntaxStablePtrId<'db> {
35422 fn from(ptr: TerminalLTPtr<'db>) -> Self {
35423 ptr.untyped()
35424 }
35425}
35426#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35427pub struct TerminalLTGreen<'db>(pub GreenId<'db>);
35428impl<'db> TypedSyntaxNode<'db> for TerminalLT<'db> {
35429 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalLT);
35430 type StablePtr = TerminalLTPtr<'db>;
35431 type Green = TerminalLTGreen<'db>;
35432 fn missing(db: &'db dyn Database) -> Self::Green {
35433 TerminalLTGreen(
35434 GreenNode {
35435 kind: SyntaxKind::TerminalLT,
35436 details: GreenNodeDetails::Node {
35437 children: [
35438 Trivia::missing(db).0,
35439 TokenLT::missing(db).0,
35440 Trivia::missing(db).0,
35441 ]
35442 .into(),
35443 width: TextWidth::default(),
35444 },
35445 }
35446 .intern(db),
35447 )
35448 }
35449 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35450 let kind = node.kind(db);
35451 assert_eq!(
35452 kind,
35453 SyntaxKind::TerminalLT,
35454 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35455 kind,
35456 SyntaxKind::TerminalLT
35457 );
35458 Self { node }
35459 }
35460 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35461 let kind = node.kind(db);
35462 if kind == SyntaxKind::TerminalLT { Some(Self::from_syntax_node(db, node)) } else { None }
35463 }
35464 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35465 self.node
35466 }
35467 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35468 TerminalLTPtr(self.node.stable_ptr(db))
35469 }
35470}
35471#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35472pub struct TokenMatchArrow<'db> {
35473 node: SyntaxNode<'db>,
35474}
35475impl<'db> Token<'db> for TokenMatchArrow<'db> {
35476 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35477 TokenMatchArrowGreen(
35478 GreenNode { kind: SyntaxKind::TokenMatchArrow, details: GreenNodeDetails::Token(text) }
35479 .intern(db),
35480 )
35481 }
35482 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35483 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35484 }
35485}
35486#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35487pub struct TokenMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35488impl<'db> TypedStablePtr<'db> for TokenMatchArrowPtr<'db> {
35489 type SyntaxNode = TokenMatchArrow<'db>;
35490 fn untyped(self) -> SyntaxStablePtrId<'db> {
35491 self.0
35492 }
35493 fn lookup(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35494 TokenMatchArrow::from_syntax_node(db, self.0.lookup(db))
35495 }
35496}
35497impl<'db> From<TokenMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35498 fn from(ptr: TokenMatchArrowPtr<'db>) -> Self {
35499 ptr.untyped()
35500 }
35501}
35502#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35503pub struct TokenMatchArrowGreen<'db>(pub GreenId<'db>);
35504impl<'db> TokenMatchArrowGreen<'db> {
35505 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35506 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35507 }
35508}
35509impl<'db> TypedSyntaxNode<'db> for TokenMatchArrow<'db> {
35510 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMatchArrow);
35511 type StablePtr = TokenMatchArrowPtr<'db>;
35512 type Green = TokenMatchArrowGreen<'db>;
35513 fn missing(db: &'db dyn Database) -> Self::Green {
35514 TokenMatchArrowGreen(
35515 GreenNode {
35516 kind: SyntaxKind::TokenMissing,
35517 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35518 }
35519 .intern(db),
35520 )
35521 }
35522 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35523 match node.green_node(db).details {
35524 GreenNodeDetails::Token(_) => Self { node },
35525 GreenNodeDetails::Node { .. } => {
35526 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMatchArrow)
35527 }
35528 }
35529 }
35530 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35531 match node.green_node(db).details {
35532 GreenNodeDetails::Token(_) => Some(Self { node }),
35533 GreenNodeDetails::Node { .. } => None,
35534 }
35535 }
35536 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35537 self.node
35538 }
35539 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35540 TokenMatchArrowPtr(self.node.stable_ptr(db))
35541 }
35542}
35543#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35544pub struct TerminalMatchArrow<'db> {
35545 node: SyntaxNode<'db>,
35546}
35547impl<'db> Terminal<'db> for TerminalMatchArrow<'db> {
35548 const KIND: SyntaxKind = SyntaxKind::TerminalMatchArrow;
35549 type TokenType = TokenMatchArrow<'db>;
35550 fn new_green(
35551 db: &'db dyn Database,
35552 leading_trivia: TriviaGreen<'db>,
35553 token: <<TerminalMatchArrow<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35554 trailing_trivia: TriviaGreen<'db>,
35555 ) -> Self::Green {
35556 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35557 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35558 TerminalMatchArrowGreen(
35559 GreenNode {
35560 kind: SyntaxKind::TerminalMatchArrow,
35561 details: GreenNodeDetails::Node { children: children.into(), width },
35562 }
35563 .intern(db),
35564 )
35565 }
35566 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35567 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35568 unreachable!("Expected a node, not a token");
35569 };
35570 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35571 }
35572}
35573impl<'db> TerminalMatchArrow<'db> {
35574 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35575 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35576 }
35577 pub fn token(&self, db: &'db dyn Database) -> TokenMatchArrow<'db> {
35578 TokenMatchArrow::from_syntax_node(db, self.node.get_children(db)[1])
35579 }
35580 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35581 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35582 }
35583}
35584#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35585pub struct TerminalMatchArrowPtr<'db>(pub SyntaxStablePtrId<'db>);
35586impl<'db> TerminalMatchArrowPtr<'db> {}
35587impl<'db> TypedStablePtr<'db> for TerminalMatchArrowPtr<'db> {
35588 type SyntaxNode = TerminalMatchArrow<'db>;
35589 fn untyped(self) -> SyntaxStablePtrId<'db> {
35590 self.0
35591 }
35592 fn lookup(&self, db: &'db dyn Database) -> TerminalMatchArrow<'db> {
35593 TerminalMatchArrow::from_syntax_node(db, self.0.lookup(db))
35594 }
35595}
35596impl<'db> From<TerminalMatchArrowPtr<'db>> for SyntaxStablePtrId<'db> {
35597 fn from(ptr: TerminalMatchArrowPtr<'db>) -> Self {
35598 ptr.untyped()
35599 }
35600}
35601#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35602pub struct TerminalMatchArrowGreen<'db>(pub GreenId<'db>);
35603impl<'db> TypedSyntaxNode<'db> for TerminalMatchArrow<'db> {
35604 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMatchArrow);
35605 type StablePtr = TerminalMatchArrowPtr<'db>;
35606 type Green = TerminalMatchArrowGreen<'db>;
35607 fn missing(db: &'db dyn Database) -> Self::Green {
35608 TerminalMatchArrowGreen(
35609 GreenNode {
35610 kind: SyntaxKind::TerminalMatchArrow,
35611 details: GreenNodeDetails::Node {
35612 children: [
35613 Trivia::missing(db).0,
35614 TokenMatchArrow::missing(db).0,
35615 Trivia::missing(db).0,
35616 ]
35617 .into(),
35618 width: TextWidth::default(),
35619 },
35620 }
35621 .intern(db),
35622 )
35623 }
35624 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35625 let kind = node.kind(db);
35626 assert_eq!(
35627 kind,
35628 SyntaxKind::TerminalMatchArrow,
35629 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35630 kind,
35631 SyntaxKind::TerminalMatchArrow
35632 );
35633 Self { node }
35634 }
35635 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35636 let kind = node.kind(db);
35637 if kind == SyntaxKind::TerminalMatchArrow {
35638 Some(Self::from_syntax_node(db, node))
35639 } else {
35640 None
35641 }
35642 }
35643 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35644 self.node
35645 }
35646 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35647 TerminalMatchArrowPtr(self.node.stable_ptr(db))
35648 }
35649}
35650#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35651pub struct TokenMinus<'db> {
35652 node: SyntaxNode<'db>,
35653}
35654impl<'db> Token<'db> for TokenMinus<'db> {
35655 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35656 TokenMinusGreen(
35657 GreenNode { kind: SyntaxKind::TokenMinus, details: GreenNodeDetails::Token(text) }
35658 .intern(db),
35659 )
35660 }
35661 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35662 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35663 }
35664}
35665#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35666pub struct TokenMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35667impl<'db> TypedStablePtr<'db> for TokenMinusPtr<'db> {
35668 type SyntaxNode = TokenMinus<'db>;
35669 fn untyped(self) -> SyntaxStablePtrId<'db> {
35670 self.0
35671 }
35672 fn lookup(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35673 TokenMinus::from_syntax_node(db, self.0.lookup(db))
35674 }
35675}
35676impl<'db> From<TokenMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35677 fn from(ptr: TokenMinusPtr<'db>) -> Self {
35678 ptr.untyped()
35679 }
35680}
35681#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35682pub struct TokenMinusGreen<'db>(pub GreenId<'db>);
35683impl<'db> TokenMinusGreen<'db> {
35684 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35685 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35686 }
35687}
35688impl<'db> TypedSyntaxNode<'db> for TokenMinus<'db> {
35689 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinus);
35690 type StablePtr = TokenMinusPtr<'db>;
35691 type Green = TokenMinusGreen<'db>;
35692 fn missing(db: &'db dyn Database) -> Self::Green {
35693 TokenMinusGreen(
35694 GreenNode {
35695 kind: SyntaxKind::TokenMissing,
35696 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35697 }
35698 .intern(db),
35699 )
35700 }
35701 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35702 match node.green_node(db).details {
35703 GreenNodeDetails::Token(_) => Self { node },
35704 GreenNodeDetails::Node { .. } => {
35705 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinus)
35706 }
35707 }
35708 }
35709 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35710 match node.green_node(db).details {
35711 GreenNodeDetails::Token(_) => Some(Self { node }),
35712 GreenNodeDetails::Node { .. } => None,
35713 }
35714 }
35715 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35716 self.node
35717 }
35718 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35719 TokenMinusPtr(self.node.stable_ptr(db))
35720 }
35721}
35722#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35723pub struct TerminalMinus<'db> {
35724 node: SyntaxNode<'db>,
35725}
35726impl<'db> Terminal<'db> for TerminalMinus<'db> {
35727 const KIND: SyntaxKind = SyntaxKind::TerminalMinus;
35728 type TokenType = TokenMinus<'db>;
35729 fn new_green(
35730 db: &'db dyn Database,
35731 leading_trivia: TriviaGreen<'db>,
35732 token: <<TerminalMinus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35733 trailing_trivia: TriviaGreen<'db>,
35734 ) -> Self::Green {
35735 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35736 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35737 TerminalMinusGreen(
35738 GreenNode {
35739 kind: SyntaxKind::TerminalMinus,
35740 details: GreenNodeDetails::Node { children: children.into(), width },
35741 }
35742 .intern(db),
35743 )
35744 }
35745 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35746 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35747 unreachable!("Expected a node, not a token");
35748 };
35749 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35750 }
35751}
35752impl<'db> TerminalMinus<'db> {
35753 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35754 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35755 }
35756 pub fn token(&self, db: &'db dyn Database) -> TokenMinus<'db> {
35757 TokenMinus::from_syntax_node(db, self.node.get_children(db)[1])
35758 }
35759 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35760 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35761 }
35762}
35763#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35764pub struct TerminalMinusPtr<'db>(pub SyntaxStablePtrId<'db>);
35765impl<'db> TerminalMinusPtr<'db> {}
35766impl<'db> TypedStablePtr<'db> for TerminalMinusPtr<'db> {
35767 type SyntaxNode = TerminalMinus<'db>;
35768 fn untyped(self) -> SyntaxStablePtrId<'db> {
35769 self.0
35770 }
35771 fn lookup(&self, db: &'db dyn Database) -> TerminalMinus<'db> {
35772 TerminalMinus::from_syntax_node(db, self.0.lookup(db))
35773 }
35774}
35775impl<'db> From<TerminalMinusPtr<'db>> for SyntaxStablePtrId<'db> {
35776 fn from(ptr: TerminalMinusPtr<'db>) -> Self {
35777 ptr.untyped()
35778 }
35779}
35780#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35781pub struct TerminalMinusGreen<'db>(pub GreenId<'db>);
35782impl<'db> TypedSyntaxNode<'db> for TerminalMinus<'db> {
35783 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinus);
35784 type StablePtr = TerminalMinusPtr<'db>;
35785 type Green = TerminalMinusGreen<'db>;
35786 fn missing(db: &'db dyn Database) -> Self::Green {
35787 TerminalMinusGreen(
35788 GreenNode {
35789 kind: SyntaxKind::TerminalMinus,
35790 details: GreenNodeDetails::Node {
35791 children: [
35792 Trivia::missing(db).0,
35793 TokenMinus::missing(db).0,
35794 Trivia::missing(db).0,
35795 ]
35796 .into(),
35797 width: TextWidth::default(),
35798 },
35799 }
35800 .intern(db),
35801 )
35802 }
35803 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35804 let kind = node.kind(db);
35805 assert_eq!(
35806 kind,
35807 SyntaxKind::TerminalMinus,
35808 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35809 kind,
35810 SyntaxKind::TerminalMinus
35811 );
35812 Self { node }
35813 }
35814 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35815 let kind = node.kind(db);
35816 if kind == SyntaxKind::TerminalMinus {
35817 Some(Self::from_syntax_node(db, node))
35818 } else {
35819 None
35820 }
35821 }
35822 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35823 self.node
35824 }
35825 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35826 TerminalMinusPtr(self.node.stable_ptr(db))
35827 }
35828}
35829#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35830pub struct TokenMinusEq<'db> {
35831 node: SyntaxNode<'db>,
35832}
35833impl<'db> Token<'db> for TokenMinusEq<'db> {
35834 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
35835 TokenMinusEqGreen(
35836 GreenNode { kind: SyntaxKind::TokenMinusEq, details: GreenNodeDetails::Token(text) }
35837 .intern(db),
35838 )
35839 }
35840 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35841 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
35842 }
35843}
35844#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35845pub struct TokenMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35846impl<'db> TypedStablePtr<'db> for TokenMinusEqPtr<'db> {
35847 type SyntaxNode = TokenMinusEq<'db>;
35848 fn untyped(self) -> SyntaxStablePtrId<'db> {
35849 self.0
35850 }
35851 fn lookup(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35852 TokenMinusEq::from_syntax_node(db, self.0.lookup(db))
35853 }
35854}
35855impl<'db> From<TokenMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35856 fn from(ptr: TokenMinusEqPtr<'db>) -> Self {
35857 ptr.untyped()
35858 }
35859}
35860#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35861pub struct TokenMinusEqGreen<'db>(pub GreenId<'db>);
35862impl<'db> TokenMinusEqGreen<'db> {
35863 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35864 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
35865 }
35866}
35867impl<'db> TypedSyntaxNode<'db> for TokenMinusEq<'db> {
35868 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMinusEq);
35869 type StablePtr = TokenMinusEqPtr<'db>;
35870 type Green = TokenMinusEqGreen<'db>;
35871 fn missing(db: &'db dyn Database) -> Self::Green {
35872 TokenMinusEqGreen(
35873 GreenNode {
35874 kind: SyntaxKind::TokenMissing,
35875 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
35876 }
35877 .intern(db),
35878 )
35879 }
35880 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35881 match node.green_node(db).details {
35882 GreenNodeDetails::Token(_) => Self { node },
35883 GreenNodeDetails::Node { .. } => {
35884 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMinusEq)
35885 }
35886 }
35887 }
35888 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35889 match node.green_node(db).details {
35890 GreenNodeDetails::Token(_) => Some(Self { node }),
35891 GreenNodeDetails::Node { .. } => None,
35892 }
35893 }
35894 fn as_syntax_node(&self) -> SyntaxNode<'db> {
35895 self.node
35896 }
35897 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
35898 TokenMinusEqPtr(self.node.stable_ptr(db))
35899 }
35900}
35901#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
35902pub struct TerminalMinusEq<'db> {
35903 node: SyntaxNode<'db>,
35904}
35905impl<'db> Terminal<'db> for TerminalMinusEq<'db> {
35906 const KIND: SyntaxKind = SyntaxKind::TerminalMinusEq;
35907 type TokenType = TokenMinusEq<'db>;
35908 fn new_green(
35909 db: &'db dyn Database,
35910 leading_trivia: TriviaGreen<'db>,
35911 token: <<TerminalMinusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
35912 trailing_trivia: TriviaGreen<'db>,
35913 ) -> Self::Green {
35914 let children = [leading_trivia.0, token.0, trailing_trivia.0];
35915 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
35916 TerminalMinusEqGreen(
35917 GreenNode {
35918 kind: SyntaxKind::TerminalMinusEq,
35919 details: GreenNodeDetails::Node { children: children.into(), width },
35920 }
35921 .intern(db),
35922 )
35923 }
35924 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
35925 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
35926 unreachable!("Expected a node, not a token");
35927 };
35928 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
35929 }
35930}
35931impl<'db> TerminalMinusEq<'db> {
35932 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35933 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
35934 }
35935 pub fn token(&self, db: &'db dyn Database) -> TokenMinusEq<'db> {
35936 TokenMinusEq::from_syntax_node(db, self.node.get_children(db)[1])
35937 }
35938 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
35939 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
35940 }
35941}
35942#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35943pub struct TerminalMinusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
35944impl<'db> TerminalMinusEqPtr<'db> {}
35945impl<'db> TypedStablePtr<'db> for TerminalMinusEqPtr<'db> {
35946 type SyntaxNode = TerminalMinusEq<'db>;
35947 fn untyped(self) -> SyntaxStablePtrId<'db> {
35948 self.0
35949 }
35950 fn lookup(&self, db: &'db dyn Database) -> TerminalMinusEq<'db> {
35951 TerminalMinusEq::from_syntax_node(db, self.0.lookup(db))
35952 }
35953}
35954impl<'db> From<TerminalMinusEqPtr<'db>> for SyntaxStablePtrId<'db> {
35955 fn from(ptr: TerminalMinusEqPtr<'db>) -> Self {
35956 ptr.untyped()
35957 }
35958}
35959#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
35960pub struct TerminalMinusEqGreen<'db>(pub GreenId<'db>);
35961impl<'db> TypedSyntaxNode<'db> for TerminalMinusEq<'db> {
35962 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMinusEq);
35963 type StablePtr = TerminalMinusEqPtr<'db>;
35964 type Green = TerminalMinusEqGreen<'db>;
35965 fn missing(db: &'db dyn Database) -> Self::Green {
35966 TerminalMinusEqGreen(
35967 GreenNode {
35968 kind: SyntaxKind::TerminalMinusEq,
35969 details: GreenNodeDetails::Node {
35970 children: [
35971 Trivia::missing(db).0,
35972 TokenMinusEq::missing(db).0,
35973 Trivia::missing(db).0,
35974 ]
35975 .into(),
35976 width: TextWidth::default(),
35977 },
35978 }
35979 .intern(db),
35980 )
35981 }
35982 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
35983 let kind = node.kind(db);
35984 assert_eq!(
35985 kind,
35986 SyntaxKind::TerminalMinusEq,
35987 "Unexpected SyntaxKind {:?}. Expected {:?}.",
35988 kind,
35989 SyntaxKind::TerminalMinusEq
35990 );
35991 Self { node }
35992 }
35993 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
35994 let kind = node.kind(db);
35995 if kind == SyntaxKind::TerminalMinusEq {
35996 Some(Self::from_syntax_node(db, node))
35997 } else {
35998 None
35999 }
36000 }
36001 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36002 self.node
36003 }
36004 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36005 TerminalMinusEqPtr(self.node.stable_ptr(db))
36006 }
36007}
36008#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36009pub struct TokenMod<'db> {
36010 node: SyntaxNode<'db>,
36011}
36012impl<'db> Token<'db> for TokenMod<'db> {
36013 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36014 TokenModGreen(
36015 GreenNode { kind: SyntaxKind::TokenMod, details: GreenNodeDetails::Token(text) }
36016 .intern(db),
36017 )
36018 }
36019 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36020 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36021 }
36022}
36023#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36024pub struct TokenModPtr<'db>(pub SyntaxStablePtrId<'db>);
36025impl<'db> TypedStablePtr<'db> for TokenModPtr<'db> {
36026 type SyntaxNode = TokenMod<'db>;
36027 fn untyped(self) -> SyntaxStablePtrId<'db> {
36028 self.0
36029 }
36030 fn lookup(&self, db: &'db dyn Database) -> TokenMod<'db> {
36031 TokenMod::from_syntax_node(db, self.0.lookup(db))
36032 }
36033}
36034impl<'db> From<TokenModPtr<'db>> for SyntaxStablePtrId<'db> {
36035 fn from(ptr: TokenModPtr<'db>) -> Self {
36036 ptr.untyped()
36037 }
36038}
36039#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36040pub struct TokenModGreen<'db>(pub GreenId<'db>);
36041impl<'db> TokenModGreen<'db> {
36042 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36043 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36044 }
36045}
36046impl<'db> TypedSyntaxNode<'db> for TokenMod<'db> {
36047 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMod);
36048 type StablePtr = TokenModPtr<'db>;
36049 type Green = TokenModGreen<'db>;
36050 fn missing(db: &'db dyn Database) -> Self::Green {
36051 TokenModGreen(
36052 GreenNode {
36053 kind: SyntaxKind::TokenMissing,
36054 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36055 }
36056 .intern(db),
36057 )
36058 }
36059 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36060 match node.green_node(db).details {
36061 GreenNodeDetails::Token(_) => Self { node },
36062 GreenNodeDetails::Node { .. } => {
36063 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMod)
36064 }
36065 }
36066 }
36067 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36068 match node.green_node(db).details {
36069 GreenNodeDetails::Token(_) => Some(Self { node }),
36070 GreenNodeDetails::Node { .. } => None,
36071 }
36072 }
36073 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36074 self.node
36075 }
36076 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36077 TokenModPtr(self.node.stable_ptr(db))
36078 }
36079}
36080#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36081pub struct TerminalMod<'db> {
36082 node: SyntaxNode<'db>,
36083}
36084impl<'db> Terminal<'db> for TerminalMod<'db> {
36085 const KIND: SyntaxKind = SyntaxKind::TerminalMod;
36086 type TokenType = TokenMod<'db>;
36087 fn new_green(
36088 db: &'db dyn Database,
36089 leading_trivia: TriviaGreen<'db>,
36090 token: <<TerminalMod<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36091 trailing_trivia: TriviaGreen<'db>,
36092 ) -> Self::Green {
36093 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36094 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36095 TerminalModGreen(
36096 GreenNode {
36097 kind: SyntaxKind::TerminalMod,
36098 details: GreenNodeDetails::Node { children: children.into(), width },
36099 }
36100 .intern(db),
36101 )
36102 }
36103 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36104 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36105 unreachable!("Expected a node, not a token");
36106 };
36107 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36108 }
36109}
36110impl<'db> TerminalMod<'db> {
36111 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36112 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36113 }
36114 pub fn token(&self, db: &'db dyn Database) -> TokenMod<'db> {
36115 TokenMod::from_syntax_node(db, self.node.get_children(db)[1])
36116 }
36117 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36118 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36119 }
36120}
36121#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36122pub struct TerminalModPtr<'db>(pub SyntaxStablePtrId<'db>);
36123impl<'db> TerminalModPtr<'db> {}
36124impl<'db> TypedStablePtr<'db> for TerminalModPtr<'db> {
36125 type SyntaxNode = TerminalMod<'db>;
36126 fn untyped(self) -> SyntaxStablePtrId<'db> {
36127 self.0
36128 }
36129 fn lookup(&self, db: &'db dyn Database) -> TerminalMod<'db> {
36130 TerminalMod::from_syntax_node(db, self.0.lookup(db))
36131 }
36132}
36133impl<'db> From<TerminalModPtr<'db>> for SyntaxStablePtrId<'db> {
36134 fn from(ptr: TerminalModPtr<'db>) -> Self {
36135 ptr.untyped()
36136 }
36137}
36138#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36139pub struct TerminalModGreen<'db>(pub GreenId<'db>);
36140impl<'db> TypedSyntaxNode<'db> for TerminalMod<'db> {
36141 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMod);
36142 type StablePtr = TerminalModPtr<'db>;
36143 type Green = TerminalModGreen<'db>;
36144 fn missing(db: &'db dyn Database) -> Self::Green {
36145 TerminalModGreen(
36146 GreenNode {
36147 kind: SyntaxKind::TerminalMod,
36148 details: GreenNodeDetails::Node {
36149 children: [
36150 Trivia::missing(db).0,
36151 TokenMod::missing(db).0,
36152 Trivia::missing(db).0,
36153 ]
36154 .into(),
36155 width: TextWidth::default(),
36156 },
36157 }
36158 .intern(db),
36159 )
36160 }
36161 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36162 let kind = node.kind(db);
36163 assert_eq!(
36164 kind,
36165 SyntaxKind::TerminalMod,
36166 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36167 kind,
36168 SyntaxKind::TerminalMod
36169 );
36170 Self { node }
36171 }
36172 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36173 let kind = node.kind(db);
36174 if kind == SyntaxKind::TerminalMod { Some(Self::from_syntax_node(db, node)) } else { None }
36175 }
36176 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36177 self.node
36178 }
36179 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36180 TerminalModPtr(self.node.stable_ptr(db))
36181 }
36182}
36183#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36184pub struct TokenModEq<'db> {
36185 node: SyntaxNode<'db>,
36186}
36187impl<'db> Token<'db> for TokenModEq<'db> {
36188 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36189 TokenModEqGreen(
36190 GreenNode { kind: SyntaxKind::TokenModEq, details: GreenNodeDetails::Token(text) }
36191 .intern(db),
36192 )
36193 }
36194 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36195 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36196 }
36197}
36198#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36199pub struct TokenModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36200impl<'db> TypedStablePtr<'db> for TokenModEqPtr<'db> {
36201 type SyntaxNode = TokenModEq<'db>;
36202 fn untyped(self) -> SyntaxStablePtrId<'db> {
36203 self.0
36204 }
36205 fn lookup(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36206 TokenModEq::from_syntax_node(db, self.0.lookup(db))
36207 }
36208}
36209impl<'db> From<TokenModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36210 fn from(ptr: TokenModEqPtr<'db>) -> Self {
36211 ptr.untyped()
36212 }
36213}
36214#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36215pub struct TokenModEqGreen<'db>(pub GreenId<'db>);
36216impl<'db> TokenModEqGreen<'db> {
36217 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36218 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36219 }
36220}
36221impl<'db> TypedSyntaxNode<'db> for TokenModEq<'db> {
36222 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenModEq);
36223 type StablePtr = TokenModEqPtr<'db>;
36224 type Green = TokenModEqGreen<'db>;
36225 fn missing(db: &'db dyn Database) -> Self::Green {
36226 TokenModEqGreen(
36227 GreenNode {
36228 kind: SyntaxKind::TokenMissing,
36229 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36230 }
36231 .intern(db),
36232 )
36233 }
36234 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36235 match node.green_node(db).details {
36236 GreenNodeDetails::Token(_) => Self { node },
36237 GreenNodeDetails::Node { .. } => {
36238 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenModEq)
36239 }
36240 }
36241 }
36242 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36243 match node.green_node(db).details {
36244 GreenNodeDetails::Token(_) => Some(Self { node }),
36245 GreenNodeDetails::Node { .. } => None,
36246 }
36247 }
36248 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36249 self.node
36250 }
36251 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36252 TokenModEqPtr(self.node.stable_ptr(db))
36253 }
36254}
36255#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36256pub struct TerminalModEq<'db> {
36257 node: SyntaxNode<'db>,
36258}
36259impl<'db> Terminal<'db> for TerminalModEq<'db> {
36260 const KIND: SyntaxKind = SyntaxKind::TerminalModEq;
36261 type TokenType = TokenModEq<'db>;
36262 fn new_green(
36263 db: &'db dyn Database,
36264 leading_trivia: TriviaGreen<'db>,
36265 token: <<TerminalModEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36266 trailing_trivia: TriviaGreen<'db>,
36267 ) -> Self::Green {
36268 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36269 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36270 TerminalModEqGreen(
36271 GreenNode {
36272 kind: SyntaxKind::TerminalModEq,
36273 details: GreenNodeDetails::Node { children: children.into(), width },
36274 }
36275 .intern(db),
36276 )
36277 }
36278 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36279 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36280 unreachable!("Expected a node, not a token");
36281 };
36282 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36283 }
36284}
36285impl<'db> TerminalModEq<'db> {
36286 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36287 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36288 }
36289 pub fn token(&self, db: &'db dyn Database) -> TokenModEq<'db> {
36290 TokenModEq::from_syntax_node(db, self.node.get_children(db)[1])
36291 }
36292 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36293 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36294 }
36295}
36296#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36297pub struct TerminalModEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36298impl<'db> TerminalModEqPtr<'db> {}
36299impl<'db> TypedStablePtr<'db> for TerminalModEqPtr<'db> {
36300 type SyntaxNode = TerminalModEq<'db>;
36301 fn untyped(self) -> SyntaxStablePtrId<'db> {
36302 self.0
36303 }
36304 fn lookup(&self, db: &'db dyn Database) -> TerminalModEq<'db> {
36305 TerminalModEq::from_syntax_node(db, self.0.lookup(db))
36306 }
36307}
36308impl<'db> From<TerminalModEqPtr<'db>> for SyntaxStablePtrId<'db> {
36309 fn from(ptr: TerminalModEqPtr<'db>) -> Self {
36310 ptr.untyped()
36311 }
36312}
36313#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36314pub struct TerminalModEqGreen<'db>(pub GreenId<'db>);
36315impl<'db> TypedSyntaxNode<'db> for TerminalModEq<'db> {
36316 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalModEq);
36317 type StablePtr = TerminalModEqPtr<'db>;
36318 type Green = TerminalModEqGreen<'db>;
36319 fn missing(db: &'db dyn Database) -> Self::Green {
36320 TerminalModEqGreen(
36321 GreenNode {
36322 kind: SyntaxKind::TerminalModEq,
36323 details: GreenNodeDetails::Node {
36324 children: [
36325 Trivia::missing(db).0,
36326 TokenModEq::missing(db).0,
36327 Trivia::missing(db).0,
36328 ]
36329 .into(),
36330 width: TextWidth::default(),
36331 },
36332 }
36333 .intern(db),
36334 )
36335 }
36336 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36337 let kind = node.kind(db);
36338 assert_eq!(
36339 kind,
36340 SyntaxKind::TerminalModEq,
36341 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36342 kind,
36343 SyntaxKind::TerminalModEq
36344 );
36345 Self { node }
36346 }
36347 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36348 let kind = node.kind(db);
36349 if kind == SyntaxKind::TerminalModEq {
36350 Some(Self::from_syntax_node(db, node))
36351 } else {
36352 None
36353 }
36354 }
36355 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36356 self.node
36357 }
36358 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36359 TerminalModEqPtr(self.node.stable_ptr(db))
36360 }
36361}
36362#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36363pub struct TokenMul<'db> {
36364 node: SyntaxNode<'db>,
36365}
36366impl<'db> Token<'db> for TokenMul<'db> {
36367 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36368 TokenMulGreen(
36369 GreenNode { kind: SyntaxKind::TokenMul, details: GreenNodeDetails::Token(text) }
36370 .intern(db),
36371 )
36372 }
36373 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36374 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36375 }
36376}
36377#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36378pub struct TokenMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36379impl<'db> TypedStablePtr<'db> for TokenMulPtr<'db> {
36380 type SyntaxNode = TokenMul<'db>;
36381 fn untyped(self) -> SyntaxStablePtrId<'db> {
36382 self.0
36383 }
36384 fn lookup(&self, db: &'db dyn Database) -> TokenMul<'db> {
36385 TokenMul::from_syntax_node(db, self.0.lookup(db))
36386 }
36387}
36388impl<'db> From<TokenMulPtr<'db>> for SyntaxStablePtrId<'db> {
36389 fn from(ptr: TokenMulPtr<'db>) -> Self {
36390 ptr.untyped()
36391 }
36392}
36393#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36394pub struct TokenMulGreen<'db>(pub GreenId<'db>);
36395impl<'db> TokenMulGreen<'db> {
36396 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36397 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36398 }
36399}
36400impl<'db> TypedSyntaxNode<'db> for TokenMul<'db> {
36401 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMul);
36402 type StablePtr = TokenMulPtr<'db>;
36403 type Green = TokenMulGreen<'db>;
36404 fn missing(db: &'db dyn Database) -> Self::Green {
36405 TokenMulGreen(
36406 GreenNode {
36407 kind: SyntaxKind::TokenMissing,
36408 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36409 }
36410 .intern(db),
36411 )
36412 }
36413 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36414 match node.green_node(db).details {
36415 GreenNodeDetails::Token(_) => Self { node },
36416 GreenNodeDetails::Node { .. } => {
36417 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMul)
36418 }
36419 }
36420 }
36421 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36422 match node.green_node(db).details {
36423 GreenNodeDetails::Token(_) => Some(Self { node }),
36424 GreenNodeDetails::Node { .. } => None,
36425 }
36426 }
36427 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36428 self.node
36429 }
36430 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36431 TokenMulPtr(self.node.stable_ptr(db))
36432 }
36433}
36434#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36435pub struct TerminalMul<'db> {
36436 node: SyntaxNode<'db>,
36437}
36438impl<'db> Terminal<'db> for TerminalMul<'db> {
36439 const KIND: SyntaxKind = SyntaxKind::TerminalMul;
36440 type TokenType = TokenMul<'db>;
36441 fn new_green(
36442 db: &'db dyn Database,
36443 leading_trivia: TriviaGreen<'db>,
36444 token: <<TerminalMul<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36445 trailing_trivia: TriviaGreen<'db>,
36446 ) -> Self::Green {
36447 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36448 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36449 TerminalMulGreen(
36450 GreenNode {
36451 kind: SyntaxKind::TerminalMul,
36452 details: GreenNodeDetails::Node { children: children.into(), width },
36453 }
36454 .intern(db),
36455 )
36456 }
36457 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36458 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36459 unreachable!("Expected a node, not a token");
36460 };
36461 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36462 }
36463}
36464impl<'db> TerminalMul<'db> {
36465 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36466 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36467 }
36468 pub fn token(&self, db: &'db dyn Database) -> TokenMul<'db> {
36469 TokenMul::from_syntax_node(db, self.node.get_children(db)[1])
36470 }
36471 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36472 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36473 }
36474}
36475#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36476pub struct TerminalMulPtr<'db>(pub SyntaxStablePtrId<'db>);
36477impl<'db> TerminalMulPtr<'db> {}
36478impl<'db> TypedStablePtr<'db> for TerminalMulPtr<'db> {
36479 type SyntaxNode = TerminalMul<'db>;
36480 fn untyped(self) -> SyntaxStablePtrId<'db> {
36481 self.0
36482 }
36483 fn lookup(&self, db: &'db dyn Database) -> TerminalMul<'db> {
36484 TerminalMul::from_syntax_node(db, self.0.lookup(db))
36485 }
36486}
36487impl<'db> From<TerminalMulPtr<'db>> for SyntaxStablePtrId<'db> {
36488 fn from(ptr: TerminalMulPtr<'db>) -> Self {
36489 ptr.untyped()
36490 }
36491}
36492#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36493pub struct TerminalMulGreen<'db>(pub GreenId<'db>);
36494impl<'db> TypedSyntaxNode<'db> for TerminalMul<'db> {
36495 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMul);
36496 type StablePtr = TerminalMulPtr<'db>;
36497 type Green = TerminalMulGreen<'db>;
36498 fn missing(db: &'db dyn Database) -> Self::Green {
36499 TerminalMulGreen(
36500 GreenNode {
36501 kind: SyntaxKind::TerminalMul,
36502 details: GreenNodeDetails::Node {
36503 children: [
36504 Trivia::missing(db).0,
36505 TokenMul::missing(db).0,
36506 Trivia::missing(db).0,
36507 ]
36508 .into(),
36509 width: TextWidth::default(),
36510 },
36511 }
36512 .intern(db),
36513 )
36514 }
36515 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36516 let kind = node.kind(db);
36517 assert_eq!(
36518 kind,
36519 SyntaxKind::TerminalMul,
36520 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36521 kind,
36522 SyntaxKind::TerminalMul
36523 );
36524 Self { node }
36525 }
36526 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36527 let kind = node.kind(db);
36528 if kind == SyntaxKind::TerminalMul { Some(Self::from_syntax_node(db, node)) } else { None }
36529 }
36530 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36531 self.node
36532 }
36533 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36534 TerminalMulPtr(self.node.stable_ptr(db))
36535 }
36536}
36537#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36538pub struct TokenMulEq<'db> {
36539 node: SyntaxNode<'db>,
36540}
36541impl<'db> Token<'db> for TokenMulEq<'db> {
36542 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36543 TokenMulEqGreen(
36544 GreenNode { kind: SyntaxKind::TokenMulEq, details: GreenNodeDetails::Token(text) }
36545 .intern(db),
36546 )
36547 }
36548 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36549 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36550 }
36551}
36552#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36553pub struct TokenMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36554impl<'db> TypedStablePtr<'db> for TokenMulEqPtr<'db> {
36555 type SyntaxNode = TokenMulEq<'db>;
36556 fn untyped(self) -> SyntaxStablePtrId<'db> {
36557 self.0
36558 }
36559 fn lookup(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36560 TokenMulEq::from_syntax_node(db, self.0.lookup(db))
36561 }
36562}
36563impl<'db> From<TokenMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36564 fn from(ptr: TokenMulEqPtr<'db>) -> Self {
36565 ptr.untyped()
36566 }
36567}
36568#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36569pub struct TokenMulEqGreen<'db>(pub GreenId<'db>);
36570impl<'db> TokenMulEqGreen<'db> {
36571 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36572 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36573 }
36574}
36575impl<'db> TypedSyntaxNode<'db> for TokenMulEq<'db> {
36576 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMulEq);
36577 type StablePtr = TokenMulEqPtr<'db>;
36578 type Green = TokenMulEqGreen<'db>;
36579 fn missing(db: &'db dyn Database) -> Self::Green {
36580 TokenMulEqGreen(
36581 GreenNode {
36582 kind: SyntaxKind::TokenMissing,
36583 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36584 }
36585 .intern(db),
36586 )
36587 }
36588 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36589 match node.green_node(db).details {
36590 GreenNodeDetails::Token(_) => Self { node },
36591 GreenNodeDetails::Node { .. } => {
36592 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMulEq)
36593 }
36594 }
36595 }
36596 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36597 match node.green_node(db).details {
36598 GreenNodeDetails::Token(_) => Some(Self { node }),
36599 GreenNodeDetails::Node { .. } => None,
36600 }
36601 }
36602 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36603 self.node
36604 }
36605 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36606 TokenMulEqPtr(self.node.stable_ptr(db))
36607 }
36608}
36609#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36610pub struct TerminalMulEq<'db> {
36611 node: SyntaxNode<'db>,
36612}
36613impl<'db> Terminal<'db> for TerminalMulEq<'db> {
36614 const KIND: SyntaxKind = SyntaxKind::TerminalMulEq;
36615 type TokenType = TokenMulEq<'db>;
36616 fn new_green(
36617 db: &'db dyn Database,
36618 leading_trivia: TriviaGreen<'db>,
36619 token: <<TerminalMulEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36620 trailing_trivia: TriviaGreen<'db>,
36621 ) -> Self::Green {
36622 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36623 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36624 TerminalMulEqGreen(
36625 GreenNode {
36626 kind: SyntaxKind::TerminalMulEq,
36627 details: GreenNodeDetails::Node { children: children.into(), width },
36628 }
36629 .intern(db),
36630 )
36631 }
36632 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36633 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36634 unreachable!("Expected a node, not a token");
36635 };
36636 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36637 }
36638}
36639impl<'db> TerminalMulEq<'db> {
36640 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36641 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36642 }
36643 pub fn token(&self, db: &'db dyn Database) -> TokenMulEq<'db> {
36644 TokenMulEq::from_syntax_node(db, self.node.get_children(db)[1])
36645 }
36646 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36647 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36648 }
36649}
36650#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36651pub struct TerminalMulEqPtr<'db>(pub SyntaxStablePtrId<'db>);
36652impl<'db> TerminalMulEqPtr<'db> {}
36653impl<'db> TypedStablePtr<'db> for TerminalMulEqPtr<'db> {
36654 type SyntaxNode = TerminalMulEq<'db>;
36655 fn untyped(self) -> SyntaxStablePtrId<'db> {
36656 self.0
36657 }
36658 fn lookup(&self, db: &'db dyn Database) -> TerminalMulEq<'db> {
36659 TerminalMulEq::from_syntax_node(db, self.0.lookup(db))
36660 }
36661}
36662impl<'db> From<TerminalMulEqPtr<'db>> for SyntaxStablePtrId<'db> {
36663 fn from(ptr: TerminalMulEqPtr<'db>) -> Self {
36664 ptr.untyped()
36665 }
36666}
36667#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36668pub struct TerminalMulEqGreen<'db>(pub GreenId<'db>);
36669impl<'db> TypedSyntaxNode<'db> for TerminalMulEq<'db> {
36670 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalMulEq);
36671 type StablePtr = TerminalMulEqPtr<'db>;
36672 type Green = TerminalMulEqGreen<'db>;
36673 fn missing(db: &'db dyn Database) -> Self::Green {
36674 TerminalMulEqGreen(
36675 GreenNode {
36676 kind: SyntaxKind::TerminalMulEq,
36677 details: GreenNodeDetails::Node {
36678 children: [
36679 Trivia::missing(db).0,
36680 TokenMulEq::missing(db).0,
36681 Trivia::missing(db).0,
36682 ]
36683 .into(),
36684 width: TextWidth::default(),
36685 },
36686 }
36687 .intern(db),
36688 )
36689 }
36690 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36691 let kind = node.kind(db);
36692 assert_eq!(
36693 kind,
36694 SyntaxKind::TerminalMulEq,
36695 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36696 kind,
36697 SyntaxKind::TerminalMulEq
36698 );
36699 Self { node }
36700 }
36701 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36702 let kind = node.kind(db);
36703 if kind == SyntaxKind::TerminalMulEq {
36704 Some(Self::from_syntax_node(db, node))
36705 } else {
36706 None
36707 }
36708 }
36709 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36710 self.node
36711 }
36712 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36713 TerminalMulEqPtr(self.node.stable_ptr(db))
36714 }
36715}
36716#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36717pub struct TokenNeq<'db> {
36718 node: SyntaxNode<'db>,
36719}
36720impl<'db> Token<'db> for TokenNeq<'db> {
36721 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36722 TokenNeqGreen(
36723 GreenNode { kind: SyntaxKind::TokenNeq, details: GreenNodeDetails::Token(text) }
36724 .intern(db),
36725 )
36726 }
36727 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36728 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36729 }
36730}
36731#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36732pub struct TokenNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36733impl<'db> TypedStablePtr<'db> for TokenNeqPtr<'db> {
36734 type SyntaxNode = TokenNeq<'db>;
36735 fn untyped(self) -> SyntaxStablePtrId<'db> {
36736 self.0
36737 }
36738 fn lookup(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36739 TokenNeq::from_syntax_node(db, self.0.lookup(db))
36740 }
36741}
36742impl<'db> From<TokenNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36743 fn from(ptr: TokenNeqPtr<'db>) -> Self {
36744 ptr.untyped()
36745 }
36746}
36747#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36748pub struct TokenNeqGreen<'db>(pub GreenId<'db>);
36749impl<'db> TokenNeqGreen<'db> {
36750 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36751 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36752 }
36753}
36754impl<'db> TypedSyntaxNode<'db> for TokenNeq<'db> {
36755 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNeq);
36756 type StablePtr = TokenNeqPtr<'db>;
36757 type Green = TokenNeqGreen<'db>;
36758 fn missing(db: &'db dyn Database) -> Self::Green {
36759 TokenNeqGreen(
36760 GreenNode {
36761 kind: SyntaxKind::TokenMissing,
36762 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36763 }
36764 .intern(db),
36765 )
36766 }
36767 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36768 match node.green_node(db).details {
36769 GreenNodeDetails::Token(_) => Self { node },
36770 GreenNodeDetails::Node { .. } => {
36771 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNeq)
36772 }
36773 }
36774 }
36775 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36776 match node.green_node(db).details {
36777 GreenNodeDetails::Token(_) => Some(Self { node }),
36778 GreenNodeDetails::Node { .. } => None,
36779 }
36780 }
36781 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36782 self.node
36783 }
36784 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36785 TokenNeqPtr(self.node.stable_ptr(db))
36786 }
36787}
36788#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36789pub struct TerminalNeq<'db> {
36790 node: SyntaxNode<'db>,
36791}
36792impl<'db> Terminal<'db> for TerminalNeq<'db> {
36793 const KIND: SyntaxKind = SyntaxKind::TerminalNeq;
36794 type TokenType = TokenNeq<'db>;
36795 fn new_green(
36796 db: &'db dyn Database,
36797 leading_trivia: TriviaGreen<'db>,
36798 token: <<TerminalNeq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36799 trailing_trivia: TriviaGreen<'db>,
36800 ) -> Self::Green {
36801 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36802 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36803 TerminalNeqGreen(
36804 GreenNode {
36805 kind: SyntaxKind::TerminalNeq,
36806 details: GreenNodeDetails::Node { children: children.into(), width },
36807 }
36808 .intern(db),
36809 )
36810 }
36811 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36812 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36813 unreachable!("Expected a node, not a token");
36814 };
36815 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36816 }
36817}
36818impl<'db> TerminalNeq<'db> {
36819 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36820 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36821 }
36822 pub fn token(&self, db: &'db dyn Database) -> TokenNeq<'db> {
36823 TokenNeq::from_syntax_node(db, self.node.get_children(db)[1])
36824 }
36825 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36826 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
36827 }
36828}
36829#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36830pub struct TerminalNeqPtr<'db>(pub SyntaxStablePtrId<'db>);
36831impl<'db> TerminalNeqPtr<'db> {}
36832impl<'db> TypedStablePtr<'db> for TerminalNeqPtr<'db> {
36833 type SyntaxNode = TerminalNeq<'db>;
36834 fn untyped(self) -> SyntaxStablePtrId<'db> {
36835 self.0
36836 }
36837 fn lookup(&self, db: &'db dyn Database) -> TerminalNeq<'db> {
36838 TerminalNeq::from_syntax_node(db, self.0.lookup(db))
36839 }
36840}
36841impl<'db> From<TerminalNeqPtr<'db>> for SyntaxStablePtrId<'db> {
36842 fn from(ptr: TerminalNeqPtr<'db>) -> Self {
36843 ptr.untyped()
36844 }
36845}
36846#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36847pub struct TerminalNeqGreen<'db>(pub GreenId<'db>);
36848impl<'db> TypedSyntaxNode<'db> for TerminalNeq<'db> {
36849 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNeq);
36850 type StablePtr = TerminalNeqPtr<'db>;
36851 type Green = TerminalNeqGreen<'db>;
36852 fn missing(db: &'db dyn Database) -> Self::Green {
36853 TerminalNeqGreen(
36854 GreenNode {
36855 kind: SyntaxKind::TerminalNeq,
36856 details: GreenNodeDetails::Node {
36857 children: [
36858 Trivia::missing(db).0,
36859 TokenNeq::missing(db).0,
36860 Trivia::missing(db).0,
36861 ]
36862 .into(),
36863 width: TextWidth::default(),
36864 },
36865 }
36866 .intern(db),
36867 )
36868 }
36869 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36870 let kind = node.kind(db);
36871 assert_eq!(
36872 kind,
36873 SyntaxKind::TerminalNeq,
36874 "Unexpected SyntaxKind {:?}. Expected {:?}.",
36875 kind,
36876 SyntaxKind::TerminalNeq
36877 );
36878 Self { node }
36879 }
36880 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36881 let kind = node.kind(db);
36882 if kind == SyntaxKind::TerminalNeq { Some(Self::from_syntax_node(db, node)) } else { None }
36883 }
36884 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36885 self.node
36886 }
36887 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36888 TerminalNeqPtr(self.node.stable_ptr(db))
36889 }
36890}
36891#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36892pub struct TokenNot<'db> {
36893 node: SyntaxNode<'db>,
36894}
36895impl<'db> Token<'db> for TokenNot<'db> {
36896 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
36897 TokenNotGreen(
36898 GreenNode { kind: SyntaxKind::TokenNot, details: GreenNodeDetails::Token(text) }
36899 .intern(db),
36900 )
36901 }
36902 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36903 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
36904 }
36905}
36906#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36907pub struct TokenNotPtr<'db>(pub SyntaxStablePtrId<'db>);
36908impl<'db> TypedStablePtr<'db> for TokenNotPtr<'db> {
36909 type SyntaxNode = TokenNot<'db>;
36910 fn untyped(self) -> SyntaxStablePtrId<'db> {
36911 self.0
36912 }
36913 fn lookup(&self, db: &'db dyn Database) -> TokenNot<'db> {
36914 TokenNot::from_syntax_node(db, self.0.lookup(db))
36915 }
36916}
36917impl<'db> From<TokenNotPtr<'db>> for SyntaxStablePtrId<'db> {
36918 fn from(ptr: TokenNotPtr<'db>) -> Self {
36919 ptr.untyped()
36920 }
36921}
36922#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
36923pub struct TokenNotGreen<'db>(pub GreenId<'db>);
36924impl<'db> TokenNotGreen<'db> {
36925 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36926 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
36927 }
36928}
36929impl<'db> TypedSyntaxNode<'db> for TokenNot<'db> {
36930 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNot);
36931 type StablePtr = TokenNotPtr<'db>;
36932 type Green = TokenNotGreen<'db>;
36933 fn missing(db: &'db dyn Database) -> Self::Green {
36934 TokenNotGreen(
36935 GreenNode {
36936 kind: SyntaxKind::TokenMissing,
36937 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
36938 }
36939 .intern(db),
36940 )
36941 }
36942 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
36943 match node.green_node(db).details {
36944 GreenNodeDetails::Token(_) => Self { node },
36945 GreenNodeDetails::Node { .. } => {
36946 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNot)
36947 }
36948 }
36949 }
36950 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
36951 match node.green_node(db).details {
36952 GreenNodeDetails::Token(_) => Some(Self { node }),
36953 GreenNodeDetails::Node { .. } => None,
36954 }
36955 }
36956 fn as_syntax_node(&self) -> SyntaxNode<'db> {
36957 self.node
36958 }
36959 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
36960 TokenNotPtr(self.node.stable_ptr(db))
36961 }
36962}
36963#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
36964pub struct TerminalNot<'db> {
36965 node: SyntaxNode<'db>,
36966}
36967impl<'db> Terminal<'db> for TerminalNot<'db> {
36968 const KIND: SyntaxKind = SyntaxKind::TerminalNot;
36969 type TokenType = TokenNot<'db>;
36970 fn new_green(
36971 db: &'db dyn Database,
36972 leading_trivia: TriviaGreen<'db>,
36973 token: <<TerminalNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
36974 trailing_trivia: TriviaGreen<'db>,
36975 ) -> Self::Green {
36976 let children = [leading_trivia.0, token.0, trailing_trivia.0];
36977 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
36978 TerminalNotGreen(
36979 GreenNode {
36980 kind: SyntaxKind::TerminalNot,
36981 details: GreenNodeDetails::Node { children: children.into(), width },
36982 }
36983 .intern(db),
36984 )
36985 }
36986 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
36987 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
36988 unreachable!("Expected a node, not a token");
36989 };
36990 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
36991 }
36992}
36993impl<'db> TerminalNot<'db> {
36994 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
36995 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
36996 }
36997 pub fn token(&self, db: &'db dyn Database) -> TokenNot<'db> {
36998 TokenNot::from_syntax_node(db, self.node.get_children(db)[1])
36999 }
37000 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37001 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37002 }
37003}
37004#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37005pub struct TerminalNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37006impl<'db> TerminalNotPtr<'db> {}
37007impl<'db> TypedStablePtr<'db> for TerminalNotPtr<'db> {
37008 type SyntaxNode = TerminalNot<'db>;
37009 fn untyped(self) -> SyntaxStablePtrId<'db> {
37010 self.0
37011 }
37012 fn lookup(&self, db: &'db dyn Database) -> TerminalNot<'db> {
37013 TerminalNot::from_syntax_node(db, self.0.lookup(db))
37014 }
37015}
37016impl<'db> From<TerminalNotPtr<'db>> for SyntaxStablePtrId<'db> {
37017 fn from(ptr: TerminalNotPtr<'db>) -> Self {
37018 ptr.untyped()
37019 }
37020}
37021#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37022pub struct TerminalNotGreen<'db>(pub GreenId<'db>);
37023impl<'db> TypedSyntaxNode<'db> for TerminalNot<'db> {
37024 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalNot);
37025 type StablePtr = TerminalNotPtr<'db>;
37026 type Green = TerminalNotGreen<'db>;
37027 fn missing(db: &'db dyn Database) -> Self::Green {
37028 TerminalNotGreen(
37029 GreenNode {
37030 kind: SyntaxKind::TerminalNot,
37031 details: GreenNodeDetails::Node {
37032 children: [
37033 Trivia::missing(db).0,
37034 TokenNot::missing(db).0,
37035 Trivia::missing(db).0,
37036 ]
37037 .into(),
37038 width: TextWidth::default(),
37039 },
37040 }
37041 .intern(db),
37042 )
37043 }
37044 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37045 let kind = node.kind(db);
37046 assert_eq!(
37047 kind,
37048 SyntaxKind::TerminalNot,
37049 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37050 kind,
37051 SyntaxKind::TerminalNot
37052 );
37053 Self { node }
37054 }
37055 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37056 let kind = node.kind(db);
37057 if kind == SyntaxKind::TerminalNot { Some(Self::from_syntax_node(db, node)) } else { None }
37058 }
37059 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37060 self.node
37061 }
37062 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37063 TerminalNotPtr(self.node.stable_ptr(db))
37064 }
37065}
37066#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37067pub struct TokenBitNot<'db> {
37068 node: SyntaxNode<'db>,
37069}
37070impl<'db> Token<'db> for TokenBitNot<'db> {
37071 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37072 TokenBitNotGreen(
37073 GreenNode { kind: SyntaxKind::TokenBitNot, details: GreenNodeDetails::Token(text) }
37074 .intern(db),
37075 )
37076 }
37077 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37078 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37079 }
37080}
37081#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37082pub struct TokenBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37083impl<'db> TypedStablePtr<'db> for TokenBitNotPtr<'db> {
37084 type SyntaxNode = TokenBitNot<'db>;
37085 fn untyped(self) -> SyntaxStablePtrId<'db> {
37086 self.0
37087 }
37088 fn lookup(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37089 TokenBitNot::from_syntax_node(db, self.0.lookup(db))
37090 }
37091}
37092impl<'db> From<TokenBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37093 fn from(ptr: TokenBitNotPtr<'db>) -> Self {
37094 ptr.untyped()
37095 }
37096}
37097#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37098pub struct TokenBitNotGreen<'db>(pub GreenId<'db>);
37099impl<'db> TokenBitNotGreen<'db> {
37100 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37101 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37102 }
37103}
37104impl<'db> TypedSyntaxNode<'db> for TokenBitNot<'db> {
37105 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenBitNot);
37106 type StablePtr = TokenBitNotPtr<'db>;
37107 type Green = TokenBitNotGreen<'db>;
37108 fn missing(db: &'db dyn Database) -> Self::Green {
37109 TokenBitNotGreen(
37110 GreenNode {
37111 kind: SyntaxKind::TokenMissing,
37112 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37113 }
37114 .intern(db),
37115 )
37116 }
37117 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37118 match node.green_node(db).details {
37119 GreenNodeDetails::Token(_) => Self { node },
37120 GreenNodeDetails::Node { .. } => {
37121 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenBitNot)
37122 }
37123 }
37124 }
37125 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37126 match node.green_node(db).details {
37127 GreenNodeDetails::Token(_) => Some(Self { node }),
37128 GreenNodeDetails::Node { .. } => None,
37129 }
37130 }
37131 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37132 self.node
37133 }
37134 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37135 TokenBitNotPtr(self.node.stable_ptr(db))
37136 }
37137}
37138#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37139pub struct TerminalBitNot<'db> {
37140 node: SyntaxNode<'db>,
37141}
37142impl<'db> Terminal<'db> for TerminalBitNot<'db> {
37143 const KIND: SyntaxKind = SyntaxKind::TerminalBitNot;
37144 type TokenType = TokenBitNot<'db>;
37145 fn new_green(
37146 db: &'db dyn Database,
37147 leading_trivia: TriviaGreen<'db>,
37148 token: <<TerminalBitNot<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37149 trailing_trivia: TriviaGreen<'db>,
37150 ) -> Self::Green {
37151 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37152 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37153 TerminalBitNotGreen(
37154 GreenNode {
37155 kind: SyntaxKind::TerminalBitNot,
37156 details: GreenNodeDetails::Node { children: children.into(), width },
37157 }
37158 .intern(db),
37159 )
37160 }
37161 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37162 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37163 unreachable!("Expected a node, not a token");
37164 };
37165 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37166 }
37167}
37168impl<'db> TerminalBitNot<'db> {
37169 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37170 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37171 }
37172 pub fn token(&self, db: &'db dyn Database) -> TokenBitNot<'db> {
37173 TokenBitNot::from_syntax_node(db, self.node.get_children(db)[1])
37174 }
37175 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37176 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37177 }
37178}
37179#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37180pub struct TerminalBitNotPtr<'db>(pub SyntaxStablePtrId<'db>);
37181impl<'db> TerminalBitNotPtr<'db> {}
37182impl<'db> TypedStablePtr<'db> for TerminalBitNotPtr<'db> {
37183 type SyntaxNode = TerminalBitNot<'db>;
37184 fn untyped(self) -> SyntaxStablePtrId<'db> {
37185 self.0
37186 }
37187 fn lookup(&self, db: &'db dyn Database) -> TerminalBitNot<'db> {
37188 TerminalBitNot::from_syntax_node(db, self.0.lookup(db))
37189 }
37190}
37191impl<'db> From<TerminalBitNotPtr<'db>> for SyntaxStablePtrId<'db> {
37192 fn from(ptr: TerminalBitNotPtr<'db>) -> Self {
37193 ptr.untyped()
37194 }
37195}
37196#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37197pub struct TerminalBitNotGreen<'db>(pub GreenId<'db>);
37198impl<'db> TypedSyntaxNode<'db> for TerminalBitNot<'db> {
37199 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalBitNot);
37200 type StablePtr = TerminalBitNotPtr<'db>;
37201 type Green = TerminalBitNotGreen<'db>;
37202 fn missing(db: &'db dyn Database) -> Self::Green {
37203 TerminalBitNotGreen(
37204 GreenNode {
37205 kind: SyntaxKind::TerminalBitNot,
37206 details: GreenNodeDetails::Node {
37207 children: [
37208 Trivia::missing(db).0,
37209 TokenBitNot::missing(db).0,
37210 Trivia::missing(db).0,
37211 ]
37212 .into(),
37213 width: TextWidth::default(),
37214 },
37215 }
37216 .intern(db),
37217 )
37218 }
37219 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37220 let kind = node.kind(db);
37221 assert_eq!(
37222 kind,
37223 SyntaxKind::TerminalBitNot,
37224 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37225 kind,
37226 SyntaxKind::TerminalBitNot
37227 );
37228 Self { node }
37229 }
37230 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37231 let kind = node.kind(db);
37232 if kind == SyntaxKind::TerminalBitNot {
37233 Some(Self::from_syntax_node(db, node))
37234 } else {
37235 None
37236 }
37237 }
37238 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37239 self.node
37240 }
37241 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37242 TerminalBitNotPtr(self.node.stable_ptr(db))
37243 }
37244}
37245#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37246pub struct TokenOr<'db> {
37247 node: SyntaxNode<'db>,
37248}
37249impl<'db> Token<'db> for TokenOr<'db> {
37250 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37251 TokenOrGreen(
37252 GreenNode { kind: SyntaxKind::TokenOr, details: GreenNodeDetails::Token(text) }
37253 .intern(db),
37254 )
37255 }
37256 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37257 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37258 }
37259}
37260#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37261pub struct TokenOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37262impl<'db> TypedStablePtr<'db> for TokenOrPtr<'db> {
37263 type SyntaxNode = TokenOr<'db>;
37264 fn untyped(self) -> SyntaxStablePtrId<'db> {
37265 self.0
37266 }
37267 fn lookup(&self, db: &'db dyn Database) -> TokenOr<'db> {
37268 TokenOr::from_syntax_node(db, self.0.lookup(db))
37269 }
37270}
37271impl<'db> From<TokenOrPtr<'db>> for SyntaxStablePtrId<'db> {
37272 fn from(ptr: TokenOrPtr<'db>) -> Self {
37273 ptr.untyped()
37274 }
37275}
37276#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37277pub struct TokenOrGreen<'db>(pub GreenId<'db>);
37278impl<'db> TokenOrGreen<'db> {
37279 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37280 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37281 }
37282}
37283impl<'db> TypedSyntaxNode<'db> for TokenOr<'db> {
37284 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOr);
37285 type StablePtr = TokenOrPtr<'db>;
37286 type Green = TokenOrGreen<'db>;
37287 fn missing(db: &'db dyn Database) -> Self::Green {
37288 TokenOrGreen(
37289 GreenNode {
37290 kind: SyntaxKind::TokenMissing,
37291 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37292 }
37293 .intern(db),
37294 )
37295 }
37296 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37297 match node.green_node(db).details {
37298 GreenNodeDetails::Token(_) => Self { node },
37299 GreenNodeDetails::Node { .. } => {
37300 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOr)
37301 }
37302 }
37303 }
37304 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37305 match node.green_node(db).details {
37306 GreenNodeDetails::Token(_) => Some(Self { node }),
37307 GreenNodeDetails::Node { .. } => None,
37308 }
37309 }
37310 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37311 self.node
37312 }
37313 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37314 TokenOrPtr(self.node.stable_ptr(db))
37315 }
37316}
37317#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37318pub struct TerminalOr<'db> {
37319 node: SyntaxNode<'db>,
37320}
37321impl<'db> Terminal<'db> for TerminalOr<'db> {
37322 const KIND: SyntaxKind = SyntaxKind::TerminalOr;
37323 type TokenType = TokenOr<'db>;
37324 fn new_green(
37325 db: &'db dyn Database,
37326 leading_trivia: TriviaGreen<'db>,
37327 token: <<TerminalOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37328 trailing_trivia: TriviaGreen<'db>,
37329 ) -> Self::Green {
37330 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37331 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37332 TerminalOrGreen(
37333 GreenNode {
37334 kind: SyntaxKind::TerminalOr,
37335 details: GreenNodeDetails::Node { children: children.into(), width },
37336 }
37337 .intern(db),
37338 )
37339 }
37340 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37341 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37342 unreachable!("Expected a node, not a token");
37343 };
37344 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37345 }
37346}
37347impl<'db> TerminalOr<'db> {
37348 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37349 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37350 }
37351 pub fn token(&self, db: &'db dyn Database) -> TokenOr<'db> {
37352 TokenOr::from_syntax_node(db, self.node.get_children(db)[1])
37353 }
37354 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37355 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37356 }
37357}
37358#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37359pub struct TerminalOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37360impl<'db> TerminalOrPtr<'db> {}
37361impl<'db> TypedStablePtr<'db> for TerminalOrPtr<'db> {
37362 type SyntaxNode = TerminalOr<'db>;
37363 fn untyped(self) -> SyntaxStablePtrId<'db> {
37364 self.0
37365 }
37366 fn lookup(&self, db: &'db dyn Database) -> TerminalOr<'db> {
37367 TerminalOr::from_syntax_node(db, self.0.lookup(db))
37368 }
37369}
37370impl<'db> From<TerminalOrPtr<'db>> for SyntaxStablePtrId<'db> {
37371 fn from(ptr: TerminalOrPtr<'db>) -> Self {
37372 ptr.untyped()
37373 }
37374}
37375#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37376pub struct TerminalOrGreen<'db>(pub GreenId<'db>);
37377impl<'db> TypedSyntaxNode<'db> for TerminalOr<'db> {
37378 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOr);
37379 type StablePtr = TerminalOrPtr<'db>;
37380 type Green = TerminalOrGreen<'db>;
37381 fn missing(db: &'db dyn Database) -> Self::Green {
37382 TerminalOrGreen(
37383 GreenNode {
37384 kind: SyntaxKind::TerminalOr,
37385 details: GreenNodeDetails::Node {
37386 children: [
37387 Trivia::missing(db).0,
37388 TokenOr::missing(db).0,
37389 Trivia::missing(db).0,
37390 ]
37391 .into(),
37392 width: TextWidth::default(),
37393 },
37394 }
37395 .intern(db),
37396 )
37397 }
37398 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37399 let kind = node.kind(db);
37400 assert_eq!(
37401 kind,
37402 SyntaxKind::TerminalOr,
37403 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37404 kind,
37405 SyntaxKind::TerminalOr
37406 );
37407 Self { node }
37408 }
37409 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37410 let kind = node.kind(db);
37411 if kind == SyntaxKind::TerminalOr { Some(Self::from_syntax_node(db, node)) } else { None }
37412 }
37413 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37414 self.node
37415 }
37416 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37417 TerminalOrPtr(self.node.stable_ptr(db))
37418 }
37419}
37420#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37421pub struct TokenOrOr<'db> {
37422 node: SyntaxNode<'db>,
37423}
37424impl<'db> Token<'db> for TokenOrOr<'db> {
37425 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37426 TokenOrOrGreen(
37427 GreenNode { kind: SyntaxKind::TokenOrOr, details: GreenNodeDetails::Token(text) }
37428 .intern(db),
37429 )
37430 }
37431 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37432 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37433 }
37434}
37435#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37436pub struct TokenOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37437impl<'db> TypedStablePtr<'db> for TokenOrOrPtr<'db> {
37438 type SyntaxNode = TokenOrOr<'db>;
37439 fn untyped(self) -> SyntaxStablePtrId<'db> {
37440 self.0
37441 }
37442 fn lookup(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37443 TokenOrOr::from_syntax_node(db, self.0.lookup(db))
37444 }
37445}
37446impl<'db> From<TokenOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37447 fn from(ptr: TokenOrOrPtr<'db>) -> Self {
37448 ptr.untyped()
37449 }
37450}
37451#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37452pub struct TokenOrOrGreen<'db>(pub GreenId<'db>);
37453impl<'db> TokenOrOrGreen<'db> {
37454 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37455 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37456 }
37457}
37458impl<'db> TypedSyntaxNode<'db> for TokenOrOr<'db> {
37459 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenOrOr);
37460 type StablePtr = TokenOrOrPtr<'db>;
37461 type Green = TokenOrOrGreen<'db>;
37462 fn missing(db: &'db dyn Database) -> Self::Green {
37463 TokenOrOrGreen(
37464 GreenNode {
37465 kind: SyntaxKind::TokenMissing,
37466 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37467 }
37468 .intern(db),
37469 )
37470 }
37471 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37472 match node.green_node(db).details {
37473 GreenNodeDetails::Token(_) => Self { node },
37474 GreenNodeDetails::Node { .. } => {
37475 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenOrOr)
37476 }
37477 }
37478 }
37479 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37480 match node.green_node(db).details {
37481 GreenNodeDetails::Token(_) => Some(Self { node }),
37482 GreenNodeDetails::Node { .. } => None,
37483 }
37484 }
37485 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37486 self.node
37487 }
37488 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37489 TokenOrOrPtr(self.node.stable_ptr(db))
37490 }
37491}
37492#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37493pub struct TerminalOrOr<'db> {
37494 node: SyntaxNode<'db>,
37495}
37496impl<'db> Terminal<'db> for TerminalOrOr<'db> {
37497 const KIND: SyntaxKind = SyntaxKind::TerminalOrOr;
37498 type TokenType = TokenOrOr<'db>;
37499 fn new_green(
37500 db: &'db dyn Database,
37501 leading_trivia: TriviaGreen<'db>,
37502 token: <<TerminalOrOr<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37503 trailing_trivia: TriviaGreen<'db>,
37504 ) -> Self::Green {
37505 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37506 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37507 TerminalOrOrGreen(
37508 GreenNode {
37509 kind: SyntaxKind::TerminalOrOr,
37510 details: GreenNodeDetails::Node { children: children.into(), width },
37511 }
37512 .intern(db),
37513 )
37514 }
37515 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37516 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37517 unreachable!("Expected a node, not a token");
37518 };
37519 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37520 }
37521}
37522impl<'db> TerminalOrOr<'db> {
37523 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37524 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37525 }
37526 pub fn token(&self, db: &'db dyn Database) -> TokenOrOr<'db> {
37527 TokenOrOr::from_syntax_node(db, self.node.get_children(db)[1])
37528 }
37529 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37530 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37531 }
37532}
37533#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37534pub struct TerminalOrOrPtr<'db>(pub SyntaxStablePtrId<'db>);
37535impl<'db> TerminalOrOrPtr<'db> {}
37536impl<'db> TypedStablePtr<'db> for TerminalOrOrPtr<'db> {
37537 type SyntaxNode = TerminalOrOr<'db>;
37538 fn untyped(self) -> SyntaxStablePtrId<'db> {
37539 self.0
37540 }
37541 fn lookup(&self, db: &'db dyn Database) -> TerminalOrOr<'db> {
37542 TerminalOrOr::from_syntax_node(db, self.0.lookup(db))
37543 }
37544}
37545impl<'db> From<TerminalOrOrPtr<'db>> for SyntaxStablePtrId<'db> {
37546 fn from(ptr: TerminalOrOrPtr<'db>) -> Self {
37547 ptr.untyped()
37548 }
37549}
37550#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37551pub struct TerminalOrOrGreen<'db>(pub GreenId<'db>);
37552impl<'db> TypedSyntaxNode<'db> for TerminalOrOr<'db> {
37553 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalOrOr);
37554 type StablePtr = TerminalOrOrPtr<'db>;
37555 type Green = TerminalOrOrGreen<'db>;
37556 fn missing(db: &'db dyn Database) -> Self::Green {
37557 TerminalOrOrGreen(
37558 GreenNode {
37559 kind: SyntaxKind::TerminalOrOr,
37560 details: GreenNodeDetails::Node {
37561 children: [
37562 Trivia::missing(db).0,
37563 TokenOrOr::missing(db).0,
37564 Trivia::missing(db).0,
37565 ]
37566 .into(),
37567 width: TextWidth::default(),
37568 },
37569 }
37570 .intern(db),
37571 )
37572 }
37573 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37574 let kind = node.kind(db);
37575 assert_eq!(
37576 kind,
37577 SyntaxKind::TerminalOrOr,
37578 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37579 kind,
37580 SyntaxKind::TerminalOrOr
37581 );
37582 Self { node }
37583 }
37584 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37585 let kind = node.kind(db);
37586 if kind == SyntaxKind::TerminalOrOr { Some(Self::from_syntax_node(db, node)) } else { None }
37587 }
37588 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37589 self.node
37590 }
37591 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37592 TerminalOrOrPtr(self.node.stable_ptr(db))
37593 }
37594}
37595#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37596pub struct TokenPlus<'db> {
37597 node: SyntaxNode<'db>,
37598}
37599impl<'db> Token<'db> for TokenPlus<'db> {
37600 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37601 TokenPlusGreen(
37602 GreenNode { kind: SyntaxKind::TokenPlus, details: GreenNodeDetails::Token(text) }
37603 .intern(db),
37604 )
37605 }
37606 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37607 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37608 }
37609}
37610#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37611pub struct TokenPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37612impl<'db> TypedStablePtr<'db> for TokenPlusPtr<'db> {
37613 type SyntaxNode = TokenPlus<'db>;
37614 fn untyped(self) -> SyntaxStablePtrId<'db> {
37615 self.0
37616 }
37617 fn lookup(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37618 TokenPlus::from_syntax_node(db, self.0.lookup(db))
37619 }
37620}
37621impl<'db> From<TokenPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37622 fn from(ptr: TokenPlusPtr<'db>) -> Self {
37623 ptr.untyped()
37624 }
37625}
37626#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37627pub struct TokenPlusGreen<'db>(pub GreenId<'db>);
37628impl<'db> TokenPlusGreen<'db> {
37629 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37630 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37631 }
37632}
37633impl<'db> TypedSyntaxNode<'db> for TokenPlus<'db> {
37634 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlus);
37635 type StablePtr = TokenPlusPtr<'db>;
37636 type Green = TokenPlusGreen<'db>;
37637 fn missing(db: &'db dyn Database) -> Self::Green {
37638 TokenPlusGreen(
37639 GreenNode {
37640 kind: SyntaxKind::TokenMissing,
37641 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37642 }
37643 .intern(db),
37644 )
37645 }
37646 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37647 match node.green_node(db).details {
37648 GreenNodeDetails::Token(_) => Self { node },
37649 GreenNodeDetails::Node { .. } => {
37650 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlus)
37651 }
37652 }
37653 }
37654 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37655 match node.green_node(db).details {
37656 GreenNodeDetails::Token(_) => Some(Self { node }),
37657 GreenNodeDetails::Node { .. } => None,
37658 }
37659 }
37660 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37661 self.node
37662 }
37663 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37664 TokenPlusPtr(self.node.stable_ptr(db))
37665 }
37666}
37667#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37668pub struct TerminalPlus<'db> {
37669 node: SyntaxNode<'db>,
37670}
37671impl<'db> Terminal<'db> for TerminalPlus<'db> {
37672 const KIND: SyntaxKind = SyntaxKind::TerminalPlus;
37673 type TokenType = TokenPlus<'db>;
37674 fn new_green(
37675 db: &'db dyn Database,
37676 leading_trivia: TriviaGreen<'db>,
37677 token: <<TerminalPlus<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37678 trailing_trivia: TriviaGreen<'db>,
37679 ) -> Self::Green {
37680 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37681 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37682 TerminalPlusGreen(
37683 GreenNode {
37684 kind: SyntaxKind::TerminalPlus,
37685 details: GreenNodeDetails::Node { children: children.into(), width },
37686 }
37687 .intern(db),
37688 )
37689 }
37690 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37691 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37692 unreachable!("Expected a node, not a token");
37693 };
37694 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37695 }
37696}
37697impl<'db> TerminalPlus<'db> {
37698 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37699 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37700 }
37701 pub fn token(&self, db: &'db dyn Database) -> TokenPlus<'db> {
37702 TokenPlus::from_syntax_node(db, self.node.get_children(db)[1])
37703 }
37704 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37705 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37706 }
37707}
37708#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37709pub struct TerminalPlusPtr<'db>(pub SyntaxStablePtrId<'db>);
37710impl<'db> TerminalPlusPtr<'db> {}
37711impl<'db> TypedStablePtr<'db> for TerminalPlusPtr<'db> {
37712 type SyntaxNode = TerminalPlus<'db>;
37713 fn untyped(self) -> SyntaxStablePtrId<'db> {
37714 self.0
37715 }
37716 fn lookup(&self, db: &'db dyn Database) -> TerminalPlus<'db> {
37717 TerminalPlus::from_syntax_node(db, self.0.lookup(db))
37718 }
37719}
37720impl<'db> From<TerminalPlusPtr<'db>> for SyntaxStablePtrId<'db> {
37721 fn from(ptr: TerminalPlusPtr<'db>) -> Self {
37722 ptr.untyped()
37723 }
37724}
37725#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37726pub struct TerminalPlusGreen<'db>(pub GreenId<'db>);
37727impl<'db> TypedSyntaxNode<'db> for TerminalPlus<'db> {
37728 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlus);
37729 type StablePtr = TerminalPlusPtr<'db>;
37730 type Green = TerminalPlusGreen<'db>;
37731 fn missing(db: &'db dyn Database) -> Self::Green {
37732 TerminalPlusGreen(
37733 GreenNode {
37734 kind: SyntaxKind::TerminalPlus,
37735 details: GreenNodeDetails::Node {
37736 children: [
37737 Trivia::missing(db).0,
37738 TokenPlus::missing(db).0,
37739 Trivia::missing(db).0,
37740 ]
37741 .into(),
37742 width: TextWidth::default(),
37743 },
37744 }
37745 .intern(db),
37746 )
37747 }
37748 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37749 let kind = node.kind(db);
37750 assert_eq!(
37751 kind,
37752 SyntaxKind::TerminalPlus,
37753 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37754 kind,
37755 SyntaxKind::TerminalPlus
37756 );
37757 Self { node }
37758 }
37759 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37760 let kind = node.kind(db);
37761 if kind == SyntaxKind::TerminalPlus { Some(Self::from_syntax_node(db, node)) } else { None }
37762 }
37763 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37764 self.node
37765 }
37766 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37767 TerminalPlusPtr(self.node.stable_ptr(db))
37768 }
37769}
37770#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37771pub struct TokenPlusEq<'db> {
37772 node: SyntaxNode<'db>,
37773}
37774impl<'db> Token<'db> for TokenPlusEq<'db> {
37775 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37776 TokenPlusEqGreen(
37777 GreenNode { kind: SyntaxKind::TokenPlusEq, details: GreenNodeDetails::Token(text) }
37778 .intern(db),
37779 )
37780 }
37781 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37782 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37783 }
37784}
37785#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37786pub struct TokenPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37787impl<'db> TypedStablePtr<'db> for TokenPlusEqPtr<'db> {
37788 type SyntaxNode = TokenPlusEq<'db>;
37789 fn untyped(self) -> SyntaxStablePtrId<'db> {
37790 self.0
37791 }
37792 fn lookup(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37793 TokenPlusEq::from_syntax_node(db, self.0.lookup(db))
37794 }
37795}
37796impl<'db> From<TokenPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37797 fn from(ptr: TokenPlusEqPtr<'db>) -> Self {
37798 ptr.untyped()
37799 }
37800}
37801#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37802pub struct TokenPlusEqGreen<'db>(pub GreenId<'db>);
37803impl<'db> TokenPlusEqGreen<'db> {
37804 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37805 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37806 }
37807}
37808impl<'db> TypedSyntaxNode<'db> for TokenPlusEq<'db> {
37809 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenPlusEq);
37810 type StablePtr = TokenPlusEqPtr<'db>;
37811 type Green = TokenPlusEqGreen<'db>;
37812 fn missing(db: &'db dyn Database) -> Self::Green {
37813 TokenPlusEqGreen(
37814 GreenNode {
37815 kind: SyntaxKind::TokenMissing,
37816 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37817 }
37818 .intern(db),
37819 )
37820 }
37821 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37822 match node.green_node(db).details {
37823 GreenNodeDetails::Token(_) => Self { node },
37824 GreenNodeDetails::Node { .. } => {
37825 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenPlusEq)
37826 }
37827 }
37828 }
37829 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37830 match node.green_node(db).details {
37831 GreenNodeDetails::Token(_) => Some(Self { node }),
37832 GreenNodeDetails::Node { .. } => None,
37833 }
37834 }
37835 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37836 self.node
37837 }
37838 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37839 TokenPlusEqPtr(self.node.stable_ptr(db))
37840 }
37841}
37842#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37843pub struct TerminalPlusEq<'db> {
37844 node: SyntaxNode<'db>,
37845}
37846impl<'db> Terminal<'db> for TerminalPlusEq<'db> {
37847 const KIND: SyntaxKind = SyntaxKind::TerminalPlusEq;
37848 type TokenType = TokenPlusEq<'db>;
37849 fn new_green(
37850 db: &'db dyn Database,
37851 leading_trivia: TriviaGreen<'db>,
37852 token: <<TerminalPlusEq<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
37853 trailing_trivia: TriviaGreen<'db>,
37854 ) -> Self::Green {
37855 let children = [leading_trivia.0, token.0, trailing_trivia.0];
37856 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
37857 TerminalPlusEqGreen(
37858 GreenNode {
37859 kind: SyntaxKind::TerminalPlusEq,
37860 details: GreenNodeDetails::Node { children: children.into(), width },
37861 }
37862 .intern(db),
37863 )
37864 }
37865 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37866 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
37867 unreachable!("Expected a node, not a token");
37868 };
37869 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
37870 }
37871}
37872impl<'db> TerminalPlusEq<'db> {
37873 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37874 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
37875 }
37876 pub fn token(&self, db: &'db dyn Database) -> TokenPlusEq<'db> {
37877 TokenPlusEq::from_syntax_node(db, self.node.get_children(db)[1])
37878 }
37879 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
37880 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
37881 }
37882}
37883#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37884pub struct TerminalPlusEqPtr<'db>(pub SyntaxStablePtrId<'db>);
37885impl<'db> TerminalPlusEqPtr<'db> {}
37886impl<'db> TypedStablePtr<'db> for TerminalPlusEqPtr<'db> {
37887 type SyntaxNode = TerminalPlusEq<'db>;
37888 fn untyped(self) -> SyntaxStablePtrId<'db> {
37889 self.0
37890 }
37891 fn lookup(&self, db: &'db dyn Database) -> TerminalPlusEq<'db> {
37892 TerminalPlusEq::from_syntax_node(db, self.0.lookup(db))
37893 }
37894}
37895impl<'db> From<TerminalPlusEqPtr<'db>> for SyntaxStablePtrId<'db> {
37896 fn from(ptr: TerminalPlusEqPtr<'db>) -> Self {
37897 ptr.untyped()
37898 }
37899}
37900#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37901pub struct TerminalPlusEqGreen<'db>(pub GreenId<'db>);
37902impl<'db> TypedSyntaxNode<'db> for TerminalPlusEq<'db> {
37903 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalPlusEq);
37904 type StablePtr = TerminalPlusEqPtr<'db>;
37905 type Green = TerminalPlusEqGreen<'db>;
37906 fn missing(db: &'db dyn Database) -> Self::Green {
37907 TerminalPlusEqGreen(
37908 GreenNode {
37909 kind: SyntaxKind::TerminalPlusEq,
37910 details: GreenNodeDetails::Node {
37911 children: [
37912 Trivia::missing(db).0,
37913 TokenPlusEq::missing(db).0,
37914 Trivia::missing(db).0,
37915 ]
37916 .into(),
37917 width: TextWidth::default(),
37918 },
37919 }
37920 .intern(db),
37921 )
37922 }
37923 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
37924 let kind = node.kind(db);
37925 assert_eq!(
37926 kind,
37927 SyntaxKind::TerminalPlusEq,
37928 "Unexpected SyntaxKind {:?}. Expected {:?}.",
37929 kind,
37930 SyntaxKind::TerminalPlusEq
37931 );
37932 Self { node }
37933 }
37934 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
37935 let kind = node.kind(db);
37936 if kind == SyntaxKind::TerminalPlusEq {
37937 Some(Self::from_syntax_node(db, node))
37938 } else {
37939 None
37940 }
37941 }
37942 fn as_syntax_node(&self) -> SyntaxNode<'db> {
37943 self.node
37944 }
37945 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
37946 TerminalPlusEqPtr(self.node.stable_ptr(db))
37947 }
37948}
37949#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
37950pub struct TokenQuestionMark<'db> {
37951 node: SyntaxNode<'db>,
37952}
37953impl<'db> Token<'db> for TokenQuestionMark<'db> {
37954 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
37955 TokenQuestionMarkGreen(
37956 GreenNode {
37957 kind: SyntaxKind::TokenQuestionMark,
37958 details: GreenNodeDetails::Token(text),
37959 }
37960 .intern(db),
37961 )
37962 }
37963 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37964 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
37965 }
37966}
37967#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37968pub struct TokenQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
37969impl<'db> TypedStablePtr<'db> for TokenQuestionMarkPtr<'db> {
37970 type SyntaxNode = TokenQuestionMark<'db>;
37971 fn untyped(self) -> SyntaxStablePtrId<'db> {
37972 self.0
37973 }
37974 fn lookup(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
37975 TokenQuestionMark::from_syntax_node(db, self.0.lookup(db))
37976 }
37977}
37978impl<'db> From<TokenQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
37979 fn from(ptr: TokenQuestionMarkPtr<'db>) -> Self {
37980 ptr.untyped()
37981 }
37982}
37983#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
37984pub struct TokenQuestionMarkGreen<'db>(pub GreenId<'db>);
37985impl<'db> TokenQuestionMarkGreen<'db> {
37986 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
37987 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
37988 }
37989}
37990impl<'db> TypedSyntaxNode<'db> for TokenQuestionMark<'db> {
37991 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenQuestionMark);
37992 type StablePtr = TokenQuestionMarkPtr<'db>;
37993 type Green = TokenQuestionMarkGreen<'db>;
37994 fn missing(db: &'db dyn Database) -> Self::Green {
37995 TokenQuestionMarkGreen(
37996 GreenNode {
37997 kind: SyntaxKind::TokenMissing,
37998 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
37999 }
38000 .intern(db),
38001 )
38002 }
38003 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38004 match node.green_node(db).details {
38005 GreenNodeDetails::Token(_) => Self { node },
38006 GreenNodeDetails::Node { .. } => {
38007 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenQuestionMark)
38008 }
38009 }
38010 }
38011 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38012 match node.green_node(db).details {
38013 GreenNodeDetails::Token(_) => Some(Self { node }),
38014 GreenNodeDetails::Node { .. } => None,
38015 }
38016 }
38017 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38018 self.node
38019 }
38020 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38021 TokenQuestionMarkPtr(self.node.stable_ptr(db))
38022 }
38023}
38024#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38025pub struct TerminalQuestionMark<'db> {
38026 node: SyntaxNode<'db>,
38027}
38028impl<'db> Terminal<'db> for TerminalQuestionMark<'db> {
38029 const KIND: SyntaxKind = SyntaxKind::TerminalQuestionMark;
38030 type TokenType = TokenQuestionMark<'db>;
38031 fn new_green(
38032 db: &'db dyn Database,
38033 leading_trivia: TriviaGreen<'db>,
38034 token: <<TerminalQuestionMark<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38035 trailing_trivia: TriviaGreen<'db>,
38036 ) -> Self::Green {
38037 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38038 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38039 TerminalQuestionMarkGreen(
38040 GreenNode {
38041 kind: SyntaxKind::TerminalQuestionMark,
38042 details: GreenNodeDetails::Node { children: children.into(), width },
38043 }
38044 .intern(db),
38045 )
38046 }
38047 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38048 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38049 unreachable!("Expected a node, not a token");
38050 };
38051 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38052 }
38053}
38054impl<'db> TerminalQuestionMark<'db> {
38055 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38056 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38057 }
38058 pub fn token(&self, db: &'db dyn Database) -> TokenQuestionMark<'db> {
38059 TokenQuestionMark::from_syntax_node(db, self.node.get_children(db)[1])
38060 }
38061 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38062 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38063 }
38064}
38065#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38066pub struct TerminalQuestionMarkPtr<'db>(pub SyntaxStablePtrId<'db>);
38067impl<'db> TerminalQuestionMarkPtr<'db> {}
38068impl<'db> TypedStablePtr<'db> for TerminalQuestionMarkPtr<'db> {
38069 type SyntaxNode = TerminalQuestionMark<'db>;
38070 fn untyped(self) -> SyntaxStablePtrId<'db> {
38071 self.0
38072 }
38073 fn lookup(&self, db: &'db dyn Database) -> TerminalQuestionMark<'db> {
38074 TerminalQuestionMark::from_syntax_node(db, self.0.lookup(db))
38075 }
38076}
38077impl<'db> From<TerminalQuestionMarkPtr<'db>> for SyntaxStablePtrId<'db> {
38078 fn from(ptr: TerminalQuestionMarkPtr<'db>) -> Self {
38079 ptr.untyped()
38080 }
38081}
38082#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38083pub struct TerminalQuestionMarkGreen<'db>(pub GreenId<'db>);
38084impl<'db> TypedSyntaxNode<'db> for TerminalQuestionMark<'db> {
38085 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalQuestionMark);
38086 type StablePtr = TerminalQuestionMarkPtr<'db>;
38087 type Green = TerminalQuestionMarkGreen<'db>;
38088 fn missing(db: &'db dyn Database) -> Self::Green {
38089 TerminalQuestionMarkGreen(
38090 GreenNode {
38091 kind: SyntaxKind::TerminalQuestionMark,
38092 details: GreenNodeDetails::Node {
38093 children: [
38094 Trivia::missing(db).0,
38095 TokenQuestionMark::missing(db).0,
38096 Trivia::missing(db).0,
38097 ]
38098 .into(),
38099 width: TextWidth::default(),
38100 },
38101 }
38102 .intern(db),
38103 )
38104 }
38105 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38106 let kind = node.kind(db);
38107 assert_eq!(
38108 kind,
38109 SyntaxKind::TerminalQuestionMark,
38110 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38111 kind,
38112 SyntaxKind::TerminalQuestionMark
38113 );
38114 Self { node }
38115 }
38116 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38117 let kind = node.kind(db);
38118 if kind == SyntaxKind::TerminalQuestionMark {
38119 Some(Self::from_syntax_node(db, node))
38120 } else {
38121 None
38122 }
38123 }
38124 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38125 self.node
38126 }
38127 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38128 TerminalQuestionMarkPtr(self.node.stable_ptr(db))
38129 }
38130}
38131#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38132pub struct TokenRBrace<'db> {
38133 node: SyntaxNode<'db>,
38134}
38135impl<'db> Token<'db> for TokenRBrace<'db> {
38136 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38137 TokenRBraceGreen(
38138 GreenNode { kind: SyntaxKind::TokenRBrace, details: GreenNodeDetails::Token(text) }
38139 .intern(db),
38140 )
38141 }
38142 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38143 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38144 }
38145}
38146#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38147pub struct TokenRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38148impl<'db> TypedStablePtr<'db> for TokenRBracePtr<'db> {
38149 type SyntaxNode = TokenRBrace<'db>;
38150 fn untyped(self) -> SyntaxStablePtrId<'db> {
38151 self.0
38152 }
38153 fn lookup(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38154 TokenRBrace::from_syntax_node(db, self.0.lookup(db))
38155 }
38156}
38157impl<'db> From<TokenRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38158 fn from(ptr: TokenRBracePtr<'db>) -> Self {
38159 ptr.untyped()
38160 }
38161}
38162#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38163pub struct TokenRBraceGreen<'db>(pub GreenId<'db>);
38164impl<'db> TokenRBraceGreen<'db> {
38165 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38166 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38167 }
38168}
38169impl<'db> TypedSyntaxNode<'db> for TokenRBrace<'db> {
38170 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrace);
38171 type StablePtr = TokenRBracePtr<'db>;
38172 type Green = TokenRBraceGreen<'db>;
38173 fn missing(db: &'db dyn Database) -> Self::Green {
38174 TokenRBraceGreen(
38175 GreenNode {
38176 kind: SyntaxKind::TokenMissing,
38177 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38178 }
38179 .intern(db),
38180 )
38181 }
38182 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38183 match node.green_node(db).details {
38184 GreenNodeDetails::Token(_) => Self { node },
38185 GreenNodeDetails::Node { .. } => {
38186 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrace)
38187 }
38188 }
38189 }
38190 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38191 match node.green_node(db).details {
38192 GreenNodeDetails::Token(_) => Some(Self { node }),
38193 GreenNodeDetails::Node { .. } => None,
38194 }
38195 }
38196 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38197 self.node
38198 }
38199 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38200 TokenRBracePtr(self.node.stable_ptr(db))
38201 }
38202}
38203#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38204pub struct TerminalRBrace<'db> {
38205 node: SyntaxNode<'db>,
38206}
38207impl<'db> Terminal<'db> for TerminalRBrace<'db> {
38208 const KIND: SyntaxKind = SyntaxKind::TerminalRBrace;
38209 type TokenType = TokenRBrace<'db>;
38210 fn new_green(
38211 db: &'db dyn Database,
38212 leading_trivia: TriviaGreen<'db>,
38213 token: <<TerminalRBrace<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38214 trailing_trivia: TriviaGreen<'db>,
38215 ) -> Self::Green {
38216 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38217 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38218 TerminalRBraceGreen(
38219 GreenNode {
38220 kind: SyntaxKind::TerminalRBrace,
38221 details: GreenNodeDetails::Node { children: children.into(), width },
38222 }
38223 .intern(db),
38224 )
38225 }
38226 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38227 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38228 unreachable!("Expected a node, not a token");
38229 };
38230 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38231 }
38232}
38233impl<'db> TerminalRBrace<'db> {
38234 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38235 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38236 }
38237 pub fn token(&self, db: &'db dyn Database) -> TokenRBrace<'db> {
38238 TokenRBrace::from_syntax_node(db, self.node.get_children(db)[1])
38239 }
38240 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38241 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38242 }
38243}
38244#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38245pub struct TerminalRBracePtr<'db>(pub SyntaxStablePtrId<'db>);
38246impl<'db> TerminalRBracePtr<'db> {}
38247impl<'db> TypedStablePtr<'db> for TerminalRBracePtr<'db> {
38248 type SyntaxNode = TerminalRBrace<'db>;
38249 fn untyped(self) -> SyntaxStablePtrId<'db> {
38250 self.0
38251 }
38252 fn lookup(&self, db: &'db dyn Database) -> TerminalRBrace<'db> {
38253 TerminalRBrace::from_syntax_node(db, self.0.lookup(db))
38254 }
38255}
38256impl<'db> From<TerminalRBracePtr<'db>> for SyntaxStablePtrId<'db> {
38257 fn from(ptr: TerminalRBracePtr<'db>) -> Self {
38258 ptr.untyped()
38259 }
38260}
38261#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38262pub struct TerminalRBraceGreen<'db>(pub GreenId<'db>);
38263impl<'db> TypedSyntaxNode<'db> for TerminalRBrace<'db> {
38264 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrace);
38265 type StablePtr = TerminalRBracePtr<'db>;
38266 type Green = TerminalRBraceGreen<'db>;
38267 fn missing(db: &'db dyn Database) -> Self::Green {
38268 TerminalRBraceGreen(
38269 GreenNode {
38270 kind: SyntaxKind::TerminalRBrace,
38271 details: GreenNodeDetails::Node {
38272 children: [
38273 Trivia::missing(db).0,
38274 TokenRBrace::missing(db).0,
38275 Trivia::missing(db).0,
38276 ]
38277 .into(),
38278 width: TextWidth::default(),
38279 },
38280 }
38281 .intern(db),
38282 )
38283 }
38284 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38285 let kind = node.kind(db);
38286 assert_eq!(
38287 kind,
38288 SyntaxKind::TerminalRBrace,
38289 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38290 kind,
38291 SyntaxKind::TerminalRBrace
38292 );
38293 Self { node }
38294 }
38295 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38296 let kind = node.kind(db);
38297 if kind == SyntaxKind::TerminalRBrace {
38298 Some(Self::from_syntax_node(db, node))
38299 } else {
38300 None
38301 }
38302 }
38303 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38304 self.node
38305 }
38306 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38307 TerminalRBracePtr(self.node.stable_ptr(db))
38308 }
38309}
38310#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38311pub struct TokenRBrack<'db> {
38312 node: SyntaxNode<'db>,
38313}
38314impl<'db> Token<'db> for TokenRBrack<'db> {
38315 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38316 TokenRBrackGreen(
38317 GreenNode { kind: SyntaxKind::TokenRBrack, details: GreenNodeDetails::Token(text) }
38318 .intern(db),
38319 )
38320 }
38321 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38322 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38323 }
38324}
38325#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38326pub struct TokenRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38327impl<'db> TypedStablePtr<'db> for TokenRBrackPtr<'db> {
38328 type SyntaxNode = TokenRBrack<'db>;
38329 fn untyped(self) -> SyntaxStablePtrId<'db> {
38330 self.0
38331 }
38332 fn lookup(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38333 TokenRBrack::from_syntax_node(db, self.0.lookup(db))
38334 }
38335}
38336impl<'db> From<TokenRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38337 fn from(ptr: TokenRBrackPtr<'db>) -> Self {
38338 ptr.untyped()
38339 }
38340}
38341#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38342pub struct TokenRBrackGreen<'db>(pub GreenId<'db>);
38343impl<'db> TokenRBrackGreen<'db> {
38344 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38345 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38346 }
38347}
38348impl<'db> TypedSyntaxNode<'db> for TokenRBrack<'db> {
38349 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRBrack);
38350 type StablePtr = TokenRBrackPtr<'db>;
38351 type Green = TokenRBrackGreen<'db>;
38352 fn missing(db: &'db dyn Database) -> Self::Green {
38353 TokenRBrackGreen(
38354 GreenNode {
38355 kind: SyntaxKind::TokenMissing,
38356 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38357 }
38358 .intern(db),
38359 )
38360 }
38361 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38362 match node.green_node(db).details {
38363 GreenNodeDetails::Token(_) => Self { node },
38364 GreenNodeDetails::Node { .. } => {
38365 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRBrack)
38366 }
38367 }
38368 }
38369 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38370 match node.green_node(db).details {
38371 GreenNodeDetails::Token(_) => Some(Self { node }),
38372 GreenNodeDetails::Node { .. } => None,
38373 }
38374 }
38375 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38376 self.node
38377 }
38378 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38379 TokenRBrackPtr(self.node.stable_ptr(db))
38380 }
38381}
38382#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38383pub struct TerminalRBrack<'db> {
38384 node: SyntaxNode<'db>,
38385}
38386impl<'db> Terminal<'db> for TerminalRBrack<'db> {
38387 const KIND: SyntaxKind = SyntaxKind::TerminalRBrack;
38388 type TokenType = TokenRBrack<'db>;
38389 fn new_green(
38390 db: &'db dyn Database,
38391 leading_trivia: TriviaGreen<'db>,
38392 token: <<TerminalRBrack<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38393 trailing_trivia: TriviaGreen<'db>,
38394 ) -> Self::Green {
38395 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38396 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38397 TerminalRBrackGreen(
38398 GreenNode {
38399 kind: SyntaxKind::TerminalRBrack,
38400 details: GreenNodeDetails::Node { children: children.into(), width },
38401 }
38402 .intern(db),
38403 )
38404 }
38405 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38406 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38407 unreachable!("Expected a node, not a token");
38408 };
38409 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38410 }
38411}
38412impl<'db> TerminalRBrack<'db> {
38413 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38414 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38415 }
38416 pub fn token(&self, db: &'db dyn Database) -> TokenRBrack<'db> {
38417 TokenRBrack::from_syntax_node(db, self.node.get_children(db)[1])
38418 }
38419 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38420 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38421 }
38422}
38423#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38424pub struct TerminalRBrackPtr<'db>(pub SyntaxStablePtrId<'db>);
38425impl<'db> TerminalRBrackPtr<'db> {}
38426impl<'db> TypedStablePtr<'db> for TerminalRBrackPtr<'db> {
38427 type SyntaxNode = TerminalRBrack<'db>;
38428 fn untyped(self) -> SyntaxStablePtrId<'db> {
38429 self.0
38430 }
38431 fn lookup(&self, db: &'db dyn Database) -> TerminalRBrack<'db> {
38432 TerminalRBrack::from_syntax_node(db, self.0.lookup(db))
38433 }
38434}
38435impl<'db> From<TerminalRBrackPtr<'db>> for SyntaxStablePtrId<'db> {
38436 fn from(ptr: TerminalRBrackPtr<'db>) -> Self {
38437 ptr.untyped()
38438 }
38439}
38440#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38441pub struct TerminalRBrackGreen<'db>(pub GreenId<'db>);
38442impl<'db> TypedSyntaxNode<'db> for TerminalRBrack<'db> {
38443 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRBrack);
38444 type StablePtr = TerminalRBrackPtr<'db>;
38445 type Green = TerminalRBrackGreen<'db>;
38446 fn missing(db: &'db dyn Database) -> Self::Green {
38447 TerminalRBrackGreen(
38448 GreenNode {
38449 kind: SyntaxKind::TerminalRBrack,
38450 details: GreenNodeDetails::Node {
38451 children: [
38452 Trivia::missing(db).0,
38453 TokenRBrack::missing(db).0,
38454 Trivia::missing(db).0,
38455 ]
38456 .into(),
38457 width: TextWidth::default(),
38458 },
38459 }
38460 .intern(db),
38461 )
38462 }
38463 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38464 let kind = node.kind(db);
38465 assert_eq!(
38466 kind,
38467 SyntaxKind::TerminalRBrack,
38468 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38469 kind,
38470 SyntaxKind::TerminalRBrack
38471 );
38472 Self { node }
38473 }
38474 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38475 let kind = node.kind(db);
38476 if kind == SyntaxKind::TerminalRBrack {
38477 Some(Self::from_syntax_node(db, node))
38478 } else {
38479 None
38480 }
38481 }
38482 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38483 self.node
38484 }
38485 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38486 TerminalRBrackPtr(self.node.stable_ptr(db))
38487 }
38488}
38489#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38490pub struct TokenRParen<'db> {
38491 node: SyntaxNode<'db>,
38492}
38493impl<'db> Token<'db> for TokenRParen<'db> {
38494 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38495 TokenRParenGreen(
38496 GreenNode { kind: SyntaxKind::TokenRParen, details: GreenNodeDetails::Token(text) }
38497 .intern(db),
38498 )
38499 }
38500 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38501 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38502 }
38503}
38504#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38505pub struct TokenRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38506impl<'db> TypedStablePtr<'db> for TokenRParenPtr<'db> {
38507 type SyntaxNode = TokenRParen<'db>;
38508 fn untyped(self) -> SyntaxStablePtrId<'db> {
38509 self.0
38510 }
38511 fn lookup(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38512 TokenRParen::from_syntax_node(db, self.0.lookup(db))
38513 }
38514}
38515impl<'db> From<TokenRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38516 fn from(ptr: TokenRParenPtr<'db>) -> Self {
38517 ptr.untyped()
38518 }
38519}
38520#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38521pub struct TokenRParenGreen<'db>(pub GreenId<'db>);
38522impl<'db> TokenRParenGreen<'db> {
38523 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38524 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38525 }
38526}
38527impl<'db> TypedSyntaxNode<'db> for TokenRParen<'db> {
38528 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenRParen);
38529 type StablePtr = TokenRParenPtr<'db>;
38530 type Green = TokenRParenGreen<'db>;
38531 fn missing(db: &'db dyn Database) -> Self::Green {
38532 TokenRParenGreen(
38533 GreenNode {
38534 kind: SyntaxKind::TokenMissing,
38535 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38536 }
38537 .intern(db),
38538 )
38539 }
38540 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38541 match node.green_node(db).details {
38542 GreenNodeDetails::Token(_) => Self { node },
38543 GreenNodeDetails::Node { .. } => {
38544 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenRParen)
38545 }
38546 }
38547 }
38548 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38549 match node.green_node(db).details {
38550 GreenNodeDetails::Token(_) => Some(Self { node }),
38551 GreenNodeDetails::Node { .. } => None,
38552 }
38553 }
38554 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38555 self.node
38556 }
38557 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38558 TokenRParenPtr(self.node.stable_ptr(db))
38559 }
38560}
38561#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38562pub struct TerminalRParen<'db> {
38563 node: SyntaxNode<'db>,
38564}
38565impl<'db> Terminal<'db> for TerminalRParen<'db> {
38566 const KIND: SyntaxKind = SyntaxKind::TerminalRParen;
38567 type TokenType = TokenRParen<'db>;
38568 fn new_green(
38569 db: &'db dyn Database,
38570 leading_trivia: TriviaGreen<'db>,
38571 token: <<TerminalRParen<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38572 trailing_trivia: TriviaGreen<'db>,
38573 ) -> Self::Green {
38574 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38575 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38576 TerminalRParenGreen(
38577 GreenNode {
38578 kind: SyntaxKind::TerminalRParen,
38579 details: GreenNodeDetails::Node { children: children.into(), width },
38580 }
38581 .intern(db),
38582 )
38583 }
38584 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38585 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38586 unreachable!("Expected a node, not a token");
38587 };
38588 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38589 }
38590}
38591impl<'db> TerminalRParen<'db> {
38592 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38593 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38594 }
38595 pub fn token(&self, db: &'db dyn Database) -> TokenRParen<'db> {
38596 TokenRParen::from_syntax_node(db, self.node.get_children(db)[1])
38597 }
38598 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38599 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38600 }
38601}
38602#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38603pub struct TerminalRParenPtr<'db>(pub SyntaxStablePtrId<'db>);
38604impl<'db> TerminalRParenPtr<'db> {}
38605impl<'db> TypedStablePtr<'db> for TerminalRParenPtr<'db> {
38606 type SyntaxNode = TerminalRParen<'db>;
38607 fn untyped(self) -> SyntaxStablePtrId<'db> {
38608 self.0
38609 }
38610 fn lookup(&self, db: &'db dyn Database) -> TerminalRParen<'db> {
38611 TerminalRParen::from_syntax_node(db, self.0.lookup(db))
38612 }
38613}
38614impl<'db> From<TerminalRParenPtr<'db>> for SyntaxStablePtrId<'db> {
38615 fn from(ptr: TerminalRParenPtr<'db>) -> Self {
38616 ptr.untyped()
38617 }
38618}
38619#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38620pub struct TerminalRParenGreen<'db>(pub GreenId<'db>);
38621impl<'db> TypedSyntaxNode<'db> for TerminalRParen<'db> {
38622 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalRParen);
38623 type StablePtr = TerminalRParenPtr<'db>;
38624 type Green = TerminalRParenGreen<'db>;
38625 fn missing(db: &'db dyn Database) -> Self::Green {
38626 TerminalRParenGreen(
38627 GreenNode {
38628 kind: SyntaxKind::TerminalRParen,
38629 details: GreenNodeDetails::Node {
38630 children: [
38631 Trivia::missing(db).0,
38632 TokenRParen::missing(db).0,
38633 Trivia::missing(db).0,
38634 ]
38635 .into(),
38636 width: TextWidth::default(),
38637 },
38638 }
38639 .intern(db),
38640 )
38641 }
38642 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38643 let kind = node.kind(db);
38644 assert_eq!(
38645 kind,
38646 SyntaxKind::TerminalRParen,
38647 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38648 kind,
38649 SyntaxKind::TerminalRParen
38650 );
38651 Self { node }
38652 }
38653 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38654 let kind = node.kind(db);
38655 if kind == SyntaxKind::TerminalRParen {
38656 Some(Self::from_syntax_node(db, node))
38657 } else {
38658 None
38659 }
38660 }
38661 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38662 self.node
38663 }
38664 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38665 TerminalRParenPtr(self.node.stable_ptr(db))
38666 }
38667}
38668#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38669pub struct TokenSemicolon<'db> {
38670 node: SyntaxNode<'db>,
38671}
38672impl<'db> Token<'db> for TokenSemicolon<'db> {
38673 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38674 TokenSemicolonGreen(
38675 GreenNode { kind: SyntaxKind::TokenSemicolon, details: GreenNodeDetails::Token(text) }
38676 .intern(db),
38677 )
38678 }
38679 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38680 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38681 }
38682}
38683#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38684pub struct TokenSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38685impl<'db> TypedStablePtr<'db> for TokenSemicolonPtr<'db> {
38686 type SyntaxNode = TokenSemicolon<'db>;
38687 fn untyped(self) -> SyntaxStablePtrId<'db> {
38688 self.0
38689 }
38690 fn lookup(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38691 TokenSemicolon::from_syntax_node(db, self.0.lookup(db))
38692 }
38693}
38694impl<'db> From<TokenSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38695 fn from(ptr: TokenSemicolonPtr<'db>) -> Self {
38696 ptr.untyped()
38697 }
38698}
38699#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38700pub struct TokenSemicolonGreen<'db>(pub GreenId<'db>);
38701impl<'db> TokenSemicolonGreen<'db> {
38702 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38703 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38704 }
38705}
38706impl<'db> TypedSyntaxNode<'db> for TokenSemicolon<'db> {
38707 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSemicolon);
38708 type StablePtr = TokenSemicolonPtr<'db>;
38709 type Green = TokenSemicolonGreen<'db>;
38710 fn missing(db: &'db dyn Database) -> Self::Green {
38711 TokenSemicolonGreen(
38712 GreenNode {
38713 kind: SyntaxKind::TokenMissing,
38714 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38715 }
38716 .intern(db),
38717 )
38718 }
38719 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38720 match node.green_node(db).details {
38721 GreenNodeDetails::Token(_) => Self { node },
38722 GreenNodeDetails::Node { .. } => {
38723 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSemicolon)
38724 }
38725 }
38726 }
38727 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38728 match node.green_node(db).details {
38729 GreenNodeDetails::Token(_) => Some(Self { node }),
38730 GreenNodeDetails::Node { .. } => None,
38731 }
38732 }
38733 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38734 self.node
38735 }
38736 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38737 TokenSemicolonPtr(self.node.stable_ptr(db))
38738 }
38739}
38740#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38741pub struct TerminalSemicolon<'db> {
38742 node: SyntaxNode<'db>,
38743}
38744impl<'db> Terminal<'db> for TerminalSemicolon<'db> {
38745 const KIND: SyntaxKind = SyntaxKind::TerminalSemicolon;
38746 type TokenType = TokenSemicolon<'db>;
38747 fn new_green(
38748 db: &'db dyn Database,
38749 leading_trivia: TriviaGreen<'db>,
38750 token: <<TerminalSemicolon<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38751 trailing_trivia: TriviaGreen<'db>,
38752 ) -> Self::Green {
38753 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38754 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38755 TerminalSemicolonGreen(
38756 GreenNode {
38757 kind: SyntaxKind::TerminalSemicolon,
38758 details: GreenNodeDetails::Node { children: children.into(), width },
38759 }
38760 .intern(db),
38761 )
38762 }
38763 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38764 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38765 unreachable!("Expected a node, not a token");
38766 };
38767 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38768 }
38769}
38770impl<'db> TerminalSemicolon<'db> {
38771 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38772 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38773 }
38774 pub fn token(&self, db: &'db dyn Database) -> TokenSemicolon<'db> {
38775 TokenSemicolon::from_syntax_node(db, self.node.get_children(db)[1])
38776 }
38777 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38778 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38779 }
38780}
38781#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38782pub struct TerminalSemicolonPtr<'db>(pub SyntaxStablePtrId<'db>);
38783impl<'db> TerminalSemicolonPtr<'db> {}
38784impl<'db> TypedStablePtr<'db> for TerminalSemicolonPtr<'db> {
38785 type SyntaxNode = TerminalSemicolon<'db>;
38786 fn untyped(self) -> SyntaxStablePtrId<'db> {
38787 self.0
38788 }
38789 fn lookup(&self, db: &'db dyn Database) -> TerminalSemicolon<'db> {
38790 TerminalSemicolon::from_syntax_node(db, self.0.lookup(db))
38791 }
38792}
38793impl<'db> From<TerminalSemicolonPtr<'db>> for SyntaxStablePtrId<'db> {
38794 fn from(ptr: TerminalSemicolonPtr<'db>) -> Self {
38795 ptr.untyped()
38796 }
38797}
38798#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38799pub struct TerminalSemicolonGreen<'db>(pub GreenId<'db>);
38800impl<'db> TypedSyntaxNode<'db> for TerminalSemicolon<'db> {
38801 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalSemicolon);
38802 type StablePtr = TerminalSemicolonPtr<'db>;
38803 type Green = TerminalSemicolonGreen<'db>;
38804 fn missing(db: &'db dyn Database) -> Self::Green {
38805 TerminalSemicolonGreen(
38806 GreenNode {
38807 kind: SyntaxKind::TerminalSemicolon,
38808 details: GreenNodeDetails::Node {
38809 children: [
38810 Trivia::missing(db).0,
38811 TokenSemicolon::missing(db).0,
38812 Trivia::missing(db).0,
38813 ]
38814 .into(),
38815 width: TextWidth::default(),
38816 },
38817 }
38818 .intern(db),
38819 )
38820 }
38821 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38822 let kind = node.kind(db);
38823 assert_eq!(
38824 kind,
38825 SyntaxKind::TerminalSemicolon,
38826 "Unexpected SyntaxKind {:?}. Expected {:?}.",
38827 kind,
38828 SyntaxKind::TerminalSemicolon
38829 );
38830 Self { node }
38831 }
38832 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38833 let kind = node.kind(db);
38834 if kind == SyntaxKind::TerminalSemicolon {
38835 Some(Self::from_syntax_node(db, node))
38836 } else {
38837 None
38838 }
38839 }
38840 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38841 self.node
38842 }
38843 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38844 TerminalSemicolonPtr(self.node.stable_ptr(db))
38845 }
38846}
38847#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38848pub struct TokenUnderscore<'db> {
38849 node: SyntaxNode<'db>,
38850}
38851impl<'db> Token<'db> for TokenUnderscore<'db> {
38852 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
38853 TokenUnderscoreGreen(
38854 GreenNode { kind: SyntaxKind::TokenUnderscore, details: GreenNodeDetails::Token(text) }
38855 .intern(db),
38856 )
38857 }
38858 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38859 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
38860 }
38861}
38862#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38863pub struct TokenUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38864impl<'db> TypedStablePtr<'db> for TokenUnderscorePtr<'db> {
38865 type SyntaxNode = TokenUnderscore<'db>;
38866 fn untyped(self) -> SyntaxStablePtrId<'db> {
38867 self.0
38868 }
38869 fn lookup(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38870 TokenUnderscore::from_syntax_node(db, self.0.lookup(db))
38871 }
38872}
38873impl<'db> From<TokenUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38874 fn from(ptr: TokenUnderscorePtr<'db>) -> Self {
38875 ptr.untyped()
38876 }
38877}
38878#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38879pub struct TokenUnderscoreGreen<'db>(pub GreenId<'db>);
38880impl<'db> TokenUnderscoreGreen<'db> {
38881 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38882 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
38883 }
38884}
38885impl<'db> TypedSyntaxNode<'db> for TokenUnderscore<'db> {
38886 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenUnderscore);
38887 type StablePtr = TokenUnderscorePtr<'db>;
38888 type Green = TokenUnderscoreGreen<'db>;
38889 fn missing(db: &'db dyn Database) -> Self::Green {
38890 TokenUnderscoreGreen(
38891 GreenNode {
38892 kind: SyntaxKind::TokenMissing,
38893 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
38894 }
38895 .intern(db),
38896 )
38897 }
38898 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
38899 match node.green_node(db).details {
38900 GreenNodeDetails::Token(_) => Self { node },
38901 GreenNodeDetails::Node { .. } => {
38902 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenUnderscore)
38903 }
38904 }
38905 }
38906 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
38907 match node.green_node(db).details {
38908 GreenNodeDetails::Token(_) => Some(Self { node }),
38909 GreenNodeDetails::Node { .. } => None,
38910 }
38911 }
38912 fn as_syntax_node(&self) -> SyntaxNode<'db> {
38913 self.node
38914 }
38915 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
38916 TokenUnderscorePtr(self.node.stable_ptr(db))
38917 }
38918}
38919#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
38920pub struct TerminalUnderscore<'db> {
38921 node: SyntaxNode<'db>,
38922}
38923impl<'db> Terminal<'db> for TerminalUnderscore<'db> {
38924 const KIND: SyntaxKind = SyntaxKind::TerminalUnderscore;
38925 type TokenType = TokenUnderscore<'db>;
38926 fn new_green(
38927 db: &'db dyn Database,
38928 leading_trivia: TriviaGreen<'db>,
38929 token: <<TerminalUnderscore<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
38930 trailing_trivia: TriviaGreen<'db>,
38931 ) -> Self::Green {
38932 let children = [leading_trivia.0, token.0, trailing_trivia.0];
38933 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
38934 TerminalUnderscoreGreen(
38935 GreenNode {
38936 kind: SyntaxKind::TerminalUnderscore,
38937 details: GreenNodeDetails::Node { children: children.into(), width },
38938 }
38939 .intern(db),
38940 )
38941 }
38942 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
38943 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
38944 unreachable!("Expected a node, not a token");
38945 };
38946 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
38947 }
38948}
38949impl<'db> TerminalUnderscore<'db> {
38950 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38951 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
38952 }
38953 pub fn token(&self, db: &'db dyn Database) -> TokenUnderscore<'db> {
38954 TokenUnderscore::from_syntax_node(db, self.node.get_children(db)[1])
38955 }
38956 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
38957 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
38958 }
38959}
38960#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38961pub struct TerminalUnderscorePtr<'db>(pub SyntaxStablePtrId<'db>);
38962impl<'db> TerminalUnderscorePtr<'db> {}
38963impl<'db> TypedStablePtr<'db> for TerminalUnderscorePtr<'db> {
38964 type SyntaxNode = TerminalUnderscore<'db>;
38965 fn untyped(self) -> SyntaxStablePtrId<'db> {
38966 self.0
38967 }
38968 fn lookup(&self, db: &'db dyn Database) -> TerminalUnderscore<'db> {
38969 TerminalUnderscore::from_syntax_node(db, self.0.lookup(db))
38970 }
38971}
38972impl<'db> From<TerminalUnderscorePtr<'db>> for SyntaxStablePtrId<'db> {
38973 fn from(ptr: TerminalUnderscorePtr<'db>) -> Self {
38974 ptr.untyped()
38975 }
38976}
38977#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
38978pub struct TerminalUnderscoreGreen<'db>(pub GreenId<'db>);
38979impl<'db> TypedSyntaxNode<'db> for TerminalUnderscore<'db> {
38980 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalUnderscore);
38981 type StablePtr = TerminalUnderscorePtr<'db>;
38982 type Green = TerminalUnderscoreGreen<'db>;
38983 fn missing(db: &'db dyn Database) -> Self::Green {
38984 TerminalUnderscoreGreen(
38985 GreenNode {
38986 kind: SyntaxKind::TerminalUnderscore,
38987 details: GreenNodeDetails::Node {
38988 children: [
38989 Trivia::missing(db).0,
38990 TokenUnderscore::missing(db).0,
38991 Trivia::missing(db).0,
38992 ]
38993 .into(),
38994 width: TextWidth::default(),
38995 },
38996 }
38997 .intern(db),
38998 )
38999 }
39000 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39001 let kind = node.kind(db);
39002 assert_eq!(
39003 kind,
39004 SyntaxKind::TerminalUnderscore,
39005 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39006 kind,
39007 SyntaxKind::TerminalUnderscore
39008 );
39009 Self { node }
39010 }
39011 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39012 let kind = node.kind(db);
39013 if kind == SyntaxKind::TerminalUnderscore {
39014 Some(Self::from_syntax_node(db, node))
39015 } else {
39016 None
39017 }
39018 }
39019 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39020 self.node
39021 }
39022 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39023 TerminalUnderscorePtr(self.node.stable_ptr(db))
39024 }
39025}
39026#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39027pub struct TokenXor<'db> {
39028 node: SyntaxNode<'db>,
39029}
39030impl<'db> Token<'db> for TokenXor<'db> {
39031 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39032 TokenXorGreen(
39033 GreenNode { kind: SyntaxKind::TokenXor, details: GreenNodeDetails::Token(text) }
39034 .intern(db),
39035 )
39036 }
39037 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39038 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39039 }
39040}
39041#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39042pub struct TokenXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39043impl<'db> TypedStablePtr<'db> for TokenXorPtr<'db> {
39044 type SyntaxNode = TokenXor<'db>;
39045 fn untyped(self) -> SyntaxStablePtrId<'db> {
39046 self.0
39047 }
39048 fn lookup(&self, db: &'db dyn Database) -> TokenXor<'db> {
39049 TokenXor::from_syntax_node(db, self.0.lookup(db))
39050 }
39051}
39052impl<'db> From<TokenXorPtr<'db>> for SyntaxStablePtrId<'db> {
39053 fn from(ptr: TokenXorPtr<'db>) -> Self {
39054 ptr.untyped()
39055 }
39056}
39057#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39058pub struct TokenXorGreen<'db>(pub GreenId<'db>);
39059impl<'db> TokenXorGreen<'db> {
39060 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39061 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39062 }
39063}
39064impl<'db> TypedSyntaxNode<'db> for TokenXor<'db> {
39065 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenXor);
39066 type StablePtr = TokenXorPtr<'db>;
39067 type Green = TokenXorGreen<'db>;
39068 fn missing(db: &'db dyn Database) -> Self::Green {
39069 TokenXorGreen(
39070 GreenNode {
39071 kind: SyntaxKind::TokenMissing,
39072 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39073 }
39074 .intern(db),
39075 )
39076 }
39077 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39078 match node.green_node(db).details {
39079 GreenNodeDetails::Token(_) => Self { node },
39080 GreenNodeDetails::Node { .. } => {
39081 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenXor)
39082 }
39083 }
39084 }
39085 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39086 match node.green_node(db).details {
39087 GreenNodeDetails::Token(_) => Some(Self { node }),
39088 GreenNodeDetails::Node { .. } => None,
39089 }
39090 }
39091 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39092 self.node
39093 }
39094 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39095 TokenXorPtr(self.node.stable_ptr(db))
39096 }
39097}
39098#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39099pub struct TerminalXor<'db> {
39100 node: SyntaxNode<'db>,
39101}
39102impl<'db> Terminal<'db> for TerminalXor<'db> {
39103 const KIND: SyntaxKind = SyntaxKind::TerminalXor;
39104 type TokenType = TokenXor<'db>;
39105 fn new_green(
39106 db: &'db dyn Database,
39107 leading_trivia: TriviaGreen<'db>,
39108 token: <<TerminalXor<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39109 trailing_trivia: TriviaGreen<'db>,
39110 ) -> Self::Green {
39111 let children = [leading_trivia.0, token.0, trailing_trivia.0];
39112 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39113 TerminalXorGreen(
39114 GreenNode {
39115 kind: SyntaxKind::TerminalXor,
39116 details: GreenNodeDetails::Node { children: children.into(), width },
39117 }
39118 .intern(db),
39119 )
39120 }
39121 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39122 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
39123 unreachable!("Expected a node, not a token");
39124 };
39125 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39126 }
39127}
39128impl<'db> TerminalXor<'db> {
39129 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39130 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39131 }
39132 pub fn token(&self, db: &'db dyn Database) -> TokenXor<'db> {
39133 TokenXor::from_syntax_node(db, self.node.get_children(db)[1])
39134 }
39135 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39136 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39137 }
39138}
39139#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39140pub struct TerminalXorPtr<'db>(pub SyntaxStablePtrId<'db>);
39141impl<'db> TerminalXorPtr<'db> {}
39142impl<'db> TypedStablePtr<'db> for TerminalXorPtr<'db> {
39143 type SyntaxNode = TerminalXor<'db>;
39144 fn untyped(self) -> SyntaxStablePtrId<'db> {
39145 self.0
39146 }
39147 fn lookup(&self, db: &'db dyn Database) -> TerminalXor<'db> {
39148 TerminalXor::from_syntax_node(db, self.0.lookup(db))
39149 }
39150}
39151impl<'db> From<TerminalXorPtr<'db>> for SyntaxStablePtrId<'db> {
39152 fn from(ptr: TerminalXorPtr<'db>) -> Self {
39153 ptr.untyped()
39154 }
39155}
39156#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39157pub struct TerminalXorGreen<'db>(pub GreenId<'db>);
39158impl<'db> TypedSyntaxNode<'db> for TerminalXor<'db> {
39159 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalXor);
39160 type StablePtr = TerminalXorPtr<'db>;
39161 type Green = TerminalXorGreen<'db>;
39162 fn missing(db: &'db dyn Database) -> Self::Green {
39163 TerminalXorGreen(
39164 GreenNode {
39165 kind: SyntaxKind::TerminalXor,
39166 details: GreenNodeDetails::Node {
39167 children: [
39168 Trivia::missing(db).0,
39169 TokenXor::missing(db).0,
39170 Trivia::missing(db).0,
39171 ]
39172 .into(),
39173 width: TextWidth::default(),
39174 },
39175 }
39176 .intern(db),
39177 )
39178 }
39179 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39180 let kind = node.kind(db);
39181 assert_eq!(
39182 kind,
39183 SyntaxKind::TerminalXor,
39184 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39185 kind,
39186 SyntaxKind::TerminalXor
39187 );
39188 Self { node }
39189 }
39190 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39191 let kind = node.kind(db);
39192 if kind == SyntaxKind::TerminalXor { Some(Self::from_syntax_node(db, node)) } else { None }
39193 }
39194 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39195 self.node
39196 }
39197 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39198 TerminalXorPtr(self.node.stable_ptr(db))
39199 }
39200}
39201#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39202pub struct SyntaxFile<'db> {
39203 node: SyntaxNode<'db>,
39204}
39205impl<'db> SyntaxFile<'db> {
39206 pub const INDEX_ITEMS: usize = 0;
39207 pub const INDEX_EOF: usize = 1;
39208 pub fn new_green(
39209 db: &'db dyn Database,
39210 items: ModuleItemListGreen<'db>,
39211 eof: TerminalEndOfFileGreen<'db>,
39212 ) -> SyntaxFileGreen<'db> {
39213 let children = [items.0, eof.0];
39214 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39215 SyntaxFileGreen(
39216 GreenNode {
39217 kind: SyntaxKind::SyntaxFile,
39218 details: GreenNodeDetails::Node { children: children.into(), width },
39219 }
39220 .intern(db),
39221 )
39222 }
39223}
39224impl<'db> SyntaxFile<'db> {
39225 pub fn items(&self, db: &'db dyn Database) -> ModuleItemList<'db> {
39226 ModuleItemList::from_syntax_node(db, self.node.get_children(db)[0])
39227 }
39228 pub fn eof(&self, db: &'db dyn Database) -> TerminalEndOfFile<'db> {
39229 TerminalEndOfFile::from_syntax_node(db, self.node.get_children(db)[1])
39230 }
39231}
39232#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39233pub struct SyntaxFilePtr<'db>(pub SyntaxStablePtrId<'db>);
39234impl<'db> SyntaxFilePtr<'db> {}
39235impl<'db> TypedStablePtr<'db> for SyntaxFilePtr<'db> {
39236 type SyntaxNode = SyntaxFile<'db>;
39237 fn untyped(self) -> SyntaxStablePtrId<'db> {
39238 self.0
39239 }
39240 fn lookup(&self, db: &'db dyn Database) -> SyntaxFile<'db> {
39241 SyntaxFile::from_syntax_node(db, self.0.lookup(db))
39242 }
39243}
39244impl<'db> From<SyntaxFilePtr<'db>> for SyntaxStablePtrId<'db> {
39245 fn from(ptr: SyntaxFilePtr<'db>) -> Self {
39246 ptr.untyped()
39247 }
39248}
39249#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39250pub struct SyntaxFileGreen<'db>(pub GreenId<'db>);
39251impl<'db> TypedSyntaxNode<'db> for SyntaxFile<'db> {
39252 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::SyntaxFile);
39253 type StablePtr = SyntaxFilePtr<'db>;
39254 type Green = SyntaxFileGreen<'db>;
39255 fn missing(db: &'db dyn Database) -> Self::Green {
39256 SyntaxFileGreen(
39257 GreenNode {
39258 kind: SyntaxKind::SyntaxFile,
39259 details: GreenNodeDetails::Node {
39260 children: [ModuleItemList::missing(db).0, TerminalEndOfFile::missing(db).0]
39261 .into(),
39262 width: TextWidth::default(),
39263 },
39264 }
39265 .intern(db),
39266 )
39267 }
39268 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39269 let kind = node.kind(db);
39270 assert_eq!(
39271 kind,
39272 SyntaxKind::SyntaxFile,
39273 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39274 kind,
39275 SyntaxKind::SyntaxFile
39276 );
39277 Self { node }
39278 }
39279 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39280 let kind = node.kind(db);
39281 if kind == SyntaxKind::SyntaxFile { Some(Self::from_syntax_node(db, node)) } else { None }
39282 }
39283 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39284 self.node
39285 }
39286 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39287 SyntaxFilePtr(self.node.stable_ptr(db))
39288 }
39289}
39290#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39291pub struct TokenEmpty<'db> {
39292 node: SyntaxNode<'db>,
39293}
39294impl<'db> Token<'db> for TokenEmpty<'db> {
39295 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39296 TokenEmptyGreen(
39297 GreenNode { kind: SyntaxKind::TokenEmpty, details: GreenNodeDetails::Token(text) }
39298 .intern(db),
39299 )
39300 }
39301 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39302 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39303 }
39304}
39305#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39306pub struct TokenEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39307impl<'db> TypedStablePtr<'db> for TokenEmptyPtr<'db> {
39308 type SyntaxNode = TokenEmpty<'db>;
39309 fn untyped(self) -> SyntaxStablePtrId<'db> {
39310 self.0
39311 }
39312 fn lookup(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39313 TokenEmpty::from_syntax_node(db, self.0.lookup(db))
39314 }
39315}
39316impl<'db> From<TokenEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39317 fn from(ptr: TokenEmptyPtr<'db>) -> Self {
39318 ptr.untyped()
39319 }
39320}
39321#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39322pub struct TokenEmptyGreen<'db>(pub GreenId<'db>);
39323impl<'db> TokenEmptyGreen<'db> {
39324 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39325 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39326 }
39327}
39328impl<'db> TypedSyntaxNode<'db> for TokenEmpty<'db> {
39329 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenEmpty);
39330 type StablePtr = TokenEmptyPtr<'db>;
39331 type Green = TokenEmptyGreen<'db>;
39332 fn missing(db: &'db dyn Database) -> Self::Green {
39333 TokenEmptyGreen(
39334 GreenNode {
39335 kind: SyntaxKind::TokenMissing,
39336 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39337 }
39338 .intern(db),
39339 )
39340 }
39341 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39342 match node.green_node(db).details {
39343 GreenNodeDetails::Token(_) => Self { node },
39344 GreenNodeDetails::Node { .. } => {
39345 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenEmpty)
39346 }
39347 }
39348 }
39349 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39350 match node.green_node(db).details {
39351 GreenNodeDetails::Token(_) => Some(Self { node }),
39352 GreenNodeDetails::Node { .. } => None,
39353 }
39354 }
39355 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39356 self.node
39357 }
39358 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39359 TokenEmptyPtr(self.node.stable_ptr(db))
39360 }
39361}
39362#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39363pub struct TerminalEmpty<'db> {
39364 node: SyntaxNode<'db>,
39365}
39366impl<'db> Terminal<'db> for TerminalEmpty<'db> {
39367 const KIND: SyntaxKind = SyntaxKind::TerminalEmpty;
39368 type TokenType = TokenEmpty<'db>;
39369 fn new_green(
39370 db: &'db dyn Database,
39371 leading_trivia: TriviaGreen<'db>,
39372 token: <<TerminalEmpty<'db> as Terminal<'db>>::TokenType as TypedSyntaxNode<'db>>::Green,
39373 trailing_trivia: TriviaGreen<'db>,
39374 ) -> Self::Green {
39375 let children = [leading_trivia.0, token.0, trailing_trivia.0];
39376 let width = children.into_iter().map(|id: GreenId<'_>| id.long(db).width(db)).sum();
39377 TerminalEmptyGreen(
39378 GreenNode {
39379 kind: SyntaxKind::TerminalEmpty,
39380 details: GreenNodeDetails::Node { children: children.into(), width },
39381 }
39382 .intern(db),
39383 )
39384 }
39385 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39386 let GreenNodeDetails::Node { children, .. } = &self.node.green_node(db).details else {
39387 unreachable!("Expected a node, not a token");
39388 };
39389 *extract_matches!(&children[1].long(db).details, GreenNodeDetails::Token)
39390 }
39391}
39392impl<'db> TerminalEmpty<'db> {
39393 pub fn leading_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39394 Trivia::from_syntax_node(db, self.node.get_children(db)[0])
39395 }
39396 pub fn token(&self, db: &'db dyn Database) -> TokenEmpty<'db> {
39397 TokenEmpty::from_syntax_node(db, self.node.get_children(db)[1])
39398 }
39399 pub fn trailing_trivia(&self, db: &'db dyn Database) -> Trivia<'db> {
39400 Trivia::from_syntax_node(db, self.node.get_children(db)[2])
39401 }
39402}
39403#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39404pub struct TerminalEmptyPtr<'db>(pub SyntaxStablePtrId<'db>);
39405impl<'db> TerminalEmptyPtr<'db> {}
39406impl<'db> TypedStablePtr<'db> for TerminalEmptyPtr<'db> {
39407 type SyntaxNode = TerminalEmpty<'db>;
39408 fn untyped(self) -> SyntaxStablePtrId<'db> {
39409 self.0
39410 }
39411 fn lookup(&self, db: &'db dyn Database) -> TerminalEmpty<'db> {
39412 TerminalEmpty::from_syntax_node(db, self.0.lookup(db))
39413 }
39414}
39415impl<'db> From<TerminalEmptyPtr<'db>> for SyntaxStablePtrId<'db> {
39416 fn from(ptr: TerminalEmptyPtr<'db>) -> Self {
39417 ptr.untyped()
39418 }
39419}
39420#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39421pub struct TerminalEmptyGreen<'db>(pub GreenId<'db>);
39422impl<'db> TypedSyntaxNode<'db> for TerminalEmpty<'db> {
39423 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TerminalEmpty);
39424 type StablePtr = TerminalEmptyPtr<'db>;
39425 type Green = TerminalEmptyGreen<'db>;
39426 fn missing(db: &'db dyn Database) -> Self::Green {
39427 TerminalEmptyGreen(
39428 GreenNode {
39429 kind: SyntaxKind::TerminalEmpty,
39430 details: GreenNodeDetails::Node {
39431 children: [
39432 Trivia::missing(db).0,
39433 TokenEmpty::missing(db).0,
39434 Trivia::missing(db).0,
39435 ]
39436 .into(),
39437 width: TextWidth::default(),
39438 },
39439 }
39440 .intern(db),
39441 )
39442 }
39443 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39444 let kind = node.kind(db);
39445 assert_eq!(
39446 kind,
39447 SyntaxKind::TerminalEmpty,
39448 "Unexpected SyntaxKind {:?}. Expected {:?}.",
39449 kind,
39450 SyntaxKind::TerminalEmpty
39451 );
39452 Self { node }
39453 }
39454 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39455 let kind = node.kind(db);
39456 if kind == SyntaxKind::TerminalEmpty {
39457 Some(Self::from_syntax_node(db, node))
39458 } else {
39459 None
39460 }
39461 }
39462 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39463 self.node
39464 }
39465 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39466 TerminalEmptyPtr(self.node.stable_ptr(db))
39467 }
39468}
39469#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39470pub struct TokenSingleLineComment<'db> {
39471 node: SyntaxNode<'db>,
39472}
39473impl<'db> Token<'db> for TokenSingleLineComment<'db> {
39474 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39475 TokenSingleLineCommentGreen(
39476 GreenNode {
39477 kind: SyntaxKind::TokenSingleLineComment,
39478 details: GreenNodeDetails::Token(text),
39479 }
39480 .intern(db),
39481 )
39482 }
39483 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39484 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39485 }
39486}
39487#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39488pub struct TokenSingleLineCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39489impl<'db> TypedStablePtr<'db> for TokenSingleLineCommentPtr<'db> {
39490 type SyntaxNode = TokenSingleLineComment<'db>;
39491 fn untyped(self) -> SyntaxStablePtrId<'db> {
39492 self.0
39493 }
39494 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineComment<'db> {
39495 TokenSingleLineComment::from_syntax_node(db, self.0.lookup(db))
39496 }
39497}
39498impl<'db> From<TokenSingleLineCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39499 fn from(ptr: TokenSingleLineCommentPtr<'db>) -> Self {
39500 ptr.untyped()
39501 }
39502}
39503#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39504pub struct TokenSingleLineCommentGreen<'db>(pub GreenId<'db>);
39505impl<'db> TokenSingleLineCommentGreen<'db> {
39506 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39507 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39508 }
39509}
39510impl<'db> TypedSyntaxNode<'db> for TokenSingleLineComment<'db> {
39511 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineComment);
39512 type StablePtr = TokenSingleLineCommentPtr<'db>;
39513 type Green = TokenSingleLineCommentGreen<'db>;
39514 fn missing(db: &'db dyn Database) -> Self::Green {
39515 TokenSingleLineCommentGreen(
39516 GreenNode {
39517 kind: SyntaxKind::TokenMissing,
39518 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39519 }
39520 .intern(db),
39521 )
39522 }
39523 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39524 match node.green_node(db).details {
39525 GreenNodeDetails::Token(_) => Self { node },
39526 GreenNodeDetails::Node { .. } => panic!(
39527 "Expected a token {:?}, not an internal node",
39528 SyntaxKind::TokenSingleLineComment
39529 ),
39530 }
39531 }
39532 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39533 match node.green_node(db).details {
39534 GreenNodeDetails::Token(_) => Some(Self { node }),
39535 GreenNodeDetails::Node { .. } => None,
39536 }
39537 }
39538 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39539 self.node
39540 }
39541 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39542 TokenSingleLineCommentPtr(self.node.stable_ptr(db))
39543 }
39544}
39545#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39546pub struct TokenSingleLineInnerComment<'db> {
39547 node: SyntaxNode<'db>,
39548}
39549impl<'db> Token<'db> for TokenSingleLineInnerComment<'db> {
39550 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39551 TokenSingleLineInnerCommentGreen(
39552 GreenNode {
39553 kind: SyntaxKind::TokenSingleLineInnerComment,
39554 details: GreenNodeDetails::Token(text),
39555 }
39556 .intern(db),
39557 )
39558 }
39559 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39560 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39561 }
39562}
39563#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39564pub struct TokenSingleLineInnerCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39565impl<'db> TypedStablePtr<'db> for TokenSingleLineInnerCommentPtr<'db> {
39566 type SyntaxNode = TokenSingleLineInnerComment<'db>;
39567 fn untyped(self) -> SyntaxStablePtrId<'db> {
39568 self.0
39569 }
39570 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineInnerComment<'db> {
39571 TokenSingleLineInnerComment::from_syntax_node(db, self.0.lookup(db))
39572 }
39573}
39574impl<'db> From<TokenSingleLineInnerCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39575 fn from(ptr: TokenSingleLineInnerCommentPtr<'db>) -> Self {
39576 ptr.untyped()
39577 }
39578}
39579#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39580pub struct TokenSingleLineInnerCommentGreen<'db>(pub GreenId<'db>);
39581impl<'db> TokenSingleLineInnerCommentGreen<'db> {
39582 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39583 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39584 }
39585}
39586impl<'db> TypedSyntaxNode<'db> for TokenSingleLineInnerComment<'db> {
39587 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineInnerComment);
39588 type StablePtr = TokenSingleLineInnerCommentPtr<'db>;
39589 type Green = TokenSingleLineInnerCommentGreen<'db>;
39590 fn missing(db: &'db dyn Database) -> Self::Green {
39591 TokenSingleLineInnerCommentGreen(
39592 GreenNode {
39593 kind: SyntaxKind::TokenMissing,
39594 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39595 }
39596 .intern(db),
39597 )
39598 }
39599 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39600 match node.green_node(db).details {
39601 GreenNodeDetails::Token(_) => Self { node },
39602 GreenNodeDetails::Node { .. } => panic!(
39603 "Expected a token {:?}, not an internal node",
39604 SyntaxKind::TokenSingleLineInnerComment
39605 ),
39606 }
39607 }
39608 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39609 match node.green_node(db).details {
39610 GreenNodeDetails::Token(_) => Some(Self { node }),
39611 GreenNodeDetails::Node { .. } => None,
39612 }
39613 }
39614 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39615 self.node
39616 }
39617 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39618 TokenSingleLineInnerCommentPtr(self.node.stable_ptr(db))
39619 }
39620}
39621#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39622pub struct TokenSingleLineDocComment<'db> {
39623 node: SyntaxNode<'db>,
39624}
39625impl<'db> Token<'db> for TokenSingleLineDocComment<'db> {
39626 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39627 TokenSingleLineDocCommentGreen(
39628 GreenNode {
39629 kind: SyntaxKind::TokenSingleLineDocComment,
39630 details: GreenNodeDetails::Token(text),
39631 }
39632 .intern(db),
39633 )
39634 }
39635 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39636 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39637 }
39638}
39639#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39640pub struct TokenSingleLineDocCommentPtr<'db>(pub SyntaxStablePtrId<'db>);
39641impl<'db> TypedStablePtr<'db> for TokenSingleLineDocCommentPtr<'db> {
39642 type SyntaxNode = TokenSingleLineDocComment<'db>;
39643 fn untyped(self) -> SyntaxStablePtrId<'db> {
39644 self.0
39645 }
39646 fn lookup(&self, db: &'db dyn Database) -> TokenSingleLineDocComment<'db> {
39647 TokenSingleLineDocComment::from_syntax_node(db, self.0.lookup(db))
39648 }
39649}
39650impl<'db> From<TokenSingleLineDocCommentPtr<'db>> for SyntaxStablePtrId<'db> {
39651 fn from(ptr: TokenSingleLineDocCommentPtr<'db>) -> Self {
39652 ptr.untyped()
39653 }
39654}
39655#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39656pub struct TokenSingleLineDocCommentGreen<'db>(pub GreenId<'db>);
39657impl<'db> TokenSingleLineDocCommentGreen<'db> {
39658 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39659 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39660 }
39661}
39662impl<'db> TypedSyntaxNode<'db> for TokenSingleLineDocComment<'db> {
39663 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSingleLineDocComment);
39664 type StablePtr = TokenSingleLineDocCommentPtr<'db>;
39665 type Green = TokenSingleLineDocCommentGreen<'db>;
39666 fn missing(db: &'db dyn Database) -> Self::Green {
39667 TokenSingleLineDocCommentGreen(
39668 GreenNode {
39669 kind: SyntaxKind::TokenMissing,
39670 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39671 }
39672 .intern(db),
39673 )
39674 }
39675 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39676 match node.green_node(db).details {
39677 GreenNodeDetails::Token(_) => Self { node },
39678 GreenNodeDetails::Node { .. } => panic!(
39679 "Expected a token {:?}, not an internal node",
39680 SyntaxKind::TokenSingleLineDocComment
39681 ),
39682 }
39683 }
39684 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39685 match node.green_node(db).details {
39686 GreenNodeDetails::Token(_) => Some(Self { node }),
39687 GreenNodeDetails::Node { .. } => None,
39688 }
39689 }
39690 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39691 self.node
39692 }
39693 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39694 TokenSingleLineDocCommentPtr(self.node.stable_ptr(db))
39695 }
39696}
39697#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39698pub struct TokenWhitespace<'db> {
39699 node: SyntaxNode<'db>,
39700}
39701impl<'db> Token<'db> for TokenWhitespace<'db> {
39702 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39703 TokenWhitespaceGreen(
39704 GreenNode { kind: SyntaxKind::TokenWhitespace, details: GreenNodeDetails::Token(text) }
39705 .intern(db),
39706 )
39707 }
39708 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39709 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39710 }
39711}
39712#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39713pub struct TokenWhitespacePtr<'db>(pub SyntaxStablePtrId<'db>);
39714impl<'db> TypedStablePtr<'db> for TokenWhitespacePtr<'db> {
39715 type SyntaxNode = TokenWhitespace<'db>;
39716 fn untyped(self) -> SyntaxStablePtrId<'db> {
39717 self.0
39718 }
39719 fn lookup(&self, db: &'db dyn Database) -> TokenWhitespace<'db> {
39720 TokenWhitespace::from_syntax_node(db, self.0.lookup(db))
39721 }
39722}
39723impl<'db> From<TokenWhitespacePtr<'db>> for SyntaxStablePtrId<'db> {
39724 fn from(ptr: TokenWhitespacePtr<'db>) -> Self {
39725 ptr.untyped()
39726 }
39727}
39728#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39729pub struct TokenWhitespaceGreen<'db>(pub GreenId<'db>);
39730impl<'db> TokenWhitespaceGreen<'db> {
39731 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39732 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39733 }
39734}
39735impl<'db> TypedSyntaxNode<'db> for TokenWhitespace<'db> {
39736 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenWhitespace);
39737 type StablePtr = TokenWhitespacePtr<'db>;
39738 type Green = TokenWhitespaceGreen<'db>;
39739 fn missing(db: &'db dyn Database) -> Self::Green {
39740 TokenWhitespaceGreen(
39741 GreenNode {
39742 kind: SyntaxKind::TokenMissing,
39743 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39744 }
39745 .intern(db),
39746 )
39747 }
39748 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39749 match node.green_node(db).details {
39750 GreenNodeDetails::Token(_) => Self { node },
39751 GreenNodeDetails::Node { .. } => {
39752 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenWhitespace)
39753 }
39754 }
39755 }
39756 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39757 match node.green_node(db).details {
39758 GreenNodeDetails::Token(_) => Some(Self { node }),
39759 GreenNodeDetails::Node { .. } => None,
39760 }
39761 }
39762 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39763 self.node
39764 }
39765 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39766 TokenWhitespacePtr(self.node.stable_ptr(db))
39767 }
39768}
39769#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39770pub struct TokenNewline<'db> {
39771 node: SyntaxNode<'db>,
39772}
39773impl<'db> Token<'db> for TokenNewline<'db> {
39774 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39775 TokenNewlineGreen(
39776 GreenNode { kind: SyntaxKind::TokenNewline, details: GreenNodeDetails::Token(text) }
39777 .intern(db),
39778 )
39779 }
39780 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39781 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39782 }
39783}
39784#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39785pub struct TokenNewlinePtr<'db>(pub SyntaxStablePtrId<'db>);
39786impl<'db> TypedStablePtr<'db> for TokenNewlinePtr<'db> {
39787 type SyntaxNode = TokenNewline<'db>;
39788 fn untyped(self) -> SyntaxStablePtrId<'db> {
39789 self.0
39790 }
39791 fn lookup(&self, db: &'db dyn Database) -> TokenNewline<'db> {
39792 TokenNewline::from_syntax_node(db, self.0.lookup(db))
39793 }
39794}
39795impl<'db> From<TokenNewlinePtr<'db>> for SyntaxStablePtrId<'db> {
39796 fn from(ptr: TokenNewlinePtr<'db>) -> Self {
39797 ptr.untyped()
39798 }
39799}
39800#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39801pub struct TokenNewlineGreen<'db>(pub GreenId<'db>);
39802impl<'db> TokenNewlineGreen<'db> {
39803 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39804 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39805 }
39806}
39807impl<'db> TypedSyntaxNode<'db> for TokenNewline<'db> {
39808 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenNewline);
39809 type StablePtr = TokenNewlinePtr<'db>;
39810 type Green = TokenNewlineGreen<'db>;
39811 fn missing(db: &'db dyn Database) -> Self::Green {
39812 TokenNewlineGreen(
39813 GreenNode {
39814 kind: SyntaxKind::TokenMissing,
39815 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39816 }
39817 .intern(db),
39818 )
39819 }
39820 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39821 match node.green_node(db).details {
39822 GreenNodeDetails::Token(_) => Self { node },
39823 GreenNodeDetails::Node { .. } => {
39824 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenNewline)
39825 }
39826 }
39827 }
39828 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39829 match node.green_node(db).details {
39830 GreenNodeDetails::Token(_) => Some(Self { node }),
39831 GreenNodeDetails::Node { .. } => None,
39832 }
39833 }
39834 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39835 self.node
39836 }
39837 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39838 TokenNewlinePtr(self.node.stable_ptr(db))
39839 }
39840}
39841#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39842pub struct TokenMissing<'db> {
39843 node: SyntaxNode<'db>,
39844}
39845impl<'db> Token<'db> for TokenMissing<'db> {
39846 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39847 TokenMissingGreen(
39848 GreenNode { kind: SyntaxKind::TokenMissing, details: GreenNodeDetails::Token(text) }
39849 .intern(db),
39850 )
39851 }
39852 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39853 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39854 }
39855}
39856#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39857pub struct TokenMissingPtr<'db>(pub SyntaxStablePtrId<'db>);
39858impl<'db> TypedStablePtr<'db> for TokenMissingPtr<'db> {
39859 type SyntaxNode = TokenMissing<'db>;
39860 fn untyped(self) -> SyntaxStablePtrId<'db> {
39861 self.0
39862 }
39863 fn lookup(&self, db: &'db dyn Database) -> TokenMissing<'db> {
39864 TokenMissing::from_syntax_node(db, self.0.lookup(db))
39865 }
39866}
39867impl<'db> From<TokenMissingPtr<'db>> for SyntaxStablePtrId<'db> {
39868 fn from(ptr: TokenMissingPtr<'db>) -> Self {
39869 ptr.untyped()
39870 }
39871}
39872#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39873pub struct TokenMissingGreen<'db>(pub GreenId<'db>);
39874impl<'db> TokenMissingGreen<'db> {
39875 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39876 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39877 }
39878}
39879impl<'db> TypedSyntaxNode<'db> for TokenMissing<'db> {
39880 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenMissing);
39881 type StablePtr = TokenMissingPtr<'db>;
39882 type Green = TokenMissingGreen<'db>;
39883 fn missing(db: &'db dyn Database) -> Self::Green {
39884 TokenMissingGreen(
39885 GreenNode {
39886 kind: SyntaxKind::TokenMissing,
39887 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39888 }
39889 .intern(db),
39890 )
39891 }
39892 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39893 match node.green_node(db).details {
39894 GreenNodeDetails::Token(_) => Self { node },
39895 GreenNodeDetails::Node { .. } => {
39896 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenMissing)
39897 }
39898 }
39899 }
39900 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39901 match node.green_node(db).details {
39902 GreenNodeDetails::Token(_) => Some(Self { node }),
39903 GreenNodeDetails::Node { .. } => None,
39904 }
39905 }
39906 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39907 self.node
39908 }
39909 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39910 TokenMissingPtr(self.node.stable_ptr(db))
39911 }
39912}
39913#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39914pub struct TokenSkipped<'db> {
39915 node: SyntaxNode<'db>,
39916}
39917impl<'db> Token<'db> for TokenSkipped<'db> {
39918 fn new_green(db: &'db dyn Database, text: SmolStrId<'db>) -> Self::Green {
39919 TokenSkippedGreen(
39920 GreenNode { kind: SyntaxKind::TokenSkipped, details: GreenNodeDetails::Token(text) }
39921 .intern(db),
39922 )
39923 }
39924 fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39925 *extract_matches!(&self.node.green_node(db).details, GreenNodeDetails::Token)
39926 }
39927}
39928#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39929pub struct TokenSkippedPtr<'db>(pub SyntaxStablePtrId<'db>);
39930impl<'db> TypedStablePtr<'db> for TokenSkippedPtr<'db> {
39931 type SyntaxNode = TokenSkipped<'db>;
39932 fn untyped(self) -> SyntaxStablePtrId<'db> {
39933 self.0
39934 }
39935 fn lookup(&self, db: &'db dyn Database) -> TokenSkipped<'db> {
39936 TokenSkipped::from_syntax_node(db, self.0.lookup(db))
39937 }
39938}
39939impl<'db> From<TokenSkippedPtr<'db>> for SyntaxStablePtrId<'db> {
39940 fn from(ptr: TokenSkippedPtr<'db>) -> Self {
39941 ptr.untyped()
39942 }
39943}
39944#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
39945pub struct TokenSkippedGreen<'db>(pub GreenId<'db>);
39946impl<'db> TokenSkippedGreen<'db> {
39947 pub fn text(&self, db: &'db dyn Database) -> SmolStrId<'db> {
39948 *extract_matches!(&self.0.long(db).details, GreenNodeDetails::Token)
39949 }
39950}
39951impl<'db> TypedSyntaxNode<'db> for TokenSkipped<'db> {
39952 const OPTIONAL_KIND: Option<SyntaxKind> = Some(SyntaxKind::TokenSkipped);
39953 type StablePtr = TokenSkippedPtr<'db>;
39954 type Green = TokenSkippedGreen<'db>;
39955 fn missing(db: &'db dyn Database) -> Self::Green {
39956 TokenSkippedGreen(
39957 GreenNode {
39958 kind: SyntaxKind::TokenMissing,
39959 details: GreenNodeDetails::Token(SmolStrId::from(db, "")),
39960 }
39961 .intern(db),
39962 )
39963 }
39964 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
39965 match node.green_node(db).details {
39966 GreenNodeDetails::Token(_) => Self { node },
39967 GreenNodeDetails::Node { .. } => {
39968 panic!("Expected a token {:?}, not an internal node", SyntaxKind::TokenSkipped)
39969 }
39970 }
39971 }
39972 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
39973 match node.green_node(db).details {
39974 GreenNodeDetails::Token(_) => Some(Self { node }),
39975 GreenNodeDetails::Node { .. } => None,
39976 }
39977 }
39978 fn as_syntax_node(&self) -> SyntaxNode<'db> {
39979 self.node
39980 }
39981 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
39982 TokenSkippedPtr(self.node.stable_ptr(db))
39983 }
39984}
39985#[derive(Clone, Debug, Eq, Hash, PartialEq, salsa::Update)]
39986pub enum TokenNode<'db> {
39987 TerminalIdentifier(TerminalIdentifier<'db>),
39988 TerminalLiteralNumber(TerminalLiteralNumber<'db>),
39989 TerminalShortString(TerminalShortString<'db>),
39990 TerminalString(TerminalString<'db>),
39991 TerminalAs(TerminalAs<'db>),
39992 TerminalConst(TerminalConst<'db>),
39993 TerminalElse(TerminalElse<'db>),
39994 TerminalEnum(TerminalEnum<'db>),
39995 TerminalExtern(TerminalExtern<'db>),
39996 TerminalFalse(TerminalFalse<'db>),
39997 TerminalFunction(TerminalFunction<'db>),
39998 TerminalIf(TerminalIf<'db>),
39999 TerminalWhile(TerminalWhile<'db>),
40000 TerminalFor(TerminalFor<'db>),
40001 TerminalLoop(TerminalLoop<'db>),
40002 TerminalImpl(TerminalImpl<'db>),
40003 TerminalImplicits(TerminalImplicits<'db>),
40004 TerminalLet(TerminalLet<'db>),
40005 TerminalMacro(TerminalMacro<'db>),
40006 TerminalMatch(TerminalMatch<'db>),
40007 TerminalModule(TerminalModule<'db>),
40008 TerminalMut(TerminalMut<'db>),
40009 TerminalNoPanic(TerminalNoPanic<'db>),
40010 TerminalOf(TerminalOf<'db>),
40011 TerminalRef(TerminalRef<'db>),
40012 TerminalContinue(TerminalContinue<'db>),
40013 TerminalReturn(TerminalReturn<'db>),
40014 TerminalBreak(TerminalBreak<'db>),
40015 TerminalStruct(TerminalStruct<'db>),
40016 TerminalTrait(TerminalTrait<'db>),
40017 TerminalTrue(TerminalTrue<'db>),
40018 TerminalType(TerminalType<'db>),
40019 TerminalUse(TerminalUse<'db>),
40020 TerminalPub(TerminalPub<'db>),
40021 TerminalAnd(TerminalAnd<'db>),
40022 TerminalAndAnd(TerminalAndAnd<'db>),
40023 TerminalArrow(TerminalArrow<'db>),
40024 TerminalAt(TerminalAt<'db>),
40025 TerminalBadCharacters(TerminalBadCharacters<'db>),
40026 TerminalColon(TerminalColon<'db>),
40027 TerminalColonColon(TerminalColonColon<'db>),
40028 TerminalComma(TerminalComma<'db>),
40029 TerminalDiv(TerminalDiv<'db>),
40030 TerminalDivEq(TerminalDivEq<'db>),
40031 TerminalDollar(TerminalDollar<'db>),
40032 TerminalDot(TerminalDot<'db>),
40033 TerminalDotDot(TerminalDotDot<'db>),
40034 TerminalDotDotEq(TerminalDotDotEq<'db>),
40035 TerminalEndOfFile(TerminalEndOfFile<'db>),
40036 TerminalEq(TerminalEq<'db>),
40037 TerminalEqEq(TerminalEqEq<'db>),
40038 TerminalGE(TerminalGE<'db>),
40039 TerminalGT(TerminalGT<'db>),
40040 TerminalHash(TerminalHash<'db>),
40041 TerminalLBrace(TerminalLBrace<'db>),
40042 TerminalLBrack(TerminalLBrack<'db>),
40043 TerminalLE(TerminalLE<'db>),
40044 TerminalLParen(TerminalLParen<'db>),
40045 TerminalLT(TerminalLT<'db>),
40046 TerminalMatchArrow(TerminalMatchArrow<'db>),
40047 TerminalMinus(TerminalMinus<'db>),
40048 TerminalMinusEq(TerminalMinusEq<'db>),
40049 TerminalMod(TerminalMod<'db>),
40050 TerminalModEq(TerminalModEq<'db>),
40051 TerminalMul(TerminalMul<'db>),
40052 TerminalMulEq(TerminalMulEq<'db>),
40053 TerminalNeq(TerminalNeq<'db>),
40054 TerminalNot(TerminalNot<'db>),
40055 TerminalBitNot(TerminalBitNot<'db>),
40056 TerminalOr(TerminalOr<'db>),
40057 TerminalOrOr(TerminalOrOr<'db>),
40058 TerminalPlus(TerminalPlus<'db>),
40059 TerminalPlusEq(TerminalPlusEq<'db>),
40060 TerminalQuestionMark(TerminalQuestionMark<'db>),
40061 TerminalRBrace(TerminalRBrace<'db>),
40062 TerminalRBrack(TerminalRBrack<'db>),
40063 TerminalRParen(TerminalRParen<'db>),
40064 TerminalSemicolon(TerminalSemicolon<'db>),
40065 TerminalUnderscore(TerminalUnderscore<'db>),
40066 TerminalXor(TerminalXor<'db>),
40067 TerminalEmpty(TerminalEmpty<'db>),
40068}
40069#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40070pub struct TokenNodePtr<'db>(pub SyntaxStablePtrId<'db>);
40071impl<'db> TypedStablePtr<'db> for TokenNodePtr<'db> {
40072 type SyntaxNode = TokenNode<'db>;
40073 fn untyped(self) -> SyntaxStablePtrId<'db> {
40074 self.0
40075 }
40076 fn lookup(&self, db: &'db dyn Database) -> Self::SyntaxNode {
40077 TokenNode::from_syntax_node(db, self.0.lookup(db))
40078 }
40079}
40080impl<'db> From<TokenNodePtr<'db>> for SyntaxStablePtrId<'db> {
40081 fn from(ptr: TokenNodePtr<'db>) -> Self {
40082 ptr.untyped()
40083 }
40084}
40085impl<'db> From<TerminalIdentifierPtr<'db>> for TokenNodePtr<'db> {
40086 fn from(value: TerminalIdentifierPtr<'db>) -> Self {
40087 Self(value.0)
40088 }
40089}
40090impl<'db> From<TerminalLiteralNumberPtr<'db>> for TokenNodePtr<'db> {
40091 fn from(value: TerminalLiteralNumberPtr<'db>) -> Self {
40092 Self(value.0)
40093 }
40094}
40095impl<'db> From<TerminalShortStringPtr<'db>> for TokenNodePtr<'db> {
40096 fn from(value: TerminalShortStringPtr<'db>) -> Self {
40097 Self(value.0)
40098 }
40099}
40100impl<'db> From<TerminalStringPtr<'db>> for TokenNodePtr<'db> {
40101 fn from(value: TerminalStringPtr<'db>) -> Self {
40102 Self(value.0)
40103 }
40104}
40105impl<'db> From<TerminalAsPtr<'db>> for TokenNodePtr<'db> {
40106 fn from(value: TerminalAsPtr<'db>) -> Self {
40107 Self(value.0)
40108 }
40109}
40110impl<'db> From<TerminalConstPtr<'db>> for TokenNodePtr<'db> {
40111 fn from(value: TerminalConstPtr<'db>) -> Self {
40112 Self(value.0)
40113 }
40114}
40115impl<'db> From<TerminalElsePtr<'db>> for TokenNodePtr<'db> {
40116 fn from(value: TerminalElsePtr<'db>) -> Self {
40117 Self(value.0)
40118 }
40119}
40120impl<'db> From<TerminalEnumPtr<'db>> for TokenNodePtr<'db> {
40121 fn from(value: TerminalEnumPtr<'db>) -> Self {
40122 Self(value.0)
40123 }
40124}
40125impl<'db> From<TerminalExternPtr<'db>> for TokenNodePtr<'db> {
40126 fn from(value: TerminalExternPtr<'db>) -> Self {
40127 Self(value.0)
40128 }
40129}
40130impl<'db> From<TerminalFalsePtr<'db>> for TokenNodePtr<'db> {
40131 fn from(value: TerminalFalsePtr<'db>) -> Self {
40132 Self(value.0)
40133 }
40134}
40135impl<'db> From<TerminalFunctionPtr<'db>> for TokenNodePtr<'db> {
40136 fn from(value: TerminalFunctionPtr<'db>) -> Self {
40137 Self(value.0)
40138 }
40139}
40140impl<'db> From<TerminalIfPtr<'db>> for TokenNodePtr<'db> {
40141 fn from(value: TerminalIfPtr<'db>) -> Self {
40142 Self(value.0)
40143 }
40144}
40145impl<'db> From<TerminalWhilePtr<'db>> for TokenNodePtr<'db> {
40146 fn from(value: TerminalWhilePtr<'db>) -> Self {
40147 Self(value.0)
40148 }
40149}
40150impl<'db> From<TerminalForPtr<'db>> for TokenNodePtr<'db> {
40151 fn from(value: TerminalForPtr<'db>) -> Self {
40152 Self(value.0)
40153 }
40154}
40155impl<'db> From<TerminalLoopPtr<'db>> for TokenNodePtr<'db> {
40156 fn from(value: TerminalLoopPtr<'db>) -> Self {
40157 Self(value.0)
40158 }
40159}
40160impl<'db> From<TerminalImplPtr<'db>> for TokenNodePtr<'db> {
40161 fn from(value: TerminalImplPtr<'db>) -> Self {
40162 Self(value.0)
40163 }
40164}
40165impl<'db> From<TerminalImplicitsPtr<'db>> for TokenNodePtr<'db> {
40166 fn from(value: TerminalImplicitsPtr<'db>) -> Self {
40167 Self(value.0)
40168 }
40169}
40170impl<'db> From<TerminalLetPtr<'db>> for TokenNodePtr<'db> {
40171 fn from(value: TerminalLetPtr<'db>) -> Self {
40172 Self(value.0)
40173 }
40174}
40175impl<'db> From<TerminalMacroPtr<'db>> for TokenNodePtr<'db> {
40176 fn from(value: TerminalMacroPtr<'db>) -> Self {
40177 Self(value.0)
40178 }
40179}
40180impl<'db> From<TerminalMatchPtr<'db>> for TokenNodePtr<'db> {
40181 fn from(value: TerminalMatchPtr<'db>) -> Self {
40182 Self(value.0)
40183 }
40184}
40185impl<'db> From<TerminalModulePtr<'db>> for TokenNodePtr<'db> {
40186 fn from(value: TerminalModulePtr<'db>) -> Self {
40187 Self(value.0)
40188 }
40189}
40190impl<'db> From<TerminalMutPtr<'db>> for TokenNodePtr<'db> {
40191 fn from(value: TerminalMutPtr<'db>) -> Self {
40192 Self(value.0)
40193 }
40194}
40195impl<'db> From<TerminalNoPanicPtr<'db>> for TokenNodePtr<'db> {
40196 fn from(value: TerminalNoPanicPtr<'db>) -> Self {
40197 Self(value.0)
40198 }
40199}
40200impl<'db> From<TerminalOfPtr<'db>> for TokenNodePtr<'db> {
40201 fn from(value: TerminalOfPtr<'db>) -> Self {
40202 Self(value.0)
40203 }
40204}
40205impl<'db> From<TerminalRefPtr<'db>> for TokenNodePtr<'db> {
40206 fn from(value: TerminalRefPtr<'db>) -> Self {
40207 Self(value.0)
40208 }
40209}
40210impl<'db> From<TerminalContinuePtr<'db>> for TokenNodePtr<'db> {
40211 fn from(value: TerminalContinuePtr<'db>) -> Self {
40212 Self(value.0)
40213 }
40214}
40215impl<'db> From<TerminalReturnPtr<'db>> for TokenNodePtr<'db> {
40216 fn from(value: TerminalReturnPtr<'db>) -> Self {
40217 Self(value.0)
40218 }
40219}
40220impl<'db> From<TerminalBreakPtr<'db>> for TokenNodePtr<'db> {
40221 fn from(value: TerminalBreakPtr<'db>) -> Self {
40222 Self(value.0)
40223 }
40224}
40225impl<'db> From<TerminalStructPtr<'db>> for TokenNodePtr<'db> {
40226 fn from(value: TerminalStructPtr<'db>) -> Self {
40227 Self(value.0)
40228 }
40229}
40230impl<'db> From<TerminalTraitPtr<'db>> for TokenNodePtr<'db> {
40231 fn from(value: TerminalTraitPtr<'db>) -> Self {
40232 Self(value.0)
40233 }
40234}
40235impl<'db> From<TerminalTruePtr<'db>> for TokenNodePtr<'db> {
40236 fn from(value: TerminalTruePtr<'db>) -> Self {
40237 Self(value.0)
40238 }
40239}
40240impl<'db> From<TerminalTypePtr<'db>> for TokenNodePtr<'db> {
40241 fn from(value: TerminalTypePtr<'db>) -> Self {
40242 Self(value.0)
40243 }
40244}
40245impl<'db> From<TerminalUsePtr<'db>> for TokenNodePtr<'db> {
40246 fn from(value: TerminalUsePtr<'db>) -> Self {
40247 Self(value.0)
40248 }
40249}
40250impl<'db> From<TerminalPubPtr<'db>> for TokenNodePtr<'db> {
40251 fn from(value: TerminalPubPtr<'db>) -> Self {
40252 Self(value.0)
40253 }
40254}
40255impl<'db> From<TerminalAndPtr<'db>> for TokenNodePtr<'db> {
40256 fn from(value: TerminalAndPtr<'db>) -> Self {
40257 Self(value.0)
40258 }
40259}
40260impl<'db> From<TerminalAndAndPtr<'db>> for TokenNodePtr<'db> {
40261 fn from(value: TerminalAndAndPtr<'db>) -> Self {
40262 Self(value.0)
40263 }
40264}
40265impl<'db> From<TerminalArrowPtr<'db>> for TokenNodePtr<'db> {
40266 fn from(value: TerminalArrowPtr<'db>) -> Self {
40267 Self(value.0)
40268 }
40269}
40270impl<'db> From<TerminalAtPtr<'db>> for TokenNodePtr<'db> {
40271 fn from(value: TerminalAtPtr<'db>) -> Self {
40272 Self(value.0)
40273 }
40274}
40275impl<'db> From<TerminalBadCharactersPtr<'db>> for TokenNodePtr<'db> {
40276 fn from(value: TerminalBadCharactersPtr<'db>) -> Self {
40277 Self(value.0)
40278 }
40279}
40280impl<'db> From<TerminalColonPtr<'db>> for TokenNodePtr<'db> {
40281 fn from(value: TerminalColonPtr<'db>) -> Self {
40282 Self(value.0)
40283 }
40284}
40285impl<'db> From<TerminalColonColonPtr<'db>> for TokenNodePtr<'db> {
40286 fn from(value: TerminalColonColonPtr<'db>) -> Self {
40287 Self(value.0)
40288 }
40289}
40290impl<'db> From<TerminalCommaPtr<'db>> for TokenNodePtr<'db> {
40291 fn from(value: TerminalCommaPtr<'db>) -> Self {
40292 Self(value.0)
40293 }
40294}
40295impl<'db> From<TerminalDivPtr<'db>> for TokenNodePtr<'db> {
40296 fn from(value: TerminalDivPtr<'db>) -> Self {
40297 Self(value.0)
40298 }
40299}
40300impl<'db> From<TerminalDivEqPtr<'db>> for TokenNodePtr<'db> {
40301 fn from(value: TerminalDivEqPtr<'db>) -> Self {
40302 Self(value.0)
40303 }
40304}
40305impl<'db> From<TerminalDollarPtr<'db>> for TokenNodePtr<'db> {
40306 fn from(value: TerminalDollarPtr<'db>) -> Self {
40307 Self(value.0)
40308 }
40309}
40310impl<'db> From<TerminalDotPtr<'db>> for TokenNodePtr<'db> {
40311 fn from(value: TerminalDotPtr<'db>) -> Self {
40312 Self(value.0)
40313 }
40314}
40315impl<'db> From<TerminalDotDotPtr<'db>> for TokenNodePtr<'db> {
40316 fn from(value: TerminalDotDotPtr<'db>) -> Self {
40317 Self(value.0)
40318 }
40319}
40320impl<'db> From<TerminalDotDotEqPtr<'db>> for TokenNodePtr<'db> {
40321 fn from(value: TerminalDotDotEqPtr<'db>) -> Self {
40322 Self(value.0)
40323 }
40324}
40325impl<'db> From<TerminalEndOfFilePtr<'db>> for TokenNodePtr<'db> {
40326 fn from(value: TerminalEndOfFilePtr<'db>) -> Self {
40327 Self(value.0)
40328 }
40329}
40330impl<'db> From<TerminalEqPtr<'db>> for TokenNodePtr<'db> {
40331 fn from(value: TerminalEqPtr<'db>) -> Self {
40332 Self(value.0)
40333 }
40334}
40335impl<'db> From<TerminalEqEqPtr<'db>> for TokenNodePtr<'db> {
40336 fn from(value: TerminalEqEqPtr<'db>) -> Self {
40337 Self(value.0)
40338 }
40339}
40340impl<'db> From<TerminalGEPtr<'db>> for TokenNodePtr<'db> {
40341 fn from(value: TerminalGEPtr<'db>) -> Self {
40342 Self(value.0)
40343 }
40344}
40345impl<'db> From<TerminalGTPtr<'db>> for TokenNodePtr<'db> {
40346 fn from(value: TerminalGTPtr<'db>) -> Self {
40347 Self(value.0)
40348 }
40349}
40350impl<'db> From<TerminalHashPtr<'db>> for TokenNodePtr<'db> {
40351 fn from(value: TerminalHashPtr<'db>) -> Self {
40352 Self(value.0)
40353 }
40354}
40355impl<'db> From<TerminalLBracePtr<'db>> for TokenNodePtr<'db> {
40356 fn from(value: TerminalLBracePtr<'db>) -> Self {
40357 Self(value.0)
40358 }
40359}
40360impl<'db> From<TerminalLBrackPtr<'db>> for TokenNodePtr<'db> {
40361 fn from(value: TerminalLBrackPtr<'db>) -> Self {
40362 Self(value.0)
40363 }
40364}
40365impl<'db> From<TerminalLEPtr<'db>> for TokenNodePtr<'db> {
40366 fn from(value: TerminalLEPtr<'db>) -> Self {
40367 Self(value.0)
40368 }
40369}
40370impl<'db> From<TerminalLParenPtr<'db>> for TokenNodePtr<'db> {
40371 fn from(value: TerminalLParenPtr<'db>) -> Self {
40372 Self(value.0)
40373 }
40374}
40375impl<'db> From<TerminalLTPtr<'db>> for TokenNodePtr<'db> {
40376 fn from(value: TerminalLTPtr<'db>) -> Self {
40377 Self(value.0)
40378 }
40379}
40380impl<'db> From<TerminalMatchArrowPtr<'db>> for TokenNodePtr<'db> {
40381 fn from(value: TerminalMatchArrowPtr<'db>) -> Self {
40382 Self(value.0)
40383 }
40384}
40385impl<'db> From<TerminalMinusPtr<'db>> for TokenNodePtr<'db> {
40386 fn from(value: TerminalMinusPtr<'db>) -> Self {
40387 Self(value.0)
40388 }
40389}
40390impl<'db> From<TerminalMinusEqPtr<'db>> for TokenNodePtr<'db> {
40391 fn from(value: TerminalMinusEqPtr<'db>) -> Self {
40392 Self(value.0)
40393 }
40394}
40395impl<'db> From<TerminalModPtr<'db>> for TokenNodePtr<'db> {
40396 fn from(value: TerminalModPtr<'db>) -> Self {
40397 Self(value.0)
40398 }
40399}
40400impl<'db> From<TerminalModEqPtr<'db>> for TokenNodePtr<'db> {
40401 fn from(value: TerminalModEqPtr<'db>) -> Self {
40402 Self(value.0)
40403 }
40404}
40405impl<'db> From<TerminalMulPtr<'db>> for TokenNodePtr<'db> {
40406 fn from(value: TerminalMulPtr<'db>) -> Self {
40407 Self(value.0)
40408 }
40409}
40410impl<'db> From<TerminalMulEqPtr<'db>> for TokenNodePtr<'db> {
40411 fn from(value: TerminalMulEqPtr<'db>) -> Self {
40412 Self(value.0)
40413 }
40414}
40415impl<'db> From<TerminalNeqPtr<'db>> for TokenNodePtr<'db> {
40416 fn from(value: TerminalNeqPtr<'db>) -> Self {
40417 Self(value.0)
40418 }
40419}
40420impl<'db> From<TerminalNotPtr<'db>> for TokenNodePtr<'db> {
40421 fn from(value: TerminalNotPtr<'db>) -> Self {
40422 Self(value.0)
40423 }
40424}
40425impl<'db> From<TerminalBitNotPtr<'db>> for TokenNodePtr<'db> {
40426 fn from(value: TerminalBitNotPtr<'db>) -> Self {
40427 Self(value.0)
40428 }
40429}
40430impl<'db> From<TerminalOrPtr<'db>> for TokenNodePtr<'db> {
40431 fn from(value: TerminalOrPtr<'db>) -> Self {
40432 Self(value.0)
40433 }
40434}
40435impl<'db> From<TerminalOrOrPtr<'db>> for TokenNodePtr<'db> {
40436 fn from(value: TerminalOrOrPtr<'db>) -> Self {
40437 Self(value.0)
40438 }
40439}
40440impl<'db> From<TerminalPlusPtr<'db>> for TokenNodePtr<'db> {
40441 fn from(value: TerminalPlusPtr<'db>) -> Self {
40442 Self(value.0)
40443 }
40444}
40445impl<'db> From<TerminalPlusEqPtr<'db>> for TokenNodePtr<'db> {
40446 fn from(value: TerminalPlusEqPtr<'db>) -> Self {
40447 Self(value.0)
40448 }
40449}
40450impl<'db> From<TerminalQuestionMarkPtr<'db>> for TokenNodePtr<'db> {
40451 fn from(value: TerminalQuestionMarkPtr<'db>) -> Self {
40452 Self(value.0)
40453 }
40454}
40455impl<'db> From<TerminalRBracePtr<'db>> for TokenNodePtr<'db> {
40456 fn from(value: TerminalRBracePtr<'db>) -> Self {
40457 Self(value.0)
40458 }
40459}
40460impl<'db> From<TerminalRBrackPtr<'db>> for TokenNodePtr<'db> {
40461 fn from(value: TerminalRBrackPtr<'db>) -> Self {
40462 Self(value.0)
40463 }
40464}
40465impl<'db> From<TerminalRParenPtr<'db>> for TokenNodePtr<'db> {
40466 fn from(value: TerminalRParenPtr<'db>) -> Self {
40467 Self(value.0)
40468 }
40469}
40470impl<'db> From<TerminalSemicolonPtr<'db>> for TokenNodePtr<'db> {
40471 fn from(value: TerminalSemicolonPtr<'db>) -> Self {
40472 Self(value.0)
40473 }
40474}
40475impl<'db> From<TerminalUnderscorePtr<'db>> for TokenNodePtr<'db> {
40476 fn from(value: TerminalUnderscorePtr<'db>) -> Self {
40477 Self(value.0)
40478 }
40479}
40480impl<'db> From<TerminalXorPtr<'db>> for TokenNodePtr<'db> {
40481 fn from(value: TerminalXorPtr<'db>) -> Self {
40482 Self(value.0)
40483 }
40484}
40485impl<'db> From<TerminalEmptyPtr<'db>> for TokenNodePtr<'db> {
40486 fn from(value: TerminalEmptyPtr<'db>) -> Self {
40487 Self(value.0)
40488 }
40489}
40490impl<'db> From<TerminalIdentifierGreen<'db>> for TokenNodeGreen<'db> {
40491 fn from(value: TerminalIdentifierGreen<'db>) -> Self {
40492 Self(value.0)
40493 }
40494}
40495impl<'db> From<TerminalLiteralNumberGreen<'db>> for TokenNodeGreen<'db> {
40496 fn from(value: TerminalLiteralNumberGreen<'db>) -> Self {
40497 Self(value.0)
40498 }
40499}
40500impl<'db> From<TerminalShortStringGreen<'db>> for TokenNodeGreen<'db> {
40501 fn from(value: TerminalShortStringGreen<'db>) -> Self {
40502 Self(value.0)
40503 }
40504}
40505impl<'db> From<TerminalStringGreen<'db>> for TokenNodeGreen<'db> {
40506 fn from(value: TerminalStringGreen<'db>) -> Self {
40507 Self(value.0)
40508 }
40509}
40510impl<'db> From<TerminalAsGreen<'db>> for TokenNodeGreen<'db> {
40511 fn from(value: TerminalAsGreen<'db>) -> Self {
40512 Self(value.0)
40513 }
40514}
40515impl<'db> From<TerminalConstGreen<'db>> for TokenNodeGreen<'db> {
40516 fn from(value: TerminalConstGreen<'db>) -> Self {
40517 Self(value.0)
40518 }
40519}
40520impl<'db> From<TerminalElseGreen<'db>> for TokenNodeGreen<'db> {
40521 fn from(value: TerminalElseGreen<'db>) -> Self {
40522 Self(value.0)
40523 }
40524}
40525impl<'db> From<TerminalEnumGreen<'db>> for TokenNodeGreen<'db> {
40526 fn from(value: TerminalEnumGreen<'db>) -> Self {
40527 Self(value.0)
40528 }
40529}
40530impl<'db> From<TerminalExternGreen<'db>> for TokenNodeGreen<'db> {
40531 fn from(value: TerminalExternGreen<'db>) -> Self {
40532 Self(value.0)
40533 }
40534}
40535impl<'db> From<TerminalFalseGreen<'db>> for TokenNodeGreen<'db> {
40536 fn from(value: TerminalFalseGreen<'db>) -> Self {
40537 Self(value.0)
40538 }
40539}
40540impl<'db> From<TerminalFunctionGreen<'db>> for TokenNodeGreen<'db> {
40541 fn from(value: TerminalFunctionGreen<'db>) -> Self {
40542 Self(value.0)
40543 }
40544}
40545impl<'db> From<TerminalIfGreen<'db>> for TokenNodeGreen<'db> {
40546 fn from(value: TerminalIfGreen<'db>) -> Self {
40547 Self(value.0)
40548 }
40549}
40550impl<'db> From<TerminalWhileGreen<'db>> for TokenNodeGreen<'db> {
40551 fn from(value: TerminalWhileGreen<'db>) -> Self {
40552 Self(value.0)
40553 }
40554}
40555impl<'db> From<TerminalForGreen<'db>> for TokenNodeGreen<'db> {
40556 fn from(value: TerminalForGreen<'db>) -> Self {
40557 Self(value.0)
40558 }
40559}
40560impl<'db> From<TerminalLoopGreen<'db>> for TokenNodeGreen<'db> {
40561 fn from(value: TerminalLoopGreen<'db>) -> Self {
40562 Self(value.0)
40563 }
40564}
40565impl<'db> From<TerminalImplGreen<'db>> for TokenNodeGreen<'db> {
40566 fn from(value: TerminalImplGreen<'db>) -> Self {
40567 Self(value.0)
40568 }
40569}
40570impl<'db> From<TerminalImplicitsGreen<'db>> for TokenNodeGreen<'db> {
40571 fn from(value: TerminalImplicitsGreen<'db>) -> Self {
40572 Self(value.0)
40573 }
40574}
40575impl<'db> From<TerminalLetGreen<'db>> for TokenNodeGreen<'db> {
40576 fn from(value: TerminalLetGreen<'db>) -> Self {
40577 Self(value.0)
40578 }
40579}
40580impl<'db> From<TerminalMacroGreen<'db>> for TokenNodeGreen<'db> {
40581 fn from(value: TerminalMacroGreen<'db>) -> Self {
40582 Self(value.0)
40583 }
40584}
40585impl<'db> From<TerminalMatchGreen<'db>> for TokenNodeGreen<'db> {
40586 fn from(value: TerminalMatchGreen<'db>) -> Self {
40587 Self(value.0)
40588 }
40589}
40590impl<'db> From<TerminalModuleGreen<'db>> for TokenNodeGreen<'db> {
40591 fn from(value: TerminalModuleGreen<'db>) -> Self {
40592 Self(value.0)
40593 }
40594}
40595impl<'db> From<TerminalMutGreen<'db>> for TokenNodeGreen<'db> {
40596 fn from(value: TerminalMutGreen<'db>) -> Self {
40597 Self(value.0)
40598 }
40599}
40600impl<'db> From<TerminalNoPanicGreen<'db>> for TokenNodeGreen<'db> {
40601 fn from(value: TerminalNoPanicGreen<'db>) -> Self {
40602 Self(value.0)
40603 }
40604}
40605impl<'db> From<TerminalOfGreen<'db>> for TokenNodeGreen<'db> {
40606 fn from(value: TerminalOfGreen<'db>) -> Self {
40607 Self(value.0)
40608 }
40609}
40610impl<'db> From<TerminalRefGreen<'db>> for TokenNodeGreen<'db> {
40611 fn from(value: TerminalRefGreen<'db>) -> Self {
40612 Self(value.0)
40613 }
40614}
40615impl<'db> From<TerminalContinueGreen<'db>> for TokenNodeGreen<'db> {
40616 fn from(value: TerminalContinueGreen<'db>) -> Self {
40617 Self(value.0)
40618 }
40619}
40620impl<'db> From<TerminalReturnGreen<'db>> for TokenNodeGreen<'db> {
40621 fn from(value: TerminalReturnGreen<'db>) -> Self {
40622 Self(value.0)
40623 }
40624}
40625impl<'db> From<TerminalBreakGreen<'db>> for TokenNodeGreen<'db> {
40626 fn from(value: TerminalBreakGreen<'db>) -> Self {
40627 Self(value.0)
40628 }
40629}
40630impl<'db> From<TerminalStructGreen<'db>> for TokenNodeGreen<'db> {
40631 fn from(value: TerminalStructGreen<'db>) -> Self {
40632 Self(value.0)
40633 }
40634}
40635impl<'db> From<TerminalTraitGreen<'db>> for TokenNodeGreen<'db> {
40636 fn from(value: TerminalTraitGreen<'db>) -> Self {
40637 Self(value.0)
40638 }
40639}
40640impl<'db> From<TerminalTrueGreen<'db>> for TokenNodeGreen<'db> {
40641 fn from(value: TerminalTrueGreen<'db>) -> Self {
40642 Self(value.0)
40643 }
40644}
40645impl<'db> From<TerminalTypeGreen<'db>> for TokenNodeGreen<'db> {
40646 fn from(value: TerminalTypeGreen<'db>) -> Self {
40647 Self(value.0)
40648 }
40649}
40650impl<'db> From<TerminalUseGreen<'db>> for TokenNodeGreen<'db> {
40651 fn from(value: TerminalUseGreen<'db>) -> Self {
40652 Self(value.0)
40653 }
40654}
40655impl<'db> From<TerminalPubGreen<'db>> for TokenNodeGreen<'db> {
40656 fn from(value: TerminalPubGreen<'db>) -> Self {
40657 Self(value.0)
40658 }
40659}
40660impl<'db> From<TerminalAndGreen<'db>> for TokenNodeGreen<'db> {
40661 fn from(value: TerminalAndGreen<'db>) -> Self {
40662 Self(value.0)
40663 }
40664}
40665impl<'db> From<TerminalAndAndGreen<'db>> for TokenNodeGreen<'db> {
40666 fn from(value: TerminalAndAndGreen<'db>) -> Self {
40667 Self(value.0)
40668 }
40669}
40670impl<'db> From<TerminalArrowGreen<'db>> for TokenNodeGreen<'db> {
40671 fn from(value: TerminalArrowGreen<'db>) -> Self {
40672 Self(value.0)
40673 }
40674}
40675impl<'db> From<TerminalAtGreen<'db>> for TokenNodeGreen<'db> {
40676 fn from(value: TerminalAtGreen<'db>) -> Self {
40677 Self(value.0)
40678 }
40679}
40680impl<'db> From<TerminalBadCharactersGreen<'db>> for TokenNodeGreen<'db> {
40681 fn from(value: TerminalBadCharactersGreen<'db>) -> Self {
40682 Self(value.0)
40683 }
40684}
40685impl<'db> From<TerminalColonGreen<'db>> for TokenNodeGreen<'db> {
40686 fn from(value: TerminalColonGreen<'db>) -> Self {
40687 Self(value.0)
40688 }
40689}
40690impl<'db> From<TerminalColonColonGreen<'db>> for TokenNodeGreen<'db> {
40691 fn from(value: TerminalColonColonGreen<'db>) -> Self {
40692 Self(value.0)
40693 }
40694}
40695impl<'db> From<TerminalCommaGreen<'db>> for TokenNodeGreen<'db> {
40696 fn from(value: TerminalCommaGreen<'db>) -> Self {
40697 Self(value.0)
40698 }
40699}
40700impl<'db> From<TerminalDivGreen<'db>> for TokenNodeGreen<'db> {
40701 fn from(value: TerminalDivGreen<'db>) -> Self {
40702 Self(value.0)
40703 }
40704}
40705impl<'db> From<TerminalDivEqGreen<'db>> for TokenNodeGreen<'db> {
40706 fn from(value: TerminalDivEqGreen<'db>) -> Self {
40707 Self(value.0)
40708 }
40709}
40710impl<'db> From<TerminalDollarGreen<'db>> for TokenNodeGreen<'db> {
40711 fn from(value: TerminalDollarGreen<'db>) -> Self {
40712 Self(value.0)
40713 }
40714}
40715impl<'db> From<TerminalDotGreen<'db>> for TokenNodeGreen<'db> {
40716 fn from(value: TerminalDotGreen<'db>) -> Self {
40717 Self(value.0)
40718 }
40719}
40720impl<'db> From<TerminalDotDotGreen<'db>> for TokenNodeGreen<'db> {
40721 fn from(value: TerminalDotDotGreen<'db>) -> Self {
40722 Self(value.0)
40723 }
40724}
40725impl<'db> From<TerminalDotDotEqGreen<'db>> for TokenNodeGreen<'db> {
40726 fn from(value: TerminalDotDotEqGreen<'db>) -> Self {
40727 Self(value.0)
40728 }
40729}
40730impl<'db> From<TerminalEndOfFileGreen<'db>> for TokenNodeGreen<'db> {
40731 fn from(value: TerminalEndOfFileGreen<'db>) -> Self {
40732 Self(value.0)
40733 }
40734}
40735impl<'db> From<TerminalEqGreen<'db>> for TokenNodeGreen<'db> {
40736 fn from(value: TerminalEqGreen<'db>) -> Self {
40737 Self(value.0)
40738 }
40739}
40740impl<'db> From<TerminalEqEqGreen<'db>> for TokenNodeGreen<'db> {
40741 fn from(value: TerminalEqEqGreen<'db>) -> Self {
40742 Self(value.0)
40743 }
40744}
40745impl<'db> From<TerminalGEGreen<'db>> for TokenNodeGreen<'db> {
40746 fn from(value: TerminalGEGreen<'db>) -> Self {
40747 Self(value.0)
40748 }
40749}
40750impl<'db> From<TerminalGTGreen<'db>> for TokenNodeGreen<'db> {
40751 fn from(value: TerminalGTGreen<'db>) -> Self {
40752 Self(value.0)
40753 }
40754}
40755impl<'db> From<TerminalHashGreen<'db>> for TokenNodeGreen<'db> {
40756 fn from(value: TerminalHashGreen<'db>) -> Self {
40757 Self(value.0)
40758 }
40759}
40760impl<'db> From<TerminalLBraceGreen<'db>> for TokenNodeGreen<'db> {
40761 fn from(value: TerminalLBraceGreen<'db>) -> Self {
40762 Self(value.0)
40763 }
40764}
40765impl<'db> From<TerminalLBrackGreen<'db>> for TokenNodeGreen<'db> {
40766 fn from(value: TerminalLBrackGreen<'db>) -> Self {
40767 Self(value.0)
40768 }
40769}
40770impl<'db> From<TerminalLEGreen<'db>> for TokenNodeGreen<'db> {
40771 fn from(value: TerminalLEGreen<'db>) -> Self {
40772 Self(value.0)
40773 }
40774}
40775impl<'db> From<TerminalLParenGreen<'db>> for TokenNodeGreen<'db> {
40776 fn from(value: TerminalLParenGreen<'db>) -> Self {
40777 Self(value.0)
40778 }
40779}
40780impl<'db> From<TerminalLTGreen<'db>> for TokenNodeGreen<'db> {
40781 fn from(value: TerminalLTGreen<'db>) -> Self {
40782 Self(value.0)
40783 }
40784}
40785impl<'db> From<TerminalMatchArrowGreen<'db>> for TokenNodeGreen<'db> {
40786 fn from(value: TerminalMatchArrowGreen<'db>) -> Self {
40787 Self(value.0)
40788 }
40789}
40790impl<'db> From<TerminalMinusGreen<'db>> for TokenNodeGreen<'db> {
40791 fn from(value: TerminalMinusGreen<'db>) -> Self {
40792 Self(value.0)
40793 }
40794}
40795impl<'db> From<TerminalMinusEqGreen<'db>> for TokenNodeGreen<'db> {
40796 fn from(value: TerminalMinusEqGreen<'db>) -> Self {
40797 Self(value.0)
40798 }
40799}
40800impl<'db> From<TerminalModGreen<'db>> for TokenNodeGreen<'db> {
40801 fn from(value: TerminalModGreen<'db>) -> Self {
40802 Self(value.0)
40803 }
40804}
40805impl<'db> From<TerminalModEqGreen<'db>> for TokenNodeGreen<'db> {
40806 fn from(value: TerminalModEqGreen<'db>) -> Self {
40807 Self(value.0)
40808 }
40809}
40810impl<'db> From<TerminalMulGreen<'db>> for TokenNodeGreen<'db> {
40811 fn from(value: TerminalMulGreen<'db>) -> Self {
40812 Self(value.0)
40813 }
40814}
40815impl<'db> From<TerminalMulEqGreen<'db>> for TokenNodeGreen<'db> {
40816 fn from(value: TerminalMulEqGreen<'db>) -> Self {
40817 Self(value.0)
40818 }
40819}
40820impl<'db> From<TerminalNeqGreen<'db>> for TokenNodeGreen<'db> {
40821 fn from(value: TerminalNeqGreen<'db>) -> Self {
40822 Self(value.0)
40823 }
40824}
40825impl<'db> From<TerminalNotGreen<'db>> for TokenNodeGreen<'db> {
40826 fn from(value: TerminalNotGreen<'db>) -> Self {
40827 Self(value.0)
40828 }
40829}
40830impl<'db> From<TerminalBitNotGreen<'db>> for TokenNodeGreen<'db> {
40831 fn from(value: TerminalBitNotGreen<'db>) -> Self {
40832 Self(value.0)
40833 }
40834}
40835impl<'db> From<TerminalOrGreen<'db>> for TokenNodeGreen<'db> {
40836 fn from(value: TerminalOrGreen<'db>) -> Self {
40837 Self(value.0)
40838 }
40839}
40840impl<'db> From<TerminalOrOrGreen<'db>> for TokenNodeGreen<'db> {
40841 fn from(value: TerminalOrOrGreen<'db>) -> Self {
40842 Self(value.0)
40843 }
40844}
40845impl<'db> From<TerminalPlusGreen<'db>> for TokenNodeGreen<'db> {
40846 fn from(value: TerminalPlusGreen<'db>) -> Self {
40847 Self(value.0)
40848 }
40849}
40850impl<'db> From<TerminalPlusEqGreen<'db>> for TokenNodeGreen<'db> {
40851 fn from(value: TerminalPlusEqGreen<'db>) -> Self {
40852 Self(value.0)
40853 }
40854}
40855impl<'db> From<TerminalQuestionMarkGreen<'db>> for TokenNodeGreen<'db> {
40856 fn from(value: TerminalQuestionMarkGreen<'db>) -> Self {
40857 Self(value.0)
40858 }
40859}
40860impl<'db> From<TerminalRBraceGreen<'db>> for TokenNodeGreen<'db> {
40861 fn from(value: TerminalRBraceGreen<'db>) -> Self {
40862 Self(value.0)
40863 }
40864}
40865impl<'db> From<TerminalRBrackGreen<'db>> for TokenNodeGreen<'db> {
40866 fn from(value: TerminalRBrackGreen<'db>) -> Self {
40867 Self(value.0)
40868 }
40869}
40870impl<'db> From<TerminalRParenGreen<'db>> for TokenNodeGreen<'db> {
40871 fn from(value: TerminalRParenGreen<'db>) -> Self {
40872 Self(value.0)
40873 }
40874}
40875impl<'db> From<TerminalSemicolonGreen<'db>> for TokenNodeGreen<'db> {
40876 fn from(value: TerminalSemicolonGreen<'db>) -> Self {
40877 Self(value.0)
40878 }
40879}
40880impl<'db> From<TerminalUnderscoreGreen<'db>> for TokenNodeGreen<'db> {
40881 fn from(value: TerminalUnderscoreGreen<'db>) -> Self {
40882 Self(value.0)
40883 }
40884}
40885impl<'db> From<TerminalXorGreen<'db>> for TokenNodeGreen<'db> {
40886 fn from(value: TerminalXorGreen<'db>) -> Self {
40887 Self(value.0)
40888 }
40889}
40890impl<'db> From<TerminalEmptyGreen<'db>> for TokenNodeGreen<'db> {
40891 fn from(value: TerminalEmptyGreen<'db>) -> Self {
40892 Self(value.0)
40893 }
40894}
40895#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, salsa::Update)]
40896pub struct TokenNodeGreen<'db>(pub GreenId<'db>);
40897impl<'db> TypedSyntaxNode<'db> for TokenNode<'db> {
40898 const OPTIONAL_KIND: Option<SyntaxKind> = None;
40899 type StablePtr = TokenNodePtr<'db>;
40900 type Green = TokenNodeGreen<'db>;
40901 fn missing(db: &'db dyn Database) -> Self::Green {
40902 panic!("No missing variant.");
40903 }
40904 fn from_syntax_node(db: &'db dyn Database, node: SyntaxNode<'db>) -> Self {
40905 let kind = node.kind(db);
40906 match kind {
40907 SyntaxKind::TerminalIdentifier => {
40908 TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node))
40909 }
40910 SyntaxKind::TerminalLiteralNumber => {
40911 TokenNode::TerminalLiteralNumber(TerminalLiteralNumber::from_syntax_node(db, node))
40912 }
40913 SyntaxKind::TerminalShortString => {
40914 TokenNode::TerminalShortString(TerminalShortString::from_syntax_node(db, node))
40915 }
40916 SyntaxKind::TerminalString => {
40917 TokenNode::TerminalString(TerminalString::from_syntax_node(db, node))
40918 }
40919 SyntaxKind::TerminalAs => TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)),
40920 SyntaxKind::TerminalConst => {
40921 TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node))
40922 }
40923 SyntaxKind::TerminalElse => {
40924 TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node))
40925 }
40926 SyntaxKind::TerminalEnum => {
40927 TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node))
40928 }
40929 SyntaxKind::TerminalExtern => {
40930 TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node))
40931 }
40932 SyntaxKind::TerminalFalse => {
40933 TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node))
40934 }
40935 SyntaxKind::TerminalFunction => {
40936 TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node))
40937 }
40938 SyntaxKind::TerminalIf => TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)),
40939 SyntaxKind::TerminalWhile => {
40940 TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node))
40941 }
40942 SyntaxKind::TerminalFor => {
40943 TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node))
40944 }
40945 SyntaxKind::TerminalLoop => {
40946 TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node))
40947 }
40948 SyntaxKind::TerminalImpl => {
40949 TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node))
40950 }
40951 SyntaxKind::TerminalImplicits => {
40952 TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node))
40953 }
40954 SyntaxKind::TerminalLet => {
40955 TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node))
40956 }
40957 SyntaxKind::TerminalMacro => {
40958 TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node))
40959 }
40960 SyntaxKind::TerminalMatch => {
40961 TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node))
40962 }
40963 SyntaxKind::TerminalModule => {
40964 TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node))
40965 }
40966 SyntaxKind::TerminalMut => {
40967 TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node))
40968 }
40969 SyntaxKind::TerminalNoPanic => {
40970 TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node))
40971 }
40972 SyntaxKind::TerminalOf => TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)),
40973 SyntaxKind::TerminalRef => {
40974 TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node))
40975 }
40976 SyntaxKind::TerminalContinue => {
40977 TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node))
40978 }
40979 SyntaxKind::TerminalReturn => {
40980 TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node))
40981 }
40982 SyntaxKind::TerminalBreak => {
40983 TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node))
40984 }
40985 SyntaxKind::TerminalStruct => {
40986 TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node))
40987 }
40988 SyntaxKind::TerminalTrait => {
40989 TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node))
40990 }
40991 SyntaxKind::TerminalTrue => {
40992 TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node))
40993 }
40994 SyntaxKind::TerminalType => {
40995 TokenNode::TerminalType(TerminalType::from_syntax_node(db, node))
40996 }
40997 SyntaxKind::TerminalUse => {
40998 TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node))
40999 }
41000 SyntaxKind::TerminalPub => {
41001 TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node))
41002 }
41003 SyntaxKind::TerminalAnd => {
41004 TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node))
41005 }
41006 SyntaxKind::TerminalAndAnd => {
41007 TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node))
41008 }
41009 SyntaxKind::TerminalArrow => {
41010 TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node))
41011 }
41012 SyntaxKind::TerminalAt => TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)),
41013 SyntaxKind::TerminalBadCharacters => {
41014 TokenNode::TerminalBadCharacters(TerminalBadCharacters::from_syntax_node(db, node))
41015 }
41016 SyntaxKind::TerminalColon => {
41017 TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node))
41018 }
41019 SyntaxKind::TerminalColonColon => {
41020 TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node))
41021 }
41022 SyntaxKind::TerminalComma => {
41023 TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node))
41024 }
41025 SyntaxKind::TerminalDiv => {
41026 TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node))
41027 }
41028 SyntaxKind::TerminalDivEq => {
41029 TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node))
41030 }
41031 SyntaxKind::TerminalDollar => {
41032 TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node))
41033 }
41034 SyntaxKind::TerminalDot => {
41035 TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node))
41036 }
41037 SyntaxKind::TerminalDotDot => {
41038 TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node))
41039 }
41040 SyntaxKind::TerminalDotDotEq => {
41041 TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node))
41042 }
41043 SyntaxKind::TerminalEndOfFile => {
41044 TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node))
41045 }
41046 SyntaxKind::TerminalEq => TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)),
41047 SyntaxKind::TerminalEqEq => {
41048 TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node))
41049 }
41050 SyntaxKind::TerminalGE => TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)),
41051 SyntaxKind::TerminalGT => TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)),
41052 SyntaxKind::TerminalHash => {
41053 TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node))
41054 }
41055 SyntaxKind::TerminalLBrace => {
41056 TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node))
41057 }
41058 SyntaxKind::TerminalLBrack => {
41059 TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node))
41060 }
41061 SyntaxKind::TerminalLE => TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)),
41062 SyntaxKind::TerminalLParen => {
41063 TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node))
41064 }
41065 SyntaxKind::TerminalLT => TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)),
41066 SyntaxKind::TerminalMatchArrow => {
41067 TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node))
41068 }
41069 SyntaxKind::TerminalMinus => {
41070 TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node))
41071 }
41072 SyntaxKind::TerminalMinusEq => {
41073 TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node))
41074 }
41075 SyntaxKind::TerminalMod => {
41076 TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node))
41077 }
41078 SyntaxKind::TerminalModEq => {
41079 TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node))
41080 }
41081 SyntaxKind::TerminalMul => {
41082 TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node))
41083 }
41084 SyntaxKind::TerminalMulEq => {
41085 TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node))
41086 }
41087 SyntaxKind::TerminalNeq => {
41088 TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node))
41089 }
41090 SyntaxKind::TerminalNot => {
41091 TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node))
41092 }
41093 SyntaxKind::TerminalBitNot => {
41094 TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node))
41095 }
41096 SyntaxKind::TerminalOr => TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)),
41097 SyntaxKind::TerminalOrOr => {
41098 TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node))
41099 }
41100 SyntaxKind::TerminalPlus => {
41101 TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node))
41102 }
41103 SyntaxKind::TerminalPlusEq => {
41104 TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node))
41105 }
41106 SyntaxKind::TerminalQuestionMark => {
41107 TokenNode::TerminalQuestionMark(TerminalQuestionMark::from_syntax_node(db, node))
41108 }
41109 SyntaxKind::TerminalRBrace => {
41110 TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node))
41111 }
41112 SyntaxKind::TerminalRBrack => {
41113 TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node))
41114 }
41115 SyntaxKind::TerminalRParen => {
41116 TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node))
41117 }
41118 SyntaxKind::TerminalSemicolon => {
41119 TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node))
41120 }
41121 SyntaxKind::TerminalUnderscore => {
41122 TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node))
41123 }
41124 SyntaxKind::TerminalXor => {
41125 TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node))
41126 }
41127 SyntaxKind::TerminalEmpty => {
41128 TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node))
41129 }
41130 _ => panic!("Unexpected syntax kind {:?} when constructing {}.", kind, "TokenNode"),
41131 }
41132 }
41133 fn cast(db: &'db dyn Database, node: SyntaxNode<'db>) -> Option<Self> {
41134 let kind = node.kind(db);
41135 match kind {
41136 SyntaxKind::TerminalIdentifier => {
41137 Some(TokenNode::TerminalIdentifier(TerminalIdentifier::from_syntax_node(db, node)))
41138 }
41139 SyntaxKind::TerminalLiteralNumber => Some(TokenNode::TerminalLiteralNumber(
41140 TerminalLiteralNumber::from_syntax_node(db, node),
41141 )),
41142 SyntaxKind::TerminalShortString => Some(TokenNode::TerminalShortString(
41143 TerminalShortString::from_syntax_node(db, node),
41144 )),
41145 SyntaxKind::TerminalString => {
41146 Some(TokenNode::TerminalString(TerminalString::from_syntax_node(db, node)))
41147 }
41148 SyntaxKind::TerminalAs => {
41149 Some(TokenNode::TerminalAs(TerminalAs::from_syntax_node(db, node)))
41150 }
41151 SyntaxKind::TerminalConst => {
41152 Some(TokenNode::TerminalConst(TerminalConst::from_syntax_node(db, node)))
41153 }
41154 SyntaxKind::TerminalElse => {
41155 Some(TokenNode::TerminalElse(TerminalElse::from_syntax_node(db, node)))
41156 }
41157 SyntaxKind::TerminalEnum => {
41158 Some(TokenNode::TerminalEnum(TerminalEnum::from_syntax_node(db, node)))
41159 }
41160 SyntaxKind::TerminalExtern => {
41161 Some(TokenNode::TerminalExtern(TerminalExtern::from_syntax_node(db, node)))
41162 }
41163 SyntaxKind::TerminalFalse => {
41164 Some(TokenNode::TerminalFalse(TerminalFalse::from_syntax_node(db, node)))
41165 }
41166 SyntaxKind::TerminalFunction => {
41167 Some(TokenNode::TerminalFunction(TerminalFunction::from_syntax_node(db, node)))
41168 }
41169 SyntaxKind::TerminalIf => {
41170 Some(TokenNode::TerminalIf(TerminalIf::from_syntax_node(db, node)))
41171 }
41172 SyntaxKind::TerminalWhile => {
41173 Some(TokenNode::TerminalWhile(TerminalWhile::from_syntax_node(db, node)))
41174 }
41175 SyntaxKind::TerminalFor => {
41176 Some(TokenNode::TerminalFor(TerminalFor::from_syntax_node(db, node)))
41177 }
41178 SyntaxKind::TerminalLoop => {
41179 Some(TokenNode::TerminalLoop(TerminalLoop::from_syntax_node(db, node)))
41180 }
41181 SyntaxKind::TerminalImpl => {
41182 Some(TokenNode::TerminalImpl(TerminalImpl::from_syntax_node(db, node)))
41183 }
41184 SyntaxKind::TerminalImplicits => {
41185 Some(TokenNode::TerminalImplicits(TerminalImplicits::from_syntax_node(db, node)))
41186 }
41187 SyntaxKind::TerminalLet => {
41188 Some(TokenNode::TerminalLet(TerminalLet::from_syntax_node(db, node)))
41189 }
41190 SyntaxKind::TerminalMacro => {
41191 Some(TokenNode::TerminalMacro(TerminalMacro::from_syntax_node(db, node)))
41192 }
41193 SyntaxKind::TerminalMatch => {
41194 Some(TokenNode::TerminalMatch(TerminalMatch::from_syntax_node(db, node)))
41195 }
41196 SyntaxKind::TerminalModule => {
41197 Some(TokenNode::TerminalModule(TerminalModule::from_syntax_node(db, node)))
41198 }
41199 SyntaxKind::TerminalMut => {
41200 Some(TokenNode::TerminalMut(TerminalMut::from_syntax_node(db, node)))
41201 }
41202 SyntaxKind::TerminalNoPanic => {
41203 Some(TokenNode::TerminalNoPanic(TerminalNoPanic::from_syntax_node(db, node)))
41204 }
41205 SyntaxKind::TerminalOf => {
41206 Some(TokenNode::TerminalOf(TerminalOf::from_syntax_node(db, node)))
41207 }
41208 SyntaxKind::TerminalRef => {
41209 Some(TokenNode::TerminalRef(TerminalRef::from_syntax_node(db, node)))
41210 }
41211 SyntaxKind::TerminalContinue => {
41212 Some(TokenNode::TerminalContinue(TerminalContinue::from_syntax_node(db, node)))
41213 }
41214 SyntaxKind::TerminalReturn => {
41215 Some(TokenNode::TerminalReturn(TerminalReturn::from_syntax_node(db, node)))
41216 }
41217 SyntaxKind::TerminalBreak => {
41218 Some(TokenNode::TerminalBreak(TerminalBreak::from_syntax_node(db, node)))
41219 }
41220 SyntaxKind::TerminalStruct => {
41221 Some(TokenNode::TerminalStruct(TerminalStruct::from_syntax_node(db, node)))
41222 }
41223 SyntaxKind::TerminalTrait => {
41224 Some(TokenNode::TerminalTrait(TerminalTrait::from_syntax_node(db, node)))
41225 }
41226 SyntaxKind::TerminalTrue => {
41227 Some(TokenNode::TerminalTrue(TerminalTrue::from_syntax_node(db, node)))
41228 }
41229 SyntaxKind::TerminalType => {
41230 Some(TokenNode::TerminalType(TerminalType::from_syntax_node(db, node)))
41231 }
41232 SyntaxKind::TerminalUse => {
41233 Some(TokenNode::TerminalUse(TerminalUse::from_syntax_node(db, node)))
41234 }
41235 SyntaxKind::TerminalPub => {
41236 Some(TokenNode::TerminalPub(TerminalPub::from_syntax_node(db, node)))
41237 }
41238 SyntaxKind::TerminalAnd => {
41239 Some(TokenNode::TerminalAnd(TerminalAnd::from_syntax_node(db, node)))
41240 }
41241 SyntaxKind::TerminalAndAnd => {
41242 Some(TokenNode::TerminalAndAnd(TerminalAndAnd::from_syntax_node(db, node)))
41243 }
41244 SyntaxKind::TerminalArrow => {
41245 Some(TokenNode::TerminalArrow(TerminalArrow::from_syntax_node(db, node)))
41246 }
41247 SyntaxKind::TerminalAt => {
41248 Some(TokenNode::TerminalAt(TerminalAt::from_syntax_node(db, node)))
41249 }
41250 SyntaxKind::TerminalBadCharacters => Some(TokenNode::TerminalBadCharacters(
41251 TerminalBadCharacters::from_syntax_node(db, node),
41252 )),
41253 SyntaxKind::TerminalColon => {
41254 Some(TokenNode::TerminalColon(TerminalColon::from_syntax_node(db, node)))
41255 }
41256 SyntaxKind::TerminalColonColon => {
41257 Some(TokenNode::TerminalColonColon(TerminalColonColon::from_syntax_node(db, node)))
41258 }
41259 SyntaxKind::TerminalComma => {
41260 Some(TokenNode::TerminalComma(TerminalComma::from_syntax_node(db, node)))
41261 }
41262 SyntaxKind::TerminalDiv => {
41263 Some(TokenNode::TerminalDiv(TerminalDiv::from_syntax_node(db, node)))
41264 }
41265 SyntaxKind::TerminalDivEq => {
41266 Some(TokenNode::TerminalDivEq(TerminalDivEq::from_syntax_node(db, node)))
41267 }
41268 SyntaxKind::TerminalDollar => {
41269 Some(TokenNode::TerminalDollar(TerminalDollar::from_syntax_node(db, node)))
41270 }
41271 SyntaxKind::TerminalDot => {
41272 Some(TokenNode::TerminalDot(TerminalDot::from_syntax_node(db, node)))
41273 }
41274 SyntaxKind::TerminalDotDot => {
41275 Some(TokenNode::TerminalDotDot(TerminalDotDot::from_syntax_node(db, node)))
41276 }
41277 SyntaxKind::TerminalDotDotEq => {
41278 Some(TokenNode::TerminalDotDotEq(TerminalDotDotEq::from_syntax_node(db, node)))
41279 }
41280 SyntaxKind::TerminalEndOfFile => {
41281 Some(TokenNode::TerminalEndOfFile(TerminalEndOfFile::from_syntax_node(db, node)))
41282 }
41283 SyntaxKind::TerminalEq => {
41284 Some(TokenNode::TerminalEq(TerminalEq::from_syntax_node(db, node)))
41285 }
41286 SyntaxKind::TerminalEqEq => {
41287 Some(TokenNode::TerminalEqEq(TerminalEqEq::from_syntax_node(db, node)))
41288 }
41289 SyntaxKind::TerminalGE => {
41290 Some(TokenNode::TerminalGE(TerminalGE::from_syntax_node(db, node)))
41291 }
41292 SyntaxKind::TerminalGT => {
41293 Some(TokenNode::TerminalGT(TerminalGT::from_syntax_node(db, node)))
41294 }
41295 SyntaxKind::TerminalHash => {
41296 Some(TokenNode::TerminalHash(TerminalHash::from_syntax_node(db, node)))
41297 }
41298 SyntaxKind::TerminalLBrace => {
41299 Some(TokenNode::TerminalLBrace(TerminalLBrace::from_syntax_node(db, node)))
41300 }
41301 SyntaxKind::TerminalLBrack => {
41302 Some(TokenNode::TerminalLBrack(TerminalLBrack::from_syntax_node(db, node)))
41303 }
41304 SyntaxKind::TerminalLE => {
41305 Some(TokenNode::TerminalLE(TerminalLE::from_syntax_node(db, node)))
41306 }
41307 SyntaxKind::TerminalLParen => {
41308 Some(TokenNode::TerminalLParen(TerminalLParen::from_syntax_node(db, node)))
41309 }
41310 SyntaxKind::TerminalLT => {
41311 Some(TokenNode::TerminalLT(TerminalLT::from_syntax_node(db, node)))
41312 }
41313 SyntaxKind::TerminalMatchArrow => {
41314 Some(TokenNode::TerminalMatchArrow(TerminalMatchArrow::from_syntax_node(db, node)))
41315 }
41316 SyntaxKind::TerminalMinus => {
41317 Some(TokenNode::TerminalMinus(TerminalMinus::from_syntax_node(db, node)))
41318 }
41319 SyntaxKind::TerminalMinusEq => {
41320 Some(TokenNode::TerminalMinusEq(TerminalMinusEq::from_syntax_node(db, node)))
41321 }
41322 SyntaxKind::TerminalMod => {
41323 Some(TokenNode::TerminalMod(TerminalMod::from_syntax_node(db, node)))
41324 }
41325 SyntaxKind::TerminalModEq => {
41326 Some(TokenNode::TerminalModEq(TerminalModEq::from_syntax_node(db, node)))
41327 }
41328 SyntaxKind::TerminalMul => {
41329 Some(TokenNode::TerminalMul(TerminalMul::from_syntax_node(db, node)))
41330 }
41331 SyntaxKind::TerminalMulEq => {
41332 Some(TokenNode::TerminalMulEq(TerminalMulEq::from_syntax_node(db, node)))
41333 }
41334 SyntaxKind::TerminalNeq => {
41335 Some(TokenNode::TerminalNeq(TerminalNeq::from_syntax_node(db, node)))
41336 }
41337 SyntaxKind::TerminalNot => {
41338 Some(TokenNode::TerminalNot(TerminalNot::from_syntax_node(db, node)))
41339 }
41340 SyntaxKind::TerminalBitNot => {
41341 Some(TokenNode::TerminalBitNot(TerminalBitNot::from_syntax_node(db, node)))
41342 }
41343 SyntaxKind::TerminalOr => {
41344 Some(TokenNode::TerminalOr(TerminalOr::from_syntax_node(db, node)))
41345 }
41346 SyntaxKind::TerminalOrOr => {
41347 Some(TokenNode::TerminalOrOr(TerminalOrOr::from_syntax_node(db, node)))
41348 }
41349 SyntaxKind::TerminalPlus => {
41350 Some(TokenNode::TerminalPlus(TerminalPlus::from_syntax_node(db, node)))
41351 }
41352 SyntaxKind::TerminalPlusEq => {
41353 Some(TokenNode::TerminalPlusEq(TerminalPlusEq::from_syntax_node(db, node)))
41354 }
41355 SyntaxKind::TerminalQuestionMark => Some(TokenNode::TerminalQuestionMark(
41356 TerminalQuestionMark::from_syntax_node(db, node),
41357 )),
41358 SyntaxKind::TerminalRBrace => {
41359 Some(TokenNode::TerminalRBrace(TerminalRBrace::from_syntax_node(db, node)))
41360 }
41361 SyntaxKind::TerminalRBrack => {
41362 Some(TokenNode::TerminalRBrack(TerminalRBrack::from_syntax_node(db, node)))
41363 }
41364 SyntaxKind::TerminalRParen => {
41365 Some(TokenNode::TerminalRParen(TerminalRParen::from_syntax_node(db, node)))
41366 }
41367 SyntaxKind::TerminalSemicolon => {
41368 Some(TokenNode::TerminalSemicolon(TerminalSemicolon::from_syntax_node(db, node)))
41369 }
41370 SyntaxKind::TerminalUnderscore => {
41371 Some(TokenNode::TerminalUnderscore(TerminalUnderscore::from_syntax_node(db, node)))
41372 }
41373 SyntaxKind::TerminalXor => {
41374 Some(TokenNode::TerminalXor(TerminalXor::from_syntax_node(db, node)))
41375 }
41376 SyntaxKind::TerminalEmpty => {
41377 Some(TokenNode::TerminalEmpty(TerminalEmpty::from_syntax_node(db, node)))
41378 }
41379 _ => None,
41380 }
41381 }
41382 fn as_syntax_node(&self) -> SyntaxNode<'db> {
41383 match self {
41384 TokenNode::TerminalIdentifier(x) => x.as_syntax_node(),
41385 TokenNode::TerminalLiteralNumber(x) => x.as_syntax_node(),
41386 TokenNode::TerminalShortString(x) => x.as_syntax_node(),
41387 TokenNode::TerminalString(x) => x.as_syntax_node(),
41388 TokenNode::TerminalAs(x) => x.as_syntax_node(),
41389 TokenNode::TerminalConst(x) => x.as_syntax_node(),
41390 TokenNode::TerminalElse(x) => x.as_syntax_node(),
41391 TokenNode::TerminalEnum(x) => x.as_syntax_node(),
41392 TokenNode::TerminalExtern(x) => x.as_syntax_node(),
41393 TokenNode::TerminalFalse(x) => x.as_syntax_node(),
41394 TokenNode::TerminalFunction(x) => x.as_syntax_node(),
41395 TokenNode::TerminalIf(x) => x.as_syntax_node(),
41396 TokenNode::TerminalWhile(x) => x.as_syntax_node(),
41397 TokenNode::TerminalFor(x) => x.as_syntax_node(),
41398 TokenNode::TerminalLoop(x) => x.as_syntax_node(),
41399 TokenNode::TerminalImpl(x) => x.as_syntax_node(),
41400 TokenNode::TerminalImplicits(x) => x.as_syntax_node(),
41401 TokenNode::TerminalLet(x) => x.as_syntax_node(),
41402 TokenNode::TerminalMacro(x) => x.as_syntax_node(),
41403 TokenNode::TerminalMatch(x) => x.as_syntax_node(),
41404 TokenNode::TerminalModule(x) => x.as_syntax_node(),
41405 TokenNode::TerminalMut(x) => x.as_syntax_node(),
41406 TokenNode::TerminalNoPanic(x) => x.as_syntax_node(),
41407 TokenNode::TerminalOf(x) => x.as_syntax_node(),
41408 TokenNode::TerminalRef(x) => x.as_syntax_node(),
41409 TokenNode::TerminalContinue(x) => x.as_syntax_node(),
41410 TokenNode::TerminalReturn(x) => x.as_syntax_node(),
41411 TokenNode::TerminalBreak(x) => x.as_syntax_node(),
41412 TokenNode::TerminalStruct(x) => x.as_syntax_node(),
41413 TokenNode::TerminalTrait(x) => x.as_syntax_node(),
41414 TokenNode::TerminalTrue(x) => x.as_syntax_node(),
41415 TokenNode::TerminalType(x) => x.as_syntax_node(),
41416 TokenNode::TerminalUse(x) => x.as_syntax_node(),
41417 TokenNode::TerminalPub(x) => x.as_syntax_node(),
41418 TokenNode::TerminalAnd(x) => x.as_syntax_node(),
41419 TokenNode::TerminalAndAnd(x) => x.as_syntax_node(),
41420 TokenNode::TerminalArrow(x) => x.as_syntax_node(),
41421 TokenNode::TerminalAt(x) => x.as_syntax_node(),
41422 TokenNode::TerminalBadCharacters(x) => x.as_syntax_node(),
41423 TokenNode::TerminalColon(x) => x.as_syntax_node(),
41424 TokenNode::TerminalColonColon(x) => x.as_syntax_node(),
41425 TokenNode::TerminalComma(x) => x.as_syntax_node(),
41426 TokenNode::TerminalDiv(x) => x.as_syntax_node(),
41427 TokenNode::TerminalDivEq(x) => x.as_syntax_node(),
41428 TokenNode::TerminalDollar(x) => x.as_syntax_node(),
41429 TokenNode::TerminalDot(x) => x.as_syntax_node(),
41430 TokenNode::TerminalDotDot(x) => x.as_syntax_node(),
41431 TokenNode::TerminalDotDotEq(x) => x.as_syntax_node(),
41432 TokenNode::TerminalEndOfFile(x) => x.as_syntax_node(),
41433 TokenNode::TerminalEq(x) => x.as_syntax_node(),
41434 TokenNode::TerminalEqEq(x) => x.as_syntax_node(),
41435 TokenNode::TerminalGE(x) => x.as_syntax_node(),
41436 TokenNode::TerminalGT(x) => x.as_syntax_node(),
41437 TokenNode::TerminalHash(x) => x.as_syntax_node(),
41438 TokenNode::TerminalLBrace(x) => x.as_syntax_node(),
41439 TokenNode::TerminalLBrack(x) => x.as_syntax_node(),
41440 TokenNode::TerminalLE(x) => x.as_syntax_node(),
41441 TokenNode::TerminalLParen(x) => x.as_syntax_node(),
41442 TokenNode::TerminalLT(x) => x.as_syntax_node(),
41443 TokenNode::TerminalMatchArrow(x) => x.as_syntax_node(),
41444 TokenNode::TerminalMinus(x) => x.as_syntax_node(),
41445 TokenNode::TerminalMinusEq(x) => x.as_syntax_node(),
41446 TokenNode::TerminalMod(x) => x.as_syntax_node(),
41447 TokenNode::TerminalModEq(x) => x.as_syntax_node(),
41448 TokenNode::TerminalMul(x) => x.as_syntax_node(),
41449 TokenNode::TerminalMulEq(x) => x.as_syntax_node(),
41450 TokenNode::TerminalNeq(x) => x.as_syntax_node(),
41451 TokenNode::TerminalNot(x) => x.as_syntax_node(),
41452 TokenNode::TerminalBitNot(x) => x.as_syntax_node(),
41453 TokenNode::TerminalOr(x) => x.as_syntax_node(),
41454 TokenNode::TerminalOrOr(x) => x.as_syntax_node(),
41455 TokenNode::TerminalPlus(x) => x.as_syntax_node(),
41456 TokenNode::TerminalPlusEq(x) => x.as_syntax_node(),
41457 TokenNode::TerminalQuestionMark(x) => x.as_syntax_node(),
41458 TokenNode::TerminalRBrace(x) => x.as_syntax_node(),
41459 TokenNode::TerminalRBrack(x) => x.as_syntax_node(),
41460 TokenNode::TerminalRParen(x) => x.as_syntax_node(),
41461 TokenNode::TerminalSemicolon(x) => x.as_syntax_node(),
41462 TokenNode::TerminalUnderscore(x) => x.as_syntax_node(),
41463 TokenNode::TerminalXor(x) => x.as_syntax_node(),
41464 TokenNode::TerminalEmpty(x) => x.as_syntax_node(),
41465 }
41466 }
41467 fn stable_ptr(&self, db: &'db dyn Database) -> Self::StablePtr {
41468 TokenNodePtr(self.as_syntax_node().stable_ptr(db))
41469 }
41470}
41471impl<'db> TokenNode<'db> {
41472 pub fn is_variant(kind: SyntaxKind) -> bool {
41474 matches!(
41475 kind,
41476 SyntaxKind::TerminalIdentifier
41477 | SyntaxKind::TerminalLiteralNumber
41478 | SyntaxKind::TerminalShortString
41479 | SyntaxKind::TerminalString
41480 | SyntaxKind::TerminalAs
41481 | SyntaxKind::TerminalConst
41482 | SyntaxKind::TerminalElse
41483 | SyntaxKind::TerminalEnum
41484 | SyntaxKind::TerminalExtern
41485 | SyntaxKind::TerminalFalse
41486 | SyntaxKind::TerminalFunction
41487 | SyntaxKind::TerminalIf
41488 | SyntaxKind::TerminalWhile
41489 | SyntaxKind::TerminalFor
41490 | SyntaxKind::TerminalLoop
41491 | SyntaxKind::TerminalImpl
41492 | SyntaxKind::TerminalImplicits
41493 | SyntaxKind::TerminalLet
41494 | SyntaxKind::TerminalMacro
41495 | SyntaxKind::TerminalMatch
41496 | SyntaxKind::TerminalModule
41497 | SyntaxKind::TerminalMut
41498 | SyntaxKind::TerminalNoPanic
41499 | SyntaxKind::TerminalOf
41500 | SyntaxKind::TerminalRef
41501 | SyntaxKind::TerminalContinue
41502 | SyntaxKind::TerminalReturn
41503 | SyntaxKind::TerminalBreak
41504 | SyntaxKind::TerminalStruct
41505 | SyntaxKind::TerminalTrait
41506 | SyntaxKind::TerminalTrue
41507 | SyntaxKind::TerminalType
41508 | SyntaxKind::TerminalUse
41509 | SyntaxKind::TerminalPub
41510 | SyntaxKind::TerminalAnd
41511 | SyntaxKind::TerminalAndAnd
41512 | SyntaxKind::TerminalArrow
41513 | SyntaxKind::TerminalAt
41514 | SyntaxKind::TerminalBadCharacters
41515 | SyntaxKind::TerminalColon
41516 | SyntaxKind::TerminalColonColon
41517 | SyntaxKind::TerminalComma
41518 | SyntaxKind::TerminalDiv
41519 | SyntaxKind::TerminalDivEq
41520 | SyntaxKind::TerminalDollar
41521 | SyntaxKind::TerminalDot
41522 | SyntaxKind::TerminalDotDot
41523 | SyntaxKind::TerminalDotDotEq
41524 | SyntaxKind::TerminalEndOfFile
41525 | SyntaxKind::TerminalEq
41526 | SyntaxKind::TerminalEqEq
41527 | SyntaxKind::TerminalGE
41528 | SyntaxKind::TerminalGT
41529 | SyntaxKind::TerminalHash
41530 | SyntaxKind::TerminalLBrace
41531 | SyntaxKind::TerminalLBrack
41532 | SyntaxKind::TerminalLE
41533 | SyntaxKind::TerminalLParen
41534 | SyntaxKind::TerminalLT
41535 | SyntaxKind::TerminalMatchArrow
41536 | SyntaxKind::TerminalMinus
41537 | SyntaxKind::TerminalMinusEq
41538 | SyntaxKind::TerminalMod
41539 | SyntaxKind::TerminalModEq
41540 | SyntaxKind::TerminalMul
41541 | SyntaxKind::TerminalMulEq
41542 | SyntaxKind::TerminalNeq
41543 | SyntaxKind::TerminalNot
41544 | SyntaxKind::TerminalBitNot
41545 | SyntaxKind::TerminalOr
41546 | SyntaxKind::TerminalOrOr
41547 | SyntaxKind::TerminalPlus
41548 | SyntaxKind::TerminalPlusEq
41549 | SyntaxKind::TerminalQuestionMark
41550 | SyntaxKind::TerminalRBrace
41551 | SyntaxKind::TerminalRBrack
41552 | SyntaxKind::TerminalRParen
41553 | SyntaxKind::TerminalSemicolon
41554 | SyntaxKind::TerminalUnderscore
41555 | SyntaxKind::TerminalXor
41556 | SyntaxKind::TerminalEmpty
41557 )
41558 }
41559}